Human‑in‑the‑Loop via Middleware
📖 Описание
В этом проекте реализован агент на базе LangChain, который при каждом вызове инструмента останавливается и запрашивает подтверждение пользователя.
- HumanInTheLoopMiddleware автоматически формирует запрос к пользователю (в терминале) с описанием того, что планирует сделать агент.
- Пользователь вводит одно из решений:
approve,rejectилиedit. После этого выполнение возобновляется через командуCommand(resume={"decisions": [...]}).
Таким образом, пользователь всегда контролирует действия агента и может корректировать их в реальном времени.
📦 Установка зависимостей
# Создайте виртуальное окружение (рекомендовано)
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Установите зависимости из requirements.txt
pip install -r requirements.txt
requirements.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 |
Пример запуска
# 1️⃣ Запустите агента
python agent.py
# 2️⃣ В другом терминале запустите сценарий взаимодействия
python run_agent.py
🧪 Пример использования
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 – можно изменить аргументы перед повторным вызовом.