Перейти к содержанию

Сессии

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

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

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

  1. База данных SQLite (~/.hermes/state.db) — структурированные метаданные сессий с полнотекстовым поиском FTS5
  2. Транскрипты 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:

display:
  resume_display: minimal   # по умолчанию: full

Совет 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 my research project

Название применяется немедленно. Если сессия ещё не создана в базе данных (например, вы выполняете /title до отправки первого сообщения), оно помещается в очередь и применяется после начала сессии.

Вы также можете переименовать существующие сессии из командной строки:

hermes sessions rename 20250305_091523_a1b2c3d4 "refactoring auth module"

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

  • Уникальность — никакие две сессии не могут иметь одинаковое название
  • Максимум 100 символов — сохраняет чистоту вывода списка
  • Очистка — управляющие символы, символы нулевой ширины и переопределения направления текста удаляются автоматически
  • Обычный 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:

Список сессий

# Список последних сессий (по умолчанию: последние 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

Информация Очистка удаляет только завершённые сессии (сессии, которые были явно завершены или автоматически сброшены). Активные сессии никогда не очищаются.

Статистика сессий

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: * Простые ключевые слова: 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, источник, 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 для разовой очистки без включения автоматической очистки.