ByteNoteByteNote

字节笔记本

2026年6月21日

hermes教程-持久目标

API中转
¥120

持久目标 (/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 有时会在中途压缩时漂移,并撰写一份报告"
  • "构建一个小型 CLI,根据 EXIF 日期重命名文件,然后针对 photos/ 文件夹进行测试"

代理只执行一轮就停止的任务不需要 /goal。那些*你本来需要说三次“继续”*的任务才是它的用武之地。

快速开始

/goal 修复 tests/hermes_cli/ 中所有失败的测试,并确保 scripts/run_tests.sh 对该目录通过

你会看到:

  1. 目标已接受⊙ 目标已设置(20 轮预算):<你的目标>
  2. 第 1 轮运行 — Hermes 开始工作,就像你把目标作为普通消息发送一样。
  3. 评判运行 — 该轮结束后,评判模型决定 donecontinue
  4. 必要时触发循环 — 如果是 continue,你会看到 ↻ 继续向目标前进(1/20):<评判理由>,然后 Hermes 自动执行下一步。
  5. 终止 — 最终你会看到 ✓ 目标已达成:<理由>⏸ 目标已暂停 — 已使用 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 add a regression test 会收紧成功标准,而不会中断正在运行的循环。

行为细节

评判模型

每轮结束后,Hermes 会调用一个辅助模型,输入:

  • 持续目标文本
  • 代理最近一次最终回复(最后约 4 KB 文本)
  • 一条系统提示,要求评判模型以严格 JSON 格式回复:{"done": <bool>, "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

yaml
goals:
## 在 Hermes 自动暂停并提示你
## /goal resume 之前的最大延续轮数。默认为 20。如果你希望循环更紧凑,可以降低此值;
## 对于长时间运行的重构,可以增加此值。
  max_turns: 20

选择评判模型

评判模型使用 goal_judge 辅助任务。默认情况下,它会解析为你的主模型(参见辅助模型)。如果你想将评判模型路由到廉价快速的模型以降低成本,可以添加覆盖:

yaml
auxiliary:
  goal_judge:
    provider: openrouter
    model: google/gemini-3-flash-preview

评判调用很小(约 200 个输出 token),每轮运行一次,因此通常选择廉价快速的模型是正确的。

示例演练

text
你: /goal 创建四个文件 /tmp/note_{1..4}.txt,每轮一个,每个文件包含其编号作为文本

  ⊙ 目标已设置(20 轮预算):创建四个文件 /tmp/note_{1..4}.txt,每轮一个,每个文件包含其编号作为文本

Hermes: 正在创建 /tmp/note_1.txt。
  💻 echo "1" > /tmp/note_1.txt   (0.1s)
  我已创建 /tmp/note_1.txt,内容为 "1"。我将按你的要求在下一轮继续创建剩余文件。

  ↻ 继续向目标前进(1/20):仅创建了 4 个文件中的 1 个;还剩 3 个文件。

Hermes: [继续向你的持续目标前进]
  💻 echo "2" > /tmp/note_2.txt   (0.1s)
  已创建 /tmp/note_2.txt。还剩两个。

  ↻ 继续向目标前进(2/20):已创建 4 个文件中的 2 个;还剩 2 个。

Hermes: [继续向你的持续目标前进]
  💻 echo "3" > /tmp/note_3.txt   (0.1s)
  已创建 /tmp/note_3.txt。

  ↻ 继续向目标前进(3/20):已创建 4 个文件中的 3 个;还剩 1 个。

Hermes: [继续向你的持续目标前进]
  💻 echo "4" > /tmp/note_4.txt   (0.1s)
  所有四个文件已创建:/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 延续),但想法是他们的。功劳归功于应得之人。


分享: