# Human‑in‑the‑Loop через Middleware Пример реализации агента на LangGraph с встроенным `HumanInTheLoopMiddleware`. При каждом вызове инструмента агент останавливается и выводит в терминал запрос на подтверждение (`approve` / `reject`). После ответа пользователь может продолжить выполнение, а агент продолжит работу. --- ## 📦 Установка зависимостей ```bash # Создайте виртуальное окружение (рекомендуется) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите необходимые пакеты pip install langgraph langchain-core langchain-openai openai tqdm ``` > **Важно** > Для работы с OpenAI API понадобится переменная окружения `OPENAI_API_KEY`. > ```bash > export OPENAI_API_KEY="sk-..." > ``` --- ## 📁 Структура проекта ```text . ├── solution.py # Основной скрипт, реализующий агент └── README.md # Текущий файл ``` --- ## ▶️ Запуск ### 1. Запустите скрипт из командной строки ```bash python solution.py ``` > Скрипт автоматически создаст агента, подключит middleware и начнет диалог с пользователем. ### 2. Взаимодействие в терминале После каждого вызова инструмента вы увидите сообщение вида: ``` ⚠️ Инструмент: get_weather Запрос: "Какая погода в Москве на 2024‑06‑01?" Нужно подтвердить действие (approve/reject): ``` - Введите `approve` – инструмент будет выполнен и результат вернётся агенту. - Введите `reject` – вызов инструмента отменяется, агент продолжит работу без него. --- ## 📄 Пример использования ```python from langgraph.prebuilt import create_react_agent from langchain.tools import tool from langgraph.checkpoint.memory import MemorySaver from langgraph.types import Command from langgraph.moderation import HumanInTheLoopMiddleware # 1. Определяем инструмент @tool def get_weather(city: str, date: str) -> str: """Возвращает погоду в городе на указанную дату.""" return f"Погода в {city} на {date}: солнечно 25°C." # 2. Создаём агент с middleware memory = MemorySaver() agent = create_react_agent( tools=[get_weather], memory=memory, middleware=[HumanInTheLoopMiddleware()], ) # 3. Запускаем диалог config = {"thread_id": "session-1"} state = agent.invoke({"messages": [{"role": "user", "content": "Какая погода в Москве на 2024‑06‑01?"}]}, config=config) print(state["messages"][-1]["content"]) ``` > После запуска вы увидите запрос подтверждения и сможете взаимодействовать с агентом, как описано выше. --- ## 📚 Полезные ссылки - [Документация LangChain – Human‑in‑the‑Loop](https://docs.langchain.com/oss/python/langchain/human-in-the-loop) - [LangGraph GitHub репозиторий](https://github.com/run-llama/langgraph) --- ## 🤝 Вклад Если вы нашли ошибки или хотите добавить новые инструменты, создайте pull request. Пожалуйста, придерживайтесь стиля кода из `solution.py` и добавляйте комментарии. ---```