diff --git a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md index a9ba232..1051ab2 100644 --- a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md +++ b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md @@ -1,129 +1,123 @@ -# Практическое задание №3 -**Память и подтверждение действий** +# Практическое задание №3: Память и подтверждение действий ---- +## Описание проекта +В этом задании вы доработаете агента из предыдущих практических работ, добавив: +- **Память разговора** – агент будет помнить все сообщения в рамках одного диалога. +- **Механизм подтверждения** – перед выполнением любого инструмента пользователь получает запрос на подтверждение. -## Описание - -В этом проекте реализована простая консольная утилита, которая демонстрирует работу с памятью (сохранение данных в файл) и подтверждением пользовательских действий. - -Основные возможности: - -- **Сохранение** введённых пользователем строк в JSON‑файл. -- **Загрузка** ранее сохранённого списка строк при запуске программы. -- **Подтверждение** удаления элемента из памяти через диалог «Да/Нет». -- Красивый вывод сообщений и таблиц с помощью библиотеки `rich`. - ---- +Для красивого вывода в консоли используется библиотека `rich`. ## Структура проекта - ``` -memory_confirm/ -├── data.json # Хранилище (создаётся при первом запуске) -├── main.py # Точка входа -└── utils.py # Вспомогательные функции +project/ +├── agent.py # Основной скрипт с реализацией агента +├── tools.py # Пользовательские инструменты +└── README.md # Это файл ``` -- **`main.py`** – основной скрипт, который запускает CLI‑интерфейс. -- **`utils.py`** – содержит функции для чтения/записи JSON и подтверждения действий. - ---- - ## Установка зависимостей ```bash -# Создайте виртуальное окружение (рекомендуется) +# Создайте виртуальное окружение (необязательно, но рекомендуется) python -m venv .venv -source .venv/bin/activate # Windows: .venv\Scripts\activate +source .venv/bin/activate # Windows: .\.venv\Scripts\activate -# Установите зависимости из requirements.txt -pip install -r requirements.txt +# Установите все необходимые пакеты +pip install langgraph rich openai # добавьте другие зависимости при необходимости ``` -`requirements.txt` содержит: +> **Важно** – `rich` нужен только для вывода, но без него скрипт будет работать. -```text -rich>=13.0.0 -``` +## Как запустить каждый файл -Если файла `requirements.txt` нет, установите вручную: +### 1. `tools.py` +Содержит пользовательские инструменты (например, поиск в интернете, вычисления и т.д.). +Запуск не требуется отдельно – он импортируется в `agent.py`. + +### 2. `agent.py` +Главный скрипт, который запускает агента. ```bash -pip install rich +python agent.py ``` ---- +При запуске вы увидите интерактивную сессию: -## Запуск программы +1. Введите сообщение. +2. Агент сформулирует запрос к инструменту и попросит подтвердить действие. +3. После подтверждения (`yes`/`no`) агент выполнит инструмент или отменит его. -### 1. Через команду +### 3. Пример запуска в режиме потоковой печати ```bash -python main.py +python agent.py --stream ``` -После запуска вы увидите меню: +Параметр `--stream` заставляет выводить ответы построчно, как это делает `rich`. -``` -=== Меню === -1. Добавить строку -2. Показать все строки -3. Удалить строку -4. Выход -Выберите действие: +## Пример использования + +```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 ``` -### 2. Пример использования +### Что происходит при запуске -```text -> python main.py -=== Меню === -1. Добавить строку -2. Показать все строки -3. Удалить строку -4. Выход -Выберите действие: 1 -Введите строку для сохранения: Hello, world! -✅ Строка успешно добавлена. +1. **Память**: `MemorySaver` сохраняет все сообщения и состояния агента для конкретного `thread_id`. При повторном вызове с тем же ID агент «видит» историю. +2. **Подтверждение**: Когда агент планирует вызвать инструмент, он выводит запрос вида: + ``` + [Agent] Предлагаю использовать инструмент "search". Подтвердить? (yes/no) + ``` +3. **Пауза** (`interrupt_before=['tools']`): Агент останавливается до подтверждения и ждёт ввода пользователя. -=== Меню === -... -``` +## Как добавить новый инструмент -#### Удаление +1. Создайте функцию в `tools.py`. +2. Зарегистрируйте её в списке `tools=[...]` при создании агента. +3. При необходимости обновите `system_prompt`, чтобы агент знал о новом инструменте. -```text -> python main.py -... (выбираем пункт 3) -Введите номер строки для удаления: 2 -Вы уверены, что хотите удалить строку "Пример"? [y/N]: y -✅ Строка удалена. -``` +## Тестирование ---- - -## Как это работает - -- **`utils.load_data()`** читает `data.json`. Если файл отсутствует – создаётся пустой список. -- **`utils.save_data(data)`** сохраняет список в JSON‑файл с отступом 4 пробела. -- **`utils.confirm(prompt)`** выводит запрос через `rich.prompt.Prompt.ask`, ожидая ответа `y/n`. - ---- - -## Тесты - -Для проверки корректности работы можно запустить: +Для проверки работы можно использовать простые тесты: ```bash python -m unittest discover tests ``` -(Если тестовые файлы находятся в каталоге `tests/`.) +> Убедитесь, что у вас есть файл `tests/` с соответствующими проверками. ---- +## FAQ + +| Вопрос | Ответ | +|--------|-------| +| Как изменить `thread_id`? | Передайте новый ID в `config = {"configurable": {"thread_id": "новый-id"}}`. | +| Что делать, если инструмент не подтверждается? | Агент просто пропускает вызов и продолжает диалог. | +| Можно ли отключить память? | Уберите `checkpointer=memory` при создании агента – тогда каждый запрос будет независимым. | ## Лицензия -MIT © 2026. ---- \ No newline at end of file +MIT © 2026 \ No newline at end of file