Постоянная память

Hermes Agent обладает ограниченной, курируемой памятью, которая сохраняется между сессиями. Это позволяет ему помнить ваши предпочтения, проекты, окружение и то, чему он научился в процессе работы.

Как это работает

Память агента состоит из двух файлов:

ФайлНазначениеЛимит символов
MEMORY.mdЛичные заметки агента — факты об окружении, соглашения, извлеченные уроки2 200 символов (~800 токенов)
USER.mdПрофиль пользователя — ваши предпочтения, стиль общения, ожидания1 375 символов (~500 токенов)

Оба файла хранятся в ~/.hermes/memories/ и вставляются в системный промпт как неизменяемый снимок при запуске сессии. Агент управляет своей памятью с помощью инструмента memory — он может добавлять, заменять или удалять записи.

информация

Лимиты символов позволяют сохранять фокус памяти. Когда память заполнена, агент объединяет или заменяет записи, чтобы освободить место для новой информации.

Как память отображается в системном промпте

В начале каждой сессии записи памяти загружаются с диска и отрисовываются в системном промпте в виде неизменяемого блока:

══════════════════════════════════════════════
MEMORY (ваши личные заметки) [67% — 1,474/2,200 симв.]
══════════════════════════════════════════════
Проект пользователя — веб-сервис на Rust в ~/code/myapi с использованием Axum + SQLx
§
На этой машине установлена Ubuntu 22.04, есть Docker и Podman
§
Пользователь предпочитает краткие ответы и не любит многословные объяснения

Формат включает:

  • Заголовок, указывающий тип хранилища (MEMORY или USER PROFILE)
  • Процент использования и количество символов, чтобы агент знал емкость
  • Отдельные записи, разделенные символом-разделителем §
  • Записи могут быть многострочными

Парадигма «застывшего снимка»: Системный промпт фиксируется один раз при запуске сессии и никогда не меняется в процессе. Это сделано намеренно для сохранения префиксного кэша LLM и повышения производительности. Когда агент добавляет/удаляет записи памяти во время сессии, изменения немедленно сохраняются на диск, но появятся в системном промпте только при следующем запуске. Ответы инструментов всегда показывают актуальное состояние.

Действия инструмента памяти

Агент использует инструмент memory со следующими действиями:

  • add — Добавить новую запись в память
  • replace — Заменить существующую запись обновленным содержимым (используется поиск подстроки через old_text)
  • remove — Удалить запись, которая больше не актуальна (используется поиск подстроки через old_text)

Действие read отсутствует — содержимое памяти автоматически вставляется в системный промпт при запуске. Агент видит свои воспоминания как часть контекста беседы.

Сопоставление подстрок

Для действий replace и remove достаточно короткой уникальной подстроки — нет необходимости указывать весь текст записи. Параметр old_text должен быть уникальной подстрокой, которая идентифицирует ровно одну запись:

# Если память содержит "Пользователь предпочитает темную тему во всех редакторах"
memory(action="replace", target="memory",
old_text="dark mode",
content="Пользователь предпочитает светлую тему в VS Code, темную — в терминале")

Если подстрока совпадает с несколькими записями, возвращается ошибка с просьбой уточнить поисковый запрос.

Описание двух типов хранилищ

memory — Личные заметки агента

Информация, которую агенту нужно помнить об окружении, рабочих процессах и извлеченных уроках:

  • Факты об окружении (ОС, инструменты, структура проекта)
  • Соглашения и конфигурация проекта
  • Особенности инструментов и найденные обходные пути (workarounds)
  • Записи в дневнике выполненных задач
  • Эффективные навыки и техники

user — Профиль пользователя

Информация о личности пользователя, его предпочтениях и стиле общения:

  • Имя, роль, часовой пояс
  • Предпочтения в общении (кратко или подробно, предпочтительные форматы)
  • Раздражающие факторы и то, чего следует избегать
  • Рабочие привычки
  • Уровень технических навыков

Что сохранять, а что пропускать

Сохранять (проактивно)

Агент сохраняет информацию автоматически — просить его об этом не нужно. Он делает записи, когда узнает:

  • Предпочтения пользователя: «Я предпочитаю TypeScript, а не JavaScript» → сохранить в user
  • Факты об окружении: «На этом сервере стоит Debian 12 с PostgreSQL 16» → сохранить в memory
  • Исправления: «Не используй sudo для команд Docker, пользователь состоит в группе docker» → сохранить в memory
  • Соглашения: «В проекте используются табы, ширина строки 120 символов, докстринги в стиле Google» → сохранить в memory
  • Выполненная работа: «Мигрировал базу данных с MySQL на PostgreSQL 15.01.2026» → сохранить в memory
  • Явные просьбы: «Помни, что ротация моих API-ключей происходит ежемесячно» → сохранить в memory

Пропускать

  • Тривиальная/очевидная информация: «Пользователь спросил про Python» — слишком общо, чтобы быть полезным
  • Легко обнаруживаемые факты: «Python 3.12 поддерживает вложенность f-строк» — это можно найти в поиске
  • Избыточные данные: Большие блоки кода, лог-файлы, таблицы данных — слишком объемно для памяти
  • Эфемерная информация конкретной сессии: Пути к временным файлам, контекст разовой отладки
  • Информация, уже имеющаяся в файлах контекста: Содержимое SOUL.md и AGENTS.md

Управление объемом

Память имеет строгие ограничения по количеству символов, чтобы системные промпты оставались компактными:

ХранилищеЛимитТипичное количество записей
memory2 200 симв.8–15 записей
user1 375 симв.5–10 записей

Что происходит, когда память заполнена

Если попытка добавить запись приведет к превышению лимита, инструмент вернет ошибку:

{
"success": false,
"error": "Память заполнена на 2,100/2,200 симв. Добавление этой записи (250 симв.) приведет к превышению лимита. Сначала замените или удалите существующие записи.",
"current_entries": ["..."],
"usage": "2,100/2,200"
}

В этом случае агент должен:

  1. Просмотреть текущие записи (показаны в тексте ошибки)
  2. Выявить записи, которые можно удалить или объединить
  3. Использовать replace для слияния связанных записей в более краткие версии
  4. Затем вызвать add для новой записи

Лучшая практика: Когда память заполнена более чем на 80% (видно в заголовке системного промпта), объединяйте записи перед добавлением новых. Например, три отдельные записи типа «проект использует X» можно слить в одно описание стека проекта.

Примеры хороших записей в памяти

Компактные, информационно насыщенные записи работают лучше всего:

# Хорошо: Объединяет несколько связанных фактов
У пользователя macOS 14 Sonoma, есть Homebrew, Docker Desktop и Podman. Shell: zsh с oh-my-zsh. Редактор: VS Code с биндингами Vim.

# Хорошо: Конкретное, практически применимое соглашение
Проект ~/code/api использует Go 1.22, sqlc для запросов к БД, chi router. Запуск тестов: 'make test'. CI через GitHub Actions.

# Хорошо: Извлеченный урок в контексте
Для стейджинг-сервера (10.0.1.50) нужен порт SSH 2222, а не 22. Ключ лежит в ~/.ssh/staging_ed25519.

# Плохо: Слишком расплывчато
У пользователя есть проект.

# Плохо: Слишком многословно
5 января 2026 года пользователь попросил меня посмотреть его проект, который
находится в ~/code/api. Я обнаружил, что там используется Go версии 1.22 и...

Предотвращение дубликатов

Система памяти автоматически отклоняет точные дубликаты записей. Если вы попытаетесь добавить уже существующий текст, она вернет сообщение об успешном завершении с пометкой «дубликат не добавлен».

Сканирование на безопасность

Перед принятием записи сканируются на наличие паттернов инъекций и эксфильтрации данных, так как они попадают в системный промпт. Содержимое, соответствующее угрозам (промпт-инъекции, кража учетных данных, SSH-бэкдоры) или содержащее невидимые Unicode-символы, блокируется.

Помимо MEMORY.md и USER.md, агент может искать информацию в прошлых диалогах с помощью инструмента session_search:

  • Все CLI- и мессенджер-сессии хранятся в SQLite (~/.hermes/state.db) с поддержкой полнотекстового поиска FTS5
  • Поисковые запросы возвращают релевантные прошлые беседы с суммаризацией через Gemini Flash
  • Агент может найти то, что обсуждалось несколько недель назад, даже если информации нет в активной памяти
hermes sessions list    # Просмотр списка прошлых сессий

session_search против memory

ФункцияПостоянная памятьПоиск по сессиям
Емкость~1 300 токенов всегоНеограниченно (все сессии)
СкоростьМгновенно (в системном промпте)Требует поиска + суммаризации LLM
ПрименениеКлючевые факты всегда под рукойПоиск конкретных прошлых обсуждений
УправлениеКурируется агентом вручнуюАвтоматически — сохраняются все сессии
Расход токеновФиксирован на сессию (~1 300 токенов)По запросу (только при поиске)

Память предназначена для критически важных фактов, которые всегда должны быть в контексте. Поиск по сессиям нужен для ответов на вопросы типа «обсуждали ли мы X на прошлой неделе?», когда агенту нужно вспомнить детали прошлых разговоров.

Конфигурация

# В ~/.hermes/config.yaml
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200 # ~800 токенов
user_char_limit: 1375 # ~500 токенов

Интеграция с Honcho (кросс-сессионное моделирование пользователя)

Для более глубокого, генерируемого ИИ понимания пользователя, которое работает между сессиями и платформами, можно включить память Honcho. Honcho работает параллельно со встроенной памятью в режиме hybrid (по умолчанию) — MEMORY.md и USER.md остаются как есть, а Honcho добавляет сверху уровень постоянного моделирования пользователя.

hermes honcho setup

Подробности о конфигурации, инструментах и CLI см. в документации Honcho Memory.