會話
Hermes Agent 會自動將每次對話保存為一個會話。會話功能支持對話恢復、跨會話搜索以及完整的對話歷史管理。
會話的工作原理
無論來自 CLI、Telegram、Discord、Slack、WhatsApp、Signal、Matrix 還是任何其他消息平臺的對話,都會以完整消息歷史的形式存儲為一個會話。會話通過兩個互補的系統進行追蹤:
- SQLite 數據庫(
~/.hermes/state.db)—— 使用 FTS5 全文搜索的結構化會話元數據 - JSONL 轉錄文件(
~/.hermes/sessions/)—— 包含工具調用(網關)的原始對話轉錄
SQLite 數據庫存儲以下內容:
- 會話 ID、來源平臺、用戶 ID
- 會話標題(唯一、人類可讀的名稱)
- 模型名稱和配置
- 系統提示快照
- 完整的消息歷史(角色、內容、工具調用、工具結果)
- Token 統計(輸入/輸出)
- 時間戳(
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 | 通過 Twilio 的短信 |
dingtalk | 釘釘消息應用 |
feishu | 飛書/Lark 消息應用 |
wecom | 企業微信 |
weixin | 個人微信 |
bluebubbles | 通過 BlueBubbles macOS 服務器的 Apple iMessage |
homeassistant | Home Assistant 對話 |
webhook | 入站 Webhook |
api-server | API 服務器請求 |
acp | ACP 編輯器集成 |
cron | 定時任務(cron) |
batch | 批處理運行 |
CLI 會話恢復
使用 --continue 或 --resume 從 CLI 恢復之前的對話:
繼續最近的會話
# 恢復最近的 CLI session
hermes --continue
hermes -c
# 或者使用 `chat` 子命令
hermes chat --continue
hermes chat -c
此命令會從 SQLite 數據庫中查找最近的 cli 會話,並加載其完整的對話歷史。
按名稱恢復
如果你已為會話設置了標題(參見下方的 會話命名),可以通過名稱恢復:
# 恢復名為 session
hermes -c "my project"
# 如果存在譜系變體(我的項目、我的項目#2、我的項目#3),
# 這會自動恢復最近的一次
hermes -c "my project" # → 恢復 "my project #3"
恢復特定會話
# 通過 ID 恢復特定的 session
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 會在輸入提示前以樣式化面板的形式展示之前對話的緊湊摘要:
恢復模式會在返回實時提示前,顯示一個包含最近用戶和助手對話的緊湊摘要面板。
摘要內容包括:
- 顯示 用戶消息(金色
●)和 助手回覆(綠色◆) - 截斷 長消息(用戶消息截斷為 300 字符,助手消息截斷為 200 字符或 3 行)
- 摺疊 工具調用為數量和工具名稱(例如
[3 次工具調用: terminal, web_search]) - 隱藏 系統消息、工具結果和內部推理
- 限制 最多顯示最近 10 次交互,並以 "... N 條更早的消息 ..." 指示符結尾
- 使用 淺色樣式 區分於當前活躍對話
如需禁用摘要,保持最小化的一行行為,可在 ~/.hermes/config.yaml 中設置:
display:
resume_display: minimal # 默認值:完整
會話 ID 的格式為 YYYYMMDD_HHMMSS_<8位十六進制>,例如 20250305_091523_a1b2c3d4。你可以通過 ID 或標題恢復會話——兩者都支持 -c 和 -r 參數。
會話命名
為會話設置人類可讀的標題,以便輕鬆查找和恢復。
自動生成的標題
Hermes 在首次交互後會自動為每個會話生成一個簡短的描述性標題(3–7 個詞)。該過程在後臺線程中使用快速輔助模型執行,不會增加延遲。你可以在使用 hermes sessions list 或 hermes sessions browse 瀏覽會話時看到自動生成的標題。
自動命名僅在每個會話中觸發一次,如果你已手動設置標題,則會跳過自動命名。
手動設置標題
在任意聊天會話(CLI 或網關)中使用 /title 斜槓命令:
/title my research project
標題會立即生效。如果會話尚未在數據庫中創建(例如你在發送第一條消息前就運行了 /title),則會暫存標題,並在會話啟動時應用。
你也可以從命令行重命名現有會話:
hermes sessions rename 20250305_091523_a1b2c3d4 "refactoring auth module"
標題規則
- 唯一性 —— 兩個會話不能共享相同標題
- 最大 100 個字符 —— 保持列表輸出整潔
- 已淨化 —— 自動移除控制字符、零寬字符和 RTL 覆蓋符
- 正常 Unicode 字符均可使用 —— 表情符號、CJK 字符、帶重音符號的字符均支持
壓縮時的自動繼承鏈
當會話的上下文被壓縮(通過 /compress 手動執行或自動觸發)時,Hermes 會創建一個新的延續會話。如果原始會話有標題,新會話將自動獲得編號標題:
"my project" → "my project #2" → "my project #3"
當你通過名稱恢復會話(hermes -c "my project")時,系統會自動選擇該會話 lineage 中最新的一個。
消息平臺中的 /title 命令
/title 命令在所有網關平臺(Telegram、Discord、Slack、WhatsApp)中均有效:
/title My Research— 設置會話標題/title— 顯示當前標題
會話管理命令
Hermes 通過 hermes sessions 提供完整的會話管理命令:
列出會話
# 列出最近的 sessions (默認:最後 20 條)
hermes sessions list
# 按平臺過濾
hermes sessions list --source telegram
# 顯示更多 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
導出會話
# 將所有 sessions 導出到 JSONL 文件
hermes sessions export backup.jsonl
# 從特定平臺導出sessions
hermes sessions export telegram-history.jsonl --source telegram
# 導出單個session
hermes sessions export session.jsonl --session-id 20250305_091523_a1b2c3d4
導出的文件每行包含一個 JSON 對象,包含完整的會話元數據和所有消息。
刪除會話
# 刪除特定session(需確認)
hermes sessions delete 20250305_091523_a1b2c3d4
# 刪除而不確認
hermes sessions delete 20250305_091523_a1b2c3d4 --yes
重命名會話
# 設置或更改 session 的標題
hermes sessions rename 20250305_091523_a1b2c3d4 "debugging auth flow"
# 多字標題不需要在 CLI 中加引號
hermes sessions rename 20250305_091523_a1b2c3d4 debugging auth flow
如果標題已被其他會話使用,將顯示錯誤信息。
清理舊會話
# 刪除超過 90 天的結束 sessions(默認)
hermes sessions prune
# 自定義年齡閾值
hermes sessions prune --older-than 30
# 僅從特定平臺修剪 sessions
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
如需更深入的分析——包括 token 使用量、成本估算、工具使用分佈和活動模式——請使用 hermes insights。
會話搜索工具
該 Agent 內置了 session_search 工具,使用 SQLite 的 FTS5 引擎對所有歷史對話執行全文搜索。
工作原理
- FTS5 搜索匹配的消息,並按相關性排序
- 按會話分組,選取前 N 個唯一會話(默認為 3 個)
- 加載每個會話的對話內容,截取約 100K 字符,以匹配內容為中心
- 發送到快速摘要模型,生成聚焦摘要
- 返回每個會話的摘要,附帶元數據和上下文信息
FTS5 查詢語法
搜索支持標準的 FTS5 查詢語法:
- 簡單關鍵詞:
docker deployment - 詞組:
"exact phrase" - 布爾運算:
docker OR kubernetes,python NOT java - 前綴匹配:
deploy*
使用時機
Agent 會自動被提示使用會話搜索:
"當用戶引用過去對話中的內容,或你懷疑存在相關的歷史上下文時,請使用 session_search 回憶相關內容,避免讓用戶重複描述。"
各平臺會話追蹤
網關會話
在消息平臺中,會話通過從消息源生成的確定性會話鍵進行標識:
| 聊天類型 | 默認鍵格式 | 行為 |
|---|---|---|
| Telegram 私聊 | agent:main:telegram:dm:<chat_id> | 每個私聊對話一個會話 |
| Discord 私聊 | agent:main:discord:dm:<chat_id> | 每個私聊對話一個會話 |
| WhatsApp 私聊 | agent:main:whatsapp:dm:<chat_id> | 每個私聊對話一個會話 |
| 群組聊天 | agent:main:<platform>:group:<chat_id>:<user_id> | 當平臺暴露用戶 ID 時,按用戶區分會話 |
| 群組線程/話題 | agent:main:<platform>:group:<chat_id>:<thread_id>:<user_id> | 在特定線程/話題中按用戶區分會話 |
| 頻道 | agent:main:<platform>:channel:<chat_id>:<user_id> | 當平臺暴露用戶 ID 時,按用戶區分會話 |
當 Hermes 無法獲取共享聊天的參與者標識符時,會退化為該房間使用一個共享會話。
共享與隔離的群組會話
默認情況下,Hermes 在 config.yaml 中啟用 group_sessions_per_user: true。這意味著:
- Alice 和 Bob 可以在同一個 Discord 頻道中與 Hermes 交流,而不會共享對話歷史
- 一個用戶的長時間工具密集型任務不會汙染另一個用戶的上下文窗口
- 中斷處理也保持按用戶隔離,因為運行中的 Agent 鍵與隔離會話鍵一致
如果你希望實現一個共享的“房間大腦”,請設置:
group_sessions_per_user: false
這將使群組/頻道恢復為每個房間一個共享會話,從而保留共享對話上下文,但也會共享 token 成本、中斷狀態和上下文增長。
會話重置策略
網關會話根據可配置策略自動重置:
- idle — 空閒 N 分鐘後重置
- daily — 每天特定時間重置
- both — 兩者中任一條件先滿足即重置(空閒或每日)
- none — 永不自動重置
在會話自動重置前,Agent 會獲得一次機會,保存對話中的重要記憶或技能。
帶有 活躍後臺進程 的會話,無論策略如何,均不會被自動重置。
存儲位置
| 項目 | 路徑 | 描述 |
|---|---|---|
| SQLite 數據庫 | ~/.hermes/state.db | 所有會話元數據 + 帶 FTS5 的消息 |
| 網關對話記錄 | ~/.hermes/sessions/ | 每個會話的 JSONL 格式對話記錄 + sessions.json 索引文件 |
| 網關索引 | ~/.hermes/sessions/sessions.json | 將會話鍵映射到活躍會話 ID |
SQLite 數據庫使用 WAL 模式,支持併發讀取和單寫入,非常適合網關的多平臺架構。
數據庫 Schema
state.db 中的關鍵表:
- sessions — 會話元數據(id、source、user_id、model、title、時間戳、token 數量)。標題字段具有唯一索引(允許 NULL 標題,但非 NULL 標題必須唯一)。
- messages — 完整的消息歷史(role、content、tool_calls、tool_name、token_count)
- messages_fts — FTS5 虛擬表,用於在消息內容中進行全文搜索
會話過期與清理
自動清理
- 網關會話根據配置的重置策略自動重置
- 重置前,Agent 會保存即將過期會話的記憶和技能
- 結束的會話會保留在數據庫中,直到被清理
手動清理
# 修剪 90 天以上的 sessions
hermes sessions prune
# 刪除特定的session
hermes sessions delete <session_id>
# 修剪前導出(備份)
hermes sessions export backup.jsonl
hermes sessions prune --older-than 30 --yes
數據庫增長緩慢(通常:數百個會話僅佔 10-15 MB)。清理主要適用於刪除不再需要用於搜索召回的舊對話。