diff --git a/README.md b/README.md index 6e0a168..6629043 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,61 @@ # Self‑Correcting LangGraph Agent -This repository contains a minimal example of a **self‑correcting agent** built with -[LangGraph](https://langchain-ai.github.io/langgraph/) and -[LangChain](https://langchain.com/). The agent: +## Overview -1. **Receives a natural‑language task** from the user. -2. **Executes the task** via an *unreliable* tool that fails 30 % of the time. -3. **Asks an LLM** (OpenAI GPT‑4o‑mini) to judge whether the result is correct. -4. **Retries automatically** until the judge says *success* or the maximum number - of attempts is reached. +This project implements a **self‑correcting agent** using LangGraph. The agent +performs a task, asks an LLM to judge the result, and retries automatically until +the result is judged **success** or the maximum number of attempts is reached. -The code demonstrates how to build a small state machine with LangGraph, how to -use a LLM as a *judge*, and how to implement retry logic. +The key components are: -## Setup +| Component | Purpose | +|-----------|---------| +| `AgentState` | Typed state that tracks the task, result, attempts, status, error and max_attempts | +| `unreliable_tool` | Simulates a tool that fails 30 % of the time (used to demonstrate retry logic) | +| `verify_result` | LLM judge that must reply with the single word `success` or `failed` | +| `handle_error` | Resets the error and sets the status back to `pending` for a retry | +| `execute_task` | Runs the unreliable tool and updates the state | +| `create_agent` | Builds the LangGraph with the above nodes and a retry loop | +| `create_agent_executor` | Compiles the graph into a runnable executor | +| CLI | Run the agent from the command line: `python agent.py "2+2" --max 5` | + +## How It Works + +1. **Start** – The graph begins at `execute_task`. +2. **Execute** – The tool runs. If it throws an exception, the state status becomes `failed`. +3. **Check attempts** – If the number of attempts is >= `max_attempts`, the graph ends with status `max_attempts`. +4. **Verify** – The LLM judges the result. If the verdict is `success`, the graph ends. If `failed`, it goes to `handle_error`. +5. **Retry** – `handle_error` clears the error and sets status to `pending`, then the graph loops back to `execute_task`. + +## Usage ```bash -# Optional: create a virtual environment -python -m venv venv -source venv/bin/activate # Windows: venv\Scripts\activate - # Install dependencies pip install -r requirements.txt -# Set your OpenAI API key -export OPENAI_API_KEY=YOUR_KEY # Windows: set OPENAI_API_KEY=YOUR_KEY +# Run the agent +python agent.py "2+2" --max 5 ``` -## Running the agent - -```bash -python agent.py "Вычисли 2+2" -``` - -You can also run the script without arguments – it will prompt you for a task. - -## Example output +The console will show the final state, e.g.: ``` -Введите задачу: 2+2 -Попытка 1: результат Result of 2+2 -Попытка 2: результат Result of 2+2 +--- Final State --- +result: 4 +attempts: 2 +status: success +error: None +max_attempts: 5 +``` -Итог: -Успех за 2 попыток. Результат: Result of 2+2 +## Requirements + +```text +langchain>=1.0.0 +langgraph>=1.0.0 +langchain-openai>=1.0.0 ``` -The exact number of attempts may vary because the tool fails randomly. +## Note ---- - -### How it works - -- **State** – `AgentState` tracks the task, result, number of attempts, status and - any error. -- **Nodes** – `execute_task`, `verify_result`, `handle_error`. -- **LLM judge** – a simple prompt that forces the model to answer only - "success" or "failed". -- **Graph** – a conditional router that loops back to `execute_task` on failure - until the maximum attempts are reached. - -Feel free to adapt the tool, the judge prompt, or the retry policy to fit your -needs. +The agent uses the OpenAI API. Make sure the environment variable `OPENAI_API_KEY` is set. \ No newline at end of file