无人值守的 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 <间隔> <提示词> 设置(或替换)会话心跳。间隔支持 90s10m2h1d 等写法(下限 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

门是怎么跑的(每一轮)

  1. 门先于 judge 运行:任一 gate 失败,judge 直接不调用——红灯是目标未完成的确定性证据。gate 的 exit code 和输出尾部(约最后 3KB)会作为续跑提示喂回 Agent,让它对着真实失败迭代,而不是对着一个散文式的“还没好”。
  2. 全部通过才进入正常判定:LLM judge 再照常决定 done/continue/wait。
  3. 工作区未变化 → 不重跑:如果一个 gate 失败后工作区没有任何变化(通过 git HEAD + working-tree status 指纹判断),gate 不会被重复执行——直接重放失败记录、推进尝试计数。卡死的 Agent 无法靠反复重跑同一个红色测试套件烧时间。不在 git 仓库里时,gate 总是重跑。
  4. 重试有上限:每个 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 从“你指挥它干活”进化到了“你定义规则,它自己干活、自己改进、自己证明干完了”。

想要第一时间获取这类前沿特性解读,可以关注我们的博客;关于 Hermes 的完整能力地图,官方文档是最权威的来源。