OpenCode
把 RouteMux 作为自定义 provider 加进 opencode,OpenAI 与 Anthropic 两条协议路径都给。
opencode 从项目里的 opencode.json、或全局的 ~/.config/opencode/opencode.json 读 provider。
每个 provider 自己选走哪套协议,所以一把 RouteMux key 可以同时服务两条路径。
是 opencode 这个客户端,不是 OpenCode Zen
本页讲的是 opencode agent。OpenCode Zen 是同一个项目运营的付费模型服务 —— 它是上游而不是客户端,本页内容一条都不适用于它。
OpenAI 兼容路径(大多数模型)
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"routemux": {
"npm": "@ai-sdk/openai-compatible",
"name": "RouteMux",
"options": {
"baseURL": "https://api.routemux.com/v1",
"apiKey": "{env:ROUTEMUX_API_KEY}"
},
"models": {
"openai/gpt-5.5": {
"name": "GPT-5.5",
"limit": { "context": 1000000, "output": 128000 }
}
}
}
}
}能不能跑通取决于三件事:
npm就是协议选择器。@ai-sdk/openai-compatible发/v1/chat/completions; 想走/v1/responses就换成@ai-sdk/openai。混合配置可以在同一个 provider 块里 按模型覆盖npm。- models 的键必须与网关返回的完全一致。 以
GET /v1/models为准。 对不上不是 opencode 能纠正的拼写问题 —— 它就是解析不出来。 limit不是装饰。 opencode 用它来跟踪剩余上下文;不填或抄错数字会让它的上下文 记账出错,不只是显示问题。数值在每个模型的页面上。
模型的引用写法是 <providerID>/<modelID>。我们的 model id 本身就带一个斜杠,
所以完整引用是三段:
opencode run --model routemux/openai/gpt-5.5 "hello"Anthropic 协议路径(Claude 模型)
已发布的 anthropic/claude-* 模型只在 Anthropic Messages 协议上提供 ——
在 /v1/chat/completions 上会返回
400 MODEL_PROTOCOL_UNSUPPORTED。
改为覆盖内置 anthropic provider 的 base URL:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"anthropic": {
"options": { "baseURL": "https://api.routemux.com/v1" }
}
}
}这个 base URL 要带 /v1 —— 与 Claude Code 相反
AI SDK 的 Anthropic provider 只追加 /messages,所以 base URL 必须到 /v1 为止。
这与 Claude Code 正好相反:那边 ANTHROPIC_BASE_URL 是裸 origin,由客户端自己追加
/v1/messages。两者最终落在同一个端点,但字段约定不同。
凭据
/connect → Other 只会把凭据存进 ~/.local/share/opencode/auth.json,仅此而已 ——
provider 块仍然要自己写,而且你输入的 id 必须与配置里的键一致。对不上是第一个要查的点。
opencode auth list 能看到存了什么。直接在 options.apiKey 里用
{env:ROUTEMUX_API_KEY} 可以完全跳过 /connect。
精简模型选择器
whitelist 先收窄,blacklist 再剔除 —— 两者都填选择器里显示的 model id。
一把 RouteMux key 能调的模型比你想在列表里看到的多时很有用。
RouteMux 在这条路上替你做的事
- thinking 参数会被清理。 某些 opencode 版本会在
thinking里多发字段 (1.18.26 的一个构建发了thinking.adaptive.block_binding)。上游是严格 schema, 多一个未知键就整条拒绝,所以 RouteMux 只转发上游接受的键。 - 不透传你的客户端 User-Agent。 请求到上游时是
RouteMux/1, 这避开了那些会对特定客户端 UA 直接返回 403 的 bot 规则。
验证
curl https://api.routemux.com/v1/chat/completions \
-H "Authorization: Bearer $ROUTEMUX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"openai/gpt-5.5","messages":[{"role":"user","content":"ping"}]}'排查
| 现象 | 原因 |
|---|---|
| 模型列表里没有这个 provider | opencode.json 里的 provider id 与 /connect 时用的 id 不一致,或 models 是空的。 |
400 MODEL_PROTOCOL_UNSUPPORTED | 在 openai 兼容 provider 上用了 Claude 模型。改用上面的 anthropic base URL 覆盖。 |
| 每条请求都 404 | baseURL 漏了 /v1,或指到了完整操作路径而不是 API 根。 |
400 AUTH_AMBIGUOUS_API_KEY | options.apiKey 里一个 key、options.headers 里又是另一个不同的 key。只留一个。 |
| 上下文提示的数字不对 | limit.context / limit.output 与模型不匹配。 |
422 BILLING_INSUFFICIENT_CREDITS | 钱包余额不足。失败请求不计费。 |