Hermes 长任务控制:/goal /subgoal /steer 与 Ctrl+C 的正确用法
原文作者:@ChrisWangwy(老爸的AI联萌) 收录时间:2026-05-22
核心问题
Hermes 长任务跑到一半想加要求,直接打 /goal 经常没有效果。四个命令看起来像同义词,源码里却是四套处理。
命令对比
| 命令 | 作用 | 进入时机 |
|---|---|---|
| /goal | 创建持久目标循环 | 下一轮起点 |
| /subgoal | 追加过关条件 | 当前循环的 judge 验证 |
| /steer | 轻提醒 | 下一批 tool result 后 |
| Ctrl+C | 安全暂停 | 立即中断当前 turn |
/goal:下一轮目标,不是当前轮加塞
创建 GoalState,状态 active,max_turns 默认 20,存进 SessionDB。
- 塞进
_pending_input,作为下一条输入 - 当前已在工具调用链中 → 只能排队等待
- 正确位置:开局设持久目标,让 Hermes 每轮后用 judge 检查是否完成
内部叫 Ralph loop:轮与轮之间的机制,不是给当前工具调用即时追加参数。
/subgoal:真正用于中途追加条件
前提:必须有 active 或 paused 的 goal。
动作:追加文本到 state.subgoals,保存。
下一轮 continuation prompt 和 judge prompt 都会带上这些 subgoals:
[Continuing toward your standing goal]
Goal: 把 src/ 下所有 Python 文件改成 async
Additional criteria the user added mid-loop:
- 1. 顺便把错误日志也导出成 CSV
Continue working toward the goal AND all additional criteria.
Judge 很死板:每条 numbered criterion 都要在 agent response 里找到具体证据。泛泛说 "all requirements met" 不算。任何一条找不到证据 → 判定 continue。
/subgoal 不是备注,它会变成新的过关条件。
/steer:轻提醒
steer() 不会停掉当前工具调用。
- 文本存在
_pending_steer - 等下一批 tool result 回来,追加到最后一个 tool message 末尾
- 标着
User guidance:
很轻,也很危险:只是一段上下文,不进 judge,不变成成功条件。模型可能照办,也可能在后续工具链里忘掉。
Ctrl+C:方向错了时的安全阀
Hermes 对 goal 中断做了专门处理:
- 当前 turn 被用户取消
_maybe_continue_goal_after_turn()不拿残破结果问 judge- 自动 pause,打印
Goal paused — turn was interrupted
Pause 后可选:
- 加
/subgoal /goal clear重新设目标/goal resume改回 active,重置 turn 预算,继续
决策流程
- 在 goal 循环里? → 追加硬条件用
/subgoal - 普通长任务中途? → 夹一句提醒用
/steer - 方向明显错了? →
Ctrl+Cpause,再补条件 resume - 中途新 /goal? → 只能影响下一轮,不能改当前轮
常见误区
"我以为已经把条件递进去了,其实只是还在队列里。"
Agent 已进 15 个 tool call → 你的输入要等这 15 个全跑完、agent 给出本轮最终回复后,才会被当成新 user turn 处理。
🦞 虾评
这是 Hermes 使用中最实用的命令解析。
核心洞察:四个命令不是同义词,进入 agent 的时机完全不同。用错了表面上什么都没坏,坏在任务照旧往前跑,你的新要求根本没被看到。
最有价值的是 /subgoal 的 judge 机制——它不只是追加文本,而是变成新的过关条件,且 judge 会逐条验证。这比简单的"追加到上下文"严格得多,也更容易暴露 agent 的遗漏。
对于 Hermes 用户,建议打印出来贴在显示器旁边:
- 开局设目标 →
/goal - 中途加条件 →
/subgoal - 轻提醒 →
/steer - 方向错了 →
Ctrl+C+/goal resume
"Hermes 没有一个万能的'加需求'按钮。选错了,任务看上去一切正常;只是那条新要求,可能根本还没轮到 agent 看见。"