1. macOS 终端里 OpenCode 接不上模型,问题多半出在配置路径
如果你在 macOS 上用 OpenCode,大概率遇到过这种情况:装好了、opencode --version也正常,但一发起对话就卡住,或者报401、local proxy failed、reading choices之类的错。OpenCode 本身只是终端里的 AI 编码代理框架,它不带模型,真正干活的是你接进去的 LLM 通道。通道没配对,界面再顺也白搭。
这篇就聚焦一件事:在 macOS 终端里,把 OpenCode 的 LLM 接入配置改到 TaoToken 这条统一通道上。适合谁?适合已经装好 OpenCode、想用一个 Key 打通多个模型、又不想在每台机器上反复填不同厂商密钥的 Mac 开发者。我会给出可直接复制的opencode.json片段、Base URL 写法,并演示一次终端对话,确认请求真的走通了。
先说清楚 TaoToken 在这里的角色:它是一个统一的 API 接入层,对外暴露 OpenAI 兼容的接口。OpenCode 支持@ai-sdk/openai-compatible这类 SDK,所以只要把baseURL指向 TaoToken 的 API 地址、把apiKey换成你的 Key,就能让 OpenCode 通过这条通道调用模型。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api 。
很多人卡住不是因为不会写 JSON,而是没搞清 OpenCode 在 macOS 上到底读哪个文件。它遵循 XDG 规范,全局配置在~/.config/opencode/opencode.json,项目级配置在项目目录下的.opencode/opencode.json,后者优先级更高。你改了全局却没生效,八成是项目里有个同名文件把它覆盖了。下面按「先备好 Key → 再写配置 → 再验证 → 再排错」的顺序走一遍。
2. 前置准备:拿到 TaoToken Key 并确认 OpenCode 环境
2.1 创建 API Key
登录 TaoToken 控制台后,进 API Keys 页面创建一个新 Key。地址是 https://taotoken.net/console/api-keys ,创建后复制那串以sk-开头的字符串,先存到安全的地方。这个 Key 就是 OpenCode 配置里apiKey字段要填的值。
顺手把接入文档也开着,方便对照字段:https://taotoken.net/doc 。文档里会列出当前可用的模型 ID,这个很关键——OpenCode 配置里的id必须和通道实际接受的模型名一致,写错了就会报模型不存在。
2.2 确认 OpenCode 已安装且版本可用
在终端里跑一下:
opencode --version能输出版本号就说明装好了。如果提示 command not found,先确认~/.local/bin在 PATH 里,或者用 Homebrew 的官方 Tap 源重装:
brew install anomalyco/tap/opencode2.3 确认配置文件目录存在
macOS 上 OpenCode 的全局配置目录是~/.config/opencode。如果之前没配过,这个目录可能不存在,手动建一下:
mkdir -p ~/.config/opencode touch ~/.config/opencode/opencode.json建好后可以用ls -la ~/.config/opencode看一眼,确认opencode.json在里面。这一步别省,很多人直接编辑一个不存在的路径,保存时编辑器报错或者存到了别处,后面怎么都不生效。
2.4 检查有没有项目级配置在“抢权”
进你的项目目录,看看有没有.opencode/opencode.json:
ls -la .opencode/ 2>/dev/null如果有,记住它的优先级高于全局配置。你改全局没反应时,要么改这个项目级文件,要么临时把它挪走测试。这是 macOS 上 OpenCode 配置类问题里最高频的坑之一。
3. 可复制配置:把 OpenCode 的 provider 指向 TaoToken
3.1 完整 opencode.json 模板
把下面这段写进~/.config/opencode/opencode.json。注意apiKey换成你自己的,baseURL保持https://taotoken.net/api这个根地址,结尾不要多加斜杠。
{ "$schema": "https://opencode.ai/config.json", "provider": { "taotoken": { "npm": "@ai-sdk/openai-compatible", "name": "TaoToken", "options": { "baseURL": "https://taotoken.net/api", "apiKey": "sk-替换成你自己的Key" }, "models": { "claude-sonnet": { "id": "claude-sonnet-4-20250514", "name": "Claude Sonnet", "limit": { "context": 200000, "output": 8192 } }, "gpt-4o": { "id": "gpt-4o", "name": "GPT-4o", "limit": { "context": 128000, "output": 8192 } } } } }, "model": "taotoken/claude-sonnet", "autoupdate": "notify" }3.2 字段逐个说清楚
provider.taotoken这个 key 是你自己起的通道名,后面model字段里要用通道名/模型简称的格式引用,所以这里叫taotoken,下面就得写taotoken/claude-sonnet。
npm固定用@ai-sdk/openai-compatible,因为 TaoToken 对外是 OpenAI 兼容接口,这个 SDK 能直接对接。
options.baseURL是接口根地址,填https://taotoken.net/api。注意别写成带/v1或带具体路径的形式,OpenCode 会在这个根地址上拼接后续路径,多写反而会 404。
options.apiKey就是你在控制台创建的那串 Key。
models下面每个条目,外层 key(比如claude-sonnet)是你自定义的简称,id才是真正发给通道的模型标识。id必须和 TaoToken 文档里列出的模型名一致,写错会报模型不存在。limit.context和limit.output是给 OpenCode 做上下文管理的,按模型实际能力填,填太小会导致长对话被截断。
model是全局默认模型,格式通道名/模型简称。启动 OpenCode 后默认就用它。
3.3 如果你用项目级配置
只想让某个项目走 TaoToken,就在项目根目录建.opencode/opencode.json,内容同上。这样全局配置可以保持别的通道,项目内单独走 TaoToken,互不干扰。改完记得完全退出 OpenCode 再重开,配置是启动时加载的。
4. 验证请求:在终端里跑一次真实对话
4.1 启动并切换模型
保存配置后,完全退出 OpenCode(Ctrl+D),关掉终端窗口重新打开,然后:
opencode进去后输入/models,应该能看到TaoToken通道下的Claude Sonnet、GPT-4o这些条目。选中taotoken/claude-sonnet回车确认。
4.2 发一条最小请求
在对话框里输入一句最简单的:
用一句话解释什么是闭包如果配置正确,几秒内就会开始流式输出回答。这时候请求链路是:OpenCode →https://taotoken.net/api→ 模型 → 流式返回。看到正常回答,说明 Base URL、Key、模型 ID 三件套都对上了。
4.3 用 curl 单独验证通道
如果 OpenCode 里没反应,先用 curl 排除是不是通道本身的问题:
curl https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer sk-替换成你自己的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "ping"}] }'返回里有choices字段和内容,说明 Key 和模型名都没问题,那问题就在 OpenCode 配置侧。如果 curl 就报 401,那是 Key 的问题;报模型不存在,那是id写错了。这样能把问题范围一刀切开,比在 OpenCode 里瞎猜快得多。
4.4 确认走的是 TaoToken 而不是缓存
想更确定一点,可以故意把apiKey改成一个错的,重启 OpenCode 再发请求。如果立刻报 401,说明它确实在读你这份配置、确实在往 TaoToken 发请求。验证完再把正确的 Key 填回去。这个反向验证法在排查“配置到底有没有被加载”时特别好用。
5. 常见报错排查:401、local proxy failed、reading choices
5.1 报 401 Unauthorized
最常见。原因通常是 Key 填错、Key 前后带了空格、或者 Key 已经失效。先检查opencode.json里apiKey的值,确认没有多余空格和换行。然后用上面那条 curl 单独测一次,curl 也 401 就去控制台重新生成一个 Key。注意别把 Key 写进会提交到 Git 的文件里。
5.2 报 local proxy failed
这个错误通常出现在 OpenCode 尝试通过本地代理转发请求时。检查你的baseURL是不是写成了http://localhost:xxxx之类的本地地址。接 TaoToken 时baseURL应该是https://taotoken.net/api,不要指向任何本地端口。另外确认系统里没有残留的代理环境变量干扰,比如HTTP_PROXY、HTTPS_PROXY,可以在终端里env | grep -i proxy看一眼,有的话临时unset掉再试。
5.3 报 reading choices 或解析响应失败
这类错误说明请求发出去了、也回来了,但返回结构 OpenCode 解析不了。多半是baseURL多写了路径,比如写成了https://taotoken.net/api/v1,导致实际请求打到了错误端点,返回的不是标准 chat completions 结构。把baseURL改回https://taotoken.net/api再试。也有可能是模型id写错,通道返回了错误对象而不是正常响应。
5.4 配置改了不生效
按优先级从高到低排查:项目级.opencode/opencode.json是否覆盖了全局;OpenCode 是否完全重启(不是新开一个标签页,是彻底退出进程);JSON 是否有语法错误。JSON 写错一个逗号,OpenCode 可能静默回退到默认配置。可以用python3 -m json.tool ~/.config/opencode/opencode.json校验一下格式。
5.5 模型列表里看不到 TaoToken
说明provider段没被正确加载。检查provider下的通道名拼写、npm字段是否是@ai-sdk/openai-compatible、JSON 层级有没有写错。改完重启,再/models看一次。
6. 把通道固定下来,后续换模型只改一个字段
配置跑通之后,日常用起来其实很省心。你可以在models里多挂几个模型,需要切换时在 OpenCode 里用/models选,或者直接改model字段的默认值。因为所有模型都走同一个 TaoToken 通道、同一个 Key,换模型不用重新配密钥,只改模型简称就行。
如果你后面要长期在终端里做编码和 Agent 任务,可以考虑用 Coding Plan 把额度固定下来,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。只是想先验证模型对话效果,用模型对话页更快:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。Key 管理和新建都在控制台:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。字段对不上时翻文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后留一个我自己的习惯:把~/.config/opencode/opencode.json纳入 dotfiles 管理,换机器时直接同步,Key 用环境变量占位、启动时注入,这样配置能跟着人走,又不会把密钥硬编码进仓库。