1. 为什么盯盘这件事,最后都变成了「定时任务 + 统一 API 通道」
先说清楚这篇要解决什么。OpenClaw 是一套开源 AI Agent 自动化运行框架,支持技能扩展、任务调度和流程执行;把它用在行情信息辅助场景里,它能做的是:按固定时间拉取公开行情数据、整理指数与成交量分布、识别活跃板块、生成结构化文本清单并推送。适合谁?适合白天要上班、没法一直盯屏幕,但又想每天固定几个时间点拿到一份客观盘面汇总的开发者。它不做预测,不接交易接口,不下单,本质是信息采集与文本生成的自动化工具。
真正卡住大多数人的不是「装不上 OpenClaw」,而是装完之后模型通道七零八落:盘前汇总用一个 Key,午间整理用另一个,收盘总结又换一个,定时任务一多,401、超时、限流全冒出来,排查起来毫无头绪。我试过把三套 Key 混着用,结果某天早上 9:20 的盘前任务直接静默失败,日志里只有一行认证错误,查了半小时才发现是某个 Key 过期了。
所以这篇的路线是:先把模型调用收敛到一条统一的 API 通道(TaoToken),再在这个基础上配置 OpenClaw 的定时行情技能。这样你只需要维护一份 Key、一个 baseUrl,定时任务无论跑几次、跑几个时段,认证逻辑都是同一套。下面从环境准备一路写到定时任务验证和排障,配置骨架可以直接复制。
2. TaoToken 前置:把模型通道收敛成一份 Key
2.1 TaoToken 在这套方案里扮演什么角色
TaoToken 提供的是统一的模型 API 通道。对 OpenClaw 这种「一个 Agent 里可能调用多个模型、多个技能」的框架来说,统一通道的价值很直接:你不需要为每个技能单独申请和轮换 Key,也不用在多个 baseUrl 之间来回切换。OpenClaw 的模型配置里填一次 TaoToken 的地址和 Key,后面所有技能、所有定时任务都走这一条路。
官网入口在这里:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个地址不加 UTM 参数,配置里直接写它)。
2.2 拿 Key 和确认通道可用
登录后进入控制台,在 API Keys 页面创建一个 Key。建议按用途命名,比如openclaw-stock-agent,方便以后区分。创建后立刻复制保存,页面刷新后就看不到完整 Key 了。
创建完先别急着写进 OpenClaw,用一条 curl 确认通道本身是通的:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的TaoToken Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "只回复两个字:连通"}], "max_tokens": 32 }'返回里能看到choices[0].message.content就说明通道没问题。这一步很关键,因为后面 OpenClaw 报认证错误时,你需要知道到底是通道问题还是配置问题——先在这里排除掉通道因素。
如果你还想顺手验证一下模型对话效果,可以直接用模型对话页面发几条测试消息,确认返回质量和延迟符合预期,再去配 OpenClaw。
3. 可复制配置:settings.json 与 config.toml 双份骨架
OpenClaw 不同版本、不同安装方式读取的配置文件位置不完全一样。为了不让你在「配置写了但没生效」上浪费时间,这里给两份骨架:一份是 OpenClaw 主配置settings.json,一份是技能层的config.toml。你按自己实际安装的版本选对应的那份,或者两份都放上,让框架自己挑。
3.1 settings.json:模型通道主配置
OpenClaw 的模型配置通常放在~/.openclaw/config/openclaw.json或安装目录下的settings.json。核心是把 provider 指向 TaoToken:
{ "models": { "default": "taotoken-main", "providers": { "taotoken-main": { "baseUrl": "https://taotoken.net/api", "apiKey": "你的TaoToken Key", "model": "claude-sonnet-4-20250514", "timeout": 60000, "maxRetries": 2 } } }, "gateway": { "port": 18789, "host": "0.0.0.0" } }几个参数说明一下。timeout设 60 秒,是因为行情汇总类任务输出文本较长,默认超时容易在收盘总结这种长报告上被截断。maxRetries设 2,应对偶发的网络抖动,但别设太高,否则定时任务堆积会互相挤占。baseUrl结尾不要带/v1,OpenClaw 内部会自己拼路径,带了反而会变成/v1/v1/...。
3.2 config.toml:技能层配置
如果你用的是 TOML 配置的版本,技能层这样写:
[model] provider = "taotoken" base_url = "https://taotoken.net/api" api_key = "你的TaoToken Key" default_model = "claude-sonnet-4-20250514" timeout_seconds = 60 [skill.timed-stock-push] enabled = true report_times = ["pre", "noon", "close"] timezone = "Asia/Shanghai" output_format = "markdown" [skill.timed-stock-push.data] source = "public" retry_on_empty = truetimezone一定要显式写Asia/Shanghai。定时任务最容易踩的坑就是服务器时区是 UTC,你配的 9:20 实际在北京时间 17:20 才触发,盘前汇总变成了盘后复盘。
3.3 让配置生效
改完配置后重启网关:
openclaw gateway restart然后确认配置被正确加载:
openclaw config show | grep -A 5 taotoken能看到 baseUrl 和 model 字段就说明读进去了。如果这里显示的还是旧配置,检查你是不是改错了文件路径——用openclaw config path可以打印当前实际读取的配置文件位置。
4. 验证请求:定时任务触发与行情拉取的成功结果
4.1 先手动跑一次技能
配置生效后,别直接上定时任务,先手动触发一次,确认整条链路通:
openclaw skill run timed-stock-push --report test成功的话,控制台会输出一段结构化文本,包含指数概况、成交量分布、板块涨跌家数、以及基于基础规则生成的观察清单。输出末尾应该带有数据来源和时间标注。如果输出为空,先看第 5 节的排查。
4.2 配置三个时段的定时任务
确认手动跑通后,再加定时任务。以工作日盘前、午间、收盘三个时段为例:
openclaw schedule add "morning-report" "20 9 * * 1-5" \ "openclaw skill run timed-stock-push --report pre" openclaw schedule add "noon-report" "0 12 * * 1-5" \ "openclaw skill run timed-stock-push --report noon" openclaw schedule add "close-report" "10 15 * * 1-5" \ "openclaw skill run timed-stock-push --report close"cron 表达式里的1-5表示周一到周五,避免周末空跑浪费调用。查看任务列表确认都注册上了:
openclaw schedule list4.3 验证定时任务真的会触发
不想等到明天早上 9:20,可以把某个任务临时改成两分钟后触发,观察日志:
openclaw schedule add "verify-now" "$(date -d '+2 minutes' '+%M %H * * *')" \ "openclaw skill run timed-stock-push --report test"然后盯日志:
openclaw gateway logs --follow | grep timed-stock-push看到任务执行记录和技能输出,就说明调度器工作正常。验证完记得把临时任务删掉:
openclaw schedule remove "verify-now"4.4 成功结果的判断标准
一次成功的定时行情任务,日志里应该同时出现这几样:调度器触发记录、技能开始执行、模型调用返回 200、技能输出写入、任务结束标记。缺任何一环都算没跑完。特别是「模型调用返回 200」这一条,如果只有技能启动没有模型返回,多半是通道配置问题,回到第 2.2 节的 curl 重新确认。
5. 本篇常见错排查
5.1 认证失败 401 / 403
最常见。先确认 Key 有没有多余空格——从控制台复制时经常带上首尾空白。然后确认baseUrl写的是https://taotoken.net/api,没有多写/v1。最后回到第 2.2 节的 curl 命令单独测通道,如果 curl 通但 OpenClaw 不通,就是配置文件路径或字段名的问题,用openclaw config show对比。
5.2 定时任务不触发
按顺序查三件事。第一,任务是否启用:openclaw schedule list看状态。第二,系统时区:timedatectl确认是Asia/Shanghai,不是就sudo timedatectl set-timezone Asia/Shanghai。第三,网关是否在跑:openclaw gateway status,挂了就openclaw gateway restart。这三样都没问题,再看 cron 表达式本身,* * 1-5和* * * * *的区别就是周末跑不跑。
5.3 技能输出为空或格式异常
先手动跑openclaw skill run timed-stock-push --report test看原始输出。如果模型返回了内容但技能没解析出来,多半是输出格式和技能预期不匹配,检查output_format配置。如果模型压根没返回,回到通道排查。另外数据源接口偶发不可达也会导致空输出,retry_on_empty = true能缓解一部分。
5.4 端口占用导致启动失败
3000 或 18789 被占:
# Linux / Mac sudo lsof -i :18789 sudo kill -9 进程ID # Windows netstat -ano | findstr :18789 taskkill /PID 进程ID /F5.5 长报告被截断
收盘总结这类输出较长,如果timeout设得太短会被截断。把timeout提到 60000 毫秒以上,同时确认max_tokens没有被设成很小的值。截断的表现是输出到一半突然结束,没有结尾的数据来源标注。
5.6 调用频率过高被限流
三个时段任务本身不会触发限流,但如果你还配了「固定间隔快速扫描」,间隔太短就会撞上。建议间隔类任务不要低于 5 分钟,并且和整点任务错开。真遇到限流,maxRetries会帮你重试,但根治办法是拉开间隔。
6. 长期跑下去:把通道和调度都固定下来
如果你打算让这套 Agent 长期在服务器上跑,建议把模型通道固定成一份 Key、一个 baseUrl,所有技能和定时任务共用。这样以后加新技能——比如加一个「板块异动扫描」或者「自选清单整理」——不用再动模型配置,直接写技能逻辑就行。
对于需要长期编码、持续迭代 Agent 技能的场景,可以考虑 Coding Plan,把调用成本从按量计费转成更可控的方式,适合任务量稳定的情况。配置入口在控制台的 Coding Plan 页面,开通后同样在 API Keys 里生成 Key,替换掉settings.json里的apiKey字段即可,baseUrl 不变。
最后提醒一句:这套系统的定位始终是信息整理工具。所有数据来自公开接口,输出是规则化的客观汇总,不构成任何投资相关建议,也不接入交易系统。它的价值在于帮你把「每天固定时间手动翻盘面」这件事自动化掉,省下来的时间你自己判断。定时任务配好之后,你甚至可以一周不看日志,只要每天早中晚三份汇总按时出现在控制台里,就说明整条链路是稳的。