1. 为什么单次对话撑不起真正的自动化
很多人第一次用 OpenClaw 的感觉是:这玩意儿挺聪明。问它问题能答,让它写脚本能写,甚至丢一段报错日志它也能给出排查方向。但用上一两周就会发现一个尴尬的事实——每次都要重新交代背景、重新贴上下文、重新纠正输出格式。上周刚调好的提示词,这周换个任务又得重来一遍。
问题不在模型能力,而在于我们把 OpenClaw 当成了一个"问答框",而不是一个"执行引擎"。真正的工程价值从来不是某一次回答有多准,而是同一类任务能不能稳定、可重复、可审计地跑下去。比如每周一自动汇总缺陷数据、每次提交代码后自动生成变更说明、每天定时拉取业务指标生成报表——这些流程如果每次都靠人手敲一遍提示词,那自动化就只是个幻觉。
OpenClaw 接入 MCP(Model Context Protocol)之后,能力边界会明显扩大。MCP 负责把外部工具(文件系统、数据库、HTTP 接口、浏览器操作)以标准化协议暴露给模型,OpenClaw 负责理解任务、规划步骤、编排调用。但光有这两层还不够,因为"怎么做"这件事如果没有沉淀,每次执行的不确定性依然很高。这就是 Skills 和 JSON Schema 要解决的问题:Skills 把策略固化成可复用资产,JSON Schema 把输出契约锁死,让整条链路从"能跑"变成"稳定跑"。
这篇内容面向的是已经在本地折腾 AI 工具链、想让 OpenClaw 真正进入日常工作流的开发者。我会给出 config.toml 和 settings.json 的骨架、TaoToken 统一 Key 的接入片段,以及一次完整的工作流触发与结果校验动作。你可以直接照着改。
2. TaoToken 前置:统一 Key 与 API 通道
在搭工作流之前,先把模型调用这条链路理顺。OpenClaw 本身不绑定某一家模型服务,它通过配置里的 provider 字段决定请求发往哪里。如果你同时用多个模型(比如规划用强模型、执行用快模型),每个都单独配 Key、单独记额度,维护成本会很快失控。
TaoToken 在这里的角色是统一入口:一个 Key 覆盖多种模型通道,OpenClaw 侧只需要改 base_url 和 api_key 两个字段。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数,配置时别把推广参数拼进去。
你需要先去控制台创建一个 API Key。打开 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,登录后在 API Keys 页面生成一个 Key,复制出来备用。这个 Key 就是后面 config.toml 里要填的值。
有一点要提醒:Key 不要硬编码在会提交到 Git 的文件里。推荐做法是放在环境变量或者本地.env文件,config.toml 里用占位符引用。后面配置片段我会按这个思路写。
3. 可复制配置:config.toml 与 settings.json 骨架
OpenClaw 的配置分两层:config.toml管模型通道和 MCP Server 注册,settings.json管 Skills 定义和工作流参数。先看 config.toml。
# ~/.openclaw/config.toml [provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" default_model = "claude-sonnet-4-20250514" timeout_seconds = 120 max_retries = 3 [provider.models] planner = "claude-sonnet-4-20250514" executor = "claude-haiku-3-5-20241022" [mcp_servers.filesystem] command = "npx" args = ["-y", "@modelcontextprotocol/server-filesystem", "/Users/you/workspace"] [mcp_servers.http] command = "npx" args = ["-y", "@modelcontextprotocol/server-http"] env = { ALLOWED_HOSTS = "api.internal.example.com,taotoken.net" } [workflow] state_dir = "~/.openclaw/runs" log_level = "info" idempotency_key_field = "run_id"这里有几个点值得展开。base_url指向 TaoToken 的 API 端点,api_key用${TAOTOKEN_API_KEY}引用环境变量,你在 shell 里export TAOTOKEN_API_KEY="sk-..."就行。planner和executor分开配,是因为规划阶段需要强推理,执行阶段用快模型能省时间和额度。MCP Server 用 npx 拉起,filesystem 限定在 workspace 目录内,http server 用 ALLOWED_HOSTS 白名单控制出站请求,避免工作流意外打到不该打的地方。
然后是 settings.json,这里定义 Skills 和输出契约。
{ "skills": [ { "name": "weekly_defect_report", "description": "生成周度缺陷治理报告", "states": ["collect", "normalize", "analyze", "render", "publish"], "timeout_per_state": 90, "retry": { "max": 3, "backoff": [1, 2, 4] }, "output_schema": "schemas/defect_report.json", "template": "templates/defect_report.md" } ], "workflow_defaults": { "idempotency": true, "audit_log": true, "degrade_on_source_failure": true } }Skills 的核心是states数组,把流程拆成五个状态:collect 采集、normalize 标准化、analyze 分析、render 渲染、publish 发布。每个状态独立超时和重试,单点失败不会拖垮整条链路。output_schema指向一个 JSON Schema 文件,这是保证输出格式不漂移的关键。
JSON Schema 文件长这样:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "required": ["period", "metrics", "top_causes", "risks", "actions"], "properties": { "period": { "type": "string", "pattern": "^\\d{4}-W\\d{2}$" }, "metrics": { "type": "object", "required": ["new", "closed", "backlog"], "properties": { "new": { "type": "integer", "minimum": 0 }, "closed": { "type": "integer", "minimum": 0 }, "backlog": { "type": "integer", "minimum": 0 } } }, "top_causes": { "type": "array", "items": { "type": "object", "required": ["cause", "count"], "properties": { "cause": { "type": "string" }, "count": { "type": "integer" } } } }, "risks": { "type": "array", "items": { "type": "string" } }, "actions": { "type": "array", "items": { "type": "object", "required": ["owner", "deadline", "task"], "properties": { "owner": { "type": "string" }, "deadline": { "type": "string", "format": "date" }, "task": { "type": "string" } } } } } }period用正则锁死2026-W11这种格式,metrics三个字段强制非负整数,actions里每条必须有负责人、截止日期、任务描述。OpenClaw 在 render 状态会拿这个 schema 校验模型输出,不通过就触发重试或降级,而不是把格式乱七八糟的报告直接发出去。
4. 验证请求:触发一次工作流并校验结果
配置写完之后,先别急着上定时任务,手动触发一次看链路通不通。
第一步,确认 OpenClaw 能读到配置:
openclaw doctor openclaw status --alldoctor会检查 config.toml 语法、环境变量是否设置、MCP Server 能否拉起。如果TAOTOKEN_API_KEY没导出,这里会直接报错,别跳过。
第二步,触发工作流:
openclaw run weekly_defect_report \ --param period=2026-W11 \ --param project=backend-core \ --idempotency-key "2026-W11-backend-core-weekly" \ --follow--follow会实时打印每个状态的执行日志。正常输出大概是这样:
[collect] fetching issues... 142 records [collect] fetching commits... 87 records [normalize] time range: 2026-03-09 ~ 2026-03-15 [analyze] new=23 closed=31 backlog=58 [analyze] top cause: "null pointer" (9) [render] schema validation: PASS [publish] report written to /workspace/reports/2026-W11.md [publish] idempotency key recorded第三步,校验输出。打开生成的报告文件,或者直接用 jq 检查结构化数据:
cat ~/.openclaw/runs/2026-W11-backend-core/result.json | jq '.metrics'期望看到:
{ "new": 23, "closed": 31, "backlog": 58 }如果metrics字段缺失或者类型不对,说明 schema 校验没拦住,回去检查output_schema路径是否正确、render 状态有没有真正调用校验器。
第四步,验证幂等。用同一个--idempotency-key再跑一次:
openclaw run weekly_defect_report \ --param period=2026-W11 \ --param project=backend-core \ --idempotency-key "2026-W11-backend-core-weekly"这次应该直接返回skipped: idempotency key already exists,不会重复发布。如果它又跑了一遍并覆盖了报告,说明idempotency_key_field配置没生效,检查 config.toml 里[workflow]段。
5. 本篇常见错排查
报错一:provider taotoken not found
config.toml 里[provider]段的name字段和 OpenClaw 内部注册的 provider 名对不上。OpenClaw 对自定义 provider 的识别依赖name+base_url组合,确认base_url写的是https://taotoken.net/api而不是带 UTM 的官网地址。官网地址是给浏览器访问的,API 调用必须走/api路径。
报错二:MCP server filesystem failed to start
npx 拉包失败,通常是网络或缓存问题。先手动跑一遍npx -y @modelcontextprotocol/server-filesystem /Users/you/workspace,看能不能起来。如果卡在下载,检查 npm registry 配置。另外路径要用绝对路径,~在 args 数组里不会被 shell 展开。
报错三:schema validation failed: period does not match pattern
模型输出的 period 写成了2026年第11周或者2026-03-09,没按^\d{4}-W\d{2}$格式来。两个解法:一是在 Skill 的 prompt 模板里明确写"period 必须输出为 YYYY-Www 格式",二是在 normalize 状态里加一个格式化步骤,把日期统一转成 ISO 周格式再传给 analyze。推荐后者,因为靠提示词约束格式始终不稳定。
报错四:工作流跑到 publish 就卡住
publish 状态通常涉及外部写入(知识库、群消息),如果目标服务响应慢或者需要鉴权,会一直等。检查timeout_per_state是不是设得太长,以及 publish 的 MCP 工具调用有没有配超时。另外确认degrade_on_source_failure为 true,这样单个数据源挂了会输出部分数据版本而不是整体失败。
报错五:idempotency key already exists但报告没生成
幂等键记录和实际发布动作之间有时序问题。如果 publish 状态在写入报告之前就记录了幂等键,而写入过程失败了,下次重跑会被幂等逻辑拦住。解法是把幂等键的记录放在 publish 成功之后,或者用两阶段提交:先写临时文件,确认成功后再改名为正式报告并记录键。
6. 把工作流变成团队资产
单次跑通只是起点。真正让这套东西产生复利的是把它版本化、权限化、可审计化。
Skill 定义、JSON Schema、报告模板、config.toml 全部放进 Git 仓库,用 PR 审核变更。这样任何人改了输出格式或者重试策略,都有记录可查,不会出现"上周还好好的这周格式就变了"的情况。权限方面,MCP Server 的 ALLOWED_HOSTS 和 filesystem 路径要按最小权限配,写操作和高风险动作(比如直接发群消息)加二次确认或者 dry-run 模式。
审计日志这块,OpenClaw 的state_dir下每次运行都会生成run.json,记录触发时间、输入参数、每个状态的耗时、调用的 MCP 工具、最终输出路径。排障的时候直接看这个文件,比翻聊天记录快得多。
如果你想让模型对话能力也纳入这条链路,可以到 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 看看当前支持的模型列表,规划用强模型、执行用快模型的组合在成本上比较划算。长期跑编码类 Agent 工作流的话,Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 有更细的额度说明。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,API Keys 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
最后说一个我踩过的坑:Skills 的 states 不要设计得太细。一开始我把 normalize 拆成了"字段映射""时间转换""空值填充"三个状态,结果每个状态都要单独配超时和重试,调试起来非常痛苦。后来合并成一个 normalize 状态,内部用普通函数处理,只在真正需要模型介入或者外部调用的地方才设状态边界。状态机的粒度应该对齐"失败后需要独立重试的最小单元",而不是对齐代码里的函数。