跳到主要内容

循环任务(/loop)

/loop 会在你当前会话内按周期性节奏重新运行一个提示词(或一个斜杠命令)。每次唤醒都是一次真实的智能体回合:Hermes 会重新读取当前状态 —— 最新的 CI 结果、最新的队列深度、文件此刻的样子 —— 完成工作、汇报结果,然后保持安静直到下一个滴答。

这是 Hermes 对 Claude Code 的 /loop 的实现(以及它的 /proactive 别名,在这里也同样可用)。/goal 是判定驱动的 —— “持续工作直到这个目标达成” —— 而 /loop 是定时器驱动的:“每隔 N 分钟(或每当它合理时)再做一次这件事,直到有东西说停止。”

何时使用​

  • 轮询外部状态。 “盯着部署 / CI 运行 / 队列,一有变化就告诉我。”这是最典型的用例。
  • 迭代直到通过。 “运行测试,修复失败项,重复直到通过。”
  • 工作期间监控。 在你于同一对话中做别的事情时,持续关注错误率或长任务的进度。
  • 周期性杂务。 在长会话期间每隔 N 分钟重新运行一次 lint 检查或状态摘要。

当工作应当无人值守地运行 —— 夜间、按真实的计划、在终端重启后依然存在 —— 请改用 定时任务。/loop 存在于某个会话之内;cron 存在于所有会话之外。而当任务是一个带有完成定义单一目标时,/goal 通常更合适。

快速开始​

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

你会看到:

  1. 循环已接受 —— ↻ Loop set (every 5m): check the deploy status…
  2. 首次唤醒立即触发 —— 在下一次空闲轮询时(网关:下一次 15 秒监视扫描),Hermes 注入唤醒并针对当前状态运行一个正常的回合。
  3. 重复 —— 之后每 5 分钟一次,直到某个停止条件触发或你将其停止。

循环一个斜杠命令同样简单:

/loop 10m /recap

两种节奏模式​

固定间隔 —— 你来设定时钟。 给出一个间隔(30s、5m、2h、1h30m),循环就按该计划触发。当你监视的对象按照自己的时间线变化时使用它:

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

自适应节奏 —— Hermes 设定时钟。 省略间隔,循环就会自行调整节奏:它从下限开始(默认 1 分钟),当智能体的回复不再变化时,它会以指数方式退避 —— 2m、4m、8m,直到上限(默认 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)会暂停循环,以免无人值守的会话无限消耗 token。0 = 无限制。

示例:

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

命令​

命令作用
/loop [interval] <prompt> [--times N] [--until <cond>]为当前会话启动(或替换)循环。首次唤醒立即触发;后续唤醒按节奏跟随。
/loop 或 /loop status显示节奏、已触发的滴答次数以及距下次唤醒的时间。
/loop pause停止触发,但不丢失循环。
/loop resume恢复它。
/loop stop结束循环。
/proactive …/loop 的别名(与 Claude Code 保持一致)。

可用于 CLI、TUI(hermes --tui)、网页仪表盘聊天、桌面应用,以及每个网关平台(Telegram、Discord、Slack、WhatsApp,……)。在消息平台上,网关甚至会在你的消息之间触发唤醒 —— 循环属于该聊天的会话,其结果作为普通回复送达。

与 /goal 混用​

这两个功能都会在空闲边界注入合成回合,因此遵循一条规则:一个活跃的目标拥有该会话。 当一个 /goal 正在积极驱动时(判定器说“继续”),循环唤醒会推迟。目标一旦完成、暂停,或将自身停靠在等待屏障上(/goal wait,或判定器自动的 WAIT 裁决),循环就会利用空闲时间恢复。一个停靠的目标加上一个 /loop 是自然的组合:目标等待那个大的异步事项,而循环则对别的东西保持心跳。

真实用户消息始终优先于两者 —— 唤醒仅在会话空闲且你没有排队内容时触发。

行为细节​

  • 一次唤醒是一个普通的用户角色回合。 不改动系统提示词,不切换工具集 —— 提示词缓存保持完好。
  • 可在 /resume 和压缩后存续。 循环状态按会话持久化,并像 /goal 一样跨上下文压缩边界迁移。
  • 每个会话一个循环。 设定一个新的 /loop 会替换旧的。要运行多个循环,就运行多个会话(或使用 cron 来运行一组计划)。
  • 中断一次唤醒回合(Ctrl+C)会暂停循环 —— 可用 /loop resume 恢复,因此取消确实意味着取消。
  • Token 成本随节奏变化。 每个滴答都是一次完整的智能体回合。让间隔匹配状态实际变化的频率;对于空闲等待,优先使用自适应节奏。

配置​

# ~/.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 vs /goal vs cron​

/loop/goalcron
触发方式定时器(或自适应节奏)每回合后的判定器裁决计划,在任何会话之外
存在于你当前的会话你当前的会话每次运行各自的会话
结束于停止条件 / 上限 / 你目标达成 / 预算 / 你你移除该任务
最适合轮询、监控、周期性重新运行单一目标,迭代直到完成无人值守、长周期计划