持久化目標 (/goal)
/goal 為 Hermes 提供一個跨輪次存續的長期目標。每輪對話結束後,一個輕量級的評判模型(judge model)會檢查助手最近的回覆是否已滿足該目標。如果未滿足,Hermes 會自動將延續提示(continuation prompt)反饋回同一會話並繼續工作——直到目標達成、你暫停或清除它,或者輪次預算耗盡。
這是我們對 Ralph loop 的實現,直接靈感來源於 Eric Traut (OpenAI) 的 Codex CLI 0.128.0 的 /goal。其核心理念——在輪次間保持目標活躍且直到達成前不停止——歸功於他們。此處的實現是獨立的,並適配了 Hermes 的架構。
何時使用
對於希望 Hermes 自行迭代而無需你在每輪重新提示的任務,請使用 /goal:
- “修復
src/中的所有 lint 錯誤並驗證ruff check通過” - “從倉庫 Y 移植功能 X,包括測試,並確保 CI 變綠”
- “調查為什麼會話 ID 在運行中壓縮時有時會漂移,並撰寫報告”
- “構建一個小型 CLI 工具,根據 EXIF 日期重命名文件,然後針對 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 也會執行相同的操作。
當你啟動一個循環(“修復失敗的測試”)並在中途注意到你還希望它“為你剛剛修補的錯誤添加回歸測試”時,請使用此功能——/subgoal add a regression test 可以在不中斷運行中的循環的情況下收緊成功標準。
行為細節
評判模型 (The judge)
每輪對話後,Hermes 會調用一個輔助模型,提供:
- 長期目標文本
- 代理最近的最終回覆(最後約 4 KB 的文本)
- 一個系統提示,指示評判模型回覆嚴格的 JSON:
{"done": <bool>, "reason": "<one-sentence rationale>"}
評判模型故意保守:僅當回覆明確確認目標已完成、最終交付物清晰產生,或者目標無法實現/受阻(視為 DONE 並附帶受阻原因,以免在不可能完成的任務上浪費預算)時,它才會將目標標記為 done。
故障開放語義 (Fail-open semantics)
如果評判模型出錯(網絡波動、響應格式錯誤、輔助客戶端不可用),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 將計數器重置為零,因此你可以以可控的塊狀方式繼續。
用戶消息始終優先
在目標(goal)處於活動狀態時,你發送的任何真實消息都優先於延續循環。在 CLI 中,你的消息會進入 _pending_input,排在隊列中的延續之前;在網關中,它同樣通過適配器 FIFO 處理。在你的回合結束後,裁判(judge)會再次運行——因此,如果你的消息恰好完成了目標,裁判將會捕獲這一狀態並停止。
運行中的安全性(網關)
當代理已經在運行時,/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 loop 模式的實現。其面向用戶的設計——在多輪對話中保持目標活躍,直到達成目標才停止,並提供創建/暫停/恢復/清除控制——由 OpenAI Codex 團隊的 Eric Traut 在 Codex CLI 0.128.0 中推廣併發布。我們的實現是獨立的(中央 CommandDef 註冊表、SessionDB.state_meta 持久化、輔助客戶端裁判、網關側的適配器 FIFO 延續),但理念源於他們。特此致謝。