OpenCode 自己不产模型,它通过 AI SDK 和 Models.dev 预置了 75 家以上提供商。把 TaoToken 接进 OpenCode 时,/models 报 401 通常不是 Key 的问题,而是 Base URL 写错。先打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建一把 API Key,回头看 opencode.json 里的 provider,你会发现问题大多出在路径上。默认情况下,OpenCode 只要求你 /connect 往预装提供商塞凭证;但自定义 provider 走的是另一套字段:Key 写在 provider.options.apiKey,端点写在 provider.options.baseURL。它的接口地址是 https://taotoken.net/api,末尾不带 /v1。多写一个 /v1,AI SDK 就会把补全请求拼到 /api/v1/chat/completions,网关验 Key 失败直接回 401。
1. /models 弹 401 前,先看我当时的 opencode.json
1.1 最容易触发 401 的错误配置
很多人把 Base URL 理解成「统一的 API 入口,后面应该接版本号」,于是写出了这样的配置:
{ "$schema": "https://opencode.ai/config.json", "provider": { "taotoken": { "npm": "@ai-sdk/openai-compatible", "name": "统一 API 通道", "options": { "baseURL": "https://taotoken.net/api/v1", "apiKey": "YOUR_API_KEY" }, "models": { "gpt-5.2": { "name": "GPT 5.2" } } } } }表面看很合理:有 provider 名,有 Key,有模型 ID。但问题出在那段/v1。OpenCode 的 openai-compatible provider 会把baseURL当作前缀,再拼/chat/completions、/models这些资源路径。TaoToken 的兼容端点本身已经以/api结尾,你再加一个/v1,实际请求就落在https://taotoken.net/api/v1/chat/completions。服务端在这个路径上找不到资源,而且因为请求头里的 Authorization 没有被正常消费,错误统一表现为 401。
1.2 401 和 404 的判别顺序
你可能会问:路径错误为什么不是 404?这就涉及网关的处理顺序。很多 OpenAI 兼容网关先检查 Authorization,验不过就回 401,不会继续去匹配路径。所以 401 不一定代表 Key 错,也可能是 Key 被发送到了错误的路径上。以下三个现象值得记一下:
| 现象 | 可能原因 | 优先检查 |
|---|---|---|
| 401 Unauthorized | Key 无效或路径错误 | baseURL 是否多写 /v1 |
| 404 Not Found | 资源路径不存在 | baseURL 与官方端点是否一致 |
| Model not found | 模型 ID 不是真实 ID | 模型广场列表里的准确 ID |
这个判别顺序可以帮你少走弯路:先看路径,再看 Key,最后才怀疑模型 ID。很多人一看见 401 就删 Key 重建,其实 Key 从头到尾都没问题。
2. 正确的 opencode.json:新增一个 TaoToken provider
2.1 准备 Key 和模型 ID
配置前先去 TaoToken 注册登录,进入控制台的 API Keys 页面创建一把新 Key,把生成的字符串保存到本机。随后打开模型广场,找到你要用的模型,复制它显示出来的模型 ID。这一步很关键:模型广场展示名常写成「GPT 5.2」这种带空格的名称,但配置里要用服务端能识别的 ID 字段。本文示例中的gpt-5.2只是演示 provider 和 models 的嵌套关系,请务必换成 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当时列出的准确 ID。
2.2 完整配置示例
{ "$schema": "https://opencode.ai/config.json", "provider": { "taotoken": { "npm": "@ai-sdk/openai-compatible", "name": "统一 API 通道", "options": { "baseURL": "https://taotoken.net/api", "apiKey": "YOUR_API_KEY" }, "models": { "gpt-5.2": { "name": "GPT 5.2" } } } }, "model": "taotoken/gpt-5.2" }provider 节点的 key 是taotoken,所以完整模型 ID 就是taotoken/gpt-5.2。顶层model字段对应原文里「设为默认」那一步,写不写都行,但建议写上,否则 OpenCode 会按内部优先级选第一个可用模型,可能不是你想要的。apiKey也可以改成{env:TAOTOKEN_API_KEY}的写法,然后在 shell 里export TAOTOKEN_API_KEY=你的Key,这样opencode.json可以放心提交到仓库,Key 只留在本机环境变量里。
3. 保存重启后,再做三步验证
3.1 第一步:/models 不再报 401
修改完配置后要完全退出 OpenCode,不是只关当前会话。重新执行opencode,输入/models,正常情况下你会看到taotoken分组下的模型列表。如果这里仍然报 401,不要接着改代码,先回到第 4 节按顺序排查。
3.2 第二步:/model 切换走一次真实请求
从列表选中taotoken/gpt-5.2,或者直接输入/model taotoken/gpt-5.2,然后随便发一段补全请求。比如让它写一个解析 CSV 的 TypeScript 函数。这一步必须看到模型返回内容才算通过,因为 OpenCode 的请求要一路经过 AI SDK、TaoToken API、模型服务三跳,任何一跳没通都会在回复里暴露出来。
3.3 第三步:回控制台看这次调用
很多配置看起来成功,实际请求走了本地缓存或旧环境变量。建议切到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的用量页面,看刚才那条补全请求是否新增了记录。如果 OpenCode 返回正常但用量里没有记录,说明请求没走这条通道,多半是终端环境里残留了其他 Base URL 环境变量,需要清理后重启。
4. 仍然 401?四步排查法
4.1 先看 baseURL
把provider.options.baseURL拿出来,确认它是https://taotoken.net/api,不是https://taotoken.net/api/v1,也不是https://taotoken.net/。注意官网落地页和接口地址是两个东西:官网用于注册和查看用量,接口地址才是填进配置的值。
4.2 再看 API Key 的首尾
从控制台复制 Key 时,可能把换行符也带进了 JSON。先粘贴到一个无格式文本框里检查开头结尾,再放回配置。Authorization 请求头里多一个空格,服务端就会判定 Key 非法。
4.3 核对模型 ID
模型 ID 是models对象里的 key,不是模型的展示名。如果你在模型广场看到的是「GPT 5.2」,就直接去列表里找它对应的 ID 字段并原样复制,不要在配置里手动改成gpt 5.2或GPT-5.2。ID 不匹配时,OpenCode 可能表现为 401,也可能表现为 model not found。
4.4 检查 OpenCode 的模型加载顺序
原文最后提到过加载顺序:命令行--model最高,其次是配置文件里的model字段,再是上次用过的模型,最后才是内置默认。如果你启动命令里带了-m参数,或者旧终端进程还残留着上次选中的模型,新配置虽然写对了也不会生效。把所有 OpenCode 实例关掉,不带任何参数重新启动,再执行/models。
5. 确认可用后,回到原文的选模型环节
5.1 从 TaoToken 模型广场选模型
原文推荐了 GPT 5.2、GPT 5.1 Codex、Claude Opus 4.5、Claude Sonnet 4.5、Minimax M2.1、Gemini 3 Pro。这些模型是否都能在 TaoToken 通道下使用,以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当时的列表为准。每个项目适合的模型不一样,建议先在模型对话页面用同一把 Key 各试一轮,挑出速度和效果都合适的,再写进 OpenCode 的 provider.models。
5.2 设默认模型
把配置顶层的model字段改成你确定要用的完整 ID,例如taotoken/模型广场里的准确ID。这样每次启动 OpenCode 都会固定用这个模型,不会因为上次会话的记录跳来跳去。
5.3 全局参数和变体在通过后配置才有意义
原文里讲的 reasoningEffort、thinking 这类参数,都建立在通道已经通的基础上。你可以在 provider.models 的某个模型节点下新增 variants 或 options,让同一模型不同场景使用不同推理力度。判断模型支持哪些参数,同样以模型广场标注为准。刻意把所有选项堆在配置里,反而会干扰排障。
6. 把 401 的排查顺序记下来
6.1 固定排查顺序
再遇到/models报 401,按「baseURL → apiKey → 模型 ID → 启动方式」四步走,不要一上来就重建 Key。其中 baseURL 的错误率最高,尤其是/v1后缀。TaoToken 的统一接口地址就是 https://taotoken.net/api,其他工具接入时同理。
6.2 Key 的日常管理
如果确实需要撤销某把 Key,去 API Keys 页面 操作,而不是因为 401 而盲目重建。控制台里能看到 Key 的创建时间和最新用量,你可以判断它是否真的被 OpenCode 使用过。
配置保存好后,现在先用同一把 Key 在 TaoToken 模型对话 里发一条测试消息,确认模型 ID 没写错;接下来打算长时间写代码的话,可以打开 Coding Plan 看套餐够不够用。其他工具接入的参数对照,见 TaoToken 接入文档。下次再遇到 401,先别急着换 Key,回到 opencode.json 看 Base URL 是不是多了个/v1。