Human‑in‑the‑Loop через Middleware
Пример реализации агента на LangGraph с встроенным HumanInTheLoopMiddleware.
При каждом вызове инструмента агент останавливается и выводит в терминал запрос
на подтверждение (approve / reject). После ответа пользователь может
продолжить выполнение, а агент продолжит работу.
📦 Установка зависимостей
# Создайте виртуальное окружение (рекомендуется)
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.export OPENAI_API_KEY="sk-..."
📁 Структура проекта
.
├── solution.py # Основной скрипт, реализующий агент
└── README.md # Текущий файл
▶️ Запуск
1. Запустите скрипт из командной строки
python solution.py
Скрипт автоматически создаст агента, подключит middleware и начнет диалог с пользователем.
2. Взаимодействие в терминале
После каждого вызова инструмента вы увидите сообщение вида:
⚠️ Инструмент: get_weather
Запрос: "Какая погода в Москве на 2024‑06‑01?"
Нужно подтвердить действие (approve/reject):
- Введите
approve– инструмент будет выполнен и результат вернётся агенту. - Введите
reject– вызов инструмента отменяется, агент продолжит работу без него.
📄 Пример использования
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"])
После запуска вы увидите запрос подтверждения и сможете взаимодействовать с агентом, как описано выше.
📚 Полезные ссылки
🤝 Вклад
Если вы нашли ошибки или хотите добавить новые инструменты, создайте pull request.
Пожалуйста, придерживайтесь стиля кода из solution.py и добавляйте комментарии.
---```