Сессии
Hermes Agent автоматически сохраняет каждый разговор как сессию. Сессии позволяют возобновлять разговоры, выполнять поиск по сессиям и управлять полной историей разговоров.
Как работают сессии
Каждый разговор — будь то из CLI, Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Teams или любой другой платформы обмена сообщениями — сохраняется как сессия с полной историей сообщений. Сессии отслеживаются в двух дополняющих друг друга системах:
-
SQLite база данных (
~/.hermes/state.db) — структурированные метаданные сессий с полнотекстовым поиском FTS5 -
JSONL транскрипты (
~/.hermes/sessions/) — сырые транскрипты разговоров, включая вызовы инструментов (gateway)
База данных SQLite хранит:
-
ID сессии, исходная платформа, ID пользователя
-
Название сессии (уникальное, читаемое имя)
-
Название и конфигурация модели
-
Снимок системного промпта
-
Полная история сообщений (роль, содержимое, вызовы инструментов, результаты инструментов)
-
Количество токенов (ввод/вывод)
-
Временные метки (started_at, ended_at)
-
ID родительской сессии (для разделения сессии при сжатии)
Источники сессий
Каждая сессия помечена исходной платформой:
| Источник | Описание |
|---|---|
cli |
Интерактивный CLI (hermes или hermes chat) |
telegram |
Мессенджер Telegram |
discord |
Сервер/ЛС Discord |
slack |
Рабочее пространство Slack |
whatsapp |
Мессенджер WhatsApp |
signal |
Мессенджер Signal |
matrix |
Комнаты и ЛС Matrix |
mattermost |
Каналы Mattermost |
email |
Электронная почта (IMAP/SMTP) |
sms |
SMS через Twilio |
dingtalk |
Мессенджер DingTalk |
feishu |
Мессенджер Feishu/Lark |
wecom |
WeCom (WeChat Work) |
weixin |
Weixin (личный WeChat) |
bluebubbles |
Apple iMessage через сервер BlueBubbles на macOS |
qqbot |
QQ Bot (Tencent QQ) через Official API v2 |
homeassistant |
Разговор Home Assistant |
webhook |
Входящие webhook'и |
api-server |
Запросы API сервера |
acp |
Интеграция редактора ACP |
cron |
Запланированные cron задачи |
batch |
Пакетные запуски обработки |
Возобновление сессий в CLI
Возобновляйте предыдущие разговоры из CLI с помощью --continue или --resume:
Продолжить последнюю сессию
# Resume the most recent CLI session
hermes --continue
hermes -c
# Or with the chat subcommand
hermes chat --continue
hermes chat -c
Эта команда находит последнюю сессию cli в SQLite базе данных и загружает всю её историю разговора.
Возобновить по имени
Если вы дали сессии название (см. Именование сессий ниже), вы можете возобновить её по имени:
# Resume a named session
hermes -c "my project"
# If there are lineage variants (my project, my project #2, my project #3),
# this automatically resumes the most recent one
hermes -c "my project" # → resumes "my project #3"
Возобновить конкретную сессию
# Resume a specific session by ID
hermes --resume 20250305_091523_a1b2c3d4
hermes -r 20250305_091523_a1b2c3d4
# Resume by title
hermes --resume "refactoring auth"
# Or with the chat subcommand
hermes chat --resume 20250305_091523_a1b2c3d4
ID сессий отображаются при выходе из CLI сессии, и их можно найти с помощью hermes sessions list.
Краткий обзор разговора при возобновлении
При возобновлении сессии Hermes отображает компактный обзор предыдущего разговора в стилизованной панели перед строкой ввода:
Режим возобновления показывает компактную панель обзора с последними сообщениями пользователя и ассистента перед возвратом к активному вводу.
Обзор:
-
Показывает сообщения пользователя (золотой
●) и ответы ассистента (зелёный◆) -
Обрезает длинные сообщения (300 символов для пользователя, 200 символов / 3 строки для ассистента)
-
Сворачивает вызовы инструментов в количество с названиями инструментов (например,
[3 tool calls: terminal, web_search]) -
Скрывает системные сообщения, результаты инструментов и внутренние рассуждения
-
Ограничивает последними 10 обменами с индикатором "... N earlier messages ..."
-
Использует приглушённый стиль для отличия от активного разговора
Чтобы отключить обзор и оставить минимальное поведение одной строки, установите в ~/.hermes/config.yaml:
display:
resume_display: minimal # default: full
Именование сессий
Давайте сессиям читаемые названия, чтобы их было легко находить и возобновлять.
Автоматически генерируемые названия
Hermes автоматически генерирует короткое описательное название (3–7 слов) для каждой сессии после первого обмена. Это выполняется в фоновом потоке с использованием быстрой вспомогательной модели, поэтому не добавляет задержки. Вы увидите автоматически сгенерированные названия при просмотре сессий с помощью hermes sessions list или hermes sessions browse.
Автоматическое название генерируется только один раз для каждой сессии и пропускается, если вы уже задали название вручную.
Установка названия вручную
Используйте слэш-команду /title внутри любой сессии (CLI или gateway):
/title my research project
Название применяется немедленно. Если сессия ещё не создана в базе данных (например, вы выполнили /title до отправки первого сообщения), оно ставится в очередь и применяется после начала сессии.
Вы также можете переименовывать существующие сессии из командной строки:
hermes sessions rename 20250305_091523_a1b2c3d4 "refactoring auth module"
Правила названий
-
Уникальность — никакие две сессии не могут иметь одинаковое название
-
Максимум 100 символов — сохраняет чистоту вывода списка
-
Санитизация — управляющие символы, символы нулевой ширины и RTL-переопределения автоматически удаляются
-
Обычный Unicode допустим — эмодзи, CJK, диакритические знаки — всё работает
Автоматическая нумерация при сжатии
Когда контекст сессии сжимается (вручную через /compress или автоматически), Hermes создаёт новую продолженную сессию. Если у оригинальной было название, новая сессия автоматически получает нумерованное название:
"my project" → "my project #2" → "my project #3"
При возобновлении по имени (hermes -c "my project") автоматически выбирается самая последняя сессия в линейке.
/title в платформах обмена сообщениями
Команда /title работает на всех gateway платформах (Telegram, Discord, Slack, WhatsApp):
-
/title My Research— установить название сессии -
/title— показать текущее название
Команды управления сессиями
Hermes предоставляет полный набор команд управления сессиями через hermes sessions:
Список сессий
# List recent sessions (default: last 20)
hermes sessions list
# Filter by platform
hermes sessions list --source telegram
# Show more sessions
hermes sessions list --limit 50
Когда у сессий есть названия, вывод показывает названия, превью и относительные временные метки:
Title Preview Last Active ID
────────────────────────────────────────────────────────────────────────────────────────────────
refactoring auth Help me refactor the auth module please 2h ago 20250305_091523_a
my project #3 Can you check the test failures? yesterday 20250304_143022_e
— What's the weather in Las Vegas? 3d ago 20250303_101500_f
Если ни у одной сессии нет названий, используется более простой формат:
Preview Last Active Src ID
──────────────────────────────────────────────────────────────────────────────────────
Help me refactor the auth module please 2h ago cli 20250305_091523_a
What's the weather in Las Vegas? 3d ago tele 20250303_101500_f
Экспорт сессий
# Export all sessions to a JSONL file
hermes sessions export backup.jsonl
# Export sessions from a specific platform
hermes sessions export telegram-history.jsonl --source telegram
# Export a single session
hermes sessions export session.jsonl --session-id 20250305_091523_a1b2c3d4
Экспортированные файлы содержат по одному JSON объекту на строку с полными метаданными сессии и всеми сообщениями.
Удаление сессии
# Delete a specific session (with confirmation)
hermes sessions delete 20250305_091523_a1b2c3d4
# Delete without confirmation
hermes sessions delete 20250305_091523_a1b2c3d4 --yes
Переименование сессии
# Set or change a session's title
hermes sessions rename 20250305_091523_a1b2c3d4 "debugging auth flow"
# Multi-word titles don't need quotes in the CLI
hermes sessions rename 20250305_091523_a1b2c3d4 debugging auth flow
Если название уже используется другой сессией, отображается ошибка.
Очистка старых сессий
# Delete ended sessions older than 90 days (default)
hermes sessions prune
# Custom age threshold
hermes sessions prune --older-than 30
# Only prune sessions from a specific platform
hermes sessions prune --source telegram --older-than 60
# Skip confirmation
hermes sessions prune --older-than 30 --yes
Статистика сессий
hermes sessions stats
Вывод:
Total sessions: 142
Total messages: 3847
cli: 89 sessions
telegram: 38 sessions
discord: 15 sessions
Database size: 12.4 MB
Для более глубокой аналитики — использования токенов, оценки затрат, разбивки по инструментам и паттернов активности — используйте hermes insights.
Инструмент поиска по сессиям
У агента есть встроенный инструмент session_search, который выполняет полнотекстовый поиск по всем прошлым разговорам, используя движок FTS5 в SQLite.
Как это работает
-
FTS5 ищет соответствующие сообщения, отсортированные по релевантности
-
Группирует результаты по сессиям, берёт топ N уникальных сессий (по умолчанию 3)
-
Загружает разговор каждой сессии, обрезает до ~100K символов с центром на совпадениях
-
Отправляет быстрой модели суммаризации для создания сфокусированных кратких изложений
-
Возвращает краткие изложения по сессиям с метаданными и окружающим контекстом
Синтаксис запросов FTS5
Поиск поддерживает стандартный синтаксис запросов FTS5:
-
Простые ключевые слова:
docker deployment -
Фразы:
"exact phrase" -
Булевы операторы:
docker OR kubernetes,python NOT java -
Префикс:
deploy*
Когда это используется
Агенту даётся указание использовать поиск по сессиям автоматически:
"Когда пользователь ссылается на что-то из прошлого разговора или вы подозреваете, что существует релевантный предыдущий контекст, используйте session_search, чтобы вспомнить его, прежде чем просить пользователя повториться."
Отслеживание сессий по платформам
Gateway сессии
На платформах обмена сообщениями сессии привязаны к детерминированному ключу сессии, построенному из источника сообщения:
| Тип чата | Формат ключа по умолчанию | Поведение |
|---|---|---|
| Telegram ЛС | agent:main:telegram:dm:<chat_id> |
Одна сессия на ЛС чат |
| Discord ЛС | agent:main:discord:dm:<chat_id> |
Одна сессия на ЛС чат |
| WhatsApp ЛС | agent:main:whatsapp:dm:<canonical_identifier> |
Одна сессия на пользователя ЛС (LID/телефонные псевдонимы объединяются в одну личность при наличии сопоставления) |
| Групповой чат | agent:main:<platform>:group:<chat_id>:<user_id> |
По пользователю внутри группы, если платформа предоставляет ID пользователя |
| Групповой тред/тема | agent:main:<platform>:group:<chat_id>:<thread_id> |
Общая сессия для всех участников треда (по умолчанию). По пользователю с thread_sessions_per_user: true. |
| Канал | agent:main:<platform>:channel:<chat_id>:<user_id> |
По пользователю внутри канала, если платформа предоставляет ID пользователя |
Когда Hermes не может получить идентификатор участника для общего чата, он возвращается к одной общей сессии для этой комнаты.
Общие и изолированные групповые сессии
По умолчанию Hermes использует group_sessions_per_user: true в config.yaml. Это означает:
-
Алиса и Боб могут оба разговаривать с Hermes в одном канале Discord, не делясь историей транскриптов
-
длительная задача одного пользователя с большим количеством инструментов не загрязняет окно контекста другого пользователя
-
обработка прерываний также остаётся по пользователю, поскольку ключ запущенного агента совпадает с изолированным ключом сессии
Если вы хотите один общий «мозг комнаты», установите:
group_sessions_per_user: false
Это возвращает группы/каналы к одной общей сессии на комнату, что сохраняет общий контекст разговора, но также делит затраты на токены, состояние прерываний и рост контекста.
Политики сброса сессий
Gateway сессии автоматически сбрасываются на основе настраиваемых политик:
-
idle — сброс после N минут бездействия
-
daily — сброс в определённый час каждый день
-
both — сброс по первому наступившему событию (бездействие или ежедневно)
-
none — никогда не сбрасывать автоматически
Перед автоматическим сбросом сессии агенту даётся возможность сохранить важные воспоминания или навыки из разговора.
Сессии с активными фоновыми процессами никогда не сбрасываются автоматически, независимо от политики.
Расположение хранилища
| Что | Путь | Описание |
|---|---|---|
| SQLite база данных | ~/.hermes/state.db |
Все метаданные сессий + сообщения с FTS5 |
| Gateway транскрипты | ~/.hermes/sessions/ |
JSONL транскрипты каждой сессии + индекс sessions.json |
| Gateway индекс | ~/.hermes/sessions/sessions.json |
Сопоставляет ключи сессий с ID активных сессий |
База данных SQLite использует режим WAL для конкурентных читателей и одного писателя, что хорошо подходит для многоплатформенной архитектуры gateway.
Схема базы данных
Ключевые таблицы в state.db:
-
sessions — метаданные сессий (id, source, user_id, model, title, временные метки, количество токенов). Названия имеют уникальный индекс (NULL названия разрешены, только не-NULL должны быть уникальными).
-
messages — полная история сообщений (роль, содержимое, tool_calls, tool_name, token_count)
-
messages_fts — виртуальная таблица FTS5 для полнотекстового поиска по содержимому сообщений
Истечение срока и очистка сессий
Автоматическая очистка
-
Gateway сессии автоматически сбрасываются на основе настроенной политики сброса
-
Перед сбросом агент сохраняет воспоминания и навыки из истекающей сессии
-
Опциональная автоочистка: когда
sessions.auto_pruneустановлен вtrue, завершённые сессии старшеsessions.retention_days(по умолчанию 90) очищаются при запуске CLI/gateway -
После очистки, которая фактически удалила строки, выполняется
VACUUMдляstate.db, чтобы вернуть дисковое пространство (SQLite не уменьшает файл при обычном DELETE) -
Очистка выполняется не чаще одного раза в
sessions.min_interval_hours(по умолчанию 24); временная метка последнего запуска отслеживается внутри самогоstate.db, что обеспечивает общий доступ для всех процессов Hermes в однойHERMES_HOME
По умолчанию функция отключена — история сессий ценна для поиска через session_search, и её автоматическое удаление может удивить пользователей. Включите в ~/.hermes/config.yaml:
sessions:
auto_prune: true # opt in — default is false
retention_days: 90 # keep ended sessions this many days
vacuum_after_prune: true # reclaim disk space after a pruning sweep
min_interval_hours: 24 # don't re-run the sweep more often than this
Активные сессии никогда не очищаются автоматически, независимо от возраста.
Ручная очистка
# Prune sessions older than 90 days
hermes sessions prune
# Delete a specific session
hermes sessions delete <session_id>
# Export before pruning (backup)
hermes sessions export backup.jsonl
hermes sessions prune --older-than 30 --yes