AgentHarness 课程
Hermes 专题/课程概述

第十课:Slash 命令(上):会话控制

/new/resume/fork/compact/clear/archive/delete

1. Slash 命令体系总览

1.1 什么是 Slash 命令

Slash 命令(斜杠命令)是 Hermes Agent 提供的一组/ 开头的内置快捷指令,用于在对话过程中快速执行控制操作,而无需离开当前会话界面。与自然语言交互不同,Slash 命令是确定性的、即时的——它们直接触发系统内部逻辑,不经过 LLM 推理,因此响应速度极快(通常 < 100ms)。

Slash 命令的设计哲学是**"不打断工作流"**:当 Agent 正在执行复杂任务时,你可以随时通过 Slash 命令查看状态、切换配置、管理会话,而不会中断 Agent 的执行流程。

1.2 命令分类

Hermes Agent 的 Slash 命令按功能可分为以下几个类别:

类别命令示例用途
会话控制/new, /resume, /fork, /compact, /clear, /archive, /delete管理会话生命周期
模型与权限/model, /fast, /permissions, /approve, /plan, /goal控制模型选择和权限
高级功能/mcp, /skills, /plugins, /memories, /apps, /agent, /ide扩展功能管理
界面定制/theme, /statusline, /vim, /keymap, /raw, /title界面和交互定制
信息查询/usage, /help, /version, /status查看系统状态和帮助

本课将重点讲解会话控制相关的 7 个核心命令。


2. /new — 开始新对话

2.1 基本用法

/new

/new 是最常用的 Slash 命令之一,用于创建一个全新的对话会话。执行后:

  1. 当前会话的完整历史会被保存到会话数据库(SQLite)
  2. 消息历史被清空,Agent 进入干净状态
  3. 系统提示词重新加载(包括最新的 MEMORY.md 快照)
  4. 迭代预算(IterationBudget)重置为默认值

2.2 实现机制

从源码角度看,/new 命令触发 SessionStore.reset_session() 方法(gateway/session.py)。该方法执行以下操作:

# 简化的 reset_session 流程
def reset_session(self, chat_id):
    # 1. 将当前会话标记为已完成
    self._finalize_current_session(chat_id)
    # 2. 创建新的 session_id
    new_session_id = self._generate_session_id()
    # 3. 清空消息历史
    self.sessions[chat_id] = SessionHistory(session_id=new_session_id)
    # 4. 触发 session:start Hook 事件
    self.hook_registry.emit('session:start', chat_id=chat_id)

2.3 使用场景

场景一:切换话题 当你完成一个任务(比如部署服务),想开始一个完全不相关的任务(比如写文档),使用 /new 可以避免之前的部署上下文干扰新任务。

场景二:上下文污染恢复 如果 Agent 因为错误的工具输出或误解而进入混乱状态,/new 是最快速的"重置"方式。

场景三:Token 预算管理 在长对话中,上下文会不断膨胀。如果不想使用压缩(可能丢失信息),/new 可以彻底重新开始。

2.4 注意事项

  • /new 不会删除旧会话,只是切换到新会话。旧会话仍可通过 /resume 访问
  • 如果 Agent 正在执行工具调用,/new 会等待当前工具执行完成后才生效
  • 在 Gateway 模式下,每个平台/用户组合有独立的会话,/new 只影响当前对话

3. /resume — 恢复历史会话

3.1 基本用法

/resume              # 选择最近的会话恢复
/resume <session_id> # 恢复指定会话

/resume 用于恢复一个之前被保存的会话,包括其完整的对话历史。执行后:

  1. 当前会话(如果有)被保存
  2. 指定的历史会话被加载,包含所有消息历史
  3. Agent 恢复到该会话结束时的上下文状态
  4. 如果未指定 session_id,系统会列出最近的会话供选择

3.2 会话搜索与浏览

/resume 配合 session_search 工具可以实现强大的历史会话搜索:

/resume              # 列出最近 10 个会话
/resume deploy       # 搜索包含 "deploy" 关键词的历史会话

会话数据库(SQLite)支持按以下维度搜索:

  • 关键词匹配(消息内容)
  • 时间范围
  • 平台来源
  • 会话标签

3.3 使用场景

场景一:中断后恢复 如果你因为网络断开、关闭终端等原因中断了一个正在进行的任务,/resume 可以让你从断点继续。Agent 会看到之前所有的对话历史,包括工具调用的结果。

场景二:参考历史决策 当需要参考之前的技术决策(比如某个架构讨论的结论)时,/resume 可以快速定位到相关会话。

场景三:多任务切换 在多个并行任务之间切换时,/resume/new 的组合使用可以高效管理工作流。

3.4 会话状态恢复的限制

需要注意的是,/resume 恢复的是对话历史,但以下状态不会自动恢复

  • 终端工具的后台进程状态(background=true 的进程可能已经结束)
  • 浏览器工具的页面状态(浏览器上下文已关闭)
  • 子 Agent 的执行状态(子 Agent 已终止)
  • 文件系统的临时变更(临时文件可能已被清理)

4. /fork — 分叉会话

4.1 基本用法

/fork                # 从当前会话分叉
/fork <N>            # 从当前会话的第 N 轮分叉

/fork 是一个高级会话管理命令,用于从当前会话的某个时间点创建一个分支。这类似于 Git 的分支功能:

  1. 保留当前会话的历史到分叉点
  2. 创建一个新会话,包含从起点到分叉点的所有消息
  3. 从分叉点开始,你可以走一条完全不同的路径

4.2 使用场景

场景一:探索性任务 当 Agent 正在执行一个任务,你想到另一个可能更好的方案时,可以 /fork 然后尝试新方案。如果新方案不行,/resume 回到原来的分支继续。

场景二:A/B 对比 对于同一个问题,想让 Agent 用两种不同的方式分别处理,/fork 可以让你在同一个上下文基础上分别探索。

场景三:错误回退 如果 Agent 在某一步操作出错(比如错误的重构),/fork 到出错之前的点,然后重新开始。

4.3 分叉与检查点的对比

特性/fork/rollback
作用层会话历史(对话层面)文件系统(代码层面)
操作方式创建新会话分支恢复文件到之前的状态
保留原会话是,原会话继续存在否,回滚后原检查点丢失
适用场景探索不同方案撤销错误的代码修改

两者可以结合使用:/fork 创建新的对话分支 + /rollback 恢复代码状态。


5. /compact — 压缩历史释放 Token

5.1 基本用法

/compact               # 自动压缩
/compact <target>      # 压缩到指定 token 数

/compact手动触发上下文压缩的命令。虽然 Hermes Agent 有自动压缩机制(当上下文使用率超过阈值时自动触发),但 /compact 允许你在任何需要的时候主动压缩

5.2 压缩算法详解

当执行 /compact 时,系统调用 ContextCompressoragent/context_compressor.py)执行以下步骤:

Step 1:工具输出剪枝(零成本) 将超过 200 字符的旧工具输出替换为短占位符:

[Old tool output cleared to save context space]

这一步不需要 LLM 调用,是纯粹的字符串替换,因此零成本。

Step 2:确定压缩边界

  • 保护头部:前 3 条消息(系统提示词 + 初始交换)不可压缩
  • 保护尾部:根据 token 预算从末尾向前累积,至少保留 20 条近期消息

Step 3:LLM 结构化摘要 使用压缩模型(默认为主模型,建议配置为廉价模型)生成结构化摘要:

Goal: [用户目标]
Progress: [Done / In Progress / Blocked]
Key Decisions: [关键技术决策]
Resolved Questions: [已解答的问题]
Pending User Asks: [待处理的用户请求]
Relevant Files: [相关文件路径]
Remaining Work: [待完成的工作]

Step 4:消息替换 将被压缩范围内的消息替换为一条摘要消息。

5.3 何时使用 /compact

  • 主动管理 Token:在执行复杂任务前,主动压缩可以释放更多 token 空间
  • 自动压缩阈值前:如果你知道即将进行大量工具调用,提前压缩可以避免自动压缩的延迟
  • 切换上下文前:从一个长讨论切换到相关但不同的话题时,压缩可以保留关键信息同时释放空间

5.4 压缩配置

compression:
  enabled: true
  threshold: 0.50          # 上下文使用率达到 50% 时自动触发
  target_ratio: 0.20       # 压缩后保留为目标大小的 20%
  protect_last_n: 20       # 至少保护最近 20 条消息
  summary_model: ""         # 空=使用主模型;建议设为廉价模型
  summary_provider: "auto"  # 摘要使用的 provider
  timeout: 120             # 摘要生成超时(秒)

6. /clear — 清除终端显示

6.1 基本用法

/clear

/clear 用于清除终端/聊天窗口中的显示内容。这是一个纯粹的显示操作,不会影响对话历史或 Agent 状态

6.2 与 /new 的关键区别

特性/clear/new
显示内容清除屏幕清除屏幕
对话历史保留清空
Agent 上下文保留重置
迭代预算保留重置
内存使用不变释放

6.3 使用场景

  • 界面整洁:长时间对话后,屏幕内容过多,/clear 快速清理显示
  • 隐私保护:在共享屏幕上清除敏感信息的显示(但历史仍保留)
  • 心理重置:视觉上"重新开始",但保留所有上下文

6.4 在不同平台上的行为

  • CLI:发送 ANSI 清屏序列 \033[2J\033[H
  • Gateway(飞书/Telegram 等):发送一个分隔标记,视觉上区分新旧内容
  • API Server:返回空响应,客户端自行清屏

7. /archive — 归档会话

7.1 基本用法

/archive               # 归档当前会话
/archive <session_id>  # 归档指定会话

/archive 将会话标记为已归档状态。归档的会话:

  1. 不再出现在默认的会话列表中
  2. 不会参与 /resume 的默认列表(但可通过搜索找到)
  3. 会话数据保留在数据库中,不删除
  4. 可以随时取消归档

7.2 归档 vs 删除

特性/archive/delete
数据保留保留,可恢复永久删除
默认列表不显示不显示
搜索可见可搜索到不可搜索
恢复可能随时可以不可恢复
适用场景暂时不需要的会话确认不再需要的会话

7.3 使用场景

项目完成后归档 完成一个项目后,归档相关会话可以保持会话列表整洁,同时保留历史记录以备将来参考。

定期清理 建议定期归档不活跃的会话,保持工作环境的有序。

团队协作 在 Gateway 模式下,归档可以帮助团队成员快速找到当前活跃的会话,不被历史会话干扰。


8. /delete — 永久删除会话

8.1 基本用法

/delete               # 删除当前会话
/delete <session_id>  # 删除指定会话

/delete 永久删除一个会话及其所有数据。这是一个不可逆操作,执行后数据无法恢复。

8.2 安全机制

由于 /delete 是破坏性操作,Hermes Agent 实施了多层安全保护:

  1. 确认提示:执行前会要求用户确认
  2. 二次确认:对于包含大量消息的会话,会显示消息数量并要求二次确认
  3. 审计日志:所有删除操作都会记录到日志中

8.3 何时使用 /delete

  • 敏感数据清理:会话中包含密码、密钥等敏感信息时
  • 测试会话清理:清理用于测试目的的无意义会话
  • 合规要求:根据数据保留政策需要删除过期数据

8.4 删除的数据范围

执行 /delete 时,以下数据会被删除:

  • 消息历史(SQLite 中的 messages 表记录)
  • 会话元数据
  • 关联的检查点(如果存在)
  • 关联的工具执行记录

以下数据不会被删除

  • MEMORY.md 和 USER.md(记忆系统独立于会话)
  • Agent 日志文件(日志是追加写入的独立文件)
  • 全局配置

9. 命令组合与工作流

9.1 典型工作流

# 工作流 1:多任务并行管理
/new                  # 开始新任务 A
... (执行任务 A) ...
/new                  # 开始新任务 B
... (执行任务 B) ...
/resume               # 切回任务 A 继续
# 工作流 2:探索性开发
... (Agent 执行重构) ...
/fork                 # 分叉一个探索分支
... (尝试新方案) ...
# 如果新方案不行
/resume               # 回到原始分支
# 工作流 3:定期清理
/archive              # 归档完成的任务
/compact              # 压缩当前长对话
/new                  # 开始新话题

9.2 会话管理最佳实践

  1. 一个任务一个会话:避免在一个会话中混杂多个不相关任务
  2. 善用 /fork:探索性任务前先分叉,保留回退路径
  3. 定期 /compact:长对话中定期压缩,保持上下文质量
  4. 及时 /archive:完成的项目及时归档,保持会话列表整洁
  5. 谨慎 /delete:除非确信不再需要,优先使用 /archive

思考题

  1. /new/clear 都能"清屏",但它们的本质区别是什么?在什么场景下应该使用哪个?

  2. /compact 的压缩算法中,为什么要保护头部 3 条消息和尾部 20 条消息不被压缩?如果调整这些参数会有什么影响?

  3. /fork 创建的分支会话和 Git 分支有哪些相似之处和差异?这种设计如何帮助开发者进行探索性工作?

  4. 在 Gateway 模式下,如果一个团队成员 /delete 了一个共享会话,其他成员会受到什么影响?Hermes Agent 如何处理这种并发场景?

  5. 设计一个会话管理策略:一个 5 人开发团队,每天产生约 20 个会话,如何利用 /new, /resume, /fork, /archive, /delete 保持工作环境整洁?