OpenClaw 定时任务原理:从自然语言到可执行系统
很多人第一次用 OpenClaw 做自动化时,都会有这个瞬间:
我只说了一句”每天早上 6 点发送新闻简报”,它为什么就能自动变成一个定时任务?
今天这篇,我们不讲玄学,直接讲底层。
你将看懂三件事:
- 自然语言到底是怎么变成
0 6 * * *的; - OpenClaw 在这条链路里具体做了什么;
- 为什么它能长期稳定、重启后也不丢任务。
先说结论:不是硬编码规则,而是”模型 + 工具协议”
OpenClaw 并不是写死了一个”中文句子 -> cron”的规则引擎。真实机制是:
- 模型理解你的自然语言(比如把”每天早上 6 点”理解成
0 6 * * *)。 - 模型发起结构化工具调用(调用
cron工具的add动作)。 - OpenClaw 负责规范化、校验、存储和调度执行。
换句话说: 语义映射由模型完成,系统可靠性由 OpenClaw 完成。
从你按下回车开始:10 步完整链路
第 1 步:消息进入会话
你发出”每天早上 6 点发送新闻简报”后,这条消息先进入当前会话(session),随后触发一次 agent 运行。
第 2 步:系统把”可用工具”告诉模型
在这一轮运行中,OpenClaw 会把工具列表发给模型,其中包含 cron 工具,以及它的参数 schema(例如 action、schedule.kind、schedule.expr、schedule.tz 等)。
这一步很关键:它把”我能做什么”从纯文本提示,变成了一个明确的接口契约。
第 3 步:模型做语义理解并生成工具调用
模型看到你的意图后,会倾向于输出类似下面的结构化调用(示意):
{
"action": "add",
"job": {
"name": "Morning brief",
"schedule": {
"kind": "cron",
"expr": "0 6 * * *",
"tz": "Asia/Shanghai"
},
"payload": {
"kind": "agentTurn",
"message": "请生成今天的新闻简报..."
}
}
}
这里的 0 6 * * *,就是模型对”每天早上 6 点”的语义映射结果。
第 4 步:cron 工具做第一次标准化
cron 工具接到参数后,会做一轮”输入修正与默认值补全”,例如:
- 标准化字段格式;
- 推断缺省字段(如
enabled=true、wakeMode=now); - 根据 payload 类型推断 sessionTarget(如
agentTurn -> isolated); - 对某些模式自动补默认 delivery。
这一步不是理解自然语言,而是保证调用参数”长得像系统能吃的样子”。
第 5 步:调用 Gateway 的 cron.add
工具层随后把处理后的 job 发送给 Gateway 方法层(cron.add)。
第 6 步:Gateway 做第二次校验
在 Gateway 里,会再次进行:
- 参数结构校验;
- 时间字段合法性校验;
- 安全约束校验。
通过后才会进入真正的 CronService。
第 7 步:CronService 创建任务并计算下一次运行时间
CronService 接收任务后会:
- 创建 job 对象;
- 计算
nextRunAtMs; - 持久化到 cron store;
- 重新设置内部 timer。
第 8 步:写入 jobs.json
任务会落到本地(默认):
~/.openclaw/cron/jobs.json
结构大致是:
{
"version": 1,
"jobs": [ ... ]
}
这意味着即使进程重启,计划也不会丢。
第 9 步:到点触发执行
到达时间点后,OpenClaw 内部调度器唤醒,找到 due job,然后按任务类型执行:
main:注入 system event + heartbeat;isolated:启动隔离的 agent turn(常用于简报、日报、周报)。
第 10 步:结果投递到目标渠道
执行结束后,按 delivery 策略投递:
announce:发到聊天渠道;webhook:POST 到回调地址;none:只内部记录,不外发。
为什么这种设计更可靠?
1)语义和执行解耦
“理解你说什么”交给模型,“保证一定能按时执行”交给系统。两者分工清晰,便于演进和排错。
2)持久化可恢复
任务持久化在本地 store,重启不会丢计划。
3)双层校验降低误调用
工具层 + Gateway 层双重规范化与验证,避免模型参数抖动直接污染调度系统。
4)内置调度闭环
不是把任务丢给外部 crontab,而是 Gateway 内自洽完成”存储-计算-触发-执行-投递”闭环,观测和维护一致性更好。
常见误区
误区 1:OpenClaw 有个”中文转 cron 的固定规则库”
不准确。它依赖模型语义理解 + 工具调用约束,而不是纯规则硬解析。
误区 2:时区一定自动是你本地时区
不一定。tz 可以由模型在工具参数中显式给出;若未给出,调度计算会回退到运行环境的默认时区。
误区 3:生成了 job 就等于会发送消息
还要看 payload 类型、sessionTarget、delivery 配置是否匹配。比如某些模式下默认投递策略不同。
实战建议:想要”每天 6 点稳定发简报”,建议这样做
如果你要稳定跑”每天 6 点新闻简报”,建议:
- 显式写时区(例如
Asia/Shanghai),避免跨机器部署时出现偏差; - 使用 isolated + agentTurn,让简报任务与主会话解耦;
- 明确 delivery target(channel/to),减少”跑了但没发到预期位置”的问题;
- 定期查看 run history,关注失败重试和投递状态。
最后总结
当你说出”每天早上 6 点发送新闻简报”,背后不是一句魔法指令,而是一条完整的工程流水线:
自然语言理解(模型) -> 结构化工具调用 -> 系统规范化与校验 -> 持久化调度 -> 到点执行与投递。
这正是 OpenClaw 的价值所在: 它不只是”会聊天”,而是把你的意图变成可以长期稳定运行的自动化能力。
评论 / 0
共 0 条你可能是第一个留下评论的人