自动化
Cron 任务
Cron 还是 Heartbeat? 关于何时使用各自的指导,请参阅 Cron vs Heartbeat。
Cron 是网关内置的调度器。它持久化任务,在正确的时间唤醒智能体(agent),并可以选择性地将输出发送回聊天。如果你想要 “每天早上运行这个” 或 “20分钟后提醒代理”,cron 就是实现机制。故障排除:/automation/troubleshooting
摘要
- Cron 在网关内部运行(不在模型内部)。
- 任务持久化存储在
~/.openclaw/cron/下,因此重启不会丢失 计划。 - 两种执行风格:
- 主会话:将系统事件加入队列,然后在下一个心跳时运行。
- 隔离:在
cron:中运行一个专用的智能体轮次,可选择交付(默认宣布或无交付)。
- 唤醒是一等公民:任务可以请求“立即唤醒”或“下次心跳”。
- 每个任务可通过
delivery.mode = "webhook"+delivery.to = ""进行 Webhook 投递。 - 当设置了
cron.webhook时,对于存储的带有notify: true的遗留任务,仍保留回退机制,请将这些任务迁移到 webhook 交付模式。
快速开始(可操作)
创建一个一次性提醒,验证其存在,并立即运行:
openclaw cron add \
--name "Reminder" \
--at "2026-02-01T16:00:00Z" \
--session main \
--system-event "Reminder: check the cron docs draft" \
--wake now \
--delete-after-run
openclaw cron list
openclaw cron run <job-id>
openclaw cron runs --id <job-id>
安排一个带交付的重复隔离任务:
openclaw cron add \
--name "Morning brief" \
--cron "0 7 * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Summarize overnight updates." \
--announce \
--channel slack \
--to "channel:C1234567890"
工具调用等效项(网关 cron 工具)
关于规范的 JSON 结构和示例,请参阅 工具调用的 JSON 模式。
Cron 任务存储位置
Cron 任务默认持久化存储在网关主机的 ~/.openclaw/cron/jobs.json。网关将文件加载到内存中,并在更改时写回,因此手动编辑仅在网关停止时是安全的。建议使用 openclaw cron add/edit 或 cron 工具调用 API 进行更改。
面向初学者的概述
将 cron 任务视为:何时运行 + 做什么。
- 选择计划
- 一次性提醒 →
schedule.kind = "at"(CLI:--at) - 重复任务 →
schedule.kind = "every"或schedule.kind = "cron" - 如果你的 ISO 时间戳省略了时区,则被视为 UTC。
- 一次性提醒 →
- 选择运行位置
sessionTarget: "main"→ 在下一个心跳时运行,使用主上下文。sessionTarget: "isolated"→ 在cron:中运行一个专用的智能体轮次。
- 选择有效载荷
- 主会话 →
payload.kind = "systemEvent" - 隔离会话 →
payload.kind = "agentTurn"
- 主会话 →
可选:一次性任务 (schedule.kind = "at") 默认在成功后删除。设置 deleteAfterRun: false 以保留它们(它们将在成功后禁用)。
概念
任务
一个 cron 任务是一个存储的记录,包含:
- 一个计划(何时应运行),
- 一个有效载荷(应做什么),
- 可选的交付模式 (
announce、webhook或none)。 - 可选的智能体绑定 (
agentId):在特定智能体下运行任务;如果缺失或未知,网关将回退到默认智能体。
任务由稳定的 jobId 标识(由 CLI/网关 API 使用)。在智能体工具调用中,jobId 是规范的;为兼容性也接受遗留的 id。一次性任务默认在成功后自动删除;设置 deleteAfterRun: false 以保留它们。
计划
Cron 支持三种计划类型:
at:通过schedule.at指定一次性时间戳(ISO 8601)。every:固定间隔(毫秒)。cron:5 字段 cron 表达式(或带秒的 6 字段),带有可选的 IANA 时区。
Cron 表达式使用 croner。如果省略时区,则使用网关主机的本地时区。为了减少跨多个网关的整点负载峰值,OpenClaw 对重复的整点表达式(例如 0 * * * *、0 */2 * * *)应用了确定性的每任务交错窗口,最多 5 分钟。固定小时表达式如 0 7 * * * 保持精确。对于任何 cron 计划,你可以使用 schedule.staggerMs 设置显式的交错窗口(0 保持精确计时)。CLI 快捷方式:
--stagger 30s(或1m、5m)以设置显式交错窗口。--exact以强制staggerMs = 0。
主会话与隔离执行
主会话任务(系统事件)
主任务将系统事件加入队列,并可选择唤醒心跳运行器。它们必须使用 payload.kind = "systemEvent"。
wakeMode: "now"(默认):事件触发立即的心跳运行。wakeMode: "next-heartbeat":事件等待下一个计划的心跳。
当你想要正常的心跳提示 + 主会话上下文时,这是最佳选择。参见 Heartbeat。
隔离任务(专用的 cron 会话)
隔离任务在会话 cron: 中运行一个专用的智能体轮次。关键行为:
- 提示前缀为
[cron: ]以便追踪。 - 每次运行启动一个新的会话 ID(无先前对话延续)。
- 默认行为:如果省略
delivery,隔离任务会宣布摘要 (delivery.mode = "announce")。 delivery.mode选择发生的情况:announce:将摘要发送到目标频道,并向主会话发布简短摘要。webhook:当完成事件包含摘要时,将完成的事件有效载荷 POST 到delivery.to。none:仅内部(无交付,无主会话摘要)。
wakeMode控制主会话摘要何时发布:now:立即心跳。next-heartbeat:等待下一个计划的心跳。
将隔离任务用于嘈杂、频繁或“后台杂务”,这些任务不应污染你的主聊天历史记录。
有效载荷结构(运行内容)
支持两种有效载荷类型:
systemEvent:仅主会话,通过心跳提示路由。agentTurn:仅隔离会话,运行一个专用的智能体轮次。
常见的 agentTurn 字段:
message:必需的文本提示。model/thinking:可选覆盖(见下文)。timeoutSeconds:可选的超时覆盖。lightContext:可选轻量级引导模式,适用于不需要工作区引导文件注入的任务。
交付配置:
delivery.mode:none|announce|webhook。delivery.channel:last或特定频道。delivery.to: 频道特定目标(宣布)或 webhook URL(webhook 模式)。delivery.bestEffort: 如果宣布交付失败,避免任务失败。
宣布交付会抑制运行期间的消息工具发送;使用 delivery.channel/delivery.to 来定位聊天。当 delivery.mode = "none" 时,不会向主会话发布摘要。如果为隔离任务省略了 delivery,OpenClaw 默认为 announce。
宣布交付流程
当 delivery.mode = "announce" 时,cron 直接通过出站频道适配器交付。主智能体不会被启动来创建或转发消息。行为细节:
- 内容:交付使用隔离运行的出站有效载荷(文本/媒体),具有正常的块处理和频道格式化。
- 仅心跳响应(
HEARTBEAT_OK无实际内容)不会被交付。 - 如果隔离运行已通过消息工具向同一目标发送了消息,则跳过交付以避免重复。
- 缺失或无效的交付目标会导致任务失败,除非
delivery.bestEffort = true。 - 仅当
delivery.mode = "announce"时,才会向主会话发布简短摘要。 - 主会话摘要遵循
wakeMode:now触发立即心跳,next-heartbeat等待下一个计划的心跳。
Webhook 交付流程
当 delivery.mode = "webhook" 时,cron 在完成事件包含摘要时将完成的事件有效载荷 POST 到 delivery.to。行为细节:
- 端点必须是有效的 HTTP(S) URL。
- 在 webhook 模式下不会尝试频道交付。
- 在 webhook 模式下不会向主会话发布摘要。
- 如果设置了
cron.webhookToken,认证头为Authorization: Bearer <cron.webhookToken>。 - 已弃用的回退:存储的遗留任务如果设置了
notify: true,仍会发布到cron.webhook(如果已配置),并带有警告,以便你可以迁移到delivery.mode = "webhook"。
模型和思考级别覆盖
隔离任务 (agentTurn) 可以覆盖模型和思考级别:
model:提供商/模型字符串(例如,anthropic/claude-sonnet-4-20250514)或别名(例如,opus)thinking:思考级别(off、minimal、low、medium、high、xhigh;仅限 GPT-5.2 + Codex 模型)
注意:你也可以在主会话任务上设置 model,但这会改变共享的主会话模型。我们建议仅对隔离任务使用模型覆盖,以避免意外的上下文切换。解析优先级:
- 任务有效载荷覆盖(最高)
- 钩子特定默认值(例如,
hooks.gmail.model) - 智能体配置默认值
轻量级引导上下文
隔离任务 (agentTurn) 可以设置 lightContext: true 以使用轻量级引导上下文运行。
- 将此用于不需要工作区引导文件注入的计划杂务。
- 实际上,嵌入式运行时以
bootstrapContextMode: "lightweight"运行,这特意保持 cron 引导上下文为空。 - CLI 等效项:
openclaw cron add --light-context ...和openclaw cron edit --light-context。