Human‑in‑the‑Loop Middleware Demo
A minimal Python project that demonstrates how to add a Human‑in‑the‑Loop (HITL) experience to a LangChain agent using the built‑in HumanInTheLoopMiddleware.
When the agent is about to invoke an external tool, it pauses and asks for user approval (approve or reject) before continuing.
Why use middleware?
Unlike the olderinterrupt_before=['tools']approach, the middleware automatically builds the confirmation prompt, handles the response, and resumes execution via aCommand(resume={…}). This keeps your agent logic clean and declarative.
📦 Project Structure
├── agent.py # Agent definition + HITL middleware
├── client.py # Simple CLI that runs the agent
├── requirements.txt
└── README.md
agent.py– creates a LangChain agent with a single tool (get_weather) and attaches the HITL middleware.client.py– launches the agent in an interactive loop.
⚙️ Prerequisites
| Component | Minimum Version | Notes |
|---|---|---|
| Python | 3.11+ | Tested on 3.12 |
| Ollama | latest | Local LLM (e.g., llama3) |
| LangChain | 0.2.x or newer | Provides agents & middleware |
| LangGraph | 0.1.x or newer | For checkpointing (optional) |
Ollama must be running locally and the model (
llama3in this repo) should be pulled beforehand:ollama pull llama3
📦 Installation
# Clone the repository
git clone https://github.com/your-username/hitl-middleware-demo.git
cd hitl-middleware-demo
# Create a virtual environment (recommended)
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
requirements.txt contains:
langchain==0.2.*
langgraph==0.1.*
langchain-ollama==0.2.*
🚀 Running the Project
1️⃣ Start the Agent (CLI)
python client.py
You will see a prompt like:
Agent: What would you like to know?
> Tell me the weather in Paris tomorrow.
...
[HITL] The agent wants to call tool `get_weather` with arguments:
{
"city": "Paris",
"date": "2024-06-01"
}
Approve? (approve/reject):
Type approve or reject and press Enter.
If approved, the tool runs; if rejected, the agent will re‑think.
2️⃣ Run a Single File Directly
You can also run each file individually:
# Agent definition (no output)
python agent.py
# Client that uses the agent
python client.py
🔍 Example Interaction
Agent: Tell me the weather in Tokyo tomorrow.
[HITL] The agent wants to call tool `get_weather` with arguments:
{
"city": "Tokyo",
"date": "2024-06-01"
}
Approve? (approve/reject): approve
Tool output: "Tomorrow in Tokyo, expect a high of 28°C and light showers."
Agent: The weather in Tokyo tomorrow will be around 28°C with light showers.
If you type reject, the agent will ask for clarification or try a different approach.
📚 Further Reading
Feel free to extend the toolset or replace ChatOllama with an OpenAI model by swapping imports.
Happy hacking! 🚀