1. Windows 上 opencode 装完却跑不起来:认证链路到底卡在哪
如果你在 Windows 上折腾过 opencode,大概率经历过这个画面:命令行里opencode能启动,/model也能选,但一旦涉及opencode-antigravity-auth这类第三方认证插件,就开始报BunInstallFailedError,或者干脆卡在auth.json读取失败上。这篇就把我踩过的坑按顺序还原一遍,重点放在认证配置链路:bun 安装、插件加载、auth.json路径解析、环境变量注入,以及怎么把请求真正打到 TaoToken 上完成自检。
先说清楚 opencode 是什么、能做什么、适合谁。opencode 是一个跑在终端里的 AI 编码代理(coding agent),它本身是个 CLI,通过 npm 全局包opencode-ai分发,实际执行的是平台对应的二进制,比如 Windows 下是opencode-windows-x64/opencode.exe。它内置了一个 bun 运行时,用来给自己安装插件依赖。适合谁?适合习惯在终端里干活、想让 AI 直接读写本地代码库、又不想被 IDE 插件绑死的开发者。而opencode-antigravity-auth是一个第三方认证插件,作用是给 opencode 增加额外的模型认证入口,让它可以走自定义的 Base URL 和 Key,而不是只能用官方内置的那几个 provider。
问题就出在这个「第三方插件 + Windows + bun」的组合上。opencode 在 Windows 上安装本身不难,难的是插件依赖安装阶段。opencode CLI 会用内置的 bun 去bun add opencode-antigravity-auth@1.2.7,这个包又会间接依赖typescript@5.9.3。bun 在把 typescript 从临时目录移动到自己的 cache 目录时,Windows 的文件系统权限和路径处理会拒绝这个操作,于是抛出BunInstallFailedError。这不是你配置写错了,是 bun 在 Windows 上的一个系统级 bug。
那认证链路为什么还要讲?因为即使插件装上了,auth.json的路径解析在 Windows 上也容易出问题。opencode 默认读的是~/.config/opencode/下的配置,Windows 下~展开成C:\Users\<yourname>,所以完整路径是C:\Users\<yourname>\.config\opencode\opencode.json和同目录下的auth.json。很多人把文件放到了%APPDATA%或者项目根目录,结果 opencode 根本读不到,报认证失败。这篇的目标就是让你把这条链路一段段验证通,最后能用一个可复制的auth.json模板把请求打到 TaoToken 的 API 上。
我试过在纯 PowerShell 环境和 WSL 环境各跑一遍,结论先放这:纯 Windows 下插件依赖安装有概率失败,认证配置本身可以调通;WSL 下整条链路顺畅得多。下面按步骤来,每一步都给可复制的命令和配置。
2. TaoToken 前置准备:Base URL、Key 与模型 ID 三件套
在动 opencode 之前,先把 TaoToken 这边的三件套准备好,不然后面auth.json里没东西可填。TaoToken 是一个模型 API 聚合入口,你可以把它理解成一个统一的 Base URL,后面接不同的模型。对 opencode 来说,它就是一个 OpenAI 兼容或 Anthropic 兼容的 provider。
第一件是 Base URL。API 地址是https://taotoken.net/api,注意这个地址后面不要加 UTM 参数,直接用作baseURL或base_url字段。官网是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,这个只用于浏览器访问,不要写进配置文件。
第二件是 API Key。你需要到控制台生成一个 Key,地址是https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite。生成后复制出来,形如sk-xxxx。这个 Key 就是auth.json里的apiKey字段,也是环境变量TAOTOKEN_API_KEY的值。注意 Key 只显示一次,丢了就重新生成。
第三件是 Model ID。opencode 里模型 ID 要和你实际调用的模型对上,比如claude-sonnet-4-5、gpt-4o这类。不同 provider 命名不一样,TaoToken 这边你按控制台或文档里给的模型名填。如果你不确定,可以先到模型对话页面手动发一条消息验证 Key 和模型是否可用,地址是https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite。这一步很关键,因为如果 Key 本身有问题,你在 opencode 里排查会以为是插件问题,实际是 Key 无效。
把这三件套记下来:
| 项目 | 值 | 用途 |
|---|---|---|
| Base URL | https://taotoken.net/api | 配置文件里的 baseURL |
| API Key | sk-xxxx(控制台生成) | auth.json 的 apiKey / 环境变量 |
| Model ID | 如claude-sonnet-4-5 | 请求时指定的模型 |
环境变量清单也先列出来,后面会用到:
TAOTOKEN_API_KEY:你的 Key,供脚本或 opencode 读取。OPENCODE_CONFIG_DIR:可选,指定 opencode 配置目录,默认是C:\Users\<yourname>\.config\opencode。BUN_INSTALL:bun 安装路径,Windows 下默认在C:\Users\<yourname>\.bun。
如果你打算长期用 opencode 做编码或跑 Agent,可以考虑 Coding Plan,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite,它更适合高频调用场景。但本文的重点是认证链路,先把单次请求打通。
3. 可复制配置:auth.json 字段模板与 opencode.json 插件声明
这一节给可直接复制的配置片段。先确认目录:Windows 下 opencode 的配置目录是C:\Users\<yourname>\.config\opencode\。如果这个目录不存在,手动建一下。PowerShell 里可以这样:
$configDir = "$env:USERPROFILE\.config\opencode" New-Item -ItemType Directory -Force -Path $configDir然后是auth.json。这个文件负责存认证信息,opencode 和插件会从这里读 Key 和 Base URL。一个可用的模板如下,注意 JSON 不能有注释,字段名要和插件期望的一致:
{ "taotoken": { "type": "api", "apiKey": "sk-你的Key", "baseURL": "https://taotoken.net/api" } }如果你用的是 Anthropic 兼容模式,字段可能是base_url而不是baseURL,具体看插件 README。opencode-antigravity-auth这个插件在 1.2.7 版本里,认证条目通常挂在 provider 名下,所以你也可以写成:
{ "antigravity": { "type": "api", "apiKey": "sk-你的Key", "baseURL": "https://taotoken.net/api", "models": { "default": "claude-sonnet-4-5" } } }接着是opencode.json,它声明插件和模型定义。路径同样是C:\Users\<yourname>\.config\opencode\opencode.json:
{ "$schema": "https://opencode.ai/config.json", "plugin": [ "opencode-antigravity-auth" ], "provider": { "antigravity": { "npm": "opencode-antigravity-auth", "options": { "baseURL": "https://taotoken.net/api" } } } }这里有个坑:plugin数组里写的是插件包名,opencode 启动时会用内置 bun 去装它。如果这一步失败,你会看到BunInstallFailedError。所以配置写对只是第一步,能不能装上取决于 bun 在 Windows 上的表现。
如果你用的是 Codex 风格的auth.json(有些插件会读这个),字段可能是这样:
{ "OPENAI_API_KEY": "sk-你的Key", "OPENAI_BASE_URL": "https://taotoken.net/api" }注意OPENAI_BASE_URL不要带/v1后缀,除非插件文档明确要求。TaoToken 的 API 根是https://taotoken.net/api,具体路径由 SDK 拼接。
配置写完,用 PowerShell 验证 JSON 语法,避免因为一个逗号导致解析失败:
Get-Content "$env:USERPROFILE\.config\opencode\auth.json" | ConvertFrom-Json Get-Content "$env:USERPROFILE\.config\opencode\opencode.json" | ConvertFrom-Json两条都无报错,说明 JSON 合法。如果报Unexpected token,就是语法问题,先修好再往下走。
4. 验证请求:从 bun 安装到 opencode 实际调用
配置就绪后,按顺序验证。第一步确认 bun 和 opencode 装好了:
bun --version npm list -g opencode-ai opencode --versionbun --version应该输出类似1.3.5。npm list -g opencode-ai显示版本号即安装成功。opencode --version能打印版本就说明 CLI 可用。
第二步,单独测插件安装,把 bun 的问题暴露出来:
cd "$env:USERPROFILE\.config\opencode" bun add opencode-antigravity-auth@1.2.7如果这一步报错,错误信息里通常有BunInstallFailedError和typescript@5.9.3。这就是前面说的 bun 在 Windows 上移动文件被拒的问题。你可以试着加--no-cache或者换 bun 版本,但实测下来成功率不稳定。
第三步,直接验证 API 连通性,绕开 opencode,先用 curl 确认 Key 和 Base URL 没问题:
$headers = @{ "Authorization" = "Bearer sk-你的Key" "Content-Type" = "application/json" } $body = @{ model = "claude-sonnet-4-5" messages = @(@{ role = "user"; content = "ping" }) } | ConvertTo-Json -Depth 5 Invoke-RestMethod -Uri "https://taotoken.net/api/v1/chat/completions" -Method Post -Headers $headers -Body $body如果返回里有choices字段,说明 Key、Base URL、模型三件套都对。这一步能过,后面 opencode 里再报错就一定是插件或配置路径问题,不是认证本身。
第四步,启动 opencode 并触发一次请求:
opencode进去后用/model选你配置的 provider,然后发一条消息。如果插件装上了,请求会走auth.json里的 Key。如果看到reading choices相关报错,通常是响应结构不对,检查 Base URL 是否多了/v1或少了路径。如果看到local proxy failed,多半是插件试图起本地代理但端口被占或权限不足。
成功的结果长这样:opencode 正常返回模型输出,没有BunInstallFailedError,没有401。你可以在控制台或模型对话页面看到对应的调用记录。到这一步,认证链路就算通了。
5. 常见报错逐条排查:401、BunInstallFailedError、reading choices、OAuth
这一节把真实会遇到的报错列出来,对照排查。
401 Unauthorized:Key 无效或没带上。先确认auth.json里的apiKey是完整的sk-开头字符串,没有多余空格。再确认请求头是Authorization: Bearer sk-xxx。如果你把 Key 放在环境变量里,确认 PowerShell 当前会话能读到:$env:TAOTOKEN_API_KEY。注意环境变量改了要重开终端。
BunInstallFailedError,附带pkg: opencode-antigravity-auth和version: 1.2.7:这是 Windows 下 bun 安装插件依赖失败。根因是 bun 把typescript@5.9.3从临时目录移到 cache 目录时被系统拒绝。目前没有稳定修复。暴力方案是在C:\Users\<yourname>\.config\opencode\opencode.json里删掉plugin数组中的opencode-antigravity-auth,或者直接删掉opencode.json,再敲opencode就能用,只是没有这个插件。想彻底避开,用 WSL 环境安装,或者换 macOS。
reading choices报错:通常是响应体结构和插件预期不符。检查 Base URL 是不是写成了https://taotoken.net/api/v1,有些 SDK 会自己拼/v1,重复了就 404 或结构异常。把baseURL统一成https://taotoken.net/api,让 SDK 处理路径。
local proxy failed:插件尝试起本地代理失败,常见于端口被占用或 Windows 防火墙拦截。换端口,或者用管理员权限跑一次。也可能是插件版本和 opencode 版本不匹配,降级插件到 1.2.6 试试。
OAuth相关报错:如果你用的是需要 OAuth 的 provider,但auth.json里写的是type: api,就会冲突。确认插件文档要求的认证类型。TaoToken 走的是 API Key 模式,所以type应该是api,不要填oauth。
ENOENT找不到auth.json:路径不对。Windows 下确认文件在C:\Users\<yourname>\.config\opencode\auth.json,不是%APPDATA%,也不是项目目录。可以用Test-Path "$env:USERPROFILE\.config\opencode\auth.json"确认。
排查顺序建议:先 curl 验证 Key,再验证 JSON 语法,再验证插件安装,最后看 opencode 日志。这样能快速定位是认证问题还是插件问题。如果你需要重新生成 Key,去 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。接入细节可以看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。
6. 把认证链路固定下来:环境变量、自检脚本与后续接入
最后给一套可复用的自检流程,把认证链路固定住。先设环境变量,PowerShell 里临时设:
$env:TAOTOKEN_API_KEY = "sk-你的Key" $env:OPENCODE_CONFIG_DIR = "$env:USERPROFILE\.config\opencode"想永久生效就写进用户环境变量:
[Environment]::SetEnvironmentVariable("TAOTOKEN_API_KEY", "sk-你的Key", "User")然后写一个自检脚本check-opencode.ps1,每次改完配置跑一遍:
$configDir = "$env:USERPROFILE\.config\opencode" Write-Host "1. 检查配置文件" Test-Path "$configDir\auth.json" Test-Path "$configDir\opencode.json" Write-Host "2. 校验 JSON" Get-Content "$configDir\auth.json" | ConvertFrom-Json | Out-Null Get-Content "$configDir\opencode.json" | ConvertFrom-Json | Out-Null Write-Host "3. 检查 bun 和 opencode" bun --version opencode --version Write-Host "4. 测试 API 连通" $headers = @{ "Authorization" = "Bearer $env:TAOTOKEN_API_KEY"; "Content-Type" = "application/json" } $body = @{ model = "claude-sonnet-4-5"; messages = @(@{ role = "user"; content = "ping" }) } | ConvertTo-Json -Depth 5 Invoke-RestMethod -Uri "https://taotoken.net/api/v1/chat/completions" -Method Post -Headers $headers -Body $body四步都过,说明认证链路没问题。如果第 4 步失败,问题在 Key 或 Base URL;如果第 3 步 opencode 版本读不到,问题在安装;如果第 2 步失败,是 JSON 语法。这样排查不用猜。
关于插件安装那个 bun 的坑,我的实际做法是:纯 Windows 下如果BunInstallFailedError反复出现,就别死磕,直接用 WSL。WSL 里 bun 的文件操作走 Linux 语义,不会触发那个移动失败。命令和配置基本一致,只是路径变成/home/<user>/.config/opencode/。如果你必须留在 Windows,就接受没有opencode-antigravity-auth插件,用 opencode 内置 provider 配合auth.json里的自定义 Base URL,也能把请求打到 TaoToken。
长期编码或跑 Agent 的话,Coding Plan 比按次调用更划算,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。如果你用 Claude Code 那套,接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite,Base URL 和 Key 的填法逻辑和本文一致,只是配置文件位置不同。
最后提醒一句:auth.json里的 Key 不要提交到 Git,加进.gitignore。Windows 下路径里的反斜杠在 JSON 里要转义成\\,或者直接用正斜杠/,opencode 两种都能识别。把自检脚本跑通一次,以后换机器或换 Key,照着改三个字段就行。