深入解析 Hermes Agent 会话管理机制与设置技巧
会话存储架构
Hermes Agent 自动将每一次对话保存为 session,以支持对话恢复、跨会话检索和完整的历史管理。其底层采用双存储结构:
- SQLite 数据库 (
~/.hermes/state.db):存储结构化元数据,利用 FTS5 插件实现高效的全文检索。记录内容包括 Session ID、来源平台、用户 ID、唯一标题、模型配置、系统提示词快照、完整消息历史及 Token 统计。 - JSONL 转录文件 (
~/.hermes/sessions/):存储原始对话转录,包含详细的工具调用过程与结果。
会话来源与隔离机制
Hermes 支持多种来源(Source),包括 cli、telegram、discord、slack 等。针对不同场景,采用了不同的隔离策略:
1. 群聊隔离逻辑
在 Discord 频道、Slack 频道等共享上下文中,Hermes 默认启用 group_sessions_per_user: true。这意味着:
- 每个发送者拥有独立的 session 历史。
- 不同用户的长任务不会相互污染上下文。
- 中断处理和运行状态按用户隔离。
若需将群组视为一个共享的“房间大脑”,可将该项设为 false。
2. 线程隔离
在 Slack 等支持线程的平台中,线程是主要的隔离边界。在同一线程内的对话将沿用同一会话,而新线程则会开启新会话。
CLI 会话管理
1. 对话恢复
- 恢复最近会话:使用
hermes --continue或hermes -c。 - 按 ID 或标题恢复:使用
hermes --resume <ID/Title>或hermes -r <ID/Title>。
恢复时,Hermes 会显示一个紧凑的摘要面板(Recap Panel),通过颜色标识区分用户(金点)与助手(绿点),并折叠工具调用过程。可通过 display.resume_display: minimal 关闭该面板。
2. 会话命名与 Lineage
- 自动命名:系统在首轮交互后自动生成 3-7 个词的描述性标题。
- 手动命名:在 session 中使用
/title <name>命令,或通过hermes sessions rename <ID> <name>修改。 - 自动血统 (Lineage):当会话因上下文压缩而分裂出续篇时,标题会自动递增(如
my project→my project #2)。
3. 管理命令速查
- 列表:
hermes sessions list(支持--source筛选)。 - 导出:
hermes sessions export <file>.jsonl(支持单会话导出)。 - 删除:
hermes sessions delete <ID>。 - 清理:
hermes sessions prune(默认清理 90 天前已结束的会话)。 - 统计:
hermes sessions stats。
跨会话检索:session_search
Hermes 内建 session_search 工具,允许 Agent 检索历史对话以找回丢失的上下文。
- 工作流:利用 SQLite FTS5 进行相关性排序 → 聚合 Top N 个 session → 提取匹配点前后约 100K 字符 → 调用快速摘要模型生成结果。
- 支持语法:支持简单关键词、精确短语 (
"...")、布尔运算 (OR,NOT) 及前缀匹配 (*)。
Gateway 会话重置策略
对于消息平台会话,Hermes 提供了四种重置策略 (reset_policy):
idle:空闲 N 分钟后重置。daily:每天固定时间重置。both:两者取其先。none:永不自动重置。
在自动重置前,Agent 会获得一个 Turn 用以将重要信息保存至 Memory 或 Skills。此外,含有活跃后台进程的会话不会被自动重置。
核心配置技巧
1. 上下文压缩 (compression)
为了在长对话中维持性能,Hermes 采用分段压缩机制:
threshold: 设置触发压缩的上下文百分比(默认 0.50)。target_ratio: 压缩后保留的中间内容比例(默认 0.20)。protect_last_n: 强制保留最近 N 条消息不被压缩(默认 20)。
2. 关键配置项汇总
| 配置项 | 推荐值 | 作用 |
|---|---|---|
display.resume_display |
full |
恢复会话时显示历史回顾面板 |
group_sessions_per_user |
true |
群聊中按用户隔离会话,防止上下文污染 |
compression.enabled |
true |
自动压缩长对话,防止触碰模型 Context Limit |
compression.threshold |
0.50 |
达到 50% 上限时开始摘要压缩 |
Member discussion