持久目标 (/goal)
/goal 给 Hermes 一个在多轮对话中持续存在的目标。在每一轮之后,一个轻量级裁判模型会检查助手的最后一次回应是否满足目标。如果不满足,Hermes 会自动将一个延续提示反馈到同一个会话中并继续工作——直到目标实现、您暂停或清除了它,或者轮次预算用尽。
这是我们对 Ralph 循环 的理解,直接灵感来源于 Eric Traut (OpenAI) 的 Codex CLI 0.128.0 的 /goal。核心思想——让一个目标在多轮对话中持续存在,并在其实现前不停止——是他们的。此处的实现是独立的,并适配了 Hermes 的架构。
何时使用它
将 /goal 用于您希望 Hermes 无需您在每一轮都重新提示就能自行迭代的任务:
- "修复
src/中的每一个 lint 错误并验证ruff check通过" - "将功能 X 从仓库 Y 移植,包括测试,并让 CI 变绿"
- "调查为什么会话 ID 有时在运行中压缩时发生漂移,并撰写报告"
- "构建一个小型 CLI 工具,按 EXIF 日期重命名文件,然后针对 photos/ 文件夹进行测试"
那些智能体只做一轮就停止的任务不需要 /goal。那些否则您将不得不三次说“继续”的任务正是这个功能大放异彩的地方。
快速开始
/goal 修复 tests/hermes_cli/ 中所有失败的测试,并确保 scripts/run_tests.sh 在该目录下通过
你将看到:
- 目标已接受 —
⊙ 目标已设定(20 轮预算):<你的目标> - 第 1 轮运行 — Hermes 开始工作,就像你把目标作为普通消息发送了一样。
- 判断模型运行 — 该轮结束后,判断模型会决定
done(完成)或continue(继续)。 - 按需循环 — 如果结果是
continue,你会看到↻ 继续实现目标 (1/20):<判断模型的理由>,然后 Hermes 会自动执行下一步。 - 终止 — 最终你会看到
✓ 目标已实现:<理由>或⏸ 目标已暂停 — 已使用 N/20 轮。
命令
| 命令 | 功能 |
|---|---|
/goal <文本> | 设定(或替换)一个持续的目标。会立即启动第一轮,你无需再发送单独的消息。 |
/goal 或 /goal status | 显示当前目标、其状态和已使用的轮次。 |
/goal pause | 暂停自动继续循环,但不清除目标。 |
/goal resume | 恢复循环(将轮次计数器重置为零)。 |
/goal clear | 完全删除目标。 |
在 CLI 和所有网关平台(Telegram、Discord、Slack、Matrix、Signal、WhatsApp、SMS、iMessage、Webhook、API 服务器和 Web 仪表盘)上功能完全相同。
在目标进行中添加标准:/subgoal
当目标处于活动状态时,你可以使用 /subgoal <文本> 附加额外的验收标准,而不会重置循环。每次调用都会向目标的子目标列表添加一个编号项;智能体在下一轮看到的继续提示会包含原始目标加上一个“用户在循环中途添加的附加标准”块,并且判断提示会被重写,使得最终裁决必须考虑每个子目标——只有当原始目标以及所有子目标都满足时,目标才会被标记为完成。
| 命令 | 功能 |
|---|---|
/subgoal <文本> | 向活动目标附加一个新标准。需要有一个活动的 /goal。 |
/subgoal(无参数) | 显示当前带编号的子目标列表。 |
/subgoal remove <N> | 移除第 N 个子目标(从 1 开始计数)。 |
/subgoal clear | 删除所有子目标,但保持原始目标不变。 |
子目标会与目标一起持久化在 SessionDB.state_meta 中,因此它们能在 /resume 后保留。设置新的 /goal <文本> 会替换目标并清除子目标列表;/goal clear 也会执行同样的操作。
当你开始一个循环(“修复失败的测试”)并在中途发现你还需要它“并为你刚刚修补的 bug 添加一个回归测试”时,请使用此命令——/subgoal 添加一个回归测试 可以收紧成功标准,而不会中断正在运行的循环。
行为细节
判断模型
每一轮结束后,Hermes 会调用一个辅助模型,并提供:
- 持续的目标文本
- 智能体最近一次的最终响应(最后约 4 KB 文本)
- 一个系统提示,要求判断模型回复严格的 JSON:
{"done": <布尔值>, "reason": "<一句话理由>"}
该判断模型被故意设计为保守型:只有当响应明确确认目标完成,或者最终交付物清晰可见,或者当目标无法实现/被阻塞(这被视为 DONE,但附带阻塞原因,这样我们就不会在不可能的任务上消耗预算)时,它才会将目标标记为 done。
故障开放语义
如果判断模型出错(网络闪断、响应格式错误、辅助客户端不可用),Hermes 会将裁决视为 continue — 一个出错的判断模型不会阻塞进度。轮次预算才是真正的安全网。
轮次预算
默认是 20 个继续轮次(config.yaml 中的 goals.max_turns)。当预算耗尽时,Hermes 会自动暂停并告诉你如何继续:
⏸ 目标已暂停 — 已使用 20/20 轮。使用 /goal resume 继续,或使用 /goal clear 停止。
/goal resume 会将计数器重置为零,这样你就可以分段继续。
用户消息始终具有最高优先级
当目标处于活动状态时,你发送的任何真实消息都优先于继续循环。在 CLI 上,你的消息会在排队的继续指令之前进入 _pending_input;在网关上,它通过适配器 FIFO 以同样的方式处理。判断模型会在你的轮次后再次运行——所以如果你的消息恰好完成了目标,判断模型会捕捉到并停止。
运行时安全性(网关)
当智能体已经在运行时,/goal status、/goal pause 和 /goal clear 可以安全运行——它们只触及控制平面状态,不会中断当前轮次。在运行中设置新目标(/goal <新文本>)会被拒绝,并提示你先执行 /stop,以防止旧的继续指令与新的竞争。
持久化
目标状态存储在 SessionDB.state_meta 中,键为 goal:<session_id>。这意味着 /resume 可以从你离开的地方继续——设定一个目标,合上笔记本电脑,第二天回来,/resume,目标仍保持你离开时的状态(活动、暂停或完成)。
提示缓存
继续提示是一个附加到历史记录中的普通用户角色消息。它不会修改系统提示、交换工具集,也不会以任何使 Hermes 的提示缓存失效的方式触及对话。运行一个 20 轮的目标在缓存方面与 20 轮普通对话成本相同。
配置
添加到 ~/.hermes/config.yaml:
goals:
# Hermes 自动暂停并要求你执行 /goal resume 之前的最大继续轮次。默认为 20。如果你想要更紧密的循环,可以调低此值;对于长时间运行的重构,可以调高它。
max_turns: 20
选择判断模型
判断模型使用 goal_judge 辅助任务。默认情况下,它解析为你的主模型(参见辅助模型)。如果你想将判断模型路由到一个便宜快速的模型以降低成本,可以添加一个覆盖:
auxiliary:
goal_judge:
provider: openrouter
model: google/gemini-3-flash-preview
判断模型调用很小(约 200 个输出 token),并且每轮运行一次,所以一个便宜快速的模型通常是正确的选择。
示例演练
你: /goal 创建四个文件 /tmp/note_{1..4}.txt,每轮一个,每个文件包含其编号作为文本
⊙ 目标已设定(20 轮预算):创建四个文件 /tmp/note_{1..4}.txt,每轮一个,每个文件包含其编号作为文本
Hermes: 现在创建 /tmp/note_1.txt。
💻 echo "1" > /tmp/note_1.txt (0.1秒)
我已创建了内容为 "1" 的 /tmp/note_1.txt。我将按照你的指定在下一轮继续创建剩余文件。
↻ 继续实现目标 (1/20):仅创建了 4 个文件中的 1 个;还剩 3 个文件。
Hermes: [继续实现你的持续目标]
💻 echo "2" > /tmp/note_2.txt (0.1秒)
已创建 /tmp/note_2.txt。还剩两个。
↻ 继续实现目标 (2/20):已创建 2/4 个文件;还剩 2 个。
Hermes: [继续实现你的持续目标]
💻 echo "3" > /tmp/note_3.txt (0.1秒)
已创建 /tmp/note_3.txt。
↻ 继续实现目标 (3/20):已创建 3/4 个文件;还剩 1 个。
Hermes: [继续实现你的持续目标]
💻 echo "4" > /tmp/note_4.txt (0.1秒)
四个文件已全部创建:/tmp/note_1.txt 到 /tmp/note_4.txt,每个文件包含其编号。
✓ 目标已实现:所有四个文件都按指定内容创建,目标完成。
你: _
四轮,一次 /goal 调用,你无需发送任何“继续”提示。
当判断模型出错时
没有完美的判断模型。需要注意两种失败模式:
假阴性——判断模型说继续,但目标实际上已完成。 轮次预算会处理这种情况。你会看到 ⏸ 目标已暂停,可以 /goal clear 或直接发送新消息。
假阳性——判断模型说完成,但工作尚未完成。 你会看到 ✓ 目标已实现,但你知道并非如此。发送后续消息继续,或者更精确地重新设定目标:/goal <更具体的文本>。判断模型的系统提示被故意设计为保守型,以使假阳性比假阴性更少见。
如果你觉得判断模型的裁决没有说服力,↻ 继续实现目标 或 ✓ 目标已实现 行中的理由文本会告诉你判断模型看到了什么。这通常足以判断是目标文本模糊还是模型的响应有问题。
致谢
/goal 是 Hermes 对 Ralph 循环模式的实现。面向用户的设计——在多轮中保持目标活跃,直到实现才停止,并提供创建/暂停/恢复/清除控制——是由 OpenAI Codex 团队的 Eric Traut 在 Codex CLI 0.128.0 中推广并发布的。我们的实现是独立的(中心化的 CommandDef 注册表、SessionDB.state_meta 持久化、辅助客户端判断模型、网关端的适配器 FIFO 继续机制),但这个想法是他们的。功劳归功劳。