Сессии
На этой странице 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) через официальное API v2 |
homeassistant |
Диалог Home Assistant |
webhook |
Входящие вебхуки |
api-server |
Запросы API-сервера |
acp |
Интеграция с редактором ACP |
cron |
Запланированные cron-задачи |
batch |
Пакетные запуски обработки |
Возобновление сессий в CLI¶
Возобновляйте предыдущие диалоги из CLI с помощью --continue или --resume:
Продолжить последнюю сессию¶
# Возобновить самую последнюю сессию CLI
hermes --continue
hermes -c
# Или с подкомандой chat
hermes chat --continue
hermes chat -c
Эта команда находит самую последнюю сессию cli в базе данных SQLite и загружает её полную историю диалога.
Возобновить по имени¶
Если вы задали сессии название (см. Именование сессий ниже), вы можете возобновить её по имени:
# Возобновить именованную сессию
hermes -c "my project"
# Если есть варианты в линейке (my project, my project #2, my project #3),
# эта команда автоматически возобновляет самую последнюю
hermes -c "my project" # → возобновляет "my project #3"
Возобновить конкретную сессию¶
# Возобновить конкретную сессию по ID
hermes --resume 20250305_091523_a1b2c3d4
hermes -r 20250305_091523_a1b2c3d4
# Возобновить по названию
hermes --resume "refactoring auth"
# Или с подкомандой chat
hermes chat --resume 20250305_091523_a1b2c3d4
ID сессий отображаются при выходе из сессии CLI, а также их можно найти с помощью hermes sessions list.
Краткий обзор диалога при возобновлении¶
При возобновлении сессии Hermes отображает компактный обзор предыдущего диалога в стилизованной панели перед строкой ввода:
Стилизованный предпросмотр панели обзора предыдущего диалога, показываемой при возобновлении сессии Hermes.
Режим возобновления показывает компактную панель обзора с последними сообщениями пользователя и ассистента перед возвратом к активному вводу.
Обзор:
* Показывает сообщения пользователя (золотой ●) и ответы ассистента (зелёный ◆)
* Усекает длинные сообщения (300 символов для пользователя, 200 символов / 3 строки для ассистента)
* Сворачивает вызовы инструментов в количество с именами инструментов (например, [3 tool calls: terminal, web_search])
* Скрывает системные сообщения, результаты инструментов и внутренние рассуждения
* Ограничивает последними 10 обменами с индикатором «... N более ранних сообщений ...»
* Использует приглушённый стиль, чтобы отличаться от активного диалога
Чтобы отключить обзор и оставить минимальное однострочное поведение, установите в ~/.hermes/config.yaml:
Совет ID сессий имеют формат
YYYYMMDD_HHMMSS_<hex>— сессии CLI/TUI используют 6-символьный hex-суффикс (например,20250305_091523_a1b2c3), сессии gateway используют 8-символьный суффикс (например,20250305_091523_a1b2c3d4). Вы можете возобновить сессию по ID (полному или уникальному префиксу) или по названию — оба варианта работают с-cи-r.
Именование сессий¶
Присваивайте сессиям человекочитаемые названия, чтобы легко их находить и возобновлять.
Автоматически созданные названия¶
Hermes автоматически генерирует короткое описательное название (3–7 слов) для каждой сессии после первого обмена. Это выполняется в фоновом потоке с использованием быстрой вспомогательной модели, поэтому не добавляет задержки. Вы увидите автоматически созданные названия при просмотре сессий с помощью hermes sessions list или hermes sessions browse.
Авто-название создаётся только один раз для каждой сессии и пропускается, если вы уже задали название вручную.
Установка названия вручную¶
Используйте slash-команду /title внутри любой сессии чата (CLI или gateway):
Название применяется немедленно. Если сессия ещё не создана в базе данных (например, вы выполняете /title до отправки первого сообщения), оно помещается в очередь и применяется после начала сессии.
Вы также можете переименовать существующие сессии из командной строки:
Правила названий¶
- Уникальность — никакие две сессии не могут иметь одинаковое название
- Максимум 100 символов — сохраняет чистоту вывода списка
- Очистка — управляющие символы, символы нулевой ширины и переопределения направления текста удаляются автоматически
- Обычный Unicode поддерживается — эмодзи, CJK, символы с диакритическими знаками — всё работает
Автоматическая нумерация при сжатии¶
Когда контекст сессии сжимается (вручную через /compress или автоматически), Hermes создаёт новую продолжающую сессию. Если у исходной было название, новая сессия автоматически получает нумерованное название:
При возобновлении по имени (hermes -c "my project") автоматически выбирается самая последняя сессия в линейке.
/title на платформах обмена сообщениями¶
Команда /title работает на всех платформах gateway (Telegram, Discord, Slack, WhatsApp):
* /title My Research — установить название сессии
* /title — показать текущее название
Команды управления сессиями¶
Hermes предоставляет полный набор команд для управления сессиями через hermes sessions:
Список сессий¶
# Список последних сессий (по умолчанию: последние 20)
hermes sessions list
# Фильтр по платформе
hermes sessions list --source telegram
# Показать больше сессий
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
Экспорт сессий¶
# Экспорт всех сессий в JSONL-файл
hermes sessions export backup.jsonl
# Экспорт сессий с определённой платформы
hermes sessions export telegram-history.jsonl --source telegram
# Экспорт одной сессии
hermes sessions export session.jsonl --session-id 20250305_091523_a1b2c3d4
Экспортированные файлы содержат один JSON-объект на строку с полными метаданными сессии и всеми сообщениями.
Удаление сессии¶
# Удаление конкретной сессии (с подтверждением)
hermes sessions delete 20250305_091523_a1b2c3d4
# Удаление без подтверждения
hermes sessions delete 20250305_091523_a1b2c3d4 --yes
Переименование сессии¶
# Установить или изменить название сессии
hermes sessions rename 20250305_091523_a1b2c3d4 "debugging auth flow"
# Многословные названия не требуют кавычек в CLI
hermes sessions rename 20250305_091523_a1b2c3d4 debugging auth flow
Если название уже используется другой сессией, отображается ошибка.
Очистка старых сессий¶
# Удаление завершённых сессий старше 90 дней (по умолчанию)
hermes sessions prune
# Произвольный порог давности
hermes sessions prune --older-than 30
# Очистка только сессий с определённой платформы
hermes sessions prune --source telegram --older-than 60
# Пропустить подтверждение
hermes sessions prune --older-than 30 --yes
Информация Очистка удаляет только завершённые сессии (сессии, которые были явно завершены или автоматически сброшены). Активные сессии никогда не очищаются.
Статистика сессий¶
Вывод:
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, не имея доступа к истории транскриптов друг друга
* длинная задача одного пользователя с интенсивным использованием инструментов не засоряет окно контекста другого пользователя
* обработка прерываний также остаётся на пользователя, потому что ключ запущенного агента совпадает с ключом изолированной сессии
Если вы хотите один общий «мозг комнаты», установите:
Это возвращает группы/каналы к одной общей сессии на комнату, что сохраняет общий контекст диалога, но также делит затраты на токены, состояние прерываний и рост контекста.
Политики сброса сессий¶
Сессии 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, источник, user_id, модель, название, временные метки, количество токенов). Названия имеют уникальный индекс (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 # опционально — по умолчанию false
retention_days: 90 # хранить завершённые сессии указанное количество дней
vacuum_after_prune: true # освобождать дисковое пространство после очистки
min_interval_hours: 24 # не запускать очистку чаще этого интервала
Активные сессии никогда не очищаются автоматически, независимо от возраста.
Ручная очистка¶
# Очистить сессии старше 90 дней
hermes sessions prune
# Удалить конкретную сессию
hermes sessions delete <session_id>
# Экспорт перед очисткой (резервное копирование)
hermes sessions export backup.jsonl
hermes sessions prune --older-than 30 --yes
Совет База данных растёт медленно (обычно 10–15 MB для сотен сессий), а история сессий обеспечивает поиск
session_searchпо прошлым диалогам, поэтому авто-очистка поставляется отключённой. Включите её, если вы работаете с интенсивной нагрузкой gateway/cron, гдеstate.dbзаметно влияет на производительность (наблюдаемый сценарий сбоя: 384 MB state.db с ~1000 сессий замедляют вставки FTS5 и вывод списка/resume). Используйтеhermes sessions pruneдля разовой очистки без включения автоматической очистки.
- Как работают сессии
- Источники сессий
- Возобновление сессий в CLI
- Продолжить последнюю сессию
- Возобновить по имени
- Возобновить конкретную сессию
- Краткий обзор диалога при возобновлении
- Именование сессий
- Автоматически созданные названия
- Установка названия вручную
- Правила названий
- Автоматическая нумерация при сжатии
- /title на платформах обмена сообщениями
- Команды управления сессиями
- Список сессий
- Экспорт сессий
- Удаление сессии
- Переименование сессии
- Очистка старых сессий
- Статистика сессий
- Инструмент поиска по сессиям
- Как это работает
- Синтаксис запросов FTS5
- Когда он используется
- Отслеживание сессий по платформам
- Сессии Gateway
- Общие и изолированные групповые сессии
- Политики сброса сессий
- Расположение хранилища
- Схема базы данных
- Истечение срока и очистка сессий
- Автоматическая очистка
- Ручная очистка