阅读时间 4 分钟

深入解析 Hermes Agent 会话管理机制与设置技巧

会话存储架构

Hermes Agent 自动将每一次对话保存为 session,以支持对话恢复、跨会话检索和完整的历史管理。其底层采用双存储结构:

  1. SQLite 数据库 (~/.hermes/state.db):存储结构化元数据,利用 FTS5 插件实现高效的全文检索。记录内容包括 Session ID、来源平台、用户 ID、唯一标题、模型配置、系统提示词快照、完整消息历史及 Token 统计。
  2. JSONL 转录文件 (~/.hermes/sessions/):存储原始对话转录,包含详细的工具调用过程与结果。

会话来源与隔离机制

Hermes 支持多种来源(Source),包括 clitelegramdiscordslack 等。针对不同场景,采用了不同的隔离策略:

1. 群聊隔离逻辑

在 Discord 频道、Slack 频道等共享上下文中,Hermes 默认启用 group_sessions_per_user: true。这意味着:

  • 每个发送者拥有独立的 session 历史。
  • 不同用户的长任务不会相互污染上下文。
  • 中断处理和运行状态按用户隔离。

若需将群组视为一个共享的“房间大脑”,可将该项设为 false

2. 线程隔离

在 Slack 等支持线程的平台中,线程是主要的隔离边界。在同一线程内的对话将沿用同一会话,而新线程则会开启新会话。

CLI 会话管理

1. 对话恢复

  • 恢复最近会话:使用 hermes --continuehermes -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 projectmy 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% 上限时开始摘要压缩

参考来源