1. 为什么你的 OpenClaw 装了技能却跑不起来
很多人第一次接触 OpenClaw 的 Skills 系统,都会经历一个相似的困惑:明明按文档把技能目录放进了~/.openclaw/skills,重启之后 Agent 却像没看见一样,问它“你会用这个技能吗”,它一脸茫然。更让人抓狂的是,有时候技能列表里能看到名字,但真正调用时又报command not found或者missing env。
这个问题的根源,往往不在技能本身,而在于技能加载链路和模型调用链路是两条独立的通道。Skills 负责把工具能力暴露给 Agent,但 Agent 真正去执行推理、生成工具调用参数时,走的是模型 API。如果模型通道的 Key 配置混乱、Base URL 指向不一致,就会出现“技能加载成功但调用失败”的割裂现象。
我试过在一台机器上同时跑三个不同的 Agent 项目,每个项目各自维护一套 API Key,结果就是环境变量互相覆盖,OPENCLAW_API_KEY一会儿指向 A 服务,一会儿指向 B 服务,排查起来非常痛苦。后来我把所有 OpenClaw 相关的模型调用统一收敛到 TaoToken 的 API 通道,用同一个 Key 打通 Skills 加载和模型推理两条链路,问题才彻底消失。
这篇文章面向的是已经装好 OpenClaw、想让 Skills 真正跑起来的开发者。我会从 SKILL.md 的骨架写起,讲到 ClawHub 技能拉取、settings.json 配置、TaoToken 统一 Key 接入,最后给出验证请求和常见报错排查。目标很明确:让你一次跑通技能加载与调用链路,而不是停留在“装上了但用不了”的状态。
OpenClaw 的 Skills 系统本质上是一个模块化扩展机制,每个 Skill 是一个包含SKILL.md元数据文件和可选脚本的目录,由主程序在运行时动态加载。它承载了浏览器自动化、联网搜索、文件操作、数据库访问、语音合成等 80 多个内置工具的能力。ClawHub 则是官方技能市场,类似 npm 之于 Node.js,提供搜索、安装、版本管理、发布的全生命周期能力。理解这两者的关系,是跑通链路的第一步。
2. TaoToken 统一 Key 的前置准备
在动手写 SKILL.md 之前,先把模型调用通道理顺。OpenClaw 的 Agent Runtime 在推理时需要调用大模型,而 Skills 里的很多工具(比如联网搜索、代码生成)也会间接依赖模型能力。如果每个技能各自配置一套 Key,维护成本会非常高。
TaoToken 在这里扮演的角色是统一的 API 通道。你只需要在 TaoToken 控制台创建一个 API Key,然后在 OpenClaw 的配置里把这个 Key 和 Base URL 指向 TaoToken 的接口地址,所有走 OpenAI 兼容协议的工具和技能就都能复用同一个凭证。
具体操作路径是这样的:先访问 TaoToken 官网注册账号,进入控制台创建 API Key。控制台地址是https://taotoken.net/console,创建 Key 的页面在https://taotoken.net/api-keys。拿到 Key 之后,记下两个关键信息:
- Base URL:
https://taotoken.net/api - API Key:形如
sk-xxxxxxxx的字符串
这里有个容易踩的坑:Base URL 末尾不要加/v1,OpenClaw 和大多数 OpenAI 兼容客户端会自动拼接路径。如果你手动加了/v1,请求会变成https://taotoken.net/api/v1/v1/chat/completions,直接 404。
对于需要长期跑编码任务或者 Agent 工作流的场景,可以考虑 TaoToken 的 Coding Plan,它在并发和额度上更适合持续调用。如果只是验证模型连通性,用模型对话页面手动发一条消息就能确认 Key 是否有效。
环境变量层面,建议在 shell 配置文件里统一导出:
export TAOTOKEN_API_KEY="sk-你的实际Key" export OPENCLAW_API_KEY="$TAOTOKEN_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api" export OPENAI_API_KEY="$TAOTOKEN_API_KEY"这样做的目的是让 OpenClaw 主程序、Skills 里的脚本、以及任何依赖 OpenAI SDK 的工具,都能读到同一套凭证。OPENCLAW_API_KEY是 OpenClaw 自己识别的变量名,OPENAI_API_KEY和OPENAI_BASE_URL则是给兼容 OpenAI 协议的技能用的。两者指向同一个 Key,避免出现“主程序能调用、技能调用失败”的割裂。
如果你用的是 Claude Code 类的编码工具,TaoToken 也提供了对应的接入文档,路径在https://taotoken.net/doc。核心逻辑是一样的:Base URL 指向 TaoToken,Key 用同一个,Model ID 按需选择。
前置准备做完之后,可以用一个最简单的 curl 验证通道是否通:
curl https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "ping"}] }'如果返回正常的 JSON 响应,说明 Key 和 Base URL 都没问题。这一步看似简单,但能帮你排除掉后面 80% 的“技能加载成功但调用失败”问题。
3. SKILL.md 骨架与 ClawHub 拉取配置
现在进入正题,写一个能跑起来的 SKILL.md。OpenClaw 使用兼容 AgentSkills 的技能文件夹格式,每个技能必须是一个目录,目录里必须包含SKILL.md。文件采用 YAML Front Matter 加 Markdown 正文的结构。
先看一个最小可用的骨架:
--- name: file-report-skill description: "统计目录文件并生成 Markdown 报表" version: 1.0.0 homepage: https://github.com/example/file-report-skill permissions: ["file.read", "file.write"] metadata: openclaw: requires: bins: ["python3", "git"] env: ["OPENCLAW_API_KEY"] config: ["report.format"] primaryEnv: "OPENCLAW_API_KEY" os: ["linux", "darwin", "win32"] --- # 技能说明 这个技能用于统计指定目录下的文件信息,并生成结构化的 Markdown 报表。 ## 使用场景 当用户需要以下任务时使用此技能: - 查看项目目录结构 - 统计代码文件数量和行数 - 生成项目文档 ## 执行步骤 1. 使用 `find` 命令扫描目录 2. 根据文件扩展名分类统计 3. 使用模板生成 Markdown 报表 4. 将报表写入指定文件 ## 注意事项 - 需要 Python 3.8+ 环境 - 大型目录扫描可能需要较长时间 - 生成报表前会确认目标文件路径这个骨架里,metadata.openclaw.requires是门控控制的核心。bins列出技能依赖的二进制文件,env列出需要的环境变量,config列出需要的配置项。OpenClaw 在启动时会逐项检查,任何一项不满足,这个技能就不会出现在可用列表里。
primaryEnv字段用于 UI 提示,告诉用户这个技能主要依赖哪个环境变量。os字段限制技能支持的操作系统,避免在 Windows 上加载只支持 Linux 的技能。
写完 SKILL.md 之后,把它放到正确的加载位置。OpenClaw 从四个位置加载技能,优先级从高到低:
| 加载位置 | 路径 | 可见范围 |
|---|---|---|
| 工作区技能 | <workspace>/skills | 仅当前智能体 |
| 托管/本地技能 | ~/.openclaw/skills | 同机器所有智能体 |
| 内置技能 | 随安装包分发 | 全局 |
| 额外目录 | skills.load.extraDirs配置 | 全局,优先级最低 |
开发阶段建议放在~/.openclaw/skills下,方便调试。目录结构如下:
mkdir -p ~/.openclaw/skills/file-report-skill cd ~/.openclaw/skills/file-report-skill # 把上面的 SKILL.md 内容写入接下来是 ClawHub 技能拉取。先安装 ClawHub CLI:
npm install -g clawhub常用命令覆盖了技能管理的全流程:
# 搜索技能 clawhub search "summarize" # 安装技能 clawhub install summarize # 查看已安装技能 clawhub list # 升级指定技能 clawhub update summarize # 升级全部技能 clawhub update --all # 卸载技能 clawhub uninstall summarize # 查看技能详情 clawhub info summarize安装完成后,技能会被放到~/.openclaw/skills下。这时候需要配置~/.openclaw/openclaw.json,让 OpenClaw 知道如何加载这些技能,以及如何注入环境变量。这个文件支持 JSON5 格式,可以写注释。
关键的配置片段如下:
{ "skills": { "entries": { "tavily-search": { "enabled": true, "apiKey": "tvly-xxxxx", "env": { "TAVILY_API_KEY": "tvly-xxxxx" }, "config": { "maxResults": 10, "searchDepth": "basic" } }, "file-report-skill": { "enabled": true, "env": { "OPENCLAW_API_KEY": "sk-你的TaoToken Key" }, "config": { "report.format": "markdown" } } }, "load": { "watch": true, "watchDebounceMs": 250, "extraDirs": [ "/opt/openclaw/skills", "/shared/skills" ] } }, "models": { "provider": "openai", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken Key", "model": "gpt-4o-mini" } }这里有几个关键点。skills.entries里为每个技能单独配置env和config,env里的变量会在技能加载时注入到运行环境。skills.load.watch设为true后,SKILL.md 变更会自动刷新,不用重启 OpenClaw。models段把模型调用统一指向 TaoToken 的 Base URL,Key 用同一个。
如果你用的是 Cline MCP 或者 Codex 类的工具,配置逻辑类似,核心三件套是 Base URL、Key、Model ID。以 Codex 的auth.json为例:
{ "openai": { "apiKey": "sk-你的TaoToken Key", "baseURL": "https://taotoken.net/api" } }Model ID 根据你的实际需求选择,比如gpt-4o-mini、claude-3-5-sonnet等。TaoToken 的模型列表可以在控制台查看,或者在模型对话页面测试。
配置写完后,启动 OpenClaw:
openclaw在对话里问一句“展示当前可用的 Skills”,如果配置正确,你应该能看到file-report-skill和tavily-search出现在列表里。如果没出现,先检查requires里的bins和env是否满足。
4. 验证请求与成功结果确认
配置写完不代表链路通了,必须做一次端到端的验证。验证分两层:先验证模型通道,再验证技能调用。
模型通道的验证用 curl 最直接:
curl https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [ {"role": "system", "content": "你是一个测试助手"}, {"role": "user", "content": "回复 OK 两个字母"} ] }'预期返回类似:
{ "id": "chatcmpl-xxx", "object": "chat.completion", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "OK" }, "finish_reason": "stop" } ] }如果返回 401,说明 Key 无效或没带上。如果返回 404,检查 Base URL 是否多加了/v1。如果返回local proxy failed,说明网络层有问题,检查是否有本地代理拦截了请求。
模型通道通了之后,验证技能加载。在 OpenClaw 对话里输入:
展示当前可用的 Skills预期输出会列出所有通过门控检查的技能。如果file-report-skill在列表里,说明 SKILL.md 格式正确、requires条件满足。
接下来验证技能调用。对file-report-skill说:
用 file-report-skill 统计当前目录的文件,生成 Markdown 报表Agent 应该会调用这个技能,执行find命令扫描目录,然后生成报表。如果技能里配置了OPENCLAW_API_KEY,而模型调用也走同一个 Key,整个链路就是通的。
对于tavily-search这类需要外部 API 的技能,验证方式类似:
搜索 2026 年 AI Agent 领域的最新进展预期 Agent 会调用tavily-search,返回搜索结果摘要。如果报missing env TAVILY_API_KEY,说明skills.entries里的env没配置对。
验证过程中,可以查看日志确认细节:
tail -f ~/.openclaw/logs/openclaw.log日志里会记录技能加载、环境检查、工具调用的完整过程。如果某个技能没加载,日志里会有skill skipped: missing bin xxx或skill skipped: missing env xxx的记录。
还有一个实用的验证命令:
openclaw skills validate这个命令会检查所有 SKILL.md 的格式是否符合规范,元数据字段是否完整。在发布技能到 ClawHub 之前,建议先跑一遍。
成功的结果应该是这样的:模型通道返回正常 JSON,技能列表包含你配置的技能,对话中调用技能能返回预期结果,日志里没有skipped或error记录。四个条件都满足,说明技能加载与调用链路已经跑通。
5. 本篇常见报错排查
即使配置看起来没问题,实际跑的时候还是会遇到各种报错。下面按真实报错信息逐一排查。
401 Unauthorized
这是最常见的报错,通常出现在模型调用或技能调用外部 API 时。原因有三个:Key 没配置、Key 配置错了、Key 被环境变量覆盖了。
排查步骤:先确认echo $TAOTOKEN_API_KEY有输出,再确认~/.openclaw/openclaw.json里的models.apiKey和skills.entries.*.env里的 Key 一致。如果用了多个 shell 会话,检查是否有旧的export覆盖了新值。TaoToken 的 Key 在控制台可以重新生成,如果怀疑泄露就直接换一个。
local proxy failed
这个报错说明请求在到达 TaoToken 之前被本地网络层拦截了。常见原因是系统代理设置、环境变量HTTP_PROXY/HTTPS_PROXY指向了一个不可用的地址。
排查步骤:先unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy,再重试。如果公司网络有强制代理,需要把taotoken.net加入白名单。另外检查/etc/hosts是否有异常条目。
reading choices 报错
这个报错通常出现在模型返回的 JSON 结构不符合预期时。比如返回了错误信息而不是正常的choices数组,客户端解析时就会报reading 'choices'或cannot read property 'choices' of undefined。
排查步骤:先用 curl 直接请求,看返回的原始 JSON 是什么。如果返回的是{"error": {"message": "..."}},说明请求本身有问题,可能是 Model ID 写错了,或者请求体格式不对。确认 Model ID 在 TaoToken 控制台的可用列表里。
OAuth 相关报错
如果你用的是 Claude Code 类的工具,可能会遇到 OAuth 报错。这类工具默认走 OAuth 流程,但用 TaoToken 的 Key 接入时应该走 API Key 模式。
排查步骤:检查配置文件里是否同时存在 OAuth token 和 API Key,两者冲突时优先走 OAuth 就会失败。把 OAuth 相关字段删掉,只保留apiKey和baseURL。Claude Code 的接入文档在https://taotoken.net/doc,里面有完整的配置示例。
技能加载成功但调用失败
这是最隐蔽的一类问题。技能出现在列表里,但调用时报command not found或permission denied。
排查步骤:确认requires.bins里的二进制文件在 PATH 里。比如inotifywait在 macOS 上默认没有,需要brew install inotify-tools。确认permissions字段声明的权限和实际操作匹配,比如技能要写文件但只声明了file.read,就会被拦截。
热重载不生效
改了 SKILL.md 但技能列表没更新。检查skills.load.watch是否为true,watchDebounceMs是否设得太长。如果还是不行,手动删除缓存文件再重启:
rm -rf ~/.openclaw/cache/skills openclaw restartClawHub 安装失败
clawhub install报网络错误或版本冲突。先确认 npm 源可用,再检查技能名是否拼写正确。如果技能依赖特定版本的 OpenClaw,用clawhub info <skill>查看兼容性要求。
排查完这些报错,基本能覆盖 90% 的落地问题。剩下的 10% 通常是技能本身的代码逻辑问题,需要看技能目录下的脚本和日志。
6. 用 TaoToken 统一 Key 打通技能链路
回到最初的问题:为什么技能装了却跑不起来?核心原因是模型调用通道和技能加载通道各自为政。Skills 系统负责把工具能力暴露给 Agent,但 Agent 执行推理、生成工具调用参数时走的是模型 API。两条链路如果 Key 不一致、Base URL 不一致,就会出现割裂。
用 TaoToken 统一 Key 的价值在于,它把这两条链路收敛到同一个凭证和同一个 Base URL 上。~/.openclaw/openclaw.json里的models段和skills.entries.*.env段指向同一个 Key,任何一条链路出问题,排查范围都缩小到一处。
对于长期跑 Agent 工作流的场景,TaoToken 的 Coding Plan 在并发和额度上更适合持续调用。如果只是验证模型连通性,用模型对话页面手动发一条消息就能确认。API Key 的管理在控制台完成,接入文档在https://taotoken.net/doc有完整说明。
实际落地时,建议把配置拆成两层:全局层在~/.openclaw/openclaw.json里配置模型通道和通用环境变量,技能层在每个技能的SKILL.md里声明requires,在skills.entries里注入技能专属的env和config。这样新增技能时只需要改技能层,不用动全局配置。
最后给一个可复制的完整配置片段,把模型通道和技能加载放在一起:
{ "models": { "provider": "openai", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken Key", "model": "gpt-4o-mini" }, "skills": { "entries": { "file-report-skill": { "enabled": true, "env": { "OPENCLAW_API_KEY": "sk-你的TaoToken Key" }, "config": { "report.format": "markdown" } } }, "load": { "watch": true, "watchDebounceMs": 250 } } }把这段配置写入~/.openclaw/openclaw.json,重启 OpenClaw,然后在对话里问“展示当前可用的 Skills”,再让 Agent 调用file-report-skill生成一份报表。如果两步都成功,说明技能加载与调用链路已经用 TaoToken 统一 Key 打通了。