lang: ru sidebar_position: 7 title: "Sessions" description: "Session persistence, resume, search, management, and per-platform session tracking"
Сеансы
Агент Hermes автоматически сохраняет каждый разговор как сеанс. Сеансы позволяют возобновлять разговоры, осуществлять поиск между сеансами и полностью управлять историей разговоров.
Как работают сеансы
Каждый разговор — будь то из CLI, Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Teams или любой другой платформы обмена сообщениями — сохраняется как сеанс с полной историей сообщений. Сессии отслеживаются в:
- База данных SQLite (
~/.hermes/state.db) — структурированные метаданные сеанса с полнотекстовым поиском FTS5, а также полная история сообщений.
В базе данных SQLite хранятся: - Идентификатор сеанса, исходная платформа, идентификатор пользователя. - Название сеанса (уникальное, удобочитаемое имя) - Название модели и конфигурация - Снимок системного приглашения - Полная история сообщений (роль, контент, вызовы инструментов, результаты инструментов) - Подсчет токенов (ввод/вывод) - Временные метки (начало_в, окончание_в) - Идентификатор родительского сеанса (для разделения сеанса по принципу сжатия)
Что имеет значение для контекста
Гермес сохраняет историю сеансов, чтобы иметь возможность возобновить разговор, но не делает этого. продолжайте повторно отправлять каждый байт, который он когда-либо обрабатывал. На каждом ходу модель видит выбранное системное приглашение, текущее окно разговора и любой контент Гермес явно делает инъекцию для этого поворота.
Вложения мультимедиа обрабатываются как входные данные с пошаговой областью действия:
- Изображения могут быть изначально прикреплены к следующему вызову модели или предварительно проанализированы в текстовое описание, если активная модель не поддерживает собственное зрение.
- Аудио транскрибируется в текст, если настроено преобразование речи в текст.
- Текстовые документы могут включать извлеченный текст; другие типы документов обычно представлены сохраненным локальным путем и короткой заметкой.
- Пути вложений и извлеченный/производный текст могут отображаться в расшифровке, но байты необработанного изображения, аудио или двоичного файла не копируются повторно в будущие подсказки.
Например, если пользователь отправляет изображение и просит Гермеса сделать из него мем, Гермес может один раз осмотреть это изображение с помощью зрения и запустить обработку изображения. сценарий. Будущие повороты не переносят автоматически исходный JPEG в контекст. Они несут только то, что было написано в разговоре, например, сообщения пользователя. запрос, краткое описание изображения, путь к локальному кешу или последний помощник ответ.
Наиболее распространенной причиной роста контекста является не сам медиафайл. Это подробный текст: вставленные расшифровки, полные журналы, большие выходные данные инструмента, длинные различия, повторяющиеся отчеты о состоянии и подробные дампы доказательств. Предпочитаю резюме, файл пути, целевые фрагменты и поиск с помощью инструментов при копировании больших артефактов. в чат.
💡 Tip
Используйте/compress, когда сеанс становится длинным, /new для нового потока и
«Обрезать сеансы Hermes» только в том случае, если вы хотите удалить старые завершенные сеансы из
хранилище. Если state.db просто стал большим, начните с неразрушающего
первый вариант: оптимизация сеансов Hermes объединяет сегменты индекса FTS5 и
Очищает базу данных, не затрагивая данные сеанса. Сжатие уменьшает активный контекст; это не удаление конфиденциальности.
Передайте имя в /new (например, /new Payments-Refactor), чтобы установить новый сеанс.
начальный заголовок заранее — полезно, чтобы найти его позже с помощью /resume <name> или
в средстве выбора /sessions.Источники сеансов
Каждый сеанс помечен своей исходной платформой:
| Источник | Описание |
|---|---|
кли |
Интерактивный CLI («Гермес» или «Гермес-чат») |
телеграмма |
Мессенджер Телеграм |
раздор |
Сервер Discord/DM |
слаба |
Слабое рабочее пространство |
WhatsApp |
Мессенджер WhatsApp |
сигнал |
Сигнальный мессенджер |
матрица |
Матричные комнаты и личные сообщения |
самое важное |
Самые важные каналы |
электронная почта |
Электронная почта (IMAP/SMTP) |
смс |
СМС через Twilio |
дингтолк |
Мессенджер DingTalk |
фейшу |
Фейшу/Жаворонок-мессенджер |
веком |
WeCom (работа в WeChat) |
вэйсинь |
Weixin (личный WeChat) |
голубые пузыри |
Apple iMessage через сервер BlueBubbles macOS |
qqbot |
QQ Bot (Tencent QQ) через официальный API v2 |
домашний помощник |
Разговор с домашним помощником |
вебхук |
Входящие вебхуки |
api-сервер |
API-запросы к серверу |
акп |
Интеграция редактора ACP |
крон |
Запланированные задания cron |
партия |
Пакетная обработка выполняется |
Возобновление сеанса 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"
# Resume the most recent session — same lookup as -c
hermes --resume latest
# Or with the chat subcommand
hermes chat --resume 20250305_091523_a1b2c3d4
Идентификаторы сеансов последовательно при выходе из сеанса CLI и их можно найти в «списке сеансов Hermes».
📝 Note
latest — зарезервированное ключевое слово для --resume. Сеансы с буквенным названием «последний» по-прежнему доступны по его идентификатору или через «-c последний» (соответствие заголовка).Резюме в простом каталоге
Передайте --in <dir>, чтобы перейти в каталог перед запуском или включением. В сочетании с --resumelatest (или -c) вы выбираете самый последний сеанс для рабочей области этого каталога — нет необходимости сначала cd или запоминать идентификаторы сеанса:
# Resume the latest session that belongs to./my-project
hermes --resume latest --in./my-project
# Works with the TUI too
hermes --tui --resume latest --in./my-project
--in также включает сеанс в этом каталоге: указанный рабочий каталог возобновления сеанса не поддерживается (как если бы было передано --no-restore-cwd).
Резюме
При включении сеанса CLI также cd возвращается в регулярный рабочий каталог сеанса (корневой каталог git-репо или каталог проекта), поэтому разговор возобновляется в рабочей области, к которой он принадлежит. Если вы предпочитаете оставаться там, где находитесь, передайте --no-restore-cwd:
hermes --resume 20250305_091523_a1b2c3 --no-restore-cwd
Строка ↪ восстановленная рабочая область: … подтверждено переключение. Сбои восстановления никогда не нарушают само резюме.
Фильтрация сеансов в рабочей области
Список сеансов Hermes использует --workspace <needle> для отображения только сеансов, ключ рабочего пространства которых (корень git repo, иначе cwd) соответствует — по подстроке пути или точному базовому имени каталога:
hermes sessions list --workspace my-project
hermes sessions list --workspace ~/code/hermes-agent
Резюме разговора при восстановлении
Когда вы продолжите сеанс, Гермес отобразит компактное изложение разговора на стилизованной панели перед вводом приглашения:
В режиме включения отображается компактная панель с небольшим количеством сведений о последних обращениях пользователя и помощника, прежде чем вернуться к интерактивной подсказке.
Резюме:
- Показывает сообщения пользователя (золотой ا) и ответы помощника (зеленый ◆).
- Обрезает длинные сообщения (300 символов для пользователя, 200 символов/3 строки для помощника).
- Сворачивает вызовы инструментов по количеству названий инструментов (например, [3 инструмента вызова: терминал, web_search])
- Скрывает системные сообщения, результаты работы инструментов и внутренние рассуждения.
- Капс при последних 10 обменах с индикатором "...N предыдущих сообщений..."
– Использует тусклый стиль, чтобы отучить его от активного разговора.
Чтобы отключить и сохранить минимальное однострочное поведение, установите в ~/.hermes/config.yaml:
display:
resume_display: minimal # default: full
```<div class="admonition admonition-tip"><p class="admonition-title">💡 Tip</p>
Идентификаторы сеансов имеют формат «ГГГГМДД_ЧЧММСС_<шестнадцатеричный>» — в сеансах CLI/TUI используется шестнадцатеричный суффикс из 6 символов (например, «20250305_091523_a1b2c3»), в сеансах шлюза используется 8-значный суффикс (например, «20250305_091523_a1b2c3d4»). Вы можете возобновить работу по идентификатору (полный или уникальный префикс) или по названию — оба работают с `-c` и `-r`.</div>
## Межплатформенная передача управления
Используйте `/handoff <platform>` из сеанса CLI, чтобы перенести живое общение на домашний канал платформы для обмена сообщениями. Агент начинает именно с того места, на котором остановился интерфейс командной строки: тот же идентификатор сеанса, полная расшифровка с учетом ролей, вызовов инструментов и все такое.
```bash
# Inside a CLI session
/handoff telegram
Что происходит:
- После этого CLI включила
<платформа>и установила домашний канал (запустите/sethomeодин раз из целевого чата, чтобы настроить его). - Интерфейс командной строки предупреждает об ожидающем сеансе и блокирует шлюз. Он отказывается, если агент находится в середине пути — дождитесь выполнения настоящего ответа первым.
- Шлюз наблюдателя сообщает о передаче обслуживания и запрашивает у адаптера назначение нового потока:
- Telegram — открывает новую тему форума (темы в DM, если в чате включен режим тем Bot API 9.4+, или темы супергруппы форума).
- Discord — Создаёт 1440-минутную ветку автоматического архивирования под домашним текстовым каналом.
- Slack — публикует начальное сообщение и использует его
tsв качестве привязки потока. - WhatsApp/Signal/Matrix/SMS — нет встроенных потоков, прямой переход на домашний канал.
- Шлюз повторно привязывает назначение ключа к существующему идентификатору сеанса CLI, а затем формирует синтетическую очередь пользователя с учетом агента финансовой системы и подводит итоги. Ответ открывается в новой теме.
- При успешном подтверждении шлюза CLI печатает подсказку
/resumeи корректно завершает работу:↻ Handoff complete. The session is now active on telegram. Resume it on this CLI later with: /resume my-session-title - С этого момента разговор продолжается на платформе. Ответ в новом потоке — любой, авторизованный в этом канале, использует один и тот же сеанс, и любое более позднее сообщение фактически оказывается пользователем в потоке легко при соединении, поскольку ключ сеанса потока без
user_id.
Возврат в CLI: если вы хотите вернуться на рабочий стол, просто запустите /resume <title> (или hermes -r "<title>" из процедуры) и продолжите с того места, где остановилась платформа.
Режимы отказа:
- Домашний канал не настроен → CLI отказывается с подсказкой /sethome.
- Платформа не включена / шлюз не работает → время ожидания CLI истекает через 60 секунд с четким сообщением, и ваш сеанс CLI остается нетронутым.
- Не удалось создать тему (разрешения, режим тем отключены) → происходит прямой возврат к домашнему каналу и все равно завершается; потоки не прерываются, но сама связь работает.
- Ошибка adapter.send (ограничение скорости, временная ошибка API) → передача обслуживания отмечена как неудачная с указанием причины; строка очищается, и вы можете просмотреть ее.
Ограничение, о котором стоит знать: для платформы без поддержки потоков с экономическими затратами много банков групповые синтетические ключи под ключ в виде сеанса в стиле DM. Это работает для домашних каналов с самостоятельным DM (типичная настройка), но не идеально для групповых чатов с общим доступом. Поточность охватывает Telegram/Discord/Slack — безусловно, распространенный случай — поэтому большинство настроек никогда не достигают этого.
Имя сеанса
Дайте сеансам удобочитаемые названия, чтобы вы могли легко их найти и возобновить.
Автоматически созданные заголовки
Hermes автоматически генерирует краткий описательный заголовок (3–7 слов) для каждого сеанса после первого обмена сообщениями. Это выполняется в фоновом потоке с использованием быстрой вспомогательной модели, поэтому задержка не увеличивается. Вы будете показывать автоматически генерируемые заголовки при просмотре сеансов с помощью «Списка сеансов Hermes» или «Просмотр сеансов Hermes».
Автоматическое присвоение титров срабатывает только один раз за сеанс и пропускается, если вы уже установили заголовок вручную.
Установка заголовка вручную
Используйте косую черту /title внутри любого сеанса чата (CLI или шлюз):
/title my research project
Название применить заявление. Если сеанс еще не создан на базе данных (например, вы запустили /title перед отправкой первого сообщения), он появляется по очереди и применяется после запуска сеанса.
Вы также можете переименовать периодические сеансы из командной строки:
hermes sessions rename 20250305_091523_a1b2c3d4 "refactoring auth module"
Правила титулов
- Уникальный — ни одна из двух сессий не может иметь одно и то же название.
- Макс. 100 символов — обеспечивает чистоту результата расчета.
- Санизировано — управляющие символы, символы нулевой клавиатуры и переопределения RTL удаляются автоматически.
- Обычный Юникод подходит — работают смайлы, CJK, символы с диакритическими знаками.
Автоматическое определение происхождения при сжатии
Когда сеанс сеанса сжимается (вручную с помощью /compress или автоматически), Гермес создает новое продолжение сеанса. Если в оригинале был заголовок, новый сеанс автоматически получает пронумерованный заголовок:
"my project" → "my project #2" → "my project #3"
Когда вы возобновляете работу по имени («hermes -c «мой проект»»), он автоматически выбирает самый последний сеанс в линии.
/title на платформах обмена сообщениями
Команда /title работает на всех платформах шлюза (Telegram, Discord, Slack, WhatsApp):
/title My Research— установить заголовок сессии./title— показать текущий заголовок
Команды сеанса управления
Hermes обеспечивает полный набор команд управления сеансом через «сеансы Hermes»:
Получение списка сеансов
# 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
Экспорт сеансов
«Экспорт сеансов Гермеса» — это одна поверхность для каждой формы экспорта, подключенная с помощью «--format»:
| Формат | Выход | Используйте его для |
|---|---|---|
jsonl (по умолчанию) |
один объект JSON за сеанс | резервное копирование машины туда и обратно |
мд / кмд |
один файл Markdown/Quarto на сеансе + манифест | читаемые архивы, заметки |
html |
отдельная отдельная страница (боковая панель для нескольких сеансов) | обмен, просмотр |
след |
Код Клода JSONL | Средство просмотра трассировки агента HF, --upload |
Плюс --только пользовательские запросы для просмотра только подсказок (jsonl или md).
Все форматы имеют одни и те же ручки выбора: -session-id для одного сеанса или полный набор фильтров prune/archive для больших размеров — --older-than / --newer-than / --before / --after (длинность типа 5h/2d/1w, дни или временные метки ISO), --source, --title, --model, --provider, --cwd, --min/--max-messages, --min/--max-tokens, --min/--max-cost, --min/--max-tool-calls, --user, --chat-id, --chat-type, --branch, --end-reason. --dry-run просматривает набор совпадений без записей. --redact удаляет секреты (ключи API, токены, учетные данные) из экспортированного контента в любом формате — рекомендуется для всего, чем вы планируете поделиться. Примечание. Массовые фильтры соответствуют завершившимся сеансам; нефильтрованный «экспорт» сбрасывает все, активные включения.
JSONL (по умолчанию)
# 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
# Redact API keys/tokens/credentials from the exported content
hermes sessions export backup.jsonl --redact
Экспортированные файлы содержат один объект JSON в строке с полными метаданными сеансами и всеми сообщениями.
HTML
--format html записывает один автономный HTML-файл — без удаленных зависимостей — со стилизованными пузырьками сообщений, сворачиваемым выводным инструментом и (для экспорта в несколько сеансов) боковую панель для переключения между сеансами:
# One session as a standalone HTML page
hermes sessions export --format html --session-id 20250305_091523_a1b2c3d4 transcript.html
# All Telegram sessions from the last week in one file, secrets redacted
hermes sessions export --format html --newer-than 1w --source telegram --redact archive.html
Только подсказки
`--only user-prompts экспортирует только написанные вами приглашения — без ответов помощника, выходного инструмента или системного контекста. Полезно для создания библиотек подсказок или проверки того, что вы спросили:
# One JSONL record per prompt (session id, index, timestamp, text)
hermes sessions export prompts.jsonl --session-id 20250305_091523_a1b2c3d4 --only user-prompts
# Markdown, straight to stdout
hermes sessions export - --session-id 20250305_091523_a1b2c3d4 --only user-prompts --format md
Работает с --format jsonl (по умолчанию) или md, наблюдает те же фильтры для массового экспорта и сочетается с --redact.
Traces (Просмотр трасс агента HF)
--format Trace, который код потокового кода Claude Code JSONL — форма расшифровки, автоматически определяемая Hugging Face Hub для своей [Agent Trace Viewer] (https://huggingface.co/docs/hub/agent-traces). Напишите его локально или заголовок --upload, чтобы отправить его в свой собственный набор данных Hermes-traces (читается как HF_TOKEN):
# Trace of the most recent session, to stdout
hermes sessions export --format trace
# One session to a local trace file
hermes sessions export --format trace --session-id 20250305_091523_a1b2c3d4 trace.jsonl
# Upload straight to your private HF traces dataset
hermes sessions export --format trace --session-id 20250305_091523_a1b2c3d4 --upload
По умолчанию отслеживание экспорта секретно редактируется (они должны разрешить компьютер); --no-redact отключается после проверки вручную. --upload является приватным, если только --public. При массовом экспорте трассировки с фильтрами записываются в один сеанс <id>.trace.jsonl.
Уценка / QMD
Передайте --format md или --format qmd, если вам нужен читаемый архив файлов перед открытием или удалением старых сеансов. Экспорт Markdown/QMD записывает один файл за сеанс в каталог (по умолчанию: ~/.hermes/session-exports).
# Export one session to Markdown
hermes sessions export --format md --session-id 20250305_091523_a1b2c3d4
# Export a compression lineage as one logical document
hermes sessions export --format md --session-id 20250305_091523_a1b2c3d4 --lineage logical
# Preview ended sessions older than 90 days without writing files
hermes sessions export --format md --older-than 90 --dry-run
# Export ended Telegram sessions older than 2 weeks to QMD files
hermes sessions export --format qmd --older-than 2w --source telegram
# Export long Claude sessions, secrets redacted
hermes sessions export --format md --model sonnet --min-messages 50 --redact
# Only after verification, export and delete one explicitly named session
hermes sessions export --format md --session-id 20250305_091523_a1b2c3d4 --delete-after-verified --yes
Экспорт Markdown/QMD записывает один файл .md или .qmd для каждого экспортируемого сеанса, а также файл manifest.jsonl с помощью файла, извлекающего сообщения, идентификаторы происхождения и SHA-256. Для массового экспорта требуется хотя бы один фильтр; в чистом оптовом экспорте показано. --delete-after-verified намеренно ограничен --session-id и требует --yes. Поскольку при удалении родительского сеанса также удаляются сеансы делегатов/субагентов, этот режим экспортирует, и впоследствии каждый делегата удаляется в отдельный файл перед удалением чего-либо. Если набор делегатов изменится во время экспорта, удаление будет отклонением. --redact удаляет секреты (ключи API, токены, учетные данные) из инструмента оценки сообщений и выходных данных перед записью — рекомендуется для любого экспорта, которым вы планируете поделиться.
Удалить сеанс
# 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 inactive for 90 days (default)
hermes sessions prune
# Custom age threshold — bare numbers are days
hermes sessions prune --older-than 30
# Durations work too: 5h, 30m, 2d, 1w
hermes sessions prune --older-than 12h
# Delete only a specific time window (e.g. a batch of test sessions
# created in the last 5 hours)
hermes sessions prune --newer-than 5h
# Explicit window with absolute timestamps
hermes sessions prune --after "2026-07-05 09:00" --before "2026-07-05 14:30"
# Only prune sessions from a specific platform (all ages — any filter
# disables the implicit 90-day default)
hermes sessions prune --source telegram
hermes sessions prune --source cron --older-than 60 # add a time flag to narrow
# More filters — all AND together
hermes sessions prune --newer-than 5h --title "smoke test" # title substring
hermes sessions prune --older-than 30 --max-messages 3 # tiny sessions
hermes sessions prune --cwd ~/scratch --end-reason done # by cwd / end reason
hermes sessions prune --model gpt-5 --older-than 1w # by model (substring)
hermes sessions prune --provider openrouter --older-than 60 # by billing provider
hermes sessions prune --branch feature/old-experiment # by git branch
hermes sessions prune --user 12345678 --chat-type group # by messaging origin
hermes sessions prune --max-tokens 500 --older-than 7 # by token usage
hermes sessions prune --max-cost 0.01 --max-tool-calls 0 # cheap, tool-less runs
# Preview what would be deleted, without deleting anything
hermes sessions prune --newer-than 5h --dry-run
# Skip confirmation
hermes sessions prune --older-than 30 --yes
Значения времени (--older-than, --newer-than, --before, --after) принимают
продолжительность («5 часов», «30 минут», «2 дня», «1 неделя»), простое количество дней или ISO
временная метка (2026-07-05, 2026-07-05 14:30). --older-than/--before установлен
верхняя граница; --newer-than/--after устанавливает границу границы.
Пара --older-than/--newer-than использует активность последних сообщений (откат
для запуска сеанса для пустых сеансов); --before/--after явно определены
время начала сеанса. Объедините любую пару для окна.
Фильтры атрибутов: --source (платформа, точная), --title/--model/
--филиал (подстрока без учета регистра), --провайдер (провайдер биллинга,
точно), --end-reason, --user, --chat-id, --chat-type (точно),
--cwd (префикс пути), плюс числовые границы --min/--max-messages,
--min/--max-tokens (вход+выход), --min/--max-cost (USD, фактическое падение
вернуться к расчетному) и --min/--max-tool-calls. Использование любого фильтра отключает
неявный 90-дневный срок по умолчанию, поэтому сеансы Гермес заключают --source cronили--model gpt-4oсоответствует всем возрастам — меткам флага времени, чтобы сузить его. Только
полностью голая «обрезка сеансов Гермеса» сохраняет 90-дневный срок. Каждый
запуск non---yes` показывает количество совпадений, а также самое старое и самое новое совпадение.
заседание, прежде чем запрашивать подтверждение.
Архивированные сеансы по происшествию; передать --include-archived в
удалить их тоже.
ℹ️ Info
При сокращении удаляются только завершенные сеансы (сеансы, которые были явно завершены или были автоматически сброшены). Активные сеансы никогда не удаляются.Сеансы массового архивирования
Если вы хотите сеансы аварийной ситуации из своих списков, ничего не удаляйте, «Архив сеансов Гермеса» использует те же фильтры, что и «Обрезка», но мягко скрывается. вместо этих соответствующих сеансов (устанавливается тот же флаг резервирования, что и при резервировании одного сеанс из пользовательского интерфейса рабочего стола/панели Диптихи — сообщения и поиск остаются неизменными):
# Archive everything from the last 5 hours (e.g. 75 CI smoke-test sessions)
hermes sessions archive --newer-than 5h
# Archive by title substring, preview first
hermes sessions archive --title "dry run" --dry-run
hermes sessions archive --title "dry run" --yes
Хотя бы один фильтр — голый «архив сеансов Hermes» отказывается
заархивируйте всю свою историю. Архивированные сеансы скрыты от
список сеансов Hermes и /resume, но хранится в базе данных и может быть
разархивирован из списка заседаний рабочего стола/панели Диптихов.
Статистика сеансов
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.
Восстановление застрявших сеансов шлюза
Если разговор через шлюз когда-либо «перепрыгивает назад во времени» после перезапуска — восстановление тема многодневной давности, как будто недавних сообщений никогда не было — прямой эфир разговор может застрять в строке сеанса, который потерял идентификатор маршрутизации (класс повреждений исправлен в работе в соответствии с обеспечением непрерывности сеанса v0.21; текущая версия) предотвратить это путем создания и самовосстановления во время выполнения).
Hermes session Repair-routing находит последовательные сеансы, несущие сообщения, без каких-либо ошибок.
маршрутизирует идентификаторы и повторно прикрепляет каждого из них к продолжающемуся разговору —
но только тогда, когда доказательства однозначны:
# Report only — shows each orphan, the proposed adoption, and the evidence
hermes sessions repair-routing
# Perform the adoptions (stop the gateway first — a running gateway holds
# the old routing in memory and would write it back over the repair)
hermes sessions repair-routing --apply
# Widen/narrow the contiguity window (default 900 seconds)
hermes sessions repair-routing --max-gap-seconds 300
Правила доказывания:
- lineage — сироты
parent_session_idуказывают на ключевую букву та же платформа (зафиксированный факт; временное окно не применяется) - смежность — замолчал ровно один ключевой ряд одной и той же платформы. в окне сиротского старта
Что-либо двусмысленное (два предшественника-кандидата, два сироты, заявляющие одно и то же).
предварительный) сообщается с обоснованием и остается нетронутым — неправильное толкование
соединил бы один разговор с другим чатом. Замененная строка удалена.
в superseded_by_repair, поэтому при перезапуске восстановления никогда не смогу его восстановить.
Восстановление намеренно не дорого: если в чате с тех пор образовался
вторая история, выбор продолжения зависит от вас. Застрявший
Разговор остается доступным для чтения через /resume и вызова сеанса в любом случае —
маршрутизация - большая, что меняется при ремонте. Сначала создайте резервную косметику.
(cp ~/.hermes/state.db ~/.hermes/state.db.bak).
Инструмент завершения сеансов
Агент имеет встроенный инструмент «session_search», который осуществляет полнотекстовый поиск по всем предыдущим разговорам с использованием механизма SQLite FTS5 и позволяет агенту прокручивать любой найденный сеанс. Никаких вызовов LLM, никаких обобщений, никаких усечений. каждая фигура возвращает фактические сообщения из БД.
Три призывающие фигуры
Инструмент определяет, что вы хотите, исходя из заданных вами аргументов. Параметр mode отсутствует.
1. Обнаружение — передать запрос:
session_search(query="auth refactor", limit=3)
Запускает FTS5, выполняет дедупликацию обращений по линии сеанса, возвращает N первых сеансов. Каждый результат несет в себе:
session_id,title,когда,источникsnippet— отрывок матча, выделенный FTS5.bookend_start— первые 3 сообщения пользователя+помощника сессии (цель/начало)messages— ±5 сообщений вокруг совпадения FTS5 с помеченным якорным сообщением (попадание в контекст).bookend_end— последние 3 сообщения пользователя+помощника сеанса (резолюция/решения)match_message_id,messages_before,messages_after
Подставки для окна книг + вместе восстанавливают цель → совпадение → разрешение, не платя за всю стенограмму. Типичное время ожидания: 15–50 мс при просмотре сеанса базы данных.
2. Прокрутите — передайте session_id + around_message_id:
session_search(session_id="20260510_174648_805cc2", around_message_id=590803, window=10)
Возвращает окно сообщений ±window, центрированное по якорю. Никаких FTS5, никаких подставок для книг — только кусочек. Используйте после обнаружения вызова, когда вам нужен больший контекст, чем окно по умолчанию ±5.
- Чтобы прокрутить вперед: передайте
messages[-1].idобратно какaround_message_id - Чтобы прокрутить назад: передайте
messages[0].idобратно какaround_message_id - Сообщение о границе появляется в обоих окнах как маркер ориентации.
- Когда
messages_beforeилиmessages_afterменьше, чемwindow, вы находитесь в начале или конце сеанса.
Типичное время ожидания: 1–2 мс на вызов прокрутки.
3. Просмотр — без аргументов:
session_search()
Возвращает последние сеансы в хронологическом порядке (заголовки, превью, временные метки). Полезно, когда пользователь спрашивает «над чем я работал», не называя тему.
Синтаксис запроса FTS5
Режим ключевых слов поддерживает стандартный синтаксис запросов FTS5:
— Простые ключевые слова: «развертывание докера» (по умолчанию в FTS5 установлено «И»).
- Фразы: "точная фраза"
- Логическое значение: docker OR kubernetes, python NOT java
- Префикс: deploy*
Необязательные параметры
- «сортировка» — «самая новая» или «самая старая», находящаяся на вершине рейтинга FTS5. Опустите для упорядочивания только по релевантности (по умолчанию; подходит для исследовательского отзыва). Используйте «самый новый» для вопросов «где мы оставили X», «самый старый» для вопросов «как началось X».
role_filter— роли, разделенные запятыми, которые нужно включить. По умолчанию для Discovery установлено значение «пользователь, помощник» (выходные данные инструмента обычно представляют собой шум). Передайтеuser,assistant,tool, чтобы включить выходные данные инструмента (поведение инструмента отладки), илиtool, чтобы использовать только выходные данные инструмента.
Когда он используется
Агенту будет предложено автоматически использовать поиск сеансов:
"Когда пользователь ссылается на что-то из прошлого разговора или вы подозреваете, что соответствующий предшествующий контекст существует, используйте session_search, чтобы вспомнить это, прежде чем просить его повториться."
Типичные триггеры: «мы делали это раньше», «помнить, когда», «в последний раз», «как я уже говорил» или любая ссылка на проект/человека/концепцию, которой нет в текущем окне.
Отслеживание сеансов на каждой платформе
Сеансы шлюза
На платформах обмена сообщениями сеансы фиксируются детерминированным ключом сеанса, созданным на основе источника сообщения:
| Тип чата | Формат ключа по умолчанию | Поведение |
|---|---|---|
| Телеграмма в Директ | агент:main:telegram:dm:<chat_id> |
Одна сессия на чат в DM |
| Дискорд ДМ | агент:main:discord:dm:<chat_id> |
Одна сессия на чат в DM |
| WhatsApp в Директ | agent:main:whatsapp:dm:<canonical_identifier> |
Один сеанс на каждого пользователя DM (при наличии сопоставления псевдонимы LID/телефона сворачиваются до одного идентификатора) |
| Групповой чат | agent:main:<платформа>:group:<chat_id>:<user_id> |
Для каждого пользователя внутри группы, когда платформа предоставляет идентификатор пользователя |
| Групповая тема/тема | agent:main:<платформа>:group:<chat_id>:<thread_id> |
Общий сеанс для всех участников потока (по умолчанию). Для каждого пользователя с thread_sessions_per_user: true. |
| Канал | agent:main:<платформа>:канал:<chat_id>:<user_id> |
Для каждого пользователя внутри канала, когда платформа предоставляет идентификатор пользователя |
Если Hermes не может получить идентификатор участника общего чата, он возвращается к одному общему сеансу для этой комнаты.
Общие и изолированные групповые сеансы
По умолчанию Hermes использует group_sessions_per_user: true в config.yaml. Это означает:
- Алиса и Боб могут общаться с Гермесом в одном и том же канале Discord, не делясь историей стенограммы.
- длительная и трудоемкая задача одного пользователя не загрязняет контекстное окно другого пользователя
- обработка прерываний также остается индивидуальной для каждого пользователя, поскольку ключ работающего агента соответствует изолированному ключу сеанса.
Если вместо этого вам нужен один общий «комнатный мозг», установите:
group_sessions_per_user: false
That reverts groups/channels to a single shared session per room, which preserves shared conversational context but also shares token costs, interrupt state, and context growth.
Session Reset Policies
By default gateway sessions never auto-reset (mode: none). You can opt
in to automatic resets via the session_reset section in config.yaml:
- none — never auto-reset (default; context managed by
/resetand compression) - idle — reset after N minutes of inactivity
- daily — reset at a specific hour each day
- both — reset on whichever comes first (idle or daily)
Before a session is auto-reset, the agent is given a turn to save any important memories or skills from the conversation.
Sessions with active background processes are never auto-reset, regardless of policy.
Continuity After Crashes and Restarts
A gateway chat is designed to be one continuous session — compacted
repeatedly as it grows — until you explicitly run /new (or /reset). This
holds across gateway crashes, restarts, and updates:
- Session identity (routing key, chat, origin) is written atomically when
the session row is created, on every creation path (
/new, first message,/branchchildren). If that write ever fails, the very next turn's routing refresh repairs the row automatically. - After a restart, the gateway re-resolves each chat to the session with the most recent actual activity — an older, stale row can never win over the conversation you were actually having.
- Recovery respects
/newboundaries: if the most recent event for a chat is an intentional reset, recovery starts fresh rather than reaching behind the reset to resurrect an older session. Recovered sessions also keep their real idle time, so an opt-in idle/daily reset policy applies correctly to them instead of treating every recovered session as brand new.
Storage Locations
| What | Path | Description |
|---|---|---|
| SQLite database | ~/.hermes/state.db |
All session metadata + messages with FTS5 |
| Gateway messages | ~/.hermes/state.db |
SQLite — canonical store for all session messages |
| Gateway routing index | gateway_routing table in ~/.hermes/state.db |
Maps session keys to active session IDs (origin metadata, expiry flags) |
| Legacy routing mirror | ~/.hermes/sessions/sessions.json |
Backward-compat mirror of the routing index, written when gateway.write_sessions_json: true (the default) |
The SQLite database uses WAL mode for concurrent readers and a single writer, which suits the gateway's multi-platform architecture well.
⚠️ Warning
sessions.json is not the session list
The gateway routing index lives in the gateway_routing table inside
state.db; ~/.hermes/sessions/sessions.json is a legacy mirror of it,
kept for backward compatibility (disable with
gateway.write_sessions_json: false). It maps messaging session keys
(agent:main:<platform>:...) to active session IDs.
It only ever contains gateway/messaging entries, so if you run a messaging
platform you'll see only those (e.g. agent:main:whatsapp:dm:...).
This is expected and does not mean your CLI sessions are missing.
hermes sessions list, /sessions, and the dashboard all read state.db,
which holds every session (CLI, TUI, and gateway). The /save snapshots
under ~/.hermes/sessions/saved/*.json are convenience exports, not the index.
If CLI sessions genuinely don't appear in hermes sessions list, the cause is
state.db not receiving them — run hermes sessions repair and watch for a
⚠ Session store unavailable warning at CLI startup, which means SQLite
persistence failed for that run.:::
📝 Note
Legacy JSONL transcripts Sessions created before state.db became canonical may have leftover*.jsonl files in ~/.hermes/sessions/. They are no longer written or
read by Hermes. Safe to delete after verifying the corresponding session
exists in state.db.Database Schema
Key tables in state.db:
- sessions — session metadata (id, source, user_id, model, title, timestamps, token counts). Titles have a unique index (NULL titles allowed, only non-NULL must be unique).
- messages — full message history (role, content, tool_calls, tool_name, token_count)
- messages_fts — FTS5 virtual table for full-text search across message content
Session Expiry and Cleanup
Automatic Cleanup
- Gateway sessions auto-reset based on the configured reset policy
- Before reset, the agent saves memories and skills from the expiring session
- Opt-in auto-pruning: when
sessions.auto_pruneistrue, ended sessions inactive forsessions.retention_days(default 90) are pruned at CLI/gateway startup - After a prune that actually removed rows,
state.dbisVACUUMed to reclaim disk space when at leastsessions.min_vacuum_interval_days(default 30) have elapsed since the last successfulVACUUM(SQLite does not shrink the file on plain DELETE) - Pruning runs at most once per
sessions.min_interval_hours(default 24); the last-run timestamp is tracked insidestate.dbitself so it's shared across every Hermes process in the sameHERMES_HOME
Default is off — session history is valuable for session_search recall, and silently deleting it could surprise users. Enable in ~/.hermes/config.yaml:
sessions:
auto_prune: true # opt in — default is false
retention_days: 90 # keep ended sessions active within this window
vacuum_after_prune: true # reclaim disk space after a pruning sweep
min_vacuum_interval_days: 30 # don't rewrite the DB more often than this
min_interval_hours: 24 # don't re-run the sweep more often than this
Активные сеансы никогда не удаляются автоматически, независимо от времени. Завершившиеся сеансы состарились с момента последнего своего сообщения, поэтому недавно использованный продолжительный разговор не удаляется только потому, что оно началось до периода хранения.
Ручная очистка
```bash
Prune sessions older than 90 days
hermes sessions prune
Delete a specific session
hermes sessions delete
Export before pruning (backup)
hermes sessions export backup.jsonl
hermes sessions prune --older-than 30 --yes
``<div class="admonition admonition-tip"><p class="admonition-title">💡 Tip</p>
База данных растет медленно (обычно: 10-15 МБ для сотен сеансов), а история сеансов позволяет сохранятьsession_searchиз предыдущих разговоров, поэтому ограничение ограничения поставок отключено. Включите его, если у вас тяжелая рабочая нагрузка шлюза/cron, гдеstate.dbвлияет на производительность (наблюдаемый режим сбоя: 384 МБ state.db с ~1000 сеансами, медленными вставками FTS5 и листингом/resume`). Используйте «подрез сеансов Гермес» для единовременной очистки без включения автоматической очистки.