Агент Hermes автоматически сохраняет каждый разговор как сеанс. Сеансы позволяют возобновлять разговоры, осуществлять поиск между сеансами и полностью управлять историей разговоров.
Как работают сеансы
Каждый разговор — будь то через CLI, Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Teams или любую другую платформу обмена сообщениями — сохраняется как сеанс с полной историей сообщений. Сеансы отслеживаются в двух взаимодополняющих системах:
База данных SQLite (~/.hermes/state.db) — структурированные метаданные сеанса с полнотекстовым поиском FTS5.
В базе данных SQLite хранятся:
- Идентификатор сеанса, исходная платформа, идентификатор пользователя.
- Название сеанса (уникальное, удобочитаемое имя)
- Название модели и конфигурация
- Снимок системного приглашения
- Полная история сообщений (роль, контент, вызовы инструментов, результаты инструментов)
- Подсчет токенов (ввод/вывод)
- Временные метки (начало_в, окончание_в)
- Идентификатор родительского сеанса (для разделения сеанса по принципу сжатия)
Источники сеансов
Каждый сеанс помечен своей исходной платформой:
Источник
Описание
cli
Интерактивный интерфейс командной строки (hermes или hermes chat)
telegram
Мессенджер Телеграм
discord
Сервер Discord/DM
slack
Слабое рабочее пространство
whatsapp
Мессенджер WhatsApp
signal
Сигнальный мессенджер
matrix
Матричные комнаты и личные сообщения
mattermost
Самые важные каналы
email
Электронная почта (IMAP/SMTP)
sms
СМС через Twilio
dingtalk
Мессенджер DingTalk
feishu
Фейшу/Жаворонок-мессенджер
wecom
WeCom (работа в WeChat)
weixin
Weixin (личный WeChat)
bluebubbles
Apple iMessage через сервер BlueBubbles macOS
qqbot
QQ Bot (Tencent QQ) через официальный API v2
homeassistant
Разговор с домашним помощником
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
hermeschat--continue
hermeschat-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--resume20250305_091523_a1b2c3d4
hermes-r20250305_091523_a1b2c3d4
# Resume by title
hermes--resume"refactoring auth"# Or with the chat subcommand
hermeschat--resume20250305_091523_a1b2c3d4
Идентификаторы сеансов отображаются при выходе из сеанса CLI, их можно найти с помощью hermes sessions list.
Резюме разговора при возобновлении
Когда вы возобновляете сеанс, Hermes отображает компактное изложение предыдущего разговора на стилизованной панели перед приглашением ввода:
В режиме возобновления перед возвратом к интерактивной подсказке отображается компактная панель с краткими сведениями о последних обращениях пользователя и помощника.
Резюме:
- Показывает сообщения пользователя (золотой ●) и ответы помощника (зеленый ◆)
- Обрезает длинные сообщения (300 символов для пользователя, 200 символов/3 строки для помощника).
- Сворачивает вызовы инструментов до количества с именами инструментов (например, [3 tool calls: terminal, web_search])
- Скрывает системные сообщения, результаты работы инструментов и внутренние рассуждения.
- Капс при последних 10 обменах с индикатором "...N предыдущих сообщений..."
– Использует тусклый стиль, чтобы отличить его от активного разговора.
Чтобы отключить резюме и сохранить минимальное однострочное поведение, установите в ~/.hermes/config.yaml:
display:resume_display:minimal# default: full
:::совет
Идентификаторы сеансов имеют формат YYYYMMDD_HHMMSS_<hex> — сеансы CLI/TUI используют 6-значный шестнадцатеричный суффикс (например, 20250305_091523_a1b2c3), сеансы шлюза используют 8-значный суффикс (например, 20250305_091523_a1b2c3d4). Вы можете возобновить работу по идентификатору (полный или уникальный префикс) или по должности — оба работают с -c и -r.
Именование сеанса
Дайте сеансам удобочитаемые названия, чтобы вы могли легко их найти и возобновить.
Автоматически созданные заголовки
Hermes автоматически генерирует краткий описательный заголовок (3–7 слов) для каждого сеанса после первого обмена сообщениями. Это выполняется в фоновом потоке с использованием быстрой вспомогательной модели, поэтому задержка не увеличивается. Вы увидите автоматически сгенерированные заголовки при просмотре сеансов с hermes sessions list или hermes sessions browse.
Автоматическое присвоение титров срабатывает только один раз за сеанс и пропускается, если вы уже установили заголовок вручную.
Установка заголовка вручную
Используйте косую черту /title внутри любого сеанса чата (CLI или шлюза):
/title my research project
Название применяется немедленно. Если сеанс еще не создан в базе данных (например, вы запустили /title перед отправкой первого сообщения), он ставится в очередь и применяется после запуска сеанса.
Вы также можете переименовать существующие сеансы из командной строки:
Автоматическое определение происхождения при сжатии
Когда контекст сеанса сжимается (вручную через /compress или автоматически), Hermes создает новый сеанс продолжения. Если у оригинала был заголовок, новый сеанс автоматически получает пронумерованный заголовок:
"my project" → "my project #2" → "my project #3"
Когда вы возобновляете сеанс по имени (hermes -c "my project"), он автоматически выбирает самый последний сеанс в линии.
/title на платформах обмена сообщениями
Команда /title работает на всех шлюзовых платформах (Telegram, Discord, Slack, WhatsApp):
/title My Research — задать заголовок сессии.
/title — показать текущий заголовок
Команды управления сеансом
Hermes предоставляет полный набор команд управления сеансом через hermes sessions:
Получение списка сеансов
# List recent sessions (default: last 20)
hermessessionslist
# Filter by platform
hermessessionslist--sourcetelegram
# Show more sessions
hermessessionslist--limit50
Если сеансы имеют заголовки, в выходных данных отображаются заголовки, предварительный просмотр и относительные метки времени:
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
hermessessionsexportbackup.jsonl
# Export sessions from a specific platform
hermessessionsexporttelegram-history.jsonl--sourcetelegram
# Export a single session
hermessessionsexportsession.jsonl--session-id20250305_091523_a1b2c3d4
Экспортированные файлы содержат по одному объекту JSON в строке с полными метаданными сеанса и всеми сообщениями.
Удалить сеанс
# Delete a specific session (with confirmation)
hermessessionsdelete20250305_091523_a1b2c3d4
# Delete without confirmation
hermessessionsdelete20250305_091523_a1b2c3d4--yes
Переименование сеанса
# Set or change a session's title
hermessessionsrename20250305_091523_a1b2c3d4"debugging auth flow"# Multi-word titles don't need quotes in the CLI
hermessessionsrename20250305_091523_a1b2c3d4debuggingauthflow
Если заголовок уже используется другим сеансом, отображается ошибка.
Удаление старых сессий
# Delete ended sessions older than 90 days (default)
hermessessionsprune
# Custom age threshold
hermessessionsprune--older-than30# Only prune sessions from a specific platform
hermessessionsprune--sourcetelegram--older-than60# Skip confirmation
hermessessionsprune--older-than30--yes
:::информация
При сокращении удаляются только завершенные сеансы (сеансы, которые были явно завершены или были автоматически сброшены). Активные сеансы никогда не удаляются.
Статистика сеансов
hermessessionsstats
Выход:
Total sessions: 142
Total messages: 3847
cli: 89 sessions
telegram: 38 sessions
discord: 15 sessions
Database size: 12.4 MB
Для более глубокого анализа — использования токенов, оценок затрат, разбивки инструментов и моделей активности — используйте hermes insights.
Инструмент поиска сеансов
Агент имеет встроенный инструмент session_search, который выполняет полнотекстовый поиск по всем прошлым диалогам с использованием механизма SQLite FTS5.
Как это работает
FTS5 ищет совпадающие сообщения, ранжированные по релевантности.
Группирует результаты по сеансам, берет N лучших уникальных сеансов (по умолчанию 3).
Загружает разговор каждого сеанса, усекает до ~ 100 тыс. символов, центрированных по совпадениям.
Отправляет в модель быстрого обобщения для целенаправленных сводок.
Возвращает сводные данные по сеансам с метаданными и окружающим контекстом.
Синтаксис запроса FTS5
Поиск поддерживает стандартный синтаксис запросов FTS5:
Простые ключевые слова: docker deployment
Фразы: "exact phrase"
Логическое значение: docker OR kubernetes, python NOT java
Префикс: deploy*
Когда он используется
Агенту будет предложено автоматически использовать поиск сеансов:
"Когда пользователь ссылается на что-то из прошлого разговора или вы подозреваете, что соответствующий предшествующий контекст существует, используйте session_search, чтобы вспомнить это, прежде чем просить его повториться."
Отслеживание сеансов на каждой платформе
Сеансы шлюза
На платформах обмена сообщениями сеансы фиксируются детерминированным ключом сеанса, созданным на основе источника сообщения:
Тип чата
Формат ключа по умолчанию
Поведение
Телеграмма в Директ
agent:main:telegram:dm:<chat_id>
Одна сессия на чат в DM
Дискорд ДМ
agent:main:discord:dm:<chat_id>
Одна сессия на чат в DM
WhatsApp в Директ
agent:main:whatsapp:dm:<canonical_identifier>
Один сеанс на каждого пользователя DM (при наличии сопоставления псевдонимы LID/телефона сворачиваются до одного идентификатора)
Групповой чат
agent:main:<platform>:group:<chat_id>:<user_id>
Для каждого пользователя внутри группы, когда платформа предоставляет идентификатор пользователя
Групповая тема/тема
agent:main:<platform>:group:<chat_id>:<thread_id>
Общий сеанс для всех участников потока (по умолчанию). Для каждого пользователя с thread_sessions_per_user: true.
Канал
agent:main:<platform>:channel:<chat_id>:<user_id>
Для каждого пользователя внутри канала, когда платформа предоставляет идентификатор пользователя
Если Hermes не может получить идентификатор участника общего чата, он возвращается к одному общему сеансу для этой комнаты.
Общие и изолированные групповые сеансы
По умолчанию Hermes использует group_sessions_per_user: true в config.yaml. Это означает:
Алиса и Боб могут общаться с Гермесом в одном и том же канале Discord, не делясь историей стенограммы.
длительная и трудоемкая задача одного пользователя не загрязняет контекстное окно другого пользователя
обработка прерываний также остается индивидуальной для каждого пользователя, поскольку ключ работающего агента соответствует изолированному ключу сеанса.
Если вместо этого вам нужен один общий «комнатный мозг», установите:
group_sessions_per_user:false
Это возвращает группы/каналы к одному общему сеансу в каждой комнате, что сохраняет общий контекст разговора, но также распределяет затраты токенов, состояние прерывания и рост контекста.
Политики сброса сеанса
Сеансы шлюза автоматически сбрасываются на основе настраиваемых политик:
idle — сброс после N минут бездействия
ежедневно — сбрасывается каждый день в определенный час.
both — сброс в зависимости от того, что наступит раньше (в режиме ожидания или ежедневно).
none — автоматический сброс не выполняется.
Прежде чем сеанс будет автоматически сброшен, агенту предоставляется возможность сохранить любые важные воспоминания или навыки из разговора.
Сеансы с активными фоновыми процессами никогда не сбрасываются автоматически, независимо от политики.
Места хранения
Что
Путь
Описание
База данных SQLite
~/.hermes/state.db
Все метаданные сеанса + сообщения с FTS5
Транскрипты шлюза
~/.hermes/sessions/
Транскрипты JSONL для каждого сеанса + индекс session.json
Индекс шлюза
~/.hermes/sessions/sessions.json
Сопоставляет ключи сеанса с идентификаторами активных сеансов
База данных SQLite использует режим WAL для одновременного чтения и одну запись, что хорошо соответствует многоплатформенной архитектуре шлюза.
Схема базы данных
Ключевые таблицы в state.db:
sessions — метаданные сеанса (идентификатор, источник, user_id, модель, заголовок, временные метки, количество токенов). Заголовки имеют уникальный индекс (разрешены заголовки NULL, уникальными должны быть только заголовки, отличные от NULL).
messages — полная история сообщений (роль, контент, вызовы_инструмента, имя_инструмента, количество_токенов)
messages_fts — виртуальная таблица FTS5 для полнотекстового поиска по содержимому сообщений.
Срок действия сеанса и очистка
Автоматическая очистка
Сеансы шлюза автоматически сбрасываются на основе настроенной политики сброса.
Перед сбросом агент сохраняет воспоминания и навыки из истекающей сессии.
Включенное автоматическое сокращение: если sessions.auto_prune равно true, завершенные сеансы старше sessions.retention_days (по умолчанию 90) удаляются при запуске CLI/шлюза.
После сокращения, которое фактически удалило строки, state.dbVACUUMed для освобождения дискового пространства (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 falseretention_days:90# keep ended sessions this many daysvacuum_after_prune:true# reclaim disk space after a pruning sweepmin_interval_hours:24# don't re-run the sweep more often than this
Активные сеансы никогда не удаляются автоматически, независимо от возраста.
Ручная очистка
# Prune sessions older than 90 days
hermessessionsprune
# Delete a specific session
hermessessionsdelete<session_id>
# Export before pruning (backup)
hermessessionsexportbackup.jsonl
hermessessionsprune--older-than30--yes
:::совет
База данных растет медленно (обычно: 10–15 МБ для сотен сеансов), а история сеансов позволяет session_search вспоминать прошлые разговоры, поэтому автоматическое сокращение поставок отключено. Включите его, если вы выполняете тяжелую рабочую нагрузку шлюза/cron, где state.db существенно влияет на производительность (наблюдаемый режим сбоя: 384 МБ state.db с ~ 1000 сеансами, замедляющими вставки FTS5 и листинг /resume). Используйте hermes sessions prune для однократной очистки без включения автоматической очистки.