1. OpenCode skills 网站配置 TaoToken 到底在解决什么问题
OpenCode 的 skills 网站生态这两年长得很快,skills.sh、skillsmp、LobeHub Skills Marketplace、SkillsLLM 这些平台把散落在 GitHub 上的技能包聚合起来,你只要npx skills add <owner/repo> -y就能把opencode-cli、opencode-tools-mcp、opencode-agent-factory这类技能装进项目。装完之后,技能本身只是「说明书 + 脚本」,真正跑起来还是要调模型。问题就出在这一步:每个 skill 可能各自读环境变量、各自写 base_url,有的走 OpenAI 兼容格式,有的走 Anthropic 格式,Key 散落在.env、shell profile、项目配置里,换一个技能就要重新对一遍通道。
我试过在一个项目里同时挂opencode-skills和opencode-command-authoring,结果两个技能一个读OPENAI_API_KEY、一个读ANTHROPIC_API_KEY,模型名还写死在 SKILL.md 的示例里。调试的时候根本分不清是技能没装好,还是通道没通。TaoToken 在这里的角色就是「统一 Key / API 通道」:你只维护一份settings.json,把模型入口收敛到一个 base_url 和一把 Key,skills 网站装下来的技能都从这份配置里取通道。这样排查问题时变量少、路径清晰,装十个技能和装一个技能的配置成本几乎一样。
这篇面向的是已经在用 OpenCode skills、或者准备从 skills 网站批量装技能,但被多套 Key 和多套 base_url 搞烦的开发者。下面会给一份可以直接复制的settings.json骨架,再走一遍验证请求,最后把常见的报错逐条拆开。你不需要先理解所有字段,照着填、照着跑,能出结果再回头调。
2. 接入前的准备:TaoToken 通道与 OpenCode 技能目录
先把通道侧的东西准备好。TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,API 根地址是 https://taotoken.net/api ,注意这个 API 地址后面不带任何查询参数,配置里就写这个。你需要先在控制台生成一把 API Key,控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 只在生成时完整显示一次,复制下来先存到安全的地方。如果你还没决定用哪些模型,可以先去模型对话页 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 试一下调用是否正常,确认通道通了再往 OpenCode 里塞。
OpenCode 的 skills 安装位置有两级,这个要记清楚,因为settings.json放哪一级决定了作用范围。项目级在.opencode/skill/<skill-name>/SKILL.md,全局级在~/.config/opencode/skill/<skill-name>/SKILL.md。项目级只对当前仓库生效,适合团队共享;全局级对所有项目生效,适合你个人的常用技能。配置通道的settings.json一般放在 OpenCode 的配置根目录,项目级是.opencode/settings.json,全局级是~/.config/opencode/settings.json。我建议先在项目级跑通,确认没问题再复制到全局,避免一上来就污染所有项目。
装技能用官方 CLI,命令很直接:
# 查看已安装的技能 npx skills list # 安装技能,-y 自动确认 npx skills add <owner/repo> -y # 安装指定分支 npx skills add <owner/repo>#main -y比如你想装 LobeHub 上的opencode-skills,就找到它对应的仓库地址,用npx skills add装进去。装完npx skills list能看到条目,说明技能文件已经落到.opencode/skill/下面了。这一步和 TaoToken 无关,但必须先确认技能装对了,否则后面通道配好了也没东西可调。
3. 可复制的 settings.json 骨架
下面这份骨架是核心,字段我按「通道 + 模型 + 技能覆盖」三层来组织。你可以直接复制,把sk-你的Key换成控制台生成的那把,模型名按你实际要用的填。
{ "provider": { "taotoken": { "type": "openai-compatible", "baseURL": "https://taotoken.net/api", "apiKey": "sk-你的Key", "models": { "default": "claude-sonnet-4-5", "fast": "claude-haiku-4-5", "reasoning": "claude-opus-4-1" } } }, "defaultProvider": "taotoken", "skills": { "opencode-skills": { "provider": "taotoken", "model": "default" }, "opencode-command-authoring": { "provider": "taotoken", "model": "fast" }, "opencode-agent-factory": { "provider": "taotoken", "model": "reasoning" } }, "request": { "timeout": 60000, "retries": 2 } }几个字段说明一下。provider.taotoken.type写openai-compatible,因为 TaoToken 的 API 走 OpenAI 兼容格式,大多数 OpenCode 技能默认就认这个。baseURL一定是https://taotoken.net/api,不要加斜杠结尾,也不要带查询参数。models里我放了三个档位,default给日常技能,fast给命令补全这种要低延迟的,reasoning给 agent 工厂这种要长链推理的。skills段是逐个技能覆盖,如果某个技能不写,就继承defaultProvider。request.timeout给 60 秒,skills 里有些操作会跑多轮,太短容易断。
如果你用的是 Anthropic 格式的技能,type可以改成anthropic-compatible,baseURL 不变,Key 也不变,TaoToken 两种格式都收。但要注意,同一个技能不要同时声明两种 type,否则 OpenCode 加载时会报 provider 冲突。我踩过的坑是:从 skills 网站装了一个默认走 Anthropic 的技能,又手动在settings.json里给它写了openai-compatible,结果技能启动直接失败,日志里只写provider mismatch,查了半天才发现是这里。
4. 验证请求:确认通道真的生效
配置写完不算完,要跑一次真实请求确认。最直接的方式是用 curl 打一次 TaoToken 的 API,确认 Key 和 baseURL 没问题:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的Key" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "回复 OK 两个字母即可"}], "max_tokens": 16 }'返回里如果能看到choices[0].message.content是OK,说明通道侧完全通了。这一步失败的话,先别动 OpenCode,去控制台确认 Key 有没有过期、额度够不够。控制台地址再贴一次:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。
通道确认后,回到 OpenCode 里验证技能是否读到配置。先npx skills list确认技能在,然后触发一个技能动作。比如opencode-command-authoring这类技能,你让它生成一条命令,观察输出。如果技能正常返回内容,说明它已经从settings.json里取到了taotoken这个 provider。如果技能报「no provider」或者「apiKey missing」,那就是settings.json的路径不对,或者技能名和skills段里的 key 对不上。
再补一个更细的验证:在项目根目录跑一次带调试输出的技能调用,看它实际用的 baseURL。有些技能支持--verbose,输出里会打印请求地址。如果打印出来是https://taotoken.net/api/v1/...,那就对了;如果打印的是别的地址,说明技能内部有硬编码的 baseURL,优先级高于settings.json,这时候要么改技能文件,要么在settings.json里用更强的覆盖字段。验证模型本身是否可用,也可以直接去模型对话页 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 手动发一条,和 curl 结果对照。
5. 本篇常见错排查
报错一:401 Unauthorized。九成是 Key 写错或者带了多余空格。settings.json里apiKey的值不要加引号外的空格,也不要写成Bearer sk-xxx,只写sk-xxx,Bearer 是请求时自动加的。如果 curl 能通但 OpenCode 报 401,检查技能是不是读的另一个环境变量,比如OPENAI_API_KEY,这时候要么在 shell 里 export 同名变量,要么在settings.json的skills段里显式指定provider。
报错二:404 Not Found。基本是 baseURL 写错了。常见错误是写成https://taotoken.net/api/v1,然后技能又自己拼了一次/v1,变成/api/v1/v1/...。正确写法就是https://taotoken.net/api,让技能或 SDK 自己去拼版本路径。另一个可能是技能走的是 Anthropic 格式,路径是/v1/messages,而你配了 OpenAI 格式的 provider,路径对不上。
报错三:model not found。模型名写错了,或者这个模型在你的账号下不可用。settings.json里的模型名要和 TaoToken 支持的名称一致,别自己造名字。先去模型对话页确认你要的模型能选到,再填回配置。如果技能内部硬编码了模型名,settings.json里的model字段可能被忽略,这时候要改技能文件里的默认模型。
报错四:技能装了但npx skills list看不到。检查安装路径。项目级技能在.opencode/skill/<skill-name>/SKILL.md,全局级在~/.config/opencode/skill/<skill-name>/SKILL.md。如果npx skills add装到了别的地方,OpenCode 就找不到。另外注意 skill 名的大小写,目录名和settings.json里skills段的 key 要完全一致。
报错五:请求超时。把request.timeout调大,比如 120000。skills 里有些操作会连续调多次模型,60 秒可能不够。如果调大还超时,检查网络到taotoken.net的连通性,用 curl 加-w "%{time_total}"看单次耗时。
6. 长期编码与 Agent 场景的通道选择
如果你只是偶尔跑几个 skills,上面这份settings.json够用了。但如果你要把 OpenCode 当日常编码主力,尤其是opencode-agent-factory这种会长时间跑、多轮调用的技能,建议把通道配置和额度管理分开看。TaoToken 的 Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 里有针对长期编码场景的说明,你可以对照自己的调用量决定用哪种方式。API Key 的管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,建议给 OpenCode 单独生成一把 Key,不要和别的工具混用,这样出问题能快速定位是哪个工具在消耗额度。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,字段含义和错误码都在里面,配置卡住的时候翻一下比猜快。
最后说一个实操细节:settings.json改完之后,OpenCode 不一定会热加载,最好重启一次技能进程,或者重新跑npx skills list触发一次配置读取。我遇到过改完配置没生效,以为配错了,折腾半天发现是进程还拿着旧配置。养成「改配置 → 重启 → 验证」的习惯,能省很多排查时间。