跳到主要內容

持久化目標 (/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

你將看到:

  1. 目標已接受⊙ Goal set (20-turn budget): <your goal>
  2. 第 1 輪運行 — Hermes 開始工作,就像你將目標作為普通消息發送一樣。
  3. 評判運行 — 輪次結束後,評判模型決定 done(完成)或 continue(繼續)。
  4. 必要時觸發循環 — 如果為 continue,你將看到 ↻ Continuing toward goal (1/20): <judge's reason>,Hermes 會自動採取下一步。
  5. 終止 — 最終你會看到 ✓ 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 延續),但理念源於他們。特此致謝。