# Human‑in‑the‑Loop via Middleware ## 📖 Описание В этом проекте реализован агент на базе LangChain, который при каждом вызове инструмента останавливается и запрашивает подтверждение пользователя. * **HumanInTheLoopMiddleware** автоматически формирует запрос к пользователю (в терминале) с описанием того, что планирует сделать агент. * Пользователь вводит одно из решений: `approve`, `reject` или `edit`. После этого выполнение возобновляется через команду `Command(resume={"decisions": [...]})`. Таким образом, пользователь всегда контролирует действия агента и может корректировать их в реальном времени. ## 📦 Установка зависимостей ```bash # Создайте виртуальное окружение (рекомендовано) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите зависимости из requirements.txt pip install -r requirements.txt ``` `requirements.txt` ```txt langchain==0.2.* langgraph==0.1.* openai==1.* python-dotenv==1.* ``` > **Важно**: > * `checkpointer=MemorySaver()` нужен для сохранения состояния паузы, иначе агент не сможет возобновиться после подтверждения. > * Убедитесь, что переменная окружения `OPENAI_API_KEY` установлена (или используйте `.env` файл). ## 🚀 Запуск файлов | Файл | Что делает | Как запустить | |------|------------|---------------| | `agent.py` | Создаёт агента с middleware и инструментом `get_weather`. | `python agent.py` | | `run_agent.py` | Демонстрирует взаимодействие: задаётся вопрос, агент вызывает инструмент, пользователь подтверждает. | `python run_agent.py` | ### Пример запуска ```bash # 1️⃣ Запустите агента python agent.py # 2️⃣ В другом терминале запустите сценарий взаимодействия python run_agent.py ``` ## 🧪 Пример использования ```python from langchain.agents import create_agent from langgraph.checkpoint.memory import MemorySaver from langchain.agents.middleware import HumanInTheLoopMiddleware # Инициализация памяти для сохранения состояния паузы memory = MemorySaver() agent = create_agent( model=llm, tools=[get_weather], system_prompt="Ты полезный ассистент", middleware=[ HumanInTheLoopMiddleware( interrupt_on={ "get_weather": True, # разрешаем все решения: approve, edit, reject }, description_prefix="Подтвердите вызов инструмента", ), ], checkpointer=memory, ) # Запрос к агенту response = agent.run("Какая погода в Москве?") print(response) ``` При выполнении агента вы увидите в терминале запрос вида: ``` [HumanInTheLoop] Подтвердите вызов инструмента: Agent wants to call tool 'get_weather' with arguments: {"location": "Moscow"} Enter decision (approve/reject/edit): ``` Введите `approve`, и агент продолжит работу, возвращая результат. Если ввести `reject` – запрос будет отменён, а если `edit` – можно изменить аргументы перед повторным вызовом. --- ## 📚 Дополнительные ресурсы * [Документация Human‑in‑the‑Loop — LangChain](https://docs.langchain.com/oss/python/langchain/human-in-the-loop) * [LangGraph Checkpointing](https://langgraph.org/docs/checkpoints) ---