Persistent Goals(持久目标)(/goal)
/goal 为 Hermes 设置一个跨轮次持续存在的目标。每轮之后,一个轻量级判断模型会检查目标是否已由助手的最后回复满足。如果未满足,Hermes 自动将延续提示反馈回同一会话并继续工作——直到目标达成、您暂停或清除它、或轮次预算耗尽。
这是我们对 Ralph loop 的实现,直接受 Eric Traut(OpenAI)的 Codex CLI 0.128.0 的 /goal 启发。核心理念——让目标在轮次间保持活跃且不达目的不罢休——是他们的。这里的实现是独立的,并针对 Hermes 的架构进行了适配。
何时使用
当您希望 Hermes 自行迭代而无需每轮重新提示时使用 /goal:
- “修复
src/中的每个 lint 错误并验证ruff check通过” - “将特性 X 从仓库 Y 移植过来,包括测试,并让 CI 变绿”
- “调查为什么会话 ID 有时在运行中压缩时漂移,并撰写报告”
- “构建一个根据 EXIF 日期重命名文件的小型 CLI,然后针对 photos/ 文件夹进行测试”
代理一轮就停止的任务不需要 /goal。那些*您需要反复说”继续”*的任务才是此功能大放异彩的地方。
快速开始
/goal Fix every failing test in tests/hermes_cli/ and make sure scripts/run_tests.sh passes for that directory
您会看到:
- 目标已接受 —
⊙ Goal set (20-turn budget): <your goal> - 第 1 轮运行 — Hermes 开始工作,就好像您将目标作为正常消息发送一样
- 判断器运行 — 轮次结束后,判断模型决定
done或continue - 如果需要则循环 — 如果是
continue,您会看到↻ Continuing toward goal (1/20): <judge's reason>,Hermes 自动进行下一步 - 终止 — 最终您会看到
✓ Goal achieved: <reason>或⏸ Goal paused — N/20 turns used
命令
| 命令 | 作用 |
|---|---|
/goal <text> | 设置(或替换)持续目标。立即启动第一轮,因此您无需发送单独消息。 |
/goal 或 /goal status | 显示当前目标、状态和已用轮次。 |
/goal pause | 停止自动延续循环而不清除目标。 |
/goal resume | 恢复循环(将轮次计数器重置为零)。 |
/goal clear | 完全删除目标。 |
在 CLI 和每个网关平台(Telegram、Discord、Slack、Matrix、Signal、WhatsApp、SMS、iMessage、Webhook、API 服务器和 Web 仪表盘)上工作方式完全相同。
在目标进行中添加标准:/subgoal
当目标处于活动状态时,您可以使用 /subgoal <text> 附加额外的验收标准,而无需重置循环。每次调用会向目标的子目标列表添加一个编号项;代理在下一轮看到的延续提示包括原始目标加上一个”用户在循环中间添加的额外标准”块,并且判断提示被重写,使得裁决必须考虑每个子目标——直到原始目标和每个子目标都满足时,目标才标记为完成。
| 命令 | 作用 |
|---|---|
/subgoal <text> | 向活动目标追加一个新标准。需要一个活动的 /goal。 |
/subgoal(无参数) | 显示当前编号的子目标列表。 |
/subgoal remove <N> | 移除第 N 个子目标(从 1 开始)。 |
/subgoal clear | 删除所有子目标但保留原始目标。 |
子目标与目标一起持久化在 SessionDB.state_meta 中,因此它们能在 /resume 后存活。设置新的 /goal <text> 会替换目标并清除子目标列表;/goal clear 也是这样。
当您开始一个循环(“修复失败的测试”)并在中途注意到还想要它”为刚修补的 bug 添加回归测试”时使用此功能——/subgoal add a regression test 收紧成功标准而不破坏正在运行的循环。
行为细节
判断器
每轮之后,Hermes 调用一个辅助模型,参数包括:
- 持续目标文本
- 代理最近的最终回复(最后约 4 KB 文本)
- 一个系统提示,告诉判断器以严格 JSON 回复:
{"done": <bool>, "reason": "<一句话说明>"}
判断器有意保守:仅当回复明确确认目标已完成、最终交付物已清晰产生、或目标无法实现/被阻塞时(视为 DONE 并附带阻塞原因,以免在不可能的任务上浪费预算),才将目标标记为 done。
失败开放语义
如果判断器出错(网络故障、格式错误的响应、辅助客户端不可用),Hermes 将裁决视为 continue——损坏的判断器绝不会阻塞进度。轮次预算是真正的后盾。
轮次预算
默认是 20 个延续轮次(goals.max_turns 在 config.yaml 中)。当预算用尽时,Hermes 自动暂停并确切告诉您如何继续:
⏸ Goal paused — 20/20 turns used. Use /goal resume to keep going, or /goal clear to stop.
/goal resume 将计数器重置为零,因此您可以按可控的块继续。
用户消息始终优先
当目标处于活动状态时,您发送的任何真实消息都会优先于延续循环。在 CLI 上,您的消息会排在队列延续之前的 _pending_input 中;在网关上,它同样经过适配器 FIFO。判断器会在您的轮次后再次运行——因此如果您的消息恰好完成了目标,判断器会捕获到并停止。
运行中安全(网关)
当代理已在运行时,/goal status、/goal pause 和 /goal clear 是安全的——它们只触及控制平面状态,不会中断当前轮次。在运行中设置新目标(/goal <new text>)会被拒绝并显示告诉您先 /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 个输出令牌)且每轮运行一次,因此使用便宜的快速模型通常是正确选择。
示例演练
You: /goal Create four files /tmp/note_{1..4}.txt, one per turn, each containing its number as text
⊙ Goal set (20-turn budget): Create four files /tmp/note_{1..4}.txt, one per turn, each containing its number as text
Hermes: Creating /tmp/note_1.txt now.
💻 echo "1" > /tmp/note_1.txt (0.1s)
I've created /tmp/note_1.txt with the content "1". I'll continue with the remaining files on the next turn as you specified.
↻ Continuing toward goal (1/20): Only 1 of 4 files has been created; 3 files remain.
Hermes: [Continuing toward your standing goal]
💻 echo "2" > /tmp/note_2.txt (0.1s)
Created /tmp/note_2.txt. Two more to go.
↻ Continuing toward goal (2/20): 2 of 4 files created; 2 remain.
Hermes: [Continuing toward your standing goal]
💻 echo "3" > /tmp/note_3.txt (0.1s)
Created /tmp/note_3.txt.
↻ Continuing toward goal (3/20): 3 of 4 files created; 1 remains.
Hermes: [Continuing toward your standing goal]
💻 echo "4" > /tmp/note_4.txt (0.1s)
All four files have been created: /tmp/note_1.txt through /tmp/note_4.txt, each containing its number.
✓ Goal achieved: All four files were created with the specified content, completing the goal.
You: _
四轮,一次 /goal 调用,零个来自您的”继续”提示。
当判断器出错时
没有完美的判断器。需要注意两种失败模式:
假阴性——目标实际上已完成但判断器说继续。 轮次预算会捕获这种情况。您会看到 ⏸ Goal paused,可以 /goal clear 或直接发送新消息。
假阳性——工作尚未完成但判断器说已完成。 您会看到 ✓ Goal achieved,但您知道事实并非如此。发送后续消息继续,或更精确地重新设置目标:/goal <更具体的文本>。判断器的系统提示有意保守,使假阳性比假阴性更罕见。
如果您觉得判断器裁决不可信,↻ Continuing toward goal 或 ✓ Goal achieved 行中的原因文本会确切告诉您判断器看到了什么。这通常足以诊断是目标文本不明确还是模型回复有问题。
致谢
/goal 是 Hermes 对 Ralph loop 模式的实现。面向用户的设计——让目标在轮次间保持活跃、不达目的不罢休、带有创建/暂停/恢复/清除控制——由 OpenAI Codex 团队的 Eric Traut 在 Codex CLI 0.128.0 中推广和发布。我们的实现是独立的(中央 CommandDef 注册表、SessionDB.state_meta 持久化、辅助客户端判断器、网关端的适配器 FIFO 延续),但理念属于他们。给予应有的赞誉。