1. 为什么 OpenClaw Skill 值得你花一个下午搞懂
OpenClaw Skill 是一份写给 AI 看的 Markdown 执行说明书,它让模型从“会聊天”变成“会干活”。你不需要写后端服务,不需要部署运行时,只要在~/.openclaw/workspace/skills/下建一个文件夹、放一份SKILL.md,重启网关就能被识别。适合谁?适合想把重复操作(抓数据、整理文件、生成日报)交给 AI 的开发者,也适合完全没写过插件、但会写 Markdown 的产品和运营同学。
我最初也以为 Skill 就是插件换了个名字,直到把一份 40 行的SKILL.md丢进目录、重启网关,看着它自己调curl抓天气、拉热帖、按我定义的格式输出早报,才意识到区别在哪:传统插件是“我写代码替 AI 做”,Skill 是“我写步骤教 AI 做”。前者要处理 API 鉴权、错误重试、后台常驻;后者只描述意图和命令,执行交给 Agent Loop。这个认知转变直接决定了开发成本——一个能跑的 Skill,从建目录到验证成功,熟练后 10 分钟足够。
这篇指南按真实开发顺序走:先讲清SKILL.md的结构和字段语义,再给一份可直接复制的模板,然后接上 TaoToken 的统一 Key/API 通道做调用测试,最后把本地调试、ClawHub 发布、常见报错排查串起来。全程命令可复制,路径与字段名保持和 OpenClaw 实际约定一致。你跟着敲一遍,就能拿到属于自己的第一个 AI 技能。
2. SKILL.md 结构拆解与 ClawHub 发布前的目录规范
SKILL.md是整个 Skill 的核心,它由 frontmatter(头部元数据)和正文两部分组成。frontmatter 用 YAML 写,至少包含name和description;正文则用自然语言加命令描述执行流程。很多人第一次写会把它当成 README,堆一堆介绍性文字,结果 AI 读完不知道先干什么。正确做法是:frontmatter 负责“什么时候用我”,正文负责“具体怎么干”。
先看目录结构。最小可用形态只有一个文件:
skills/ └── daily-brief/ └── SKILL.md默认存放路径是~/.openclaw/workspace/skills/。当 Skill 需要脚本或参考资料时,再扩展成:
skills/ └── trend-scout/ ├── SKILL.md ├── scripts/ │ └── analyze.py └── references/ └── source.mdscripts/放可执行脚本,references/放静态资料。注意脚本路径在SKILL.md里要写绝对路径或基于技能目录的相对路径,否则 Agent 执行时找不到文件。
frontmatter 里最容易被忽略的是description中的否定条件。只写“用于生成简报”不够,AI 可能在用户问“帮我写篇长文”时也触发它。加上NOT for能显著降低误触发:
--- name: daily-brief description: > 每日早报,上海天气 + V2EX 热帖。 Use when: 用户需要简报,或早上 8 点定时执行。 NOT for: 专业气象预报、长内容新闻。 ---正文部分建议固定四个小节:When to Run、Workflow、Output Format、Error Handling。When to Run写触发条件,可以是关键词也可以是 cron 表达式;Workflow写具体命令,原则是“写命令,不写意图”——不要写“查询天气”,要写curl "https://wttr.in/Shanghai?format=3";Output Format定义输出模板,AI 会严格遵守;Error Handling写失败时的兜底动作,比如命令超时后重试一次或返回提示。
ClawHub 发布前,目录名要和 frontmatter 的name一致,否则clawhub publish会报名称不匹配。发布命令是:
clawhub publish daily-brief发布后可以在 ClawHub 技能商店被检索到。这里必须提醒一句:ClawHub 上曾出现过包含恶意命令的 Skill,下载他人技能时先读SKILL.md里的命令,确认没有涉及敏感文件读取或外发数据的操作,再决定是否启用。
3. 可复制配置:SKILL.md 模板与 TaoToken 统一通道接入
这一节给一份完整可复制的SKILL.md模板,同时把 TaoToken 的 Base URL、Key、Model ID 三件套接进来,让 Skill 在调用模型时走统一通道。先建目录:
mkdir -p ~/.openclaw/workspace/skills/daily-brief touch ~/.openclaw/workspace/skills/daily-brief/SKILL.md然后把下面内容写进SKILL.md:
--- name: daily-brief description: > 每日早报,上海天气 + V2EX 热帖。 Use when: 用户说“今日简报”“今天热点”“早上好”,或早上 8 点定时执行。 NOT for: 专业气象预报、长内容新闻、需要登录的私有数据。 --- # Daily Brief 每日早报 ## When to Run - 每天 8:00 AM 自动执行 - 用户说“今日简报”“今天热点”“早上好” - 用户需要快速了解今日热点时 ## Workflow 1. 获取上海天气: curl "https://wttr.in/Shanghai?format=3" 2. 拉取 V2EX 热门帖子: curl https://www.v2ex.com/api/topics/hot.json 3. 从返回结果中提取前 5 条帖子的标题和节点名称 4. 按 Output Format 整理信息 ## Output Format 今日简报 - {当前日期} 🌤 上海天气:{天气结果} V2EX 今日热帖: 1. {标题1}({节点1}) 2. {标题2}({节点2}) 3. {标题3}({节点3}) 4. {标题4}({节点4}) 5. {标题5}({节点5}) ## Error Handling - 天气接口超时:重试一次,仍失败则输出“天气获取失败” - V2EX 接口返回非 200:跳过热帖部分,只输出天气接下来配置模型通道。OpenClaw 的模型配置通常放在~/.openclaw/config.json或项目级settings.json中,把 TaoToken 作为 provider 写入。Base URL 用https://taotoken.net/api,Key 从控制台创建,Model ID 按你实际使用的模型填写:
{ "models": { "default": { "provider": "taotoken", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "model": "你的ModelID" } }, "skills": { "daily-brief": { "allowNetwork": true, "allowFileSystem": false, "allowExec": ["curl", "python3"] } } }三件套缺一不可:Base URL 决定请求打到哪,Key 决定能不能过鉴权,Model ID 决定用哪个模型。只填 Key 不填 Base URL,请求会打到默认地址;只填 Base URL 不填 Model ID,会报模型不存在。配置改完重启网关:
openclaw gateway restart如果你用的是 Claude Code 类环境,配置写在~/.claude/settings.json的env段里,字段名对应ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY,Model ID 通过ANTHROPIC_MODEL指定。Cline MCP 场景则在 MCP server 配置里填 Base URL 和 Key,Model ID 在 Cline 的模型选择里指定。Codex 的auth.json里对应base_url、api_key、model三个字段。不管哪个客户端,逻辑一致:地址、密钥、模型三者对齐。
4. 验证请求:从本地调试到成功拿到早报输出
配置写完必须验证,否则你不知道是 Skill 没被识别,还是模型通道没通。第一步先确认 Skill 被加载:
openclaw skills list如果输出里能看到daily-brief,说明目录和 frontmatter 没问题。看不到就检查目录名与name是否一致、文件是否叫SKILL.md(大小写敏感)。
第二步单独测命令,排除网络问题:
curl "https://wttr.in/Shanghai?format=3" curl https://www.v2ex.com/api/topics/hot.json | head -c 500两条命令都能返回内容,再进 Skill 测试。第三步触发执行:
openclaw chat --prompt "使用daily-brief生成今日简报"正常情况你会看到按Output Format排版的早报,天气一行、热帖五条。如果输出格式乱了,多半是Output Format写得不够明确,把模板里的占位符补全即可。
第四步验证模型通道是否真的走了 TaoToken。在请求日志里看 Base URL:
openclaw logs --skill daily-brief --tail 50日志里出现https://taotoken.net/api说明通道生效。如果看到的是其他地址,回去检查config.json里baseUrl字段有没有写错,或者有没有被环境变量覆盖。
第五步设置定时任务,让 Skill 每天自动跑:
openclaw cron add daily-brief "0 8 * * *" --skill daily-brief0 8 * * *是标准 cron 表达式,表示每天 8 点。加完后用openclaw cron list确认任务已注册。到这里,一个从零创建的 Skill 就完整跑通了:目录建好、模板写好、通道接通、命令验证、定时生效。
5. 常见报错排查:401、local proxy failed 与 reading choices
开发过程中最容易卡住的不是写 Markdown,而是各种报错。下面按真实遇到的频率排一下。
401 Unauthorized:Key 无效或没带上。先确认config.json里apiKey字段填的是完整 Key,没有多余空格;再确认请求确实走了配置的 Base URL。如果 Key 是从控制台复制的,注意不要漏掉前缀。排查命令:
curl -H "Authorization: Bearer sk-你的Key" https://taotoken.net/api/v1/models返回模型列表说明 Key 有效,返回 401 说明 Key 本身有问题,去控制台重新创建一个。
local proxy failed:本地代理配置冲突。常见于环境变量里残留了HTTP_PROXY或HTTPS_PROXY,导致请求被转发到不可达地址。检查:
env | grep -i proxy有输出就临时清掉再试:
unset HTTP_PROXY HTTPS_PROXY然后重启网关重新触发 Skill。
reading choices 报错:通常是模型返回结构不符合预期,比如返回了错误对象而不是choices数组。原因可能是 Model ID 填错,或者 Base URL 指向了不兼容的端点。确认model字段和 TaoToken 控制台里可用的 Model ID 完全一致,Base URL 用https://taotoken.net/api,不要多加/v1或漏掉路径。
OAuth 相关报错:出现在 Claude Code 类客户端里,说明它还在走 OAuth 登录流程而不是 API Key。检查settings.json里是否同时存在 OAuth 配置和 API Key 配置,两者冲突时以 OAuth 优先。把 OAuth 相关字段移除,只保留ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。
Skill 不触发:When to Run关键词太少。把用户可能说的原话都列进去,比如“早报”“简报”“今天有什么热点”。
执行结果不符合预期:Workflow步骤太粗。把“获取天气”改成具体curl命令,把“提取前 5 条”改成明确的字段名。
输出格式混乱:Output Format里占位符和实际数据对不上。用固定模板,不要留模糊描述。
排查顺序建议:先看日志定位是 Skill 层还是模型层,再用curl单独测接口,最后回查配置文件字段。大部分问题出在 Base URL、Key、Model ID 三者没对齐。
6. 把 Skill 用起来:从本地验证到长期编码工作流
Skill 跑通之后,真正的价值在于把它接进日常流程。本地验证只是第一步,接下来可以考虑三件事:把常用 Skill 沉淀成个人技能库、把需要长期运行的编码类任务交给 Coding Plan、把模型调用统一收敛到 TaoToken 通道。
如果你主要做的是编码辅助类 Skill,比如自动生成 commit message、批量重构、代码审查,这类任务调用频繁、上下文长,适合用 Coding Plan 来承载,避免每次单独配 Key。配置入口在控制台的 Coding Plan 页面,开通后把对应的 Base URL 和 Key 写进客户端配置即可。
如果你只是想先验证某个模型在 Skill 里的表现,可以直接用模型对话页面快速试,不用改本地配置。确认效果后再落到SKILL.md和config.json里。
接入文档里有各客户端的完整配置示例,包括 Claude Code、Cline、Codex 的字段对照。遇到配置字段不确定时,先查文档再改本地文件,比反复重启网关快得多。
API Key 管理在控制台的 API Keys 页面,建议按用途分 Key:一个用于本地调试,一个用于定时任务,方便出问题时快速定位和吊销。Key 不要写进会提交到 Git 的文件里,用环境变量或本地配置文件承载。
最后回到 Skill 本身:它的门槛低到会写 Markdown 就能上手,但上限取决于你把 Workflow 写得多具体。命令越明确、错误处理越完整、输出格式越固定,AI 执行就越稳定。先从一个每天跑的小 Skill 开始,跑顺了再往上叠脚本和定时任务,这条路比一上来就写复杂插件要稳得多。