| # 🧠 HMP-Agent: REPL-цикл взаимодействия |
|
|
| ## 1. Обновление process_log |
| |
| - Скрипт REPL проверяет список процессов в БД (`process_log`), определяя, какие команды были выполнены, завершились ошибкой или завершились успешно. |
| - Поле `status` может принимать значения: |
| `ok`, `warning`, `error`, `timeout`, `offline`, `close` |
| - Завершённые процессы, обработанные LLM, помечаются как `close`, чтобы они больше не попадали в список видимого контекста. |
| - Скрипт может удалить закрытые процессы при очистке. |
| - LLM не имеет доступа к stdout/stderr напрямую — только к тем результатам, которые были подгружены скриптом и внесены в `process_log.result`. |
|
|
| ## 2. Подготовка контекста |
|
|
| Контексты, формируемые скриптом перед запросом к LLM: |
|
|
| - **контекст_1:** последние *K* реплик самого LLM (`llm_recent_responses` - история его собственных рассуждений). |
| - **контекст_2:** активные команды и процессы (из `process_log`, кроме тех, что со статусом `close`). Могут быть помечены как `in_progress`, `pending`, `error` и т.д. |
| - **контекст_3:** *запрошенные записи* из когнитивного дневника и семантического графа (`diary_entries`, `concepts`, `links`). Их список должен быть передан явно в промпте или выводе из предыдущих запросов LLM. |
| - **контекст_4:** *входящие сообщения*, например, от пользователя или других агентов (`notes`). |
| - В **manual-режиме** указывается общее количество сообщений по приоритетам, а также явный список ID сообщений (с их приоритетами). |
| - В **auto-режиме** можно задать фильтрацию (управляется LLM): по тэгам, приоритету (например, ≥ `important`), времени или источнику. Это позволяет избежать перегрузки LLM и держать поток сообщений под контролем. |
| - **контекст_5:** системные настройки, параметры конфигурации, текущее время, идентификатор текущей итерации, роли и т.д. |
| - **контекст_6 (llm_memory):** *внутренний дневник LLM*, куда она записывает собственные размышления, гипотезы, задачи и инсайты. |
| - Это не просто лог предыдущих сообщений, а именно *внутреннее долговременное хранилище* разума агента. |
| - Может быть представлено в виде таблицы `llm_memory`, отдельной от `agent_log`. |
| - **контекст_7:**: результат работы `anti-Stagnation Reflex` из предыдущей итерации |
| |
| ## 3. Запрос к LLM |
| |
| - Сформированный промпт включает все вышеперечисленные контексты. |
| - Также включаются инструкции о формате вывода (например, `# Команды:` в конце, структура JSON-блока и т.д.). |
| - При необходимости может использоваться системная инструкция (system prompt), содержащая цель агента, ограничения и текущий REPL-режим (manual/auto). |
| |
| ## 4. Извлечение команд |
| |
| - Скрипт парсит ответ LLM на предмет команд, размеченных как `# Команды:` (или в явном JSON-блоке). |
| - Каждая команда может включать: |
| - уникальный `cmd_id` |
| - `type` (например: `shell`, `diary_entry`, `graph_add`, `file_read`, `send_message` и т.д.) |
| - аргументы (`args`) |
| - описание (`description`) |
| - Рекомендуется предусмотреть *закрывающий тег* (`# Конец команд` или явное окончание JSON-блока), чтобы REPL-скрипт точно знал, где заканчивается команда. |
| Ответ может содержать команды: |
| - запрос детальной *справки* по команде |
| - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие) |
| - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей) |
| - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении) |
| - для *взаимодействия с Mesh* |
| - для управления *внешними процессами* из `process_log` (запустить процесс, остановить процесс, пометить запрос как обработанный) |
| - инициализация *очистки* `process_log`, `llm_recent_responses` и `notes` от устаревших записей |
| - для управления *настройками цикла*: количество возвращаемых записей `llm_recent_responses`, режим обработки сообщений пользователя (`manual` или `auto`) и фильтр для режима `auto`, пауза в секундах между итерациями цикла или включение режима idle-режима (разбудить при завершение таких-то процессов из `process_log`, получение новых сообщений с такими-то пораметрами в `notes` или через такое-то время; для отключения idle-режима достаточно выполнения одного из условий) |
| - и другие команды |
|
|
| ## 5. Проверка на идентичность вывода (Anti-Stagnation Reflex) |
|
|
| - Если вывод LLM идентичен предыдущему: |
| - Включается **Anti-Stagnation Reflex** |
| - Повторяющиеся реплики не отправляются в `llm_recent_responses` повторно но туда добавляется краткая запись, фиксирующая, запуск **Anti-Stagnation Reflex**. |
| - Идентичность может проверяться: |
| - По хешу или текстовому совпадению |
| - Через мини-запрос к LLM (без полного контекста) по шаблону: |
| `Сравни два ответа и оцени, содержатся ли в новом новые мысли или команды` |
| - Второй вариант сравнения является более предпочтительным, так как сравнивается смысл |
| |
| ## 6. Генерация нового тика (итерации) |
|
|
| - После выполнения команд и фиксации результатов: |
| - Создаётся новая запись в `agent_log` |
| - Текущие команды обновляют `process_log` |
| - Новые размышления записываются в `llm_memory` при необходимости |
| - REPL может переходить в спящий режим, если такой режим активирован LLM (idle-режим: пропуск 2-5 пунктов). |
|
|