# Практическое задание №3: Память и подтверждение действий ## Описание проекта В этом задании вы доработаете агента из предыдущих практических работ, добавив: - **Память разговора** – агент будет помнить все сообщения в рамках одного диалога. - **Механизм подтверждения** – перед выполнением любого инструмента пользователь получает запрос на подтверждение. Для красивого вывода в консоли используется библиотека `rich`. ## Структура проекта ``` project/ ├── agent.py # Основной скрипт с реализацией агента ├── tools.py # Пользовательские инструменты └── README.md # Это файл ``` ## Установка зависимостей ```bash # Создайте виртуальное окружение (необязательно, но рекомендуется) 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` Главный скрипт, который запускает агента. ```bash python agent.py ``` При запуске вы увидите интерактивную сессию: 1. Введите сообщение. 2. Агент сформулирует запрос к инструменту и попросит подтвердить действие. 3. После подтверждения (`yes`/`no`) агент выполнит инструмент или отменит его. ### 3. Пример запуска в режиме потоковой печати ```bash python agent.py --stream ``` Параметр `--stream` заставляет выводить ответы построчно, как это делает `rich`. ## Пример использования ```python # Внутри 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`, чтобы агент знал о новом инструменте. ## Тестирование Для проверки работы можно использовать простые тесты: ```bash python -m unittest discover tests ``` > Убедитесь, что у вас есть файл `tests/` с соответствующими проверками. ## FAQ | Вопрос | Ответ | |--------|-------| | Как изменить `thread_id`? | Передайте новый ID в `config = {"configurable": {"thread_id": "новый-id"}}`. | | Что делать, если инструмент не подтверждается? | Агент просто пропускает вызов и продолжает диалог. | | Можно ли отключить память? | Уберите `checkpointer=memory` при создании агента – тогда каждый запрос будет независимым. | ## Лицензия MIT © 2026