# Практическое задание №3 – Память и подтверждение действий ## Описание проекта В этом проекте реализован чат‑бот, построенный на **LangGraph** и **OpenAI LLM**, с добавленной памятью диалога и механизмом подтверждения каждого вызова инструмента пользователем. Бот умеет: - хранить историю общения в памяти (`MemorySaver`); - прерываться перед каждым использованием внешнего инструмента (пауза `interrupt_before=['tools']`); - запрашивать у пользователя подтверждение, прежде чем выполнять инструмент. ## Структура проекта ``` . ├── solution.py # основной скрипт с реализацией агента └── README.md # это файл ``` ## Установка зависимостей ```bash # Создайте виртуальное окружение (необязательно, но рекомендуется) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите все необходимые пакеты pip install langgraph langchain openai rich ``` > **Важно** – для работы с OpenAI нужен ключ API. > Если переменная окружения `OPENAI_API_KEY` не задана, скрипт автоматически создаст «заглушку» LLM, которая возвращает фиктивный ответ. ## Как запустить ```bash python solution.py ``` После запуска бот будет ждать ввода пользователя в консоли. Пример взаимодействия: ``` User: Привет! Bot: Здравствуйте! Чем могу помочь? User: Сколько стоит 1 кг яблок? Bot (пауза): Вы хотите вызвать инструмент "price_lookup" с аргументами {"item": "яблоки", "quantity_kg": 1}? (Введите `yes` или `no`) User: yes Bot: Цена за 1 кг яблок составляет $3.50. ``` > В реальном запуске бот будет использовать OpenAI GPT‑4o (или другой выбранный LLM) и ваш собственный инструмент, который вы можете добавить в список `tools`. ## Пример использования ```python from langgraph.prebuilt import create_agent from langchain.tools import BaseTool from langgraph.checkpoint.memory import MemorySaver from rich.console import Console # 1. Создаём LLM (или заглушку) llm = ChatOpenAI(temperature=0) # 2. Определяем инструмент class EchoTool(BaseTool): name: str = "echo" description: str = "Возвращает переданный текст." def _run(self, text: str) -> str: return f"Echo: {text}" tools = [EchoTool()] # 3. Создаём память memory = MemorySaver() # 4. Конфигурируем агента с паузой и подтверждением agent = create_agent( model=llm, tools=tools, system_prompt="You are a helpful assistant.", checkpointer=memory, # нужна для памяти и паузы interrupt_before=['tools'], # остановка перед каждым вызовом инструмента ) # 5. Запускаем диалог console = Console() config = {"configurable": {"thread_id": "demo-thread"}} for chunk in agent.stream( {"messages": [{"role": "user", "content": "Привет!"}]}, config=config, ): console.print(chunk) ``` ## Что дальше - Добавьте собственные инструменты (например, поиск в интернете, работа с базой данных и т.д.). - Настройте более сложный `system_prompt` для конкретных задач. - Используйте разные `thread_id`, чтобы вести несколько независимых разговоров одновременно. --- **Автор:** *Ваша команда* **Дата:** 27 мая 2026 г.