Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help


循环执行 (/loop)

/loop 会在当前会话中以固定间隔重复运行某个提示词(或斜杠命令)。每次唤醒都代表一次真正的智能体轮次:Hermes 会重新读取最新状态——最新的持续集成结果、当前的队列长度、文件的最新内容——执行相应操作,反馈结果后便进入静默状态,直到下一次定时触发。

这是 Hermes 对 Claude Code 的 /loop(及其同样可用的别名 /proactive)的实现方式。而 /goal 是由目标驱动的——“持续工作直至达成该目标”;/loop 则是由计时器驱动的:“每隔 N 分钟(或在合理时机)重复执行,直到收到停止指令”。

适用场景

  • 轮询外部状态。“监控部署进度、持续集成运行情况或队列状态,并在发生变化时通知我。”这是其最典型的应用场景。
  • 迭代直至通过。“运行测试,修复失败项,重复此过程直至所有测试通过。”
  • 工作会话期间的监控。在处理其他事务的同时,持续关注错误率或长任务的处理进度。
  • 定期任务执行。在长时间会话中,每隔 N 分钟重新运行代码检查或状态汇总。

如果需要无人值守地执行任务——比如在夜间、按固定时间表运行,或能在终端重启后继续工作——则应使用 cron 作业。/loop 仅存在于单个会话内部,而 cron 则独立于所有会话之外。此外,当任务具有明确完成标准且目标单一时,/goal 通常更为合适。

快速入门

/loop 5m check the deploy status and tell me if it's live yet

您将看到以下内容:

  1. 循环已启用 — ↻ 循环间隔设置为5分钟:正在检查部署状态……
  2. 首次唤醒立即触发 — 在下一次空闲轮询时(网关:下次15秒的监控扫描),Hermes会自动发起唤醒操作,并根据当前状态执行常规处理流程。
  3. 重复执行 — 之后每5分钟重复一次,直至满足停止条件或您主动终止。

对斜杠命令同样可以轻松设置循环:

/loop 10m /recap

两种调度模式

固定间隔——由您设定时间。 指定一个间隔时间(如“30秒”、“5分钟”、“2小时”、“1小时30分钟”),系统就会按照该时间表定期触发循环。当需要监控的对象会按照其自身的时间线发生变化时,可使用此模式:

/loop 2m poll the build at ci.example.com/job/42 and ping me the moment it finishes

自主调节——由Hermes掌控节奏。 若省略间隔时间设置,循环将自动调整节奏:初始值为最低值(默认为1分钟);当智能体的回复内容不再发生变化时,节奏会以指数级方式逐渐延长——2分钟、4分钟、8分钟,直至达到最高值(默认为15分钟)。一旦出现新的回复,节奏会立即恢复到最低值。由于变化检测是通过本地摘要对比来实现的(会忽略时间戳),因此空闲等待不会产生额外成本。

/loop keep an eye on the migration and summarize progress

经验法则:当外部时钟驱动任务时,采用固定间隔;而当任务本身决定节奏时,则按需执行。

停止条件

当出现以下任意情况时,循环即结束:

条件停止方式
智能体判定任务已完成通过唤醒提示,让智能体在任务完成或不再相关时,在单独一行中以 LOOP_COMPLETE 结束回复。
运行次数限制使用 --times N 参数——在触发 N 次唤醒后停止。
基于证据的条件判断使用 --until <condition> 参数——每次唤醒后,负责处理 /goal 请求的同一辅助评估器会根据您设定的条件检查回复。若评估器判定该条件无法达成,循环将暂停并显示原因,而不会再次触发,直到用完计时预算(采用“故障开放”机制:即使评估器出错,也不会使循环永久卡住)。
人工干预使用 /loop stop 命令停止循环(如需保持运行状态,则使用 /loop pause)。
最大循环次数限制loops.max_ticks 参数(默认值为 100)会暂停循环,防止无人监控的会话无限消耗令牌。设置为 0 表示无限制。

示例:

/loop 2m poll CI --times 30
/loop 5m watch the queue --until queue depth reaches zero

命令

命令功能说明
/loop [间隔时间] <提示词> [--次数 N] [--直到条件 <条件>]启动(或替换)当前会话的循环功能。首次唤醒会立即触发,后续唤醒则按照设定的间隔依次执行。
/loop 或 /loop status显示循环间隔、已触发的唤醒次数以及下一次唤醒的时间。
/loop pause暂停唤醒触发,但不会终止循环功能。
/loop resume恢复循环功能的执行。
/loop stop结束循环功能。
/proactive …/loop 的别名(与 Claude Code 功能保持一致)。

该功能可在命令行界面、文本用户界面(hermes --tui)、网页控制面板聊天窗口、桌面应用以及所有网关平台(Telegram、Discord、Slack、WhatsApp 等)上使用。在消息平台上,即便在用户发送消息的间隙,网关也会触发唤醒——循环属于当前聊天会话的一部分,其结果会以普通回复的形式呈现。 |

与 /goal 的协同使用

这两种功能都可在空闲时段插入虚拟对话轮次,因此遵循同一规则:当前正在执行的目标拥有会话控制权。当有 /goal 正在运行且裁判指示“继续”时,循环唤醒会被延迟。一旦目标执行完毕、暂停,或因等待条件而暂停(如使用 /goal wait 或裁判给出的自动 WAIT 判定),循环就会立即利用空闲时间恢复执行。将“暂停的目标”与“/loop”结合使用是非常常见的方案:目标负责处理那些耗时的异步任务,而循环则持续监控其他事项的进展。

若出现真实用户的消息,将会优先于这两种功能——只有当会话处于空闲状态且没有用户的消息待处理时,才会触发唤醒。 |

行为细节

  • “唤醒”即代表正常的用户与角色轮换。 既不会发生系统提示的变更,也不会更换工具集——提示缓存会保持完整。
  • 能够承受 /resume 指令及数据压缩。 循环状态会在每个会话中持续存在,并能跨越上下文压缩边界而保留,这一点与 /goal 指令相同。
  • 每个会话仅允许一次循环。 设置新的 /loop 值会替换旧值。如需执行多次循环,可启动多个会话(或通过 cron 实现批量调度)。
  • 中断“唤醒”轮换(使用 Ctrl+C)会暂停当前循环——可通过 /loop resume 恢复,因此取消操作确实意味着终止循环。
  • 令牌消耗与操作频率成正比。 每一次时间步都相当于一次完整的智能体轮换。请将间隔时间设定为状态实际发生变化的频率;在空闲等待时建议采用自适应节奏。

配置设置

# ~/.hermes/config.yaml
loops:
  min_interval_seconds: 30       # floor for fixed intervals
  max_ticks: 100                 # backstop budget (0 = unlimited)
  self_paced_floor_seconds: 60   # self-paced starting cadence
  self_paced_ceiling_seconds: 900  # self-paced max backoff

--until判定器会通过goal_judge辅助任务来处理流程,因此auxiliary.goal_judge.*相关的路由覆盖规则(包括提供者和模型设置)同样适用于循环条件。

/loop、/goal与cron的对比

/loop/goalcron
触发方式定时器(或用户自定义节奏)每轮对话后的判定结果任何会话之外的预定时间表
运行环境当前会话当前会话每次运行时的独立会话
结束条件达到停止条件、达到上限或由用户手动终止实现目标、预算耗尽或由用户终止用户手动取消任务
适用场景轮询、监控以及定期重新运行具有一个明确目标,需不断迭代直至完成无人值守的长期调度任务