skill-creator 是「生成 Skill 的 Skill」。你在 Claude Code 里说一句「生成一个 pdf-editor 技能」,它本该先写 SKILL.md 的 YAML frontmatter,再调 init_skill.py 建出 scripts、references、assets,最后用 package_skill.py 打包成可安装的产物。可真正卡住人的,往往不是模板写得好不好,而是跑这个流程的 Claude 实例根本连不上模型:Key 是旧的、Base URL 多带了一截路径、模型 ID 随手抄了个不存在的。所以动 SKILL.md 之前,先把通道理顺:打开 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建一把 API Key,然后把 Claude Code 或 Codex 的 Base URL 填成 https://taotoken.net/api,再回头跑 skill-creator。
下面按原文的生成顺序走:frontmatter → init_skill.py → package_skill.py,中间把原文没单独讲、但缺了就必挂的模型通道准备补在初始化之前。
1. skill-creator 触发不了、请求失败:先怀疑跑它的模型通道
1.1 「生成一个 pdf-editor 技能」失败时的两种表现
在 Claude Code 里输入「生成一个 pdf-editor 技能」,翻车方式通常有两种。
安静型:Claude 压根没进 skill-creator 的流程,直接凭手感写了一份 SKILL.md 给你。内容看着也还行,但没有目录规划,不提 init_skill.py,更不会去建 scripts 和 assets。你以为技能生成了,装进 skills 目录后却发现它只是一段说明文字,触发不了任何脚本。
吵闹型:skill-creator 确实触发了,开始读模板、开始追问技能用途,然后卡在某一次请求上,终端里出现 401、404 或者干脆超时重试。两次失败之间,你可能只改过一行环境变量。
这两种表现看着不像同一回事,根子却常常是同一个:跑 skill-creator 的那个 Claude 实例,用的是哪把 Key、把请求发去了哪个地址。skill-creator 本质是个普通 Skill,它靠模型来回追问、来回写文件,模型通道断了,它就只能装死。
1.2 为什么问题出在 Key 和 Base URL,而不是模板写得对不对
skill-creator 的工作方式是多轮对话加本地脚本。它先跟模型确认技能名、用途、触发场景,生成 frontmatter 草稿;再调用 init_skill.py 建目录;最后调 package_skill.py 打包。模型请求出现在开头、中间、收尾好几处,任何一处通道不通,流程都会断在那一处。
所以排查顺序应该反过来。先确认通道是通的,再去看 SKILL.md 的字段写得对不对。很多人倒过来做,花一小时改 description 的措辞,最后发现是 Base URL 末尾多写了/v1,请求全打到不存在的路径上,返回 404。
判断方法很简单:在 Claude Code 里随便问一句和技能无关的话。如果这句也报错,那就是通道问题,跟 skill-creator 一点关系都没有。
1.3 补上原文漏掉的一步:先拿 Key、再填 Base URL
原文的步骤三「初始化技能」之前,缺的正是一段模型通道准备。补起来只有两件事。
第一件,去 TaoToken 注册账号并创建 API Key。Key 只在创建时完整展示一次,复制下来存好,下面所有配置里统一写成占位符YOUR_API_KEY,你自己的那把替换进去就行。
第二件,把运行 skill-creator 的工具指向统一通道。Claude Code 和 Codex 的写法不一样,但地址只有一个:https://taotoken.net/api。这个地址末尾不要加/v1,也不要带任何查询参数——它是填进配置文件里的接口地址,和浏览器里打开的官网不是一回事。
TaoToken 在这整套流程里的角色很克制:给一把 Key、给一个 Base URL。SKILL.md 长什么样、scripts 里放什么脚本,仍然是 skill-creator 和你的模型对话决定的。
2. Claude Code 与 Codex 侧:把 Base URL 指向 TaoToken 的接口地址
2.1 Claude Code:~/.claude/settings.json 里的 env 三个变量
Claude Code 读的是~/.claude/settings.json。没有这个文件就新建一个,把下面三段填进env里:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL_ID" } }三个变量的分工要分清楚。ANTHROPIC_BASE_URL决定请求发去哪,填https://taotoken.net/api;ANTHROPIC_AUTH_TOKEN放你从 TaoToken 控制台 创建的那把 Key;ANTHROPIC_MODEL放模型 ID,具体填哪个以官网模型广场当时的列表为准,别照着半年前的截图抄。
改完保存,重启 Claude Code 会话,让新配置生效。
2.2 Codex:~/.codex/config.toml 里改的是 model_provider 和 base_url
Codex 不吃ANTHROPIC_*这套变量,把 Claude 的环境变量直接套过去是最常见的错误之一。它读的是~/.codex/config.toml:
model = "YOUR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"model_provider指向下面那张表的名字,两边要一致。base_url同样是https://taotoken.net/api,没有/v1。env_key是 Codex 去环境变量里找 Key 的名字,所以在 shell 里还要导一次:
export TAOTOKEN_API_KEY=YOUR_API_KEYKey 一样从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,写进配置时用占位符替换,别把真 Key 提交进 Git。
2.3 模型 ID 与「末尾不要 /v1」这两件事
这两个坑几乎每篇配置文都会提,但仍然是最常踩的。
模型 ID:以 TaoToken 模型广场 当时的列表为准。基于模型广场的列表选,别凭记忆写。ID 写错的表现通常是请求被拒或者返回一个奇怪的错误,而不是「找不到模型」这种直白提示。
Base URL:填https://taotoken.net/api,末尾不要带/v1。有些工具自己会补路径,你多写一段,最终发出去的地址就多一段,结果就是 404。同样,这个地址不要带任何utm参数,那是给浏览器链接用的,写进配置文件只会让请求失败。
3. SKILL.md 的 YAML frontmatter:name 与 description 怎么定
3.1 name 的命名约束,以及它和目录名的关系
skill-creator 生成 SKILL.md 时,第一件事是写 frontmatter。name建议用小写加连字符,比如pdf-editor,不要用空格、下划线或者大写字母混排。这个名字会和技能目录名保持一致,后面 init_skill.py 建的目录也叫这个名字。
名字起得太泛是另一个问题。叫tool、helper这种,模型完全判断不出什么时候该用它。名字最好直接指向动作对象,pdf-editor、sql-formatter、changelog-writer这类都比较合适。
3.2 description 要同时交代「做什么」和「什么时候用」
frontmatter 里真正决定触发率的是description。它至少要回答两个问题:这个技能能做什么;用户在什么话术下应该用上它。
只写「编辑 PDF 文件」太干,模型找不到触发时机。把典型说法也写进去:
--- name: pdf-editor description: 对 PDF 做页面级编辑,包括旋转指定页、拆分单页文件、合并多个 PDF。当用户说「旋转 PDF 的某一页」「把这份 PDF 拆成单页」「把几个 PDF 合成一个」时使用本技能。 ---触发词不是越多越好,而是越贴近用户真实说法越好。写完可以在 Claude Code 里换个说法试试,看还能不能触发。
3.3 用 pdf-editor 跑一遍 frontmatter 草稿
这一步的最佳做法是让 skill-creator 自己生成草稿,你再改。直接在 Claude Code 里说清楚三件事:技能名、它能做什么、什么时候触发。
skill-creator 会反问你几轮,然后给出 frontmatter。拿到草稿后重点看两处:name是否符合命名约束,description里有没有「做什么 + 什么时候用」。如果它给的名字带了空格,手动改成连字符再往下走——目录名一旦建错,后面打包时会很别扭。
4. init_skill.py 与 rotate_pdf.py:把 scripts / references / assets 建起来
4.1 跑 init_skill.py 之前,先确认目录落点
初始化脚本负责建骨架。它通常长这样:
python ~/.claude/skills/skill-creator/scripts/init_skill.py pdf-editor --path ~/.claude/skills--path决定技能落在哪个 skills 目录。Claude Code 默认读~/.claude/skills,如果你用的是项目级技能目录,就换成项目里的路径。跑之前先确认这个目录存在、有写权限。
跑完之后目录里会出现pdf-editor/SKILL.md、scripts/、references/、assets/。SKILL.md 是入口,另外三个是给内容用的。
4.2 scripts 放可执行脚本,references 放长文档,assets 放模板
三个目录的分工要拎清楚,否则技能会变得又长又难维护。
scripts/放真正干活的脚本,比如旋转 PDF 的那段代码。references/放长文档,比如 PDF 页面结构的说明、字段对照表。assets/放模板文件、示例输入这类不执行的资源。
拿旋转单页举例,scripts/rotate_pdf.py可以写成这样:
from pypdf import PdfReader, PdfWriter def rotate_page(src_path, page_index, degrees, dst_path): reader = PdfReader(src_path) writer = PdfWriter() for i, page in enumerate(reader.pages): if i == page_index: page.rotate(degrees) writer.add_page(page) with open(dst_path, "wb") as f: writer.write(f) if __name__ == "__main__": import sys rotate_page(sys.argv[1], int(sys.argv[2]), int(sys.argv[3]), sys.argv[4])这段脚本由读者在本地运行,skill-creator 只负责生成和解释它。跑之前记得装上pypdf。脚本里别塞模型调用,模型通道的事已经在第 2 节配完了,脚本只做确定性的事。
4.3 初始化阶段的报错对照
这一步的报错基本能归成三类。
ModuleNotFoundError: No module named 'pypdf':脚本依赖没装,本地pip install pypdf解决,跟通道无关。
请求返回 401:Key 没带上或者写错了。检查ANTHROPIC_AUTH_TOKEN和你创建的那把 Key 是否一致,注意前后别带空格。
请求返回 404:Base URL 多半写成了https://taotoken.net/api/v1。改回https://taotoken.net/api再试。
还有一种不报错但很烦的情况:模型 ID 不存在,请求被拒,skill-creator 沉默几秒后继续瞎写。这类就到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场核对一下 ID,再回填。
5. package_skill.py 打包与回归验证
5.1 打包前自检:SKILL.md、scripts 与依赖是否齐了
打包命令很直接:
python ~/.claude/skills/skill-creator/scripts/package_skill.py ~/.claude/skills/pdf-editor跑之前先自检三件事。SKILL.md 的 frontmatter 是否完整、name与目录名是否一致;scripts/里的脚本能不能在本地单独跑通;references/和assets/里的文件是否被 SKILL.md 正文引用到——没被引用的文件模型很可能永远不去读。
打包产物一般是个压缩包或.skill文件,具体后缀看 skill-creator 当前版本,以本地跑出来的实际输出为准。
5.2 回到 Claude Code 再触发一次,验证技能真的可用
打包完别急着关终端,回到 Claude Code 里再触发一次。输入「生成一个 pdf-editor 技能」,观察它是否按流程产出 SKILL.md 与scripts/rotate_pdf.py。
如果这次流程走得比以前顺,说明通道通了;如果仍然在开头就断,回到第 2 节检查三个变量。判断依据是:同样的提示,skill-creator 现在会不会主动追问用途、会不会去调 init_skill.py。
5.3 去控制台对一下这次调用有没有记上账
配置改完、技能跑通之后,顺手做一次对账。先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息,确认模型 ID 和地址没填反;长期写代码的话,看一眼 Coding Plan 的额度是否够用;需要再建 Key 就去 控制台 API Keys。Claude Code 侧的环境变量对照,接入文档 里写得更细,配不通用哪条变量对不上时去那里翻一眼。
整套流程里最容易反复出问题的还是那两处:Key 有没有带上、Base URL 末尾有没有多一截。skill-creator 只是把它们的问题暴露得特别明显——因为它是「生成 Skill 的 Skill」,通道一断,它连第一句追问都发不出来。