diff --git a/README.md b/README.md index 09db51f..8e46469 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,119 @@ -# human-in-the-loop-cherez-middleware +# Human‑in‑the‑Loop Middleware Demo -Решение: Human-in-the-Loop через middleware \ No newline at end of file +This repository contains a minimal **LangChain** agent that demonstrates how to pause execution at every tool call and ask the user for approval or rejection before continuing. +The core of this behaviour is provided by `HumanInTheLoopMiddleware`, which automatically injects a confirmation step into the agent’s workflow. + +> ⚠️ The example uses the open‑source **Ollama** LLM backend. +> If you don’t have Ollama installed, follow the instructions in the *Prerequisites* section. + +--- + +## Table of Contents + +- [Description](#description) +- [Prerequisites](#prerequisites) +- [Installation](#installation) +- [Running the Demo](#running-the-demo) +- [Example Interaction](#example-interaction) + +--- + +## Description + +`solution.py` implements a LangChain agent that: + +1. **Creates** an LLM chain using `ChatOllama`. +2. **Wraps** it with a `MemorySaver` checkpoint for state persistence. +3. **Adds** the `HumanInTheLoopMiddleware`, which: + - Intercepts every tool call, + - Prints the intended action to the terminal (via `rich`), + - Prompts the user for `"approve"` or `"reject"`, + - Resumes execution based on the response. + +This pattern is useful when you want a human operator to supervise or validate each step of an automated workflow, without having to manually interrupt the agent. + +--- + +## Prerequisites + +| Item | Version | Notes | +|------|---------|-------| +| Python | ≥ 3.10 | Tested with 3.11 | +| pip | – | Standard package installer | +| **Ollama** | Latest | Install from https://ollama.ai/ and run `ollama serve` before starting the demo. | +| **OpenAI‑compatible model** | e.g., `llama2:7b` | Pull via `ollama pull llama2:7b`. | + +> **Tip:** If you prefer a different LLM, replace `ChatOllama` with any LangChain-compatible LLM (e.g., OpenAI, Anthropic). + +--- + +## Installation + +```bash +# 1. Clone the repo +git clone https://github.com/your-username/human-in-the-loop-demo.git +cd human-in-the-loop-demo + +# 2. Create a virtual environment (optional but recommended) +python -m venv .venv +source .venv/bin/activate # On Windows: .\.venv\Scripts\activate + +# 3. Install dependencies +pip install --upgrade pip +pip install langchain langgraph langchain-ollama rich +``` + +> **Note:** +> `langgraph` is required for the checkpointing and middleware support. + +--- + +## Running the Demo + +```bash +# Make sure Ollama server is running: +# ollama serve + +# Run the agent script +python solution.py +``` + +You will be prompted to enter a question. The agent will then: + +1. Generate a plan. +2. For each tool call, pause and display the intended action. +3. Await your `"approve"` or `"reject"` input before proceeding. + +--- + +## Example Interaction + +```text +$ python solution.py +Enter your question: What is the capital of France? + +[Agent] Thinking... +[HumanInTheLoopMiddleware] Tool call planned: "search" with query "capital of France" +Approve? (yes/no): yes + +[Agent] Executing tool... +Result: Paris + +[Agent] Continuing... + +Final answer: The capital of France is Paris. +``` + +If you type `no` instead of `yes`, the agent will skip that tool call and attempt to continue with its plan, potentially leading to a different outcome. + +--- + +## Customization + +- **Different tools** – Add more tools via `@tool` decorators or by passing a list to `create_agent`. +- **Custom prompt** – Modify the middleware’s confirmation message by subclassing `HumanInTheLoopMiddleware`. +- **Persist state** – The `MemorySaver` checkpoint can be swapped for a database-backed store if you need long‑term persistence. + +--- + +Happy experimenting! 🚀 \ No newline at end of file