Files
dz/solutions/69a86305c46fd26feae6bcaa_Human-in-the-Loop_через_middleware

HumanintheLoop через 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‑0601?"}]}, config=config)
print(state["messages"][-1]["content"])

После запуска вы увидите запрос подтверждения и сможете взаимодействовать с агентом, как описано выше.


📚 Полезные ссылки


🤝 Вклад

Если вы нашли ошибки или хотите добавить новые инструменты, создайте pull request.
Пожалуйста, придерживайтесь стиля кода из solution.py и добавляйте комментарии.

---```