1. 从 ClawHub 逛一圈回来,我为什么开始重写 Skill
OpenClaw 的 Skill 机制,说白了就是把你和 AI 在一件具体事情上磨出来的默契,落成一份可复用的配置文件。ClawHub 上 video-clipper、ZhiForge 这类 Skill 一抓一大把,有免费分享的,也有标价卖的。我一开始也想着直接拿来跑,结果发现真正卡住我的不是 Skill 本身,而是它背后那条调用链路——settings.json 里模型通道怎么填、config.toml 里 Skill 参数怎么挂、Key 从哪来、报错了去哪看日志。这些问题 ClawHub 的 README 基本不写,得自己踩。
这篇不聊 Skill 的设计哲学,只聊落地配置。我会以 video-clipper 为例,把 settings.json 和 config.toml 的骨架拆开,再讲怎么用 TaoToken 做统一 Key 通道,让本地 Skill 调用链路一次跑通。适合已经在本地装了 OpenClaw、想跑通第一个 Skill 但被配置卡住的人。全程可复制,命令和参数都给你,跑完你能看到 Skill 真实返回结果。
2. TaoToken 前置:统一 Key 通道解决什么问题
OpenClaw 的 Skill 在运行时需要调用模型。如果你每个 Skill 都单独配一个 Key、单独填一个 base_url,配置文件会迅速变成一团乱麻。更麻烦的是,不同 Skill 可能默认指向不同的模型端点,切换时容易漏改。
TaoToken 在这里的角色是一个统一的模型调用通道。你申请一个 Key,所有 Skill 共用同一个 base_url 和 Key,模型选择在请求参数里指定。这样 settings.json 里只需要维护一份通道配置,config.toml 里每个 Skill 只关心自己的业务参数。
先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个 API Key,复制保存。注意这个 Key 只在创建时完整显示一次,丢了就重新建。
拿到 Key 之后,你需要确认两件事:一是 base_url 用 https://taotoken.net/api ,二是模型名。TaoToken 的模型列表可以在 https://taotoken.net/doc 查到,video-clipper 这类 Skill 通常需要文本模型做脚本理解,再配合本地 ffmpeg 和 WhisperX 做音视频处理。模型对话能力可以先在 https://taotoken.net/models 里试一下,确认通道通不通。
注意:Key 不要写进会提交到 git 的配置文件。下面所有示例里我用
sk-xxxx占位,你替换成自己的真实 Key,并且把配置文件加进 .gitignore。
3. 可复制配置:settings.json 与 config.toml 骨架
OpenClaw 的配置分两层。settings.json 管全局通道,config.toml 管 Skill 级参数。先看 settings.json。
{ "provider": { "default": "taotoken", "taotoken": { "base_url": "https://taotoken.net/api", "api_key": "sk-xxxx", "timeout": 120, "max_retries": 3 } }, "model": { "default": "claude-sonnet-4-20250514", "fallback": "gpt-4o-mini" }, "log": { "level": "info", "path": "./logs/openclaw.log" } }这里几个参数值得说清楚。base_url末尾不要带斜杠,带了容易拼出双斜杠导致 404。timeout设 120 秒是因为 video-clipper 处理长视频时,脚本理解那一步可能耗时较久。max_retries设 3 是防止偶发网络抖动直接让 Skill 失败。model.default填你在 TaoToken 文档里确认可用的模型名,fallback是主模型不可用时的兜底。
再看 config.toml,这是 video-clipper 这个 Skill 自己的配置。
[skill] name = "video-clipper" version = "0.3.0" enabled = true [skill.input] video_path = "./input/demo.mp4" output_dir = "./output" target_duration = 60 [skill.asr] engine = "whisperx" model = "large-v3" language = "zh" align = true [skill.clip] min_segment = 15 max_segment = 90 silence_threshold = -35 padding = 0.3 [skill.llm] provider = "taotoken" model = "claude-sonnet-4-20250514" prompt_file = "./prompts/clip_select.md" temperature = 0.3[skill.asr]这一段是 WhisperX 的转写参数,align = true会做强制对齐,时间戳更准,但耗时增加。[skill.clip]控制切片逻辑,silence_threshold是静音检测阈值,单位 dB,-35 对大多数口播视频够用。[skill.llm]里provider指向 settings.json 里定义的 taotoken,这样 Skill 不需要自己管 Key。
两个文件放好后,目录结构大概是这样:
openclaw/ ├── settings.json ├── skills/ │ └── video-clipper/ │ ├── config.toml │ └── prompts/ │ └── clip_select.md ├── input/ │ └── demo.mp4 └── output/4. 验证请求:跑通第一个 Skill 调用
配置写完,先别急着跑完整视频。用一个最小请求验证通道。
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-xxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 OK 两个字母"}], "max_tokens": 10 }'如果返回里choices[0].message.content是 OK,说明 Key 和 base_url 没问题。这一步不通,后面 Skill 一定跑不起来,先排查这里。
通道通了之后,跑 video-clipper:
cd openclaw openclaw skill run video-clipper --config ./skills/video-clipper/config.toml正常的话你会看到日志依次输出:加载配置、读取视频、WhisperX 转写、LLM 选段、ffmpeg 切片、写入 output 目录。跑完 output 里应该有若干 mp4 片段和一个clips.json,里面记录了每段的起止时间和选段理由。
我实测下来,一个 10 分钟的中文口播视频,WhisperX large-v3 转写大概 2 到 3 分钟,LLM 选段十几秒,ffmpeg 切片看片段数量。整体在 5 分钟内能出结果。如果卡在转写那一步超过 10 分钟,多半是模型下载或显存不够,看日志里的具体报错。
验证 Skill 是否真的调用了 TaoToken,可以看./logs/openclaw.log,里面会有请求记录,包含 model 名和耗时。如果 log 里出现provider not found或401,回到 settings.json 检查 provider 名和 Key。
5. 本篇常见错排查
报错一:provider "taotoken" not found
settings.json 里provider.default的值必须和provider对象下的 key 完全一致。我见过有人写成TaoToken大写,或者 default 写taotoken但对象里 key 是tao_token,都会报这个。大小写和下划线都要对齐。
报错二:401 Unauthorized
Key 错了或者过期。去 https://taotoken.net/api-keys 重新建一个,替换 settings.json 里的api_key。注意别把 Key 前后的空格带进去,JSON 里字符串带空格不会报格式错,但请求会失败。
报错三:model not found
config.toml 里[skill.llm]的 model 名和 settings.json 的model.default不一致,或者你填的模型名 TaoToken 不支持。去 https://taotoken.net/doc 核对模型名,别凭记忆写。
报错四:WhisperX 转写时间戳飘
这是 video-clipper 最常见的坑。align = true必须开,否则 WhisperX 只给段落级时间戳,切片会切歪。另外language要明确指定,自动检测在混合语言视频里容易出错。如果对齐后还是飘,检查 ffmpeg 版本,老版本对某些编码的音频解码有偏差。
报错五:ffmpeg 切片后音画不同步
多半是padding参数和源视频关键帧间隔不匹配。把padding从 0.3 调到 0.5 试试,或者切片时加-avoid_negative_ts make_zero参数。这个参数在 Skill 的 ffmpeg 调用模板里改,不在 config.toml。
报错六:Skill 跑完 output 为空
看clips.json里 segments 数组是不是空的。如果是空的,说明 LLM 选段那一步没选出任何片段,通常是prompt_file路径不对,或者 prompt 内容让模型判断没有合适片段。先确认 prompt 文件存在且可读,再调temperature或换模型试。
6. 把 Skill 跑成自己的,再谈复用
ClawHub 上的 Skill 是起点,不是终点。video-clipper 我重写了三遍,第一遍 mapfile 在 macOS 上跑不了,第二遍音画飘,第三遍字幕嵌入崩。每一遍出错就往 config.toml 里加一条针对我这台机器的参数。现在这份配置里有我的 macOS 版本、我的 ffmpeg 编译参数、我的 WhisperX 环境细节,别人拿去大概率跑不通,但它在我这里稳定。
所以配置骨架给你了,接下来是你自己跑。跑通了,把 settings.json 和 config.toml 存好,下次换 Skill 只改 config.toml 的业务段,通道层不动。需要长期跑编码类或 Agent 类任务的话,可以看 https://taotoken.net/coding-plan ,按用量规划比单次调用省心。模型对话验证走 https://taotoken.net/models ,接入文档在 https://taotoken.net/doc ,Key 管理在 https://taotoken.net/api-keys 。先把第一个 Skill 跑出结果,再谈第二个。