Сессии

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

Как работают сессии

Каждый разговор — будь то из CLI, Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Teams или любой другой платформы обмена сообщениями — сохраняется как сессия с полной историей сообщений. Сессии отслеживаются в двух дополняющих друг друга системах:

  1. SQLite база данных (~/.hermes/state.db) — структурированные метаданные сессий с полнотекстовым поиском FTS5

  2. JSONL транскрипты (~/.hermes/sessions/) — сырые транскрипты разговоров, включая вызовы инструментов (gateway)

База данных SQLite хранит:

Источники сессий

Каждая сессия помечена исходной платформой:

Источник Описание
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 отображает компактный обзор предыдущего разговора в стилизованной панели перед строкой ввода:

Стилизованный предварительный просмотр панели краткого обзора предыдущего разговора при возобновлении сессии Hermes.

Режим возобновления показывает компактную панель обзора с последними сообщениями пользователя и ассистента перед возвратом к активному вводу.

Обзор:

Чтобы отключить обзор и оставить минимальное поведение одной строки, установите в ~/.hermes/config.yaml:

display:
  resume_display: minimal   # default: full
ID сессий имеют формат `YYYYMMDD_HHMMSS_` — CLI/TUI сессии используют 6-символьный шестнадцатеричный суффикс (например, `20250305_091523_a1b2c3`), gateway сессии используют 8-символьный суффикс (например, `20250305_091523_a1b2c3d4`). Вы можете возобновить по ID (полному или уникальному префиксу) или по названию — оба способа работают с `-c` и `-r`.

Именование сессий

Давайте сессиям читаемые названия, чтобы их было легко находить и возобновлять.

Автоматически генерируемые названия

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"

Правила названий

Автоматическая нумерация при сжатии

Когда контекст сессии сжимается (вручную через /compress или автоматически), Hermes создаёт новую продолженную сессию. Если у оригинальной было название, новая сессия автоматически получает нумерованное название:

"my project" → "my project #2" → "my project #3"

При возобновлении по имени (hermes -c "my project") автоматически выбирается самая последняя сессия в линейке.

/title в платформах обмена сообщениями

Команда /title работает на всех gateway платформах (Telegram, Discord, Slack, WhatsApp):

Команды управления сессиями

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.

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

  1. FTS5 ищет соответствующие сообщения, отсортированные по релевантности

  2. Группирует результаты по сессиям, берёт топ N уникальных сессий (по умолчанию 3)

  3. Загружает разговор каждой сессии, обрезает до ~100K символов с центром на совпадениях

  4. Отправляет быстрой модели суммаризации для создания сфокусированных кратких изложений

  5. Возвращает краткие изложения по сессиям с метаданными и окружающим контекстом

Синтаксис запросов FTS5

Поиск поддерживает стандартный синтаксис запросов FTS5:

Когда это используется

Агенту даётся указание использовать поиск по сессиям автоматически:

"Когда пользователь ссылается на что-то из прошлого разговора или вы подозреваете, что существует релевантный предыдущий контекст, используйте 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. Это означает:

Если вы хотите один общий «мозг комнаты», установите:

group_sessions_per_user: false

Это возвращает группы/каналы к одной общей сессии на комнату, что сохраняет общий контекст разговора, но также делит затраты на токены, состояние прерываний и рост контекста.

Политики сброса сессий

Gateway сессии автоматически сбрасываются на основе настраиваемых политик:

Перед автоматическим сбросом сессии агенту даётся возможность сохранить важные воспоминания или навыки из разговора.

Сессии с активными фоновыми процессами никогда не сбрасываются автоматически, независимо от политики.

Расположение хранилища

Что Путь Описание
SQLite база данных ~/.hermes/state.db Все метаданные сессий + сообщения с FTS5
Gateway транскрипты ~/.hermes/sessions/ JSONL транскрипты каждой сессии + индекс sessions.json
Gateway индекс ~/.hermes/sessions/sessions.json Сопоставляет ключи сессий с ID активных сессий

База данных SQLite использует режим WAL для конкурентных читателей и одного писателя, что хорошо подходит для многоплатформенной архитектуры gateway.

Схема базы данных

Ключевые таблицы в state.db:

Истечение срока и очистка сессий

Автоматическая очистка

По умолчанию функция отключена — история сессий ценна для поиска через 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
База данных растёт медленно (обычно 10-15 MB для сотен сессий), и история сессий обеспечивает поиск `session_search` по прошлым разговорам, поэтому автоочистка поставляется отключённой. Включите её, если у вас интенсивная нагрузка gateway/cron, при которой `state.db` заметно влияет на производительность (наблюдаемый сбой: 384 MB state.db с ~1000 сессий замедляет вставки FTS5 и вывод списка `/resume`). Используйте `hermes sessions prune` для разовой очистки без включения автоматического механизма.