1. 为什么定时任务总在模型调用这一步翻车
OpenClaw 的 Cron 调度器本身不复杂,真正让人头疼的是任务被唤醒之后,Agent 要调用模型能力时 Key 从哪来、走哪条通道、多个任务之间怎么不打架。我见过太多人把 cron 表达式调通了,结果任务一跑就报 401 或 rate limit,排查半天发现是每个任务各自读了一份环境变量,Key 散落在不同 shell 会话里。
这篇就聚焦一件事:让 OpenClaw CLI 的 Cron 调度器稳定调用模型能力,用 TaoToken 做统一 Key 和 API 通道。适合已经在用 OpenClaw 跑 Agent、准备把重复性工作交给定时任务、但被多 Key 管理和调度稳定性卡住的开发者。读完你能拿到 config.toml 和 settings.json 的可复制骨架,知道怎么把调度器指向统一入口,也有一条触发后的验证动作和日志排查路径。
OpenClaw 的 Cron 调度器核心能力值得先明确:任务持久化在~/.openclaw/cron/目录下以 JSON 形式存储,Gateway 重启不丢;支持 at 一次性、every 固定间隔、cron 表达式三种调度类型;执行模式分主会话和隔离会话。这些是底座,而模型调用通道是跑在上面的关键链路。
2. TaoToken 前置:把 Key 和 API 通道统一起来
在动手改配置之前,先把 TaoToken 这边的准备工作做完。核心思路是:OpenClaw 的每个定时任务不再各自持有模型 Key,而是统一走 TaoToken 的 API 通道,Key 只在一个地方维护。
你需要先拿到一个可用的 API Key。登录 TaoToken 控制台,在 API Keys 页面创建一个新 Key,建议按用途命名,比如openclaw-cron,方便后续在日志里区分是哪个调用方。创建后立即复制保存,页面不会再次完整显示。
拿到 Key 之后,确认两件事:一是 API 基础地址用https://taotoken.net/api,注意这个地址不带任何查询参数;二是你打算让定时任务调用哪个模型,先在模型对话页面手动发一条消息验证 Key 可用,避免把问题带到调度器里再排查。
提示:定时任务属于长期运行的自动化调用,建议单独创建一个 Key 专用于 OpenClaw Cron,不要和交互式调试共用。这样在排查限流或异常时,能快速定位是调度器的问题还是手动调用的问题。
如果你后续要跑长期编码类或 Agent 类任务,可以了解 Coding Plan 的额度方式;如果只是验证模型连通性,模型对话页面就够了。接入细节和参数说明在接入文档里有完整对照。
3. 可复制配置:config.toml 与 settings.json 骨架
OpenClaw 的配置分两层:一层是 Gateway 级别的openclaw.json(控制 Cron 调度器全局行为),一层是任务级别的参数(通过 CLI 或任务 JSON 定义)。下面给出可直接改用的骨架。
3.1 openclaw.json 中的 Cron 与模型通道配置
{ "cron": { "enabled": true, "store": "~/.openclaw/cron/", "sessionRetention": "24h", "runLog": { "maxBytes": 10485760, "keepLines": 5000 }, "retry": { "maxRetries": 3, "backoffBase": 1000, "backoffMax": 60000 } }, "model": { "provider": "taotoken", "baseUrl": "https://taotoken.net/api", "apiKeyEnv": "TAOTOKEN_API_KEY", "defaultModel": "claude-sonnet-4-20250514" } }这里的关键是model段:baseUrl指向 TaoToken 的 API 地址,apiKeyEnv指定从哪个环境变量读取 Key,而不是把 Key 硬编码进配置文件。defaultModel按你实际要用的模型填。
3.2 config.toml 骨架
如果你的 OpenClaw 版本使用 TOML 作为主配置,对应写法如下:
[cron] enabled = true store = "~/.openclaw/cron/" session_retention = "24h" [cron.run_log] max_bytes = 10485760 keep_lines = 5000 [cron.retry] max_retries = 3 backoff_base = 1000 backoff_max = 60000 [model] provider = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" default_model = "claude-sonnet-4-20250514"3.3 settings.json 中的环境变量注入
Key 不写进配置文件,通过环境变量注入。在settings.json里可以这样声明:
{ "env": { "TAOTOKEN_API_KEY": "sk-your-key-here" }, "cron": { "inheritEnv": true } }inheritEnv: true让 Cron 唤醒的隔离会话继承这份环境变量,避免出现「手动跑能通、定时跑 401」的经典问题。生产环境更推荐用系统级环境变量或密钥管理服务,settings.json里只做开发期占位。
3.4 添加一条定时任务
配置就绪后,用 CLI 添加任务。下面这条是工作日早七点生成晨报的隔离会话任务:
openclaw cron add \ --name "morning-report" \ --cron "0 7 * * 1-5" \ --timezone "Asia/Shanghai" \ --session isolated \ --delivery announce \ --message "生成工作日晨报:1. 昨日任务完成情况 2. 今日重点待办 3. 阻塞事项提醒"时区一定要显式指定。不写--timezone时默认用 Gateway 服务器的系统时区,服务器在 UTC 而你以为在 UTC+8,任务就会在错误的时间点触发,这类问题在日志里表现为「任务跑了但时间不对」,很容易被忽略。
4. 验证请求与成功结果
配置写完不等于跑通。最稳的验证顺序是:先手动触发,再看运行历史,最后确认模型调用真的走了 TaoToken 通道。
4.1 手动触发一次
openclaw cron run --id a1b2c3d4把a1b2c3d4换成openclaw cron list里查到的实际任务 ID。手动触发会立即执行一次,不受调度时间约束,适合验证配置。
4.2 查看运行历史
openclaw cron runs --id a1b2c3d4成功的结果里应该能看到任务状态为 completed,并且有模型返回的内容摘要。如果状态是 failed,重点看错误类型:401 通常是 Key 没注入成功,429 是限流,超时则要看网络或模型响应时间。
4.3 确认调用走了统一通道
在 TaoToken 控制台的用量或日志页面,按时间点筛选,应该能看到刚才手动触发对应的调用记录,来源标识为openclaw-cron这个 Key。这一步能确认请求确实经过了 TaoToken,而不是被某个残留的旧配置截胡。
注意:如果运行历史显示成功,但 TaoToken 后台没有对应记录,说明任务可能读到了另一份配置里的旧 Key。检查
settings.json的inheritEnv是否生效,以及 shell 里是否有覆盖性的环境变量。
5. 本篇常见错排查
5.1 任务触发但报 401 Unauthorized
最常见的原因是隔离会话没有继承环境变量。OpenClaw 的隔离模式会在独立的cron:前缀会话里启动新的 Agent Turn,如果inheritEnv没开,或者 Key 只写在了交互式 shell 的 profile 里,定时任务就读不到。
排查动作:先确认settings.json里cron.inheritEnv为 true,再确认TAOTOKEN_API_KEY在 Gateway 进程的环境里可见。可以用一条临时任务打印环境变量来验证。
5.2 任务在错误的时间触发
九成是时区问题。cron 表达式本身不带时区信息,--timezone没指定就落到服务器系统时区。排查动作:openclaw cron list看 NEXT RUN 列的时间,和你预期的时间对比。如果差了几个小时,就是时区没对齐。
5.3 周期性任务被限流后不再恢复
OpenClaw 对瞬态错误采用指数退避重试,周期性任务在退避期间保持 enabled 状态,退避结束后恢复调度。但如果你把backoffMax设得过大,任务可能长时间处于等待状态,看起来像「卡死了」。排查动作:看运行历史里的重试记录,确认退避时间是否合理。backoffBase1000ms、backoffMax60000ms 是较稳的起点。
5.4 一次性任务失败后直接消失
一次性任务最多重试 3 次,全部失败后标记为 failed,不会自动移除但也不再执行。如果你需要它失败后告警,把delivery设成 webhook,指向你的告警服务。
{ "delivery": { "type": "webhook", "url": "https://your-server.com/callback", "headers": { "Authorization": "Bearer YOUR_TOKEN" } } }5.5 日志文件涨得太快
runLog.maxBytes默认 10MB,keepLines默认 5000 行。如果任务频率高、输出多,日志会快速轮转。排查动作:先看~/.openclaw/cron/目录下的文件大小,再决定是否调大maxBytes或降低任务频率。隔离会话日志的保留时长由sessionRetention控制,默认 24h。
6. 把调度器接稳之后
定时任务跑通之后,真正决定稳定性的往往不是 cron 表达式,而是模型调用通道的健壮性。统一走 TaoToken 的好处在这里体现出来:Key 只维护一份,限流和用量在一个后台看,任务出问题时排查路径短。
如果你接下来要跑的是长期编码类或 Agent 类任务,建议把 Key 和额度规划单独做一层,Coding Plan 的额度方式更适合这种持续调用的场景。接入参数和模型列表在接入文档里可以对照,需要新建或轮换 Key 时去 API Keys 页面操作。
最后留一个实用习惯:每加一条新任务,先手动openclaw cron run跑一次,确认模型调用在 TaoToken 后台有记录,再交给调度器按时间触发。这一步多花三十秒,能省掉后面半小时的日志排查。