第十课:Slash 命令(上):会话控制
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 命令之一,用于创建一个全新的对话会话。执行后:
- 当前会话的完整历史会被保存到会话数据库(SQLite)
- 消息历史被清空,Agent 进入干净状态
- 系统提示词重新加载(包括最新的 MEMORY.md 快照)
- 迭代预算(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 用于恢复一个之前被保存的会话,包括其完整的对话历史。执行后:
- 当前会话(如果有)被保存
- 指定的历史会话被加载,包含所有消息历史
- Agent 恢复到该会话结束时的上下文状态
- 如果未指定 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 的分支功能:
- 保留当前会话的历史到分叉点
- 创建一个新会话,包含从起点到分叉点的所有消息
- 从分叉点开始,你可以走一条完全不同的路径
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 时,系统调用 ContextCompressor(agent/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 将会话标记为已归档状态。归档的会话:
- 不再出现在默认的会话列表中
- 不会参与
/resume的默认列表(但可通过搜索找到) - 会话数据保留在数据库中,不删除
- 可以随时取消归档
7.2 归档 vs 删除
| 特性 | /archive | /delete |
|---|---|---|
| 数据保留 | 保留,可恢复 | 永久删除 |
| 默认列表 | 不显示 | 不显示 |
| 搜索可见 | 可搜索到 | 不可搜索 |
| 恢复可能 | 随时可以 | 不可恢复 |
| 适用场景 | 暂时不需要的会话 | 确认不再需要的会话 |
7.3 使用场景
项目完成后归档 完成一个项目后,归档相关会话可以保持会话列表整洁,同时保留历史记录以备将来参考。
定期清理 建议定期归档不活跃的会话,保持工作环境的有序。
团队协作 在 Gateway 模式下,归档可以帮助团队成员快速找到当前活跃的会话,不被历史会话干扰。
8. /delete — 永久删除会话
8.1 基本用法
/delete # 删除当前会话
/delete <session_id> # 删除指定会话
/delete 永久删除一个会话及其所有数据。这是一个不可逆操作,执行后数据无法恢复。
8.2 安全机制
由于 /delete 是破坏性操作,Hermes Agent 实施了多层安全保护:
- 确认提示:执行前会要求用户确认
- 二次确认:对于包含大量消息的会话,会显示消息数量并要求二次确认
- 审计日志:所有删除操作都会记录到日志中
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 会话管理最佳实践
- 一个任务一个会话:避免在一个会话中混杂多个不相关任务
- 善用 /fork:探索性任务前先分叉,保留回退路径
- 定期 /compact:长对话中定期压缩,保持上下文质量
- 及时 /archive:完成的项目及时归档,保持会话列表整洁
- 谨慎 /delete:除非确信不再需要,优先使用 /archive
思考题
-
/new和/clear都能"清屏",但它们的本质区别是什么?在什么场景下应该使用哪个? -
/compact的压缩算法中,为什么要保护头部 3 条消息和尾部 20 条消息不被压缩?如果调整这些参数会有什么影响? -
/fork创建的分支会话和 Git 分支有哪些相似之处和差异?这种设计如何帮助开发者进行探索性工作? -
在 Gateway 模式下,如果一个团队成员
/delete了一个共享会话,其他成员会受到什么影响?Hermes Agent 如何处理这种并发场景? -
设计一个会话管理策略:一个 5 人开发团队,每天产生约 20 个会话,如何利用
/new,/resume,/fork,/archive,/delete保持工作环境整洁?