无人值守的 Hermes:/heartbeat、/refine 与 /goal 质量门,让 Agent 自己看护、自己改进、自己验收

你是否有过这样的场景:给 Hermes 派了一个长任务,然后每隔十分钟回来看一眼、手动敲一句“继续”;或者任务快结束时,Agent 说“完成了”,但你不敢直接信,还得自己跑一遍测试验证;又或者你希望 Hermes 能把这次干活的经验沉淀成技能,却不知道它什么时候才会自动做这件事。
2026 年 8 月 6 日,Hermes Agent 的 main 分支合并了三个新命令,正好把这三个痛点一次解决:
/heartbeat—— 给当前会话挂一个“闹钟”,空闲到点自动把提示词作为普通用户消息注入,让 Agent 自己持续看护;/refine—— 手动触发 memory/skill 自改进审查(不用再等自动计数器),还能带 focus 定向优化;/goal gate—— 给持久目标挂上确定性质量门:shell 命令 exit 0 才算完成,LLM 说的“做完了”不再是一锤定音。
三个命令都改编自 Prime Intellect 的 Prime-Agent(/heartbeat、Continual Harness、--autonomous-gate),但 Hermes 的实现接的是自己的持久化状态(memory + skill 商店、SessionDB)。注意:这三个命令于 2026-08-06 合并进 main 分支,官方文档已同步更新,但尚未包含在任何正式 release 中(最新发布仍是 v0.20.0)。 文中的命令与行为均以官方文档和提交说明为准,你可以现在就用 pip install -U hermes-agent 的 nightly 分支尝鲜,或等下一个正式版本。
如果你还没用过 /goal 和持久目标,建议先读我们站上的 Herald 发布解读 和隐藏技巧合集(里面有 /goal 的基础用法)。
1. /heartbeat:让会话“自己醒来干活”
/heartbeat 给当前会话设置一条周期性指令。每当会话空闲且间隔到期,这条指令就会以一条普通用户消息的形式注入会话——同一个对话、同一份上下文、同一份 prompt cache,什么都不换。
/heartbeat every 10m Check the deployment and report meaningful changes
设置成功后,10 分钟后会话一空闲,Hermes 就会自动“醒”过来执行这条指令。官方文档给了一个非常直观的例子:你边写代码边让它看护 CI:
You: /heartbeat every 15m Check whether the CI run for PR #1234 finished; summarize the result when it does
♥ Heartbeat set (every 15m): Check whether the CI run for PR #1234 finished; ...
[15 分钟后,你还在同一个会话里忙别的]
Hermes: [Heartbeat — recurring instruction, fires every 15m]
💻 gh pr checks 1234 (1.2s)
CI is still running (14/37 checks complete). Nothing to report yet.
命令与子命令
| 命令 | 作用 |
|---|---|
/heartbeat every <间隔> <提示词> |
设置(或替换)会话心跳。间隔支持 90s、10m、2h、1d 等写法(下限 60 秒) |
/heartbeat 或 /heartbeat status |
查看当前心跳、间隔和距下次触发时间 |
/heartbeat pause |
暂停,不删除 |
/heartbeat resume |
恢复(重新锚定计时器,不会立刻补触发一次) |
/heartbeat clear |
删除心跳 |
/hb 是它的别名。CLI 和 gateway(Telegram、Discord、Slack 等)都可用,Slack 上写作 /hermes heartbeat ...。
关键行为细节
- 仅空闲时触发:心跳绝不会打断正在运行的回合。Agent 忙的时候 tick 顺延到下次空闲。
- 错过的 tick 会合并:如果会话一直忙(或进程没在运行),几个间隔过去后只会触发一次心跳,不会堆积出一串积压任务。
- 用户消息永远优先:排队中的真实用户消息先处理,心跳等队列排空。
- 缓存安全:注入的是一条普通用户消息,不改 system prompt、不换工具集,prompt cache 完全不受影响。
- “不要无中生有”护栏:注入的提示词自带一句约束——“如果当前没有值得做的事,简短回复’没有变化’然后停下,不要发明工作”。空闲心跳不会制造 busywork。
- 持久化:状态存在
SessionDB.state_meta(键为heartbeat:<session_id>),跨/resume和上下文压缩轮换存活。但触发要求所属进程(CLI 会话或 gateway)在运行——需要“任何情况下都执行”的调度,请用 cron。
和 cron 怎么选?
/heartbeat |
hermes cron |
|
|---|---|---|
| 运行在 | 当前对话里——带着全部上下文和讨论记忆 | 每次 tick 一个全新的隔离会话 |
| 进程重启后 | 状态存活(SessionDB),下次驱动会话时恢复触发 | 完全持久的调度器 |
| 数量 | 每个会话一个 | 无限个任务 |
| 适合 | “在我们这个线程里边干活边盯着 X” | 常驻任务、报告、看门狗、投递 |
一句话:需要对话上下文的周期任务用 /heartbeat;自包含的任务用 cron。两者互补,不冲突。
2. /refine:把“自动沉淀经验”提前到你想让它发生的时刻
Hermes 有个内置的后台自改进机制:每跑一定轮数(memory 侧约 10 轮对话、skill 侧约 10 次迭代),它会在回合间隙自动启动一个后台审查,把会话里值得沉淀的东西写进 memory 商店或 skill 商店。机制很好,但时机是固定的——你不能让它“现在、立刻”审查。
/refine 就是那个“立刻”:
/refine
不带参数时,它立即触发和自动审查完全相同的后台 review(对快照运行,实时会话、prompt cache 一概不动,审查完汇报结果)。
更有用的是带 focus 的定向审查:
/refine save the deploy workflow as a skill
focus 文本会追加到审查提示词里,让后台 fork 优先处理你指定的事。审查在后台线程里跑,不影响你正在进行的对话——它拿到的是一份会话历史快照,所以“边聊边沉淀”完全可行。
这个设计其实是把 Prime-Agent 的 Continual Harness 概念搬到了 Hermes 上:Hermes 对等的“持久状态”就是 memory + skill 商店,审查 fork 天然就是它的落点。自动触发传 None focus,提示词与之前字节级一致——也就是说这个新命令不会改变自动审查的任何行为,只是多了一个手动入口。
实用场景:
- 刚调通一个复杂的部署流程,
/refine save the deploy workflow as a skill,让它在后台把步骤沉淀成可复用技能; - 发现自己的 prompt 风格让 Agent 老是在某个环节翻车,
/refine review how I phrase change requests,让它针对这个点优化你的记忆里的偏好; - 跑完一个长 session 收尾时
/refine一把梭,把整场对话的干货归档。
3. /goal gate:让“完成”从 LLM 的判断变成机器的判定
/goal 的完成判定默认靠一个 judge 模型读对话散文来打分——这已经很好了,但“散文”终归是概率性的。质量门(quality gate)是更强的约束:一条确定性的 shell 命令,exit 0 才算通过,否则目标不可能被判定为完成。
/goal Fix the flaky session tests
/goal gate add scripts/run_tests.sh tests/hermes_cli/test_goals.py
门是怎么跑的(每一轮)
- 门先于 judge 运行:任一 gate 失败,judge 直接不调用——红灯是目标未完成的确定性证据。gate 的 exit code 和输出尾部(约最后 3KB)会作为续跑提示喂回 Agent,让它对着真实失败迭代,而不是对着一个散文式的“还没好”。
- 全部通过才进入正常判定:LLM judge 再照常决定 done/continue/wait。
- 工作区未变化 → 不重跑:如果一个 gate 失败后工作区没有任何变化(通过 git HEAD + working-tree status 指纹判断),gate 不会被重复执行——直接重放失败记录、推进尝试计数。卡死的 Agent 无法靠反复重跑同一个红色测试套件烧时间。不在 git 仓库里时,gate 总是重跑。
- 重试有上限:每个 gate 默认 3 次重试、5 分钟超时。重试耗尽时目标自动暂停(和回合预算耗尽一样),并提示你去手动修复、移除 gate 或
/goal resume。
命令
| 命令 | 作用 |
|---|---|
/goal gate add <命令> |
添加质量门 |
/goal gate 或 /goal gate list |
列出所有 gate 及其通过/失败状态 |
/goal gate remove <N> |
移除第 N 个 gate(从 1 开始) |
/goal gate clear |
移除全部 gate |
gate 随目标一起持久化在 SessionDB.state_meta 中(跨 /resume 和上下文压缩存活),gate 管理命令在目标运行中也可以安全使用(gate 只会在回合边界执行)。
和完成契约(Completion Contracts)怎么搭配?
v0.18.0 引入的完成契约是让 Agent 自己声明完成标准并自证完成——它塑造的是“Agent 往什么方向努力”。质量门是机制层面的:让“做完了”变成机器可检查的事实。两者可以组合:
- 用契约告诉 Agent 目标长什么样;
- 用 gate 告诉系统“什么才算真的做完”;
- 两者都设时,gate 先跑——机械检查永远优先于散文判断。
再配合 v0.19 时代的 /subgoal 和 /goal wait <pid> [reason](把循环停在一个后台进程上,进程退出后自动恢复),/goal 家族已经是一套完整的“自主执行 + 自主验收”体系了。
4. 组合实战:一个完整的无人值守工作流
把三个命令拼起来,一个典型的“晚上睡觉,早上验收”场景长这样:
# ① 立目标:修好失败的测试套件,并加回归测试
/goal Make scripts/run_tests.sh fully green and add a regression test for the session-close bug
# ② 挂质量门:测试套件不过,就不算完
/goal gate add scripts/run_tests.sh
/goal gate add git diff --exit-code --stat # 顺带要求有实际改动
# ③ 挂心跳:每 30 分钟自己汇报一次进度
/heartbeat every 30m Summarize current goal progress and what you will do next; if nothing changed, reply briefly
# ④ 收尾时把经验沉淀成技能
/refine save the troubleshooting steps for session-close bugs as a skill
于是这个会话会自己循环:干活 → gate 验证 → 不通过就对着失败输出继续修 → 全绿后 judge 判定完成 → 心跳每隔 30 分钟向你汇报(你有空瞄一眼即可)→ 完事后再 /refine 把排障经验沉淀成技能。你只需要在第二天早上看结果。
再扩展一步,把这套组合挂到 gateway(比如 Telegram)上,配合我们之前写的 webhook 业务通知,还能把“完成/失败”事件推给团队——一套完整的无人值守 CI 伴侣就成型了。
5. 注意事项与边界
- 进程要活着:
/heartbeat和/goal的循环都依赖所属进程(CLI 会话或 gateway)在运行。需要完全持久、跨进程的调度,用hermes cron。 - gate 需要能感知工作区:
unchanged-workspace skip依赖 git 指纹,不在 git 仓库里时 gate 每轮都会重跑。 - 别把 heartbeat 当 cron 用:心跳是“带着上下文看护当前线程”,不是通用调度器;每会话一个的限制是有意为之。
- 版本状态:本文三个命令在 main 分支(2026-08-06 合并),尚未进入正式 release。升级到包含它们的版本前,
/heartbeat、/refine、/goal gate会报未知命令——属正常现象。
结语
/heartbeat、/refine、/goal gate 三个命令单看都不大,但组合起来补齐了“无人值守自治”的最后三块拼图:看护(watch)、沉淀(learn)、验收(verify)。配合已有的 /goal、/subgoal、完成契约和 cron,Hermes 从“你指挥它干活”进化到了“你定义规则,它自己干活、自己改进、自己证明干完了”。