近期,Loop Engineering 在AI Agent领域热度持续攀升,开发者们都在探讨如何让Agent实现自主循环执行,而非逐行编写Prompt。

此前我们曾分享过这套方法论——/goal 负责定义"完成标准",/loop 5m 控制"检查频率",/skill-creator 则用于"沉淀可复用流程"。但面对某些场景,前两种方式仍显不足,尤其是那些检查频率不固定的任务。
以股票盯盘为例:行情波动剧烈时,恨不得每分钟刷新一次;而午间休市时,半小时看一次即可。固定间隔要么造成Token浪费,要么可能错过关键行情。
针对这类需求,我们为 /loop 引入了全新能力——动态唤醒。借助这一机制,"盯盘"类任务终于能够完整落地 Loop Engineering——Agent 自主调节监控频率、自行判断何时停止,发现问题时还能自动 fork 一个 /goal 进行处置。
那么,不同场景下究竟该选用哪个指令?
三种"放手"模式详解
交出终点:/goal
你只需告诉 Agent "完成什么算达标",后续执行全权交由它自主推进。
你为Agent设定目标与完成条件后,它便会自主运转。每轮执行后,Agent都会自检——"目标达成了吗?" 达成即停止,未达成则换思路继续尝试。内置的 stop after N tries 兜底机制,可有效防止死循环。关键在于,Agent全程保持状态记忆,清楚前几轮尝试了什么、为何无效,从而逐步优化策略。
适用场景:终点明确、结果可验证的任务。例如代码审查通过、全部测试通过、文档撰写完毕——你清楚"完成"的具体模样,只是抵达终点的路径可能曲折。得益于Agent的状态记忆,即便路径偏离,它也能自主修正。
准备工作:一个可由机器自动验证的完成条件。必须是"lint errors = 0"这类可量化指标,而非"代码质量好一点"这类模糊表述。目标不清晰时,/goal 会在中间反复横跳,消耗Token却难以产出成果。
局限性:/goal 是"一次性"的。它抵达终点后便会停止。如果你的需求是"持续监控一个动态变化的事物",/goal 无法胜任——你不能对它说"目标是股价别跌破15块",因为Agent会立刻回复"好的,股价现在16块,目标已达成",然后结束任务。
交出节奏:/loop 5m
你告诉Agent "每隔多久执行一次",它便按照你设定的节奏运行。
底层实现本质是一个cron定时任务——CronCreate 按你设定的间隔注册定时器,到期后将Prompt原封不动地喂给Agent执行。每轮都是全新上下文,上一轮的状态不会延续。因此它特别适合"每次执行相同操作"的场景:查询状态、执行巡检、生成日报等。
适用场景:巡检、轮询、周期性维护任务。你清楚大致多久检查一次合适,每次执行的内容基本一致,仅输入数据有所变化。
准备工作:两样东西——巡检内容(建议封装为skill,而非写在Prompt中)和间隔时间。间隔选择原则:间隔 = 你能接受的最大延迟。若GPU OOM后30分钟才处理会造成不可逆损失,则间隔设为5分钟;若PR评论2小时不回复reviewer不会离开,则间隔设为30分钟。
局限性:节奏是固定的。行情波动时每分钟刷新一次合理,但午休时同样每分钟刷新就是浪费。而且一旦你离开,节奏就无法调整——即便Agent发现"CI已在运行,5分钟内不会有结果",它也只能老老实实5分钟后再查一次。
交出判断权:/loop(动态唤醒)
本次升级的核心就在于此。你无需设定节奏,只需给出目标——"盯住这件事",剩下的由Agent自主决定多久检查一次、何时加速、何时停止。
适用场景:节奏需随情况动态变化的持续监控任务。目标状态在不断变化,Agent需要根据当前状态判断"下次该多久后检查"。
准备工作:监控目标的清晰描述 + 判断标准。例如"盯着股价"过于模糊——盯什么?通知什么?应当表述为"看着今天的股价,跌破15块通知我,收盘了就停"。
核心机制:动态唤醒本质上是一个"续命"机制。每轮Agent执行完检查后,它会调用 ScheduleWakeup 来安排下一次唤醒——延迟时间由它自行决定(60秒至1小时之间)。调用即表示继续,不调用则表示结束。因此Agent可以自主决定何时停止任务,你无需手动取消。此外,它还能配合Monitor工具挂载到日志流上,事件发生时立即唤醒,连轮询都省去了——后续会详细说明。
盯盘:弹性节奏的终极应用场景
在上述三种放手模式中,盯盘恰恰是最需要"交出判断权"的场景。
盯盘的典型场景大家都很熟悉:
场景
平稳时
异常时
异常时行动
结束条件
股票盯盘
30 分钟
2 分钟
通知用户 + 分析涨跌原因
收盘
线上告警
15 分钟
1 分钟
通知用户 + fork /goal 排障
告警清零
舆情监控
1 小时
3 分钟
通知用户 + 生成舆情摘要
热度回落
PR 等审
2 小时
5 分钟
回复评论 + 通知用户
PR merged
这些场景看似不同,但有一个共同特征:节奏无法提前预判,必须根据实际情况动态调整。如果你硬性设定固定间隔,要么在平稳期浪费Token,要么在异常时反应滞后。
盯盘的真正难点在哪里?定时查看并不难,真正挑战的是以下三件事:
频率自调:情况平稳时拉长间隔,情况紧急时缩短间隔
自主结束:目标达成后(收盘了、告警清零了、PR merged了),自行停止
自主行动:发现异常时,能根据情况决定下一步——该通知就通知,该深入调查就调查
这三件事,固定间隔的 /loop 5m 做不到,/goal 同样无能为力——因为没有明确的终态条件。而动态唤醒能够完美承接,因为它将"节奏"和"是否停止"的决策权完全交给了Agent。
好,说了这么多,下面来看看本次升级,我们具体改进了什么。
Loop 的五大升级亮点
本次升级围绕五个方面展开:动态唤醒机制(核心)、Monitor事件唤醒、三模式自动路由、/crontab 管理面板、--durable 持久化。
1. 动态唤醒机制(ScheduleWakeup)
这是本次升级的核心。我们新增了一个 ScheduleWakeup 工具,它的工作方式极其简洁:
Agent每轮执行完毕后,调用 ScheduleWakeup,传入 delaySeconds 和 reason
系统在指定秒数后再次唤醒Agent,执行同一任务
如果Agent不调用 ScheduleWakeup,循环自动结束
就是这么简单。无需编写cron表达式,无需设定固定间隔,也无需声明退出条件。Agent根据当前情况自主判断:该多久后检查?还需不需要继续检查?
举个例子,你让Agent盯股价,它可能会这样运行:一开始股价正常,5分钟后再看;快接近警戒线了,缩短到2分钟;跌破阈值了,通知你的同时fork一个 /goal 去分析原因,继续1分钟一次盯着;收盘了,Agent觉得没必要再看了,不调用 ScheduleWakeup,循环自然结束。
几个关键行为特征:
频率自调:从5分钟 → 2分钟 → 1分钟 → 10分钟,全部由Agent自主判断
自主行动:跌破阈值时还fork了一个 /goal 去调查原因,仅通知还不够
自主结束:收盘后Agent判断"不需要再看了",不调用 ScheduleWakeup,循环自然终止
后面盯盘实战部分会详细讲解,这里先不展开了。
2. Monitor 事件唤醒:不再需要猜测时机
动态唤醒解决了"多久看一次"的问题,但轮询终归存在延迟——事件发生在两次唤醒之间,最坏情况需要等待一个完整间隔。告警已经出来了,Agent还在沉睡。
因此,本次还新增了一个 Monitor 工具:Agent可以挂载一个后台shell命令(tail -f 告警日志、watch一个接口、盯一个进程的输出……),命令一有输出,每行内容实时变成事件通知唤醒Agent。事件驱动,秒级响应。
有了Monitor,两个通道就这样分工了:
Monitor 负责应急:事件来了立刻叫醒Agent,无需等待下一轮轮询
ScheduleWakeup 负责兜底:退化为心跳,20-30分钟唤醒一次确认监控仍在运行
你可能会担心:日志刷得飞快,Agent岂不是会被事件淹没?这块我们做了防风暴设计:令牌桶限流(高频输出会被合并成批次发送),连续过载会自动停掉Monitor并提醒Agent更换更严格的过滤条件(例如 tail -f app.log 换成 tail -f app.log | grep ERROR)。不想监控了,执行 TaskStop 即可停止。
3. /loop 三模式自动路由
升级后的 /loop 提供了多种模式,根据你的输入自动选择:
输入
模式
机制
适用
/loop 5m
固定间隔
CronCreate
节奏明确的巡检
/loop
动态唤醒
ScheduleWakeup
节奏需要弹性
/loop(无参数)
loop.md 任务
ScheduleWakeup + loop.md
项目常规维护
路由规则非常简单:第一个参数是时间(如 5m),则走固定间隔模式;不是时间,则走动态唤醒模式;什么都不传,则检查是否存在 loop.md。
所以你无需学习新命令。/loop 5m check the deploy 还是老样子——固定5分钟执行一次。而 /loop check the deploy(去掉了 5m)则切换到动态模式,Agent自主决定执行节奏。
loop.md 模式更进一步:你在 .qoder/loop.md 里编写一份任务清单,/loop 不带参数时就会自动执行这份清单,每轮唤醒时自动注入最新内容。任务清单有更新,下一轮自动生效。
4. /crontab 管理面板
此前管理定时任务只能通过命令行操作——删除一个任务需要先list找到ID,再执行delete。本次我们打造了一个交互式TUI管理面板:
三个标签页:
Session:当前会话的临时定时任务(进程退出即消失)
Persistent:持久化到磁盘的定时任务(支持 --durable 创建),展示过期时间
Wakeup:动态唤醒任务,展示下次唤醒时间和Prompt
每个任务的详情页都支持就地编辑:
按 s 编辑定时表达式——弹出预设列表(1m / 5m / 15m / 30m / 1h / ... / Custom),上下选择,Enter确认。Custom模式下输入 5m / 2h / 30s 等人类可读时间,自动转为cron表达式
按 p 编辑Prompt——预填原始内容,支持就地修改
按 e 编辑过期时间(Persistent标签页)
Wakeup标签页的 s 键同样支持重新调度——7个预设延迟从30秒到1小时
对于动态唤醒任务,管理面板特别实用:你能随时查看Agent给自己设定的下次唤醒时间、理由,想改延迟就改延迟,想改Prompt就改Prompt,无需等待Agent下一轮执行。
5. --durable 持久化
默认情况下,/loop 创建的任务是session级别的——进程退出后任务即消失。添加 --durable 参数可以将任务持久化到磁盘:
持久化任务会在进程重启后自动恢复,默认7天过期。--durable 不加天数表示永久有效,加上天数则指定过期时间。过期时间在 /crontab 管理面板中直接可见、可编辑。
盯盘实战:将 loop 动态唤醒应用于实际场景
讲了这么多理论,实际运行效果如何?我们以一个真实场景来完整走一遍。
场景:线上服务告警盯盘
你的线上服务今天有大促活动,流量预计是平时的5倍。你需要盯盘:监控告警、发现问题及时处置、活动结束后自动收工。
传统做法:编写一个crontab脚本,每5分钟检查一次告警API,有告警则发送企业微信通知。问题在于:高峰期5分钟太慢,平峰期5分钟又太频繁,而且脚本只会"喊出事了"却不会处理。
采用Loop Engineering的做法:
第一步:动态盯盘
Agent会如何运行?它首先搭建监控体系:调用 Monitor 挂载告警事件流,再设定一个20分钟的 ScheduleWakeup 作为心跳。然后:
请注意两个通道的协同配合:P2、P0告警均由Monitor秒级推送,无需等待轮询;而ScheduleWakeup全程只承担两项任务——平时作为心跳,处置期间加密追踪进度。整个节奏完全由Agent自主调节。
第二步:搭配 /goal、workflow 和 skill 进行深度处置
在上述流程中,P0告警一出现,Agent就fork了一个 /goal 去分析根因。这完全由Agent自主判断——它认为"P0太严重,仅通知不够,必须深入排查"。
/loop 负责持续监控,发现问题后如何处置?有几种选择:fork一个 /goal 全力解决,调用对应的skill执行预案流程,或者触发一个workflow执行预设的应急步骤。你提前将处置逻辑写入skill或workflow中,相当于一份预案表单——Agent发现异常后自主决定使用哪个、如何执行。你无需在监控和处置之间手动切换。
第三步:通过 /crontab 随时介入
盯盘运行到一半,你想查看Agent给自己设定的下次唤醒时间及原因。打开 /crontab → Wakeup标签页:
看到Agent将心跳设为120秒,你觉得没必要(P0已在处理中,Monitor也仍在运行),按 s 手动调整为600秒。或者你想添加一条新的监控指令,按 p 编辑Prompt,追加一句"同时检查数据库连接池使用率"。
第四步:持久化盯盘任务
如果你需要盯盘跨进程运行(例如重启终端),添加 --durable 参数:
任务持久化到磁盘,重启后自动恢复。过期时间在 /crontab 中可见,可随时调整。
如何选择
讲了这么多,落到实际选型上,其实就是一个问题:你的任务,终点和节奏,哪个你能说清楚?
终点能说清楚 → /goal
适合:lint清零、测试全部通过、文档撰写完毕这类任务——你清楚"完成"的具体模样。
不适合:盯盘、持续监控——抵达终点后就会停止,无法持续跟踪。
准备:一个可由机器验证的完成条件 + 最大重试次数。
节奏能说清楚 → /loop 5m
适合:巡检、轮询、定期维护——你清楚大致多久检查一次合适。
不适合:盯盘、弹性监控——间隔是固定的,Agent无法调整。
准备:巡检内容(封装成skill,不要写在Prompt中)+ 间隔时间(间隔 = 你能接受的最大延迟)。
都说不清楚 → /loop(动态唤醒)
适合:盯盘、弹性监控——节奏需要Agent自主判断。有现成的事件源(日志流、事件API)时效果更佳,Monitor可直接挂载实现秒级响应。
不适合:合规要求固定间隔的场景,或你明确知道间隔不会变化的情况。
准备:监控目标的清晰描述 + 判断标准 + 异常处置预案(写入skill或workflow)。
混搭才是常态
实际使用中,单一模式的情况较少。最常见的组合:/loop 持续监控,发现问题后fork /goal 深入处理,或调用skill/workflow执行预案。一个管节奏,一个管深度,一个管流程。
最后:Loop Engineering 的核心是设计思维
写到最后想多聊几句。Loop Engineering这个概念,说到底就是从"我来执行"转变为"我来设计如何让Agent执行"。
本次升级所做的几件事——动态唤醒、Monitor、管理面板、持久化——都是在降低"设计"的门槛:
动态唤醒让你无需预判节奏,计时器交由Agent管理
Monitor让Agent无需猜测时机,事件发生直接唤醒
管理面板让你随时可以介入,无需退出对话去敲命令行
持久化让你关闭终端也不丢失任务,重启后自动恢复
盯盘这个场景好在哪?它把"人设计、Agent执行"的分工展示得非常清晰:
人做了什么
Agent 做了什么
定义监控目标和判断标准
挂 Monitor、调监控节奏
审查 agent 的处置决策
响应事件、发现问题、fork /goal 处置
决定什么时候结束盯盘
自主判断是否需要继续
设计监控系统
执行监控
你花5分钟想清楚"盯什么、什么算异常、异常了怎么办",然后写成一条 /loop。剩下的,Agent替你盯到天荒地老——或者说,盯到它自己判断"不需要再盯了"为止。
Loop Engineering 想要达到的效果就是:你的注意力从"重复检查"转移到"设计更好的检查策略"上。
打开 Qoder CLI,开始用起来吧!Agent会自主决定多久检查一次。
