Постоянная память
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
Управление объемом
Память имеет строгие ограничения по количеству символов, чтобы системные промпты оставались компактными:
| Хранилище | Лимит | Типичное количество записей |
|---|---|---|
| memory | 2 200 симв. | 8–15 записей |
| user | 1 375 симв. | 5–10 записей |
Что происходит, когда память заполнена
Если попытка добавить запись приведет к превышению лимита, инструмент вернет ошибку:
{
"success": false,
"error": "Память заполнена на 2,100/2,200 симв. Добавление этой записи (250 симв.) приведет к превышению лимита. Сначала замените или удалите существующие записи.",
"current_entries": ["..."],
"usage": "2,100/2,200"
}
В этом случае агент должен:
- Просмотреть текущие записи (показаны в тексте ошибки)
- Выявить записи, которые можно удалить или объединить
- Использовать
replaceдля слияния связанных записей в более краткие версии - Затем вызвать
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.