Human-in-the-loop (interrupt / resume): README.md

This commit is contained in:
2026-05-27 10:03:34 +00:00
parent df95ffb781
commit 293194703c
@@ -0,0 +1,110 @@
# Humanintheloop (Interrupt / Resume) LangGraph Demo
This repository contains a minimal example of a **LangGraph** that pauses execution to ask the user for confirmation via a custom interrupt.
The graph demonstrates how to:
* Define a typed state with fields that will be filled by a human.
* Trigger an interrupt from a node, passing a structured payload (`type`, `question`, `allow_responds`).
* Handle the interrupt in a loop: display the question in the console (using *questionary*), capture the answer and resume the graph.
---
## 📦 Installation
```bash
# Create a virtual environment if you wish
python -m venv .venv
source .venv/bin/activate # On Windows use `.venv\Scripts\activate`
# Install dependencies
pip install langgraph questionary
```
> **Tip**: If you plan to extend the graph with LLM calls, add `langchain` and an appropriate provider (e.g., `langchain-openai`) to your requirements.
---
## 📁 Project Structure
```text
.
├── interrupt_graph.py # The LangGraph implementation
└── README.md # This file
```
---
## 🚀 Running the Example
The graph is executed in a simple loop that keeps running until the user chooses to stop.
Run it with:
```bash
python interrupt_graph.py
```
You should see something like:
```
[Graph] Starting new run...
[Interrupt] type: confirm
Question: Уверены, что хотите продолжить?
Options: approve / reject
Your choice: approve
[Graph] Resuming after interrupt...
[Graph] Run finished. Final state:
{'human_value': 'approve', 'foo': None}
```
If you answer `reject`, the graph will still resume but with a different value.
---
## 📄 Example Usage in Code
```python
# interrupt_graph.py (excerpt)
from langgraph.types import interrupt
def node_with_interrupt(state: GraphState) -> GraphState:
if state.get("human_value") is not None:
return state
payload = {
"type": "confirm",
"question": "Уверены, что хотите продолжить?",
"allow_responds": ["approve", "reject"],
}
# Pause the graph until a human responds
return interrupt(payload)
```
The main loop in `interrupt_graph.py` handles this payload:
```python
while True:
result = graph.run(state=state, config=config)
if isinstance(result, Command):
# Show question and get answer
choice = questionary.select(
result.payload["question"],
choices=result.payload["allow_responds"]
).ask()
state["human_value"] = choice
continue # resume graph
else:
break # finished
```
---
## 🎯 What You Can Learn
* How to **pause** a LangGraph node and wait for user input.
* How to structure the interrupt payload so that it can be rendered in any UI (console, web, etc.).
* The pattern of looping over `graph.run()` until no more `Command` objects are returned.
Feel free to fork this repository and experiment with different interrupt types or add LLM calls to make the graph more complex!