这节讨论三个非常实用的技巧:中断(让它立刻停)、Hermes接管(停止后做什么)、回滚(已经做过的事怎么退回去)。三个动作合起来,就是控制权在你和 Hermes 之间切换的整条链路。
2.1 为什么会有这一节
上一节讲过,范围、约束这些要素不写清楚,Hermes 就会按自己的理解去猜。但问题比这更麻烦一点——它不一定会告诉你它在猜。
有些时候,大模型会主动把你的需求补全,或者反问你让你说清楚。但也有很多时候,你的需求说得模模糊糊,它就默默按自己的理解动手了。等你看到输出才发现,它理解的和你想要的不是一回事,结果自然也就没法很好地完成你的任务。
这时候第一件事不是重新说一遍需求,而是先让它停下来。这一节讲的就是这件事:怎么把跑偏的 Hermes 拉回来。
2.2 打断:让 Hermes 停下来
打断有两种方式,都是日常高频操作。
Ctrl+C:强制中断
这是终端里最通用的手势。按一次,Hermes 当前正在做的事会立即停止。
该视频为课程站点内嵌片段,未收录于本地离线包;如需观看请回到线上课程对应课时。
实际上,Hermes 是通过向正在跑的命令发送信号来终止它的:
先发 SIGTERM(请求进程正常退出),大部分命令收到后会自动清理并退出。
如果 1 秒后命令还没退出(比如卡在网络响应或死循环里),就补一发 SIGKILL(强制杀死,进程无法忽略)。
给一个示例:
> 帮我扫描整个项目目录,统计一下……
(Ctrl+C)
光标回到提示符,会话环境还在,之前已经做完的工作不会丢失。适合的场景:
- 发现它思路跑偏了,立刻喊停
- 命令明显有问题,不想让它继续跑
- 临时想起别的事要先做
如果 Ctrl+C 连按两次(2 秒内),会直接退出 Hermes 会话而不是只中断当前任务。别按太快。
打字 + Enter:打断并重定向(最常用)
如果你已经想好了怎么纠正 Hermes,不需要先按 Ctrl+C 再停止。
Hermes 正在跑的时候,直接打新消息按 Enter。这会中断 Hermes,然后立刻处理你的新指令:
> 把桌面上的截图全部整理到 Screenshots/ 目录下
(Hermes 开始跑:创建目录、移动文件……)
> 等等,先别按日期分,按项目名分
Hermes 收到新消息后会停下当前动作,理解你的新要求,然后按新方向继续。注意,你的新要求不需要完整的复述,只需要作为「补充消息」或者「纠偏消息」,因为 Hermes 本身会结合你之前的信息做出正确的判断。
上面的案例就体现了这一点,我们的补充消息是:
等等,先别按日期分,按项目名分
没有完整复述需求。
2.3 打断的三种模式:Interrupt / Queue / Steer
前面讲的是你主动打断 Hermes。
但这不一定是你要的。也许你只是想新增一条任务,希望它忙完当前任务后再处理。又或者,你只是临时想起一件事想先记下来。
针对这个场景,Hermes 提供了一个设置命令:
/busy <模式>
用来告诉 Hermes:当我发新消息的时候,Hermes怎么处理手上的任务? 有三种模式可选:
| 模式 | 行为 | 什么时候用 |
|---|---|---|
interrupt(默认) |
新消息 > 旧任务,立即中断当前任务,处理新指令 | 发现跑偏了、参数错了、临时改主意 |
queue |
新消息排到任务队列末尾,等当前任务完成后按顺序处理 | 不想打断当前工作流,但怕忘记待会要说什么 |
steer |
新消息注入到下一轮工具结果中作为参考,不中断、不排队 | 任务进行中想轻微修正方向,不希望打乱节奏 |
设置后立刻在当前会话中持续有效。模式切换是即时的,即使 Hermes 正在处理消息,下一轮消息处理也会按新模式走。
interrupt:打断模式(默认)
默认模式:
你发消息 → Hermes 终止当前任务 → 你的新消息作为下一轮输入开始执行。
所以 interrupt 适合纠偏、改方向、紧急喊停。有即时性的要求就用它。
queue:排队模式
切换到排队模式:
/busy queue
此后你发的新消息都不会打断当前任务,而是排到一个队列里。当前任务彻底完成后,Hermes 会按先进先出的顺序逐一处理队列里的消息。
这个模式适合: - 当前任务正在跑大量 IO 操作(写文件、上传、下载),打断会造成浪费 - 你想一口气列几条指令或补充条件,让 Hermes 忙完后挨个处理 - 你在做一件连续的事,不希望因为中途插入而丢掉当前进度
如果想在当前任务跑完后处理队列消息前临时插队,直接用 Ctrl+C 打断当前任务。这时队列还在,你发新消息后 Hermes 会先处理你的紧急消息,再接着处理队列。
steer:引导模式
/busy steer
这是最温和的模式。你的新消息不会中断当前任务,也不会排队,而是注入到下一轮工具调用的结果中作为「参考信息」。
举个例子:你让 Hermes「把这个目录下所有图片转成 WebP」,跑了一会儿发现有一张图不想要了。如果用 steer 模式,你发「跳过 logo.png」——Hermes 当前的工具调用不受影响继续跑完,但在拿到工具结果之后、决定下一步之前,会把你的话作为额外输入纳入思考。它可能会说「好的,下一轮会跳过 logo.png」,而不会停下来重新规划。
steer 的典型场景: - 微调方向:给一个轻量修正,不希望中断流程 - 补充约束:想起来某个细节,补充一下但不值得重来 - 进度确认:问一句「怎么样了?」它会在当前这一轮跑完后回答你
steer 模式需要 Agent 支持 steer() 方法。Hermes 内置的 Agent 默认支持,但如果通过某些第三方框架运行,可能没有这个能力。不确定的话先用 queue,它最通用。
steer 真的是一个很棒的方案,我用得最多。
三种模式在一条斜杠命令里一览:
/busy # 查看当前模式
/busy interrupt # 设置为打断模式(默认)
/busy queue # 设置为排队模式
/busy steer # 设置为引导模式
2.4 同步执行任务
以上 Ctrl+C 和 /busy 模式可以覆盖 90% 的场景。但有时候你并不想打断 Hermes,却想并行主动做一些其他操作。
最笨的方式是,再开一个 Hermes 命令行,但并不推荐。还有一些更好的方式:
比如它正在跑一条耗时的任务,你只是想顺便问个问题。这里有几个不那么常用但偶尔很救急的操作:
| 操作 | 用途 | 什么时候用 |
|---|---|---|
/queue <指令> |
排一条指令到队尾,等当前任务完成后再处理 | 不想打断当前操作,但怕自己忘记待会要说什么 |
/background <指令> |
在独立后台会话里跑任务,互不干扰 | 需要并行处理两件独立的事 |
/stop |
杀掉所有后台进程 | 后台任务跑偏了需要紧急停止 |
/background 有两个别名:/bg 和 /btw,三者完全等价。/btw 是 By The Way(顺便说一下)的缩写——它的名字暗示了典型场景:当前任务正在跑,你临时想起另一件事要做,顺手派到后台并行处理。后台任务拥有独立的会话上下文,可以正常使用工具、读写文件,任务完成后结果以面板形式返回,不会污染主会话历史。
/stop 不是终止当前会话或中断正在跑的任务,而是杀掉所有通过 /background(及其别名 /bg、/btw)启动的后台进程。如果你想让 Hermes 停下当前任务,应该用 Ctrl+C ,而不是 /stop。
2.5 回滚:退回到之前的状态
打断只解决「别再往下做」的问题。但如果已经做过某些操作,要能退回去才算清理干净。
Hermes 支持通过检查点(checkpoint)回退。但需要注意:检查点功能默认是关闭的,需要手动开启。
开启检查点
# 方式一:启动会话时临时开启
hermes chat --checkpoints
# 方式二:在配置中全局启用
# ~/.hermes/config.yaml
checkpoints:
enabled: true
检查点什么时候产生
Hermes 会在执行破坏性操作之前自动创建快照:
- 文件操作:
write_file、patch - 危险终端命令:
rm、mv、cp、sed -i、dd、输出重定向(>)、git reset/clean/checkout
每个目录每轮对话最多产生一个检查点,不会无限膨胀。
使用方式
/rollback # 列出所有检查点
/rollback 3 # 回滚到第 3 个检查点
/rollback diff 1 # 预览第 1 个检查点以来的改动
不是所有动作都能退回去:
| 可撤 | 不可撤 |
|---|---|
| 创建文件 → 删除 | curl、kill、git push、ssh |
| 移动文件 → 移回去 | API 调用、webhook、支付 |
| 修改文件 → 写回上一版 | rm -rf 清空回收站、覆盖 |
回滚不是 100% 的时光机,但日常误操作 90% 都在可撤范围内。
2.6 ■ 学点英语
| 中文 | English | 音标 | 说明 |
|---|---|---|---|
| 中断 | Interruption | /ˌɪntəˈrʌpʃən/ | 在任务执行过程中暂停或打断当前流程 |
| 回滚 | Rollback | /ˈroʊlbæk/ | 把文件、配置或状态恢复到之前版本的操作 |
| 任务队列 | Task Queue | /tæsk kjuː/ | 按顺序保存等待处理任务的队列 |
| 后台进程 | Background Process | /ˈbækɡraʊnd ˈprɑːses/ | 在后台独立运行、不阻塞当前会话的进程 |
| 破坏性操作 | Destructive Operation | /dɪˈstrʌktɪv ˌɑːpəˈreɪʃən/ | 可能删除、覆盖或不可逆修改数据的操作 |
| 状态快照 | State Snapshot | /steɪt ˈsnæpʃɑːt/ | 用于恢复或对比的某一时刻系统状态记录 |