按计划运行 Prompt
在 Qwen Code 会话中,使用
/loop和 cron 调度工具来重复运行 prompt、轮询状态或设置一次性提醒。
定时任务允许 Qwen Code 按固定间隔自动重新运行 prompt。你可以使用它们来轮询部署状态、看护 PR、检查长时间运行的构建,或者提醒自己在会话的稍后时间做某事。
任务的作用域限定在当前会话:它们存在于当前的 Qwen Code 进程中,退出时即被销毁。不会向磁盘写入任何内容。
消息通道使用独立的持久调度器,以便在当前轮次之后将结果推送回发起聊天的通道。请参阅定时通道循环了解通道命令、持久化行为和投递约束。
提示: 定时任务默认启用。要禁用它们,请在设置中设置
experimental.cron: false,或在环境变量中设置QWEN_CODE_DISABLE_CRON=1。
使用 /loop 安排循环 prompt
/loop 内置 skill 是安排循环 prompt 的最快方法。传入一个可选的间隔和 prompt,Qwen Code 就会设置一个 cron 任务,在会话保持打开期间于后台触发。
/loop 5m check if the deployment finished and tell me what happenedQwen Code 会解析间隔,将其转换为 cron 表达式,安排任务,并确认执行频率和任务 ID。然后它会立即执行一次该 prompt——你无需等待第一次 cron 触发。
间隔语法
间隔是可选的。你可以将其放在开头、放在结尾,或者完全省略。
| 形式 | 示例 | 解析后的间隔 |
|---|---|---|
| 前导 token | /loop 30m check the build | 每 30 分钟 |
尾部 every 子句 | /loop check the build every 2 hours | 每 2 小时 |
| 无间隔 | /loop check the build | 默认为每 10 分钟 |
支持的单位有 s(秒)、m(分钟)、h(小时)和 d(天)。由于 cron 的最小粒度为分钟,秒会被向上取整到最近的分钟。不能整除其单位的间隔(如 7m 或 90m)会被四舍五入到最近的整数间隔,Qwen Code 会告诉你它选择了哪个。
循环执行其他命令
调度的 prompt 本身可以是一个命令或 skill 调用。这对于重新运行你已经打包好的工作流非常有用。
/loop 20m /review-pr 1234每次任务触发时,Qwen Code 都会运行 /review-pr 1234,就像你亲自输入的一样。
自主模式
运行 /loop 时不提供 prompt 会启动一个自主循环,而不是重复固定的 prompt。Qwen Code 会作为对话中已建立工作的管理者——在你离开时推动工作继续:
/loop单独的 /loop(无 prompt,无间隔)会运行一个自定步调的自主循环;不带 prompt 的 /loop <interval> 会以固定频率运行相同的自主循环(例如 /loop 10m)。每次触发时,它都会推进对话中已经设置好的工作——完成你开始的事情、维护进行中的 PR(处理 review 线程、修复失败的 CI、解决冲突),并履行后续承诺。它仅对对话记录中已经确立的工作采取行动:在没有明确授权的情况下,它绝不会凭空创造新工作或进行不可逆的更改(push、delete、send),并且一旦所有事情都处理完毕,它就会停止。
管理循环
/loop 还支持两个用于管理现有任务的子命令:
/loop list列出所有已调度的任务及其 ID 和 cron 表达式。
/loop clear一次性取消所有已调度的任务。
设置一次性提醒
对于一次性提醒,请使用自然语言描述你的需求,而不是使用 /loop。Qwen Code 会安排一个单次触发的任务,该任务在运行后会自动删除自身。
remind me at 3pm to push the release branchin 45 minutes, check whether the integration tests passedQwen Code 使用 cron 表达式将触发时间固定到具体的分钟和小时,并确认其触发时间。
仅在发生变化时唤醒会话
循环任务可以携带一个门控(gate):一个 shell 命令,在每次触发时运行,独立于模型。如果该命令无输出且退出码为 0,则跳过本次触发——不会运行任何轮次,也不会向对话添加任何内容。如果命令有输出,任务的 prompt 会附带该输出并标记为该命令产生的数据而运行。命令失败、打印二进制数据或运行超过 60 秒时,会被报告一次,然后静默计数直到再次成功或被阻止;CronList 显示该计数。命令失败、打印二进制数据或运行超过 60 秒时,会被报告一次,然后静默计数直到再次成功;CronList 显示该计数。
对于通常安静的监视场景,请使用一个保持自身游标并仅打印变化内容的命令作为门控:
every 2 minutes, run ./check-pr.sh 15057 as a gate; when it prints something, handle the events it listsQwen Code 使用 gate: "./check-pr.sh 15057" 调用 CronCreate,并以确认 Monitor 命令的方式确认该命令:在任务创建时确认一次,并提供始终允许的选项。然后该命令从项目目录使用会话环境无人值守地运行。当命令为只读、已保存的 Monitor(...) 或 Bash(...) 规则允许、或会话运行在 auto 或 yolo 模式时,持久的门控任务在重启后仍可继续工作;否则下一次触发会报告需要添加的规则而不是运行命令。该规则就是 Monitor 的”始终允许”会保存的规则,对于复合命令(命令替换的测试、if、heredoc),它可能无法覆盖每个部分;将此类探测放入脚本中并允许该脚本。对该命令的 deny 规则会在所有模式下停止门控。当命令为只读、已保存的 Monitor(...) 或 Bash(...) 规则允许、或会话运行在 auto 或 yolo 模式时,持久的门控任务在重启后仍可继续工作;否则下一次触发会报告需要添加的规则而不是运行命令。对该命令的 deny 规则会在所有模式下停止门控。
将门控 prompt 编写为指令(“对于门控输出中的每个事件,…”),而非斜杠命令。门控目前尚不适用于绑定到当前守护进程对话的任务(sessionMode: "current")。在 qwen serve 守护进程中,Web Shell 的定时任务表单提供相同的门控命令,任务卡片显示其最近的结果,而门控任务上的”立即运行”会让模型首先按原样运行门控本身,并且仅当命令退出 0 并在标准输出上打印内容时才继续执行任务(定时触发会忽略标准错误上的警告,模型也应如此);绑定到当前守护进程对话的任务(sessionMode: "current")也可以携带门控。
管理定时任务
使用自然语言要求 Qwen Code 列出或取消任务,或者直接引用底层工具。
what scheduled tasks do I have?cancel the deploy check job在底层,Qwen Code 使用以下工具:
| 工具 | 用途 |
|---|---|
CronCreate | 安排新任务。接受 5 字段的 cron 表达式、要运行的 prompt、是循环执行还是单次执行,以及可选的门控命令。 |
CronList | 列出所有已调度的任务及其 ID、计划、prompt,以及门控命令(如已设置)和其最近执行结果。 |
CronDelete | 按 ID 取消任务。 |
每个定时任务都有一个 8 字符的 ID,你可以将其传递给 CronDelete。一个会话最多可以同时容纳 50 个定时任务。
定时任务的运行机制
调度器每秒检查一次到期任务,并在会话空闲时将其加入队列。调度的 prompt 会在你的轮次之间触发,而不是在 Qwen Code 响应过程中触发。如果任务到期时 Qwen Code 正忙,prompt 会等待直到当前轮次结束。带门控的任务会先运行其门控命令,仅在命令产生输出时才加入队列。
所有时间均按你的本地时区解释。像 0 9 * * * 这样的 cron 表达式表示在你运行 Qwen Code 的本地时间早上 9 点,而不是 UTC 时间。
抖动
为了避免所有会话在同一物理时间点击中 API,调度器会为触发时间添加一个小的确定性偏移量:
- 循环任务 最多会延迟其周期的 10% 触发,上限为 15 分钟。一个每小时执行的任务可能会在
:00到:06之间的任何时间触发。 - 安排在整点或半点(分钟为
:00或:30)的一次性任务 最多会提前 90 秒触发。
偏移量由任务 ID 派生,因此同一个任务总是获得相同的偏移量。如果精确的时间很重要,请选择不是 :00 或 :30 的分钟,例如使用 3 9 * * * 而不是 0 9 * * *,这样一次性任务的抖动就不会生效。
循环任务过期
默认情况下,循环任务在创建 7 天后自动过期。任务会最后一次触发,然后删除自身。这限制了被遗忘的循环可以运行的时间。
要更改此限制,请在设置中设置 experimental.cronRecurringMaxAgeDays,或设置 QWEN_CODE_CRON_MAX_AGE_DAYS 环境变量(环境变量优先——这在编辑 settings.json 不切实际的云或容器部署中非常方便)。值为 0 会完全禁用过期,因此任务会一直运行直到你删除它们——这对于托管每日报告、摘要或持续监控的长时间运行的守护进程部署非常有用。配置的限制也适用于重启后从磁盘恢复的持久化任务。
一次性任务不会按计时器过期——它们只是在触发一次后直接删除自身。
Cron 表达式参考
CronCreate 接受标准的 5 字段 cron 表达式:minute hour day-of-month month day-of-week。所有字段都支持通配符(*)、单个值(5)、步长(*/15)、范围(1-5)和逗号分隔的列表(1,15,30)。
| 示例 | 含义 |
|---|---|
*/5 * * * * | 每 5 分钟 |
0 * * * * | 每小时整点 |
7 * * * * | 每小时的第 7 分钟 |
0 9 * * * | 每天本地时间上午 9 点 |
0 9 * * 1-5 | 工作日本地时间上午 9 点 |
30 14 15 3 * | 3 月 15 日本地时间下午 2:30 |
星期字段使用 0 或 7 表示星期日,6 表示星期六。当月份中的日期和星期几都受到限制(两者都不是 *)时,只要其中一个字段匹配,该日期就会匹配——这遵循标准的 vixie-cron 语义。
不支持扩展语法,如 L、W、?,以及 MON 或 JAN 等名称别名。
限制
会话作用域的调度具有固有的限制:
- 任务仅在 Qwen Code 运行且空闲时触发。关闭终端或让会话退出会取消所有任务。
- 不会补执行错过的触发。如果任务的调度时间在 Qwen Code 忙于处理长时间运行的请求时过去,它只会在 Qwen Code 变为空闲时触发一次,而不是按错过的间隔触发多次。
- 重启后不持久化。重启 Qwen Code 会清除所有会话作用域的任务。