循环任务(/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
你会看到:
- 循环已接受 ——
↻ Loop set (every 5m): check the deploy status… - 首次唤醒立即触发 —— 在下一次空闲轮询时(网关:下一次 15 秒监视扫描),Hermes 注入唤醒并针对当前状态运行一个正常的回合。
- 重复 —— 之后每 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 | /goal | cron | |
|---|---|---|---|
| 触发方式 | 定时器(或自适应节奏) | 每回合后的判定器裁决 | 计划,在任何会话之外 |
| 存在于 | 你当前的会话 | 你当前的会话 | 每次运行各自的会话 |
| 结束于 | 停止条件 / 上限 / 你 | 目标达成 / 预算 / 你 | 你移除该任务 |
| 最适合 | 轮询、监控、周期性重新运行 | 单一目标,迭代直到完成 | 无人值守、长周期计划 |