Files
dz/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве

Практическое задание №3: Память и подтверждение действий

Описание проекта

В этом задании вы доработаете агента из предыдущих практических работ, добавив:

  • Память разговора – агент будет помнить все сообщения в рамках одного диалога.
  • Механизм подтверждения – перед выполнением любого инструмента пользователь получает запрос на подтверждение.

Для красивого вывода в консоли используется библиотека rich.

Структура проекта

project/
├── agent.py          # Основной скрипт с реализацией агента
├── tools.py          # Пользовательские инструменты
└── README.md         # Это файл

Установка зависимостей

# Создайте виртуальное окружение (необязательно, но рекомендуется)
python -m venv .venv
source .venv/bin/activate   # Windows: .\.venv\Scripts\activate

# Установите все необходимые пакеты
pip install langgraph rich openai  # добавьте другие зависимости при необходимости

Важно rich нужен только для вывода, но без него скрипт будет работать.

Как запустить каждый файл

1. tools.py

Содержит пользовательские инструменты (например, поиск в интернете, вычисления и т.д.).
Запуск не требуется отдельно – он импортируется в agent.py.

2. agent.py

Главный скрипт, который запускает агента.

python agent.py

При запуске вы увидите интерактивную сессию:

  1. Введите сообщение.
  2. Агент сформулирует запрос к инструменту и попросит подтвердить действие.
  3. После подтверждения (yes/no) агент выполнит инструмент или отменит его.

3. Пример запуска в режиме потоковой печати

python agent.py --stream

Параметр --stream заставляет выводить ответы построчно, как это делает rich.

Пример использования

# Внутри agent.py (или в интерактивной сессии)
from langgraph.checkpoint.memory import MemorySaver
from rich.console import Console
import os

console = Console()

# Инициализация памяти и агента
memory = MemorySaver()
agent = create_agent(
    model=llm,
    tools=[my_tool],
    system_prompt="You are a helpful assistant.",
    checkpointer=memory,
    interrupt_before=['tools']  # пауза перед каждым инструментом
)

# Конфигурация диалога (thread_id)
config = {"configurable": {"thread_id": "conversation-1"}}

# Запуск агента с потоковым выводом
for chunk in agent.stream({"messages": [{"role":"user","content":"Расскажи о Python"}]}, config=config):
    console.print(chunk, end="")

# После завершения можно продолжить диалог в том же thread_id

Что происходит при запуске

  1. Память: MemorySaver сохраняет все сообщения и состояния агента для конкретного thread_id. При повторном вызове с тем же ID агент «видит» историю.
  2. Подтверждение: Когда агент планирует вызвать инструмент, он выводит запрос вида:
    [Agent] Предлагаю использовать инструмент "search". Подтвердить? (yes/no)
    
  3. Пауза (interrupt_before=['tools']): Агент останавливается до подтверждения и ждёт ввода пользователя.

Как добавить новый инструмент

  1. Создайте функцию в tools.py.
  2. Зарегистрируйте её в списке tools=[...] при создании агента.
  3. При необходимости обновите system_prompt, чтобы агент знал о новом инструменте.

Тестирование

Для проверки работы можно использовать простые тесты:

python -m unittest discover tests

Убедитесь, что у вас есть файл tests/ с соответствующими проверками.

FAQ

Вопрос Ответ
Как изменить thread_id? Передайте новый ID в config = {"configurable": {"thread_id": "новый-id"}}.
Что делать, если инструмент не подтверждается? Агент просто пропускает вызов и продолжает диалог.
Можно ли отключить память? Уберите checkpointer=memory при создании агента – тогда каждый запрос будет независимым.

Лицензия

MIT © 2026