Human-in-the-loop (interrupt / resume): README.md
This commit is contained in:
@@ -0,0 +1,110 @@
|
|||||||
|
# Human‑in‑the‑loop (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!
|
||||||
Reference in New Issue
Block a user