sidebar_position: 17 title: “Recurring Loops” description: “Re-run a prompt on a recurring interval inside your session — Hermes’ take on Claude Code’s /loop.”
循环执行 (/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
您将看到以下内容:
- 循环已启用 —
↻ 循环间隔设置为5分钟:正在检查部署状态…… - 首次唤醒立即触发 — 在下一次空闲轮询时(网关:下次15秒的监控扫描),Hermes会自动发起唤醒操作,并根据当前状态执行常规处理流程。
- 重复执行 — 之后每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 | /goal | cron | |
|---|---|---|---|
| 触发方式 | 定时器(或用户自定义节奏) | 每轮对话后的判定结果 | 任何会话之外的预定时间表 |
| 运行环境 | 当前会话 | 当前会话 | 每次运行时的独立会话 |
| 结束条件 | 达到停止条件、达到上限或由用户手动终止 | 实现目标、预算耗尽或由用户终止 | 用户手动取消任务 |
| 适用场景 | 轮询、监控以及定期重新运行 | 具有一个明确目标,需不断迭代直至完成 | 无人值守的长期调度任务 |