💡阅读指南

这节讨论三个非常实用的技巧:中断(让它立刻停)、Hermes接管(停止后做什么)、回滚(已经做过的事怎么退回去)。三个动作合起来,就是控制权在你和 Hermes 之间切换的整条链路。

2.1 为什么会有这一节

上一节讲过,范围、约束这些要素不写清楚,Hermes 就会按自己的理解去猜。但问题比这更麻烦一点——它不一定会告诉你它在猜。

有些时候,大模型会主动把你的需求补全,或者反问你让你说清楚。但也有很多时候,你的需求说得模模糊糊,它就默默按自己的理解动手了。等你看到输出才发现,它理解的和你想要的不是一回事,结果自然也就没法很好地完成你的任务。

这时候第一件事不是重新说一遍需求,而是先让它停下来。这一节讲的就是这件事:怎么把跑偏的 Hermes 拉回来。

2.2 打断:让 Hermes 停下来

打断有两种方式,都是日常高频操作。

Ctrl+C:强制中断

这是终端里最通用的手势。按一次,Hermes 当前正在做的事会立即停止。

🎬
本节附有教学视频 #32

该视频为课程站点内嵌片段,未收录于本地离线包;如需观看请回到线上课程对应课时。

📌技术细节

实际上,Hermes 是通过向正在跑的命令发送信号来终止它的:

先发 SIGTERM(请求进程正常退出),大部分命令收到后会自动清理并退出。

如果 1 秒后命令还没退出(比如卡在网络响应或死循环里),就补一发 SIGKILL(强制杀死,进程无法忽略)。

给一个示例:

code
> 帮我扫描整个项目目录,统计一下……
(Ctrl+C)

光标回到提示符,会话环境还在,之前已经做完的工作不会丢失。适合的场景:

  • 发现它思路跑偏了,立刻喊停
  • 命令明显有问题,不想让它继续跑
  • 临时想起别的事要先做

如果 Ctrl+C 连按两次(2 秒内),会直接退出 Hermes 会话而不是只中断当前任务。别按太快。

打字 + Enter:打断并重定向(最常用)

如果你已经想好了怎么纠正 Hermes,不需要先按 Ctrl+C 再停止。

Hermes 正在跑的时候,直接打新消息按 Enter。这会中断 Hermes,然后立刻处理你的新指令:

code
> 把桌面上的截图全部整理到 Screenshots/ 目录下
(Hermes 开始跑:创建目录、移动文件……)
> 等等,先别按日期分,按项目名分

Hermes 收到新消息后会停下当前动作,理解你的新要求,然后按新方向继续。注意,你的新要求不需要完整的复述,只需要作为「补充消息」或者「纠偏消息」,因为 Hermes 本身会结合你之前的信息做出正确的判断。

上面的案例就体现了这一点,我们的补充消息是:

等等,先别按日期分,按项目名分

没有完整复述需求。

2.3 打断的三种模式:Interrupt / Queue / Steer

前面讲的是你主动打断 Hermes。

但这不一定是你要的。也许你只是想新增一条任务,希望它忙完当前任务后再处理。又或者,你只是临时想起一件事想先记下来。

针对这个场景,Hermes 提供了一个设置命令:

code
/busy <模式>

用来告诉 Hermes:当我发新消息的时候,Hermes怎么处理手上的任务? 有三种模式可选:

模式 行为 什么时候用
interrupt(默认) 新消息 > 旧任务,立即中断当前任务,处理新指令 发现跑偏了、参数错了、临时改主意
queue 新消息排到任务队列末尾,等当前任务完成后按顺序处理 不想打断当前工作流,但怕忘记待会要说什么
steer 新消息注入到下一轮工具结果中作为参考,不中断、不排队 任务进行中想轻微修正方向,不希望打乱节奏
📌切换模式后立即生效

设置后立刻在当前会话中持续有效。模式切换是即时的,即使 Hermes 正在处理消息,下一轮消息处理也会按新模式走。

interrupt:打断模式(默认)

默认模式:

你发消息 → Hermes 终止当前任务 → 你的新消息作为下一轮输入开始执行。

所以 interrupt 适合纠偏、改方向、紧急喊停。有即时性的要求就用它。

queue:排队模式

切换到排队模式:

code
/busy queue

此后你发的新消息都不会打断当前任务,而是排到一个队列里。当前任务彻底完成后,Hermes 会按先进先出的顺序逐一处理队列里的消息。

这个模式适合: - 当前任务正在跑大量 IO 操作(写文件、上传、下载),打断会造成浪费 - 你想一口气列几条指令或补充条件,让 Hermes 忙完后挨个处理 - 你在做一件连续的事,不希望因为中途插入而丢掉当前进度

如果想在当前任务跑完后处理队列消息前临时插队,直接用 Ctrl+C 打断当前任务。这时队列还在,你发新消息后 Hermes 会先处理你的紧急消息,再接着处理队列。

steer:引导模式

code
/busy steer

这是最温和的模式。你的新消息不会中断当前任务,也不会排队,而是注入到下一轮工具调用的结果中作为「参考信息」。

举个例子:你让 Hermes「把这个目录下所有图片转成 WebP」,跑了一会儿发现有一张图不想要了。如果用 steer 模式,你发「跳过 logo.png」——Hermes 当前的工具调用不受影响继续跑完,但在拿到工具结果之后、决定下一步之前,会把你的话作为额外输入纳入思考。它可能会说「好的,下一轮会跳过 logo.png」,而不会停下来重新规划。

steer 的典型场景: - 微调方向:给一个轻量修正,不希望中断流程 - 补充约束:想起来某个细节,补充一下但不值得重来 - 进度确认:问一句「怎么样了?」它会在当前这一轮跑完后回答你

📌技术说明

steer 模式需要 Agent 支持 steer() 方法。Hermes 内置的 Agent 默认支持,但如果通过某些第三方框架运行,可能没有这个能力。不确定的话先用 queue,它最通用。

steer 真的是一个很棒的方案,我用得最多。

三种模式在一条斜杠命令里一览:

code
/busy        # 查看当前模式
/busy interrupt   # 设置为打断模式(默认)
/busy queue       # 设置为排队模式
/busy steer       # 设置为引导模式

2.4 同步执行任务

以上 Ctrl+C/busy 模式可以覆盖 90% 的场景。但有时候你并不想打断 Hermes,却想并行主动做一些其他操作。

最笨的方式是,再开一个 Hermes 命令行,但并不推荐。还有一些更好的方式:

比如它正在跑一条耗时的任务,你只是想顺便问个问题。这里有几个不那么常用但偶尔很救急的操作:

操作 用途 什么时候用
/queue <指令> 排一条指令到队尾,等当前任务完成后再处理 不想打断当前操作,但怕自己忘记待会要说什么
/background <指令> 在独立后台会话里跑任务,互不干扰 需要并行处理两件独立的事
/stop 杀掉所有后台进程 后台任务跑偏了需要紧急停止
📌background

/background 有两个别名:/bg/btw,三者完全等价。/btwBy The Way(顺便说一下)的缩写——它的名字暗示了典型场景:当前任务正在跑,你临时想起另一件事要做,顺手派到后台并行处理。后台任务拥有独立的会话上下文,可以正常使用工具、读写文件,任务完成后结果以面板形式返回,不会污染主会话历史。

📌STOP

/stop 不是终止当前会话或中断正在跑的任务,而是杀掉所有通过 /background(及其别名 /bg/btw)启动的后台进程。如果你想让 Hermes 停下当前任务,应该用 Ctrl+C ,而不是 /stop

2.5 回滚:退回到之前的状态

打断只解决「别再往下做」的问题。但如果已经做过某些操作,要能退回去才算清理干净。

Hermes 支持通过检查点(checkpoint)回退。但需要注意:检查点功能默认是关闭的,需要手动开启。

开启检查点

Bash
# 方式一:启动会话时临时开启
hermes chat --checkpoints

# 方式二:在配置中全局启用
# ~/.hermes/config.yaml
checkpoints:
  enabled: true

检查点什么时候产生

Hermes 会在执行破坏性操作之前自动创建快照:

  • 文件操作write_filepatch
  • 危险终端命令rmmvcpsed -idd、输出重定向(>)、git reset/clean/checkout

每个目录每轮对话最多产生一个检查点,不会无限膨胀。

使用方式

code
/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/ 用于恢复或对比的某一时刻系统状态记录