持久目标(Persistent Goals)(/goal)
/goal 为 Hermes 提供一个跨轮次存活的持久目标。每轮次之后,一个轻量级评判模型检查目标是否被助手的最新响应满足。如果没有,Hermes 会自动将一个延续提示词反馈到同一会话中并继续工作——直到目标实现、你暂停或清除它,或者轮次预算耗尽。
这是我们对 Ralph 循环的实现,直接受 Eric Traut(OpenAI)在 Codex CLI 0.128.0 的 /goal 启发。核心思想——跨轮次保持目标活跃,不达成不停止——是他们的。这里的实现是独立的,并针对 Hermes 的架构进行了改编。
何时使用
当你希望 Hermes 无需每轮次重新提示就能自行迭代时,使用 /goal:
- "修复
src/中的所有 lint 错误并验证ruff check通过" - "从仓库 Y 移植功能 X(包括测试),并让 CI 变绿"
- "调查为什么会话 ID 有时在运行中压缩时出现漂移并写出报告"
- "构建一个按 EXIF 日期重命名文件的小 CLI,然后对 photos/ 文件夹进行测试"
Agent 做一轮就停止的任务不需要 /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 仪表板)上工作方式相同。
行为细节
评判
每轮次之后,Hermes 调用辅助模型,传入:
- 持久目标文本
- Agent 的最新最终响应(最后约 4 KB 文字)
- 告知评判模型用严格 JSON 回复的系统提示:
{"done": <bool>, "reason": "<one-sentence rationale>"}
评判有意保守:仅当响应明确确认目标已完成、最终交付物清晰生成时,或当目标不可实现/被阻塞时(视为 DONE 并附上阻塞原因,以免在不可能完成的任务上消耗预算),才将目标标记为 done。
失败开放语义
如果评判出错(网络抖动、格式错误的响应、辅助客户端不可用),Hermes 将结果视为 continue——损坏的评判永远不会阻断进度。轮次预算才是真正的保底机制。
轮次预算
默认为 20 个延续轮次(config.yaml 中的 goals.max_turns)。当预算耗尽时,Hermes 自动暂停并告诉你如何继续:
⏸ Goal paused — 20/20 turns used. Use /goal resume to keep going, or /goal clear to stop.
/goal resume 将计数器重置为零,因此你可以以有控制的块来继续。
用户消息始终优先
目标活跃时你发送的任何实际消息都优先于延续循环。在 CLI 上,你的消息会排在 _pending_input 中排队延续之前;在网关上,它通过适配器 FIFO 以相同方式处理。你的轮次之后评判再次运行——因此如果你的消息恰好完成了目标,评判会捕获到并停止。
运行中安全(网关)
当 Agent 已经在运行时,/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:
# Max continuation turns before Hermes auto-pauses and asks you to
# /goal resume. Default 20. Lower this if you want tighter loops;
# raise it for long-running refactors.
max_turns: 20
选择评判模型
评判使用 goal_judge 辅助任务。默认情况下,它解析为你的主模型(参见辅助模型)。如果你想将评判路由到廉价快速模型以降低成本,添加覆盖:
auxiliary:
goal_judge:
provider: openrouter
model: google/gemini-3-flash-preview
评判调用很小(约 200 个输出 token),每轮次运行一次,因此廉价快速模型通常是正确的选择。
示例演示
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 <more specific text>。评判的系统提示有意保守,使假阳性比假阴性更少见。
如果你觉得评判结论不令人信服,↻ Continuing toward goal 或 ✓ Goal achieved 行中的原因文本会告诉你评判到底看到了什么。这通常足以判断是目标文本存在歧义,还是模型的响应不够清晰。
致谢
/goal 是 Hermes 对 Ralph 循环模式的实现。用户面向的设计——跨轮次保持目标活跃,不达成不停止,具有创建/暂停/恢复/清除控制——由 OpenAI Codex 团队的 Eric Traut 在 Codex CLI 0.128.0 中普及并发布。我们的实现是独立的(中央 CommandDef 注册表、SessionDB.state_meta 持久化、辅助客户端评判、网关侧适配器 FIFO 延续),但这个想法是他们的。归功于应得的人。