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

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

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

В этом проекте реализован чат‑бот, построенный на LangGraph и OpenAI LLM, с добавленной памятью диалога и механизмом подтверждения каждого вызова инструмента пользователем.
Бот умеет:

  • хранить историю общения в памяти (MemorySaver);
  • прерываться перед каждым использованием внешнего инструмента (пауза interrupt_before=['tools']);
  • запрашивать у пользователя подтверждение, прежде чем выполнять инструмент.

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

.
├── solution.py          # основной скрипт с реализацией агента
└── README.md            # это файл

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

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

# Установите все необходимые пакеты
pip install langgraph langchain openai rich

Важно – для работы с OpenAI нужен ключ API.
Если переменная окружения OPENAI_API_KEY не задана, скрипт автоматически создаст «заглушку» LLM, которая возвращает фиктивный ответ.

Как запустить

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.

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

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 г.