# Практическое задание №3: Память и подтверждение действий ## Описание проекта В этом проекте реализован агент на базе LangGraph с поддержкой: - **Памяти разговора** – сохранение истории сообщений в `MemorySaver`. - **Подтверждения действия** – пауза перед вызовом любого инструмента, чтобы пользователь мог подтвердить или отменить действие. Агент использует модель GPT‑4o‑mini и простой инструмент поиска. Вывод осуществляется через библиотеку `rich`, что делает консольный интерфейс более читаемым. --- ## Установка зависимостей ```bash # Создайте виртуальное окружение (необязательно, но рекомендуется) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите все необходимые пакеты pip install -r requirements.txt ``` `requirements.txt` содержит: ```text langchain-openai>=0.2.0 langgraph>=0.1.0 rich>=13.0.0 python-dotenv # для удобного управления переменными окружения (необязательно) ``` > **Важно**: Установите ключ OpenAI в переменной окружения `OPENAI_API_KEY`. > Можно создать файл `.env` с содержимым: > ```dotenv > OPENAI_API_KEY=sk-... > ``` --- ## Запуск ### 1. Основной скрипт (`solution.py`) ```bash python solution.py ``` Скрипт запускает интерактивный чат‑бот, который: 1. Принимает ввод пользователя. 2. Пауза перед каждым вызовом инструмента `search`. 3. Показывает пользователю сообщение о предстоящем действии и ожидает подтверждения (`y`/`n`). 4. Если пользователь подтверждает – инструмент вызывается; иначе действие отменяется. ### 2. Тестовый скрипт (если есть) Если в проекте присутствует файл `test_solution.py`, его можно запустить так: ```bash pytest test_solution.py ``` --- ## Пример использования ```text $ python solution.py 🤖: Здравствуйте! Чем могу помочь? 🧑: Какую погоду будет завтра в Москве? 🤖: Я собираюсь выполнить поиск по запросу "погода завтра Москва". Продолжить? (y/n) y 🔍 Выполняю инструмент search... Результаты поиска по запросу 'погода завтра Москва': ... 🤖: Похоже, завтра в Москве будет облачно с небольшой вероятностью осадков. Есть ли ещё что‑то, чем могу помочь? ``` Если пользователь вводит `n`: ```text 🤖: Я собираюсь выполнить поиск по запросу "погода завтра Москва". Продолжить? (y/n) n 🤖: Операция отменена. Чем ещё могу помочь? ``` --- ## Как это работает 1. **MemorySaver** сохраняет состояние разговора, позволяя агенту помнить предыдущие сообщения. 2. `interrupt_before=['tools']` заставляет агент остановиться перед каждым вызовом инструмента. 3. Внутри цикла обработки сообщений пользователь получает запрос на подтверждение и вводит `y`/`n`. 4. После подтверждения инструмент вызывается через LangGraph, а результат возвращается в поток. --- ## Что можно улучшить - Добавить более сложные инструменты (например, API погоды). - Реализовать хранение истории в базе данных вместо памяти в RAM. - Поддержать несколько параллельных разговоров с разными `thread_id`. ---