RouteMux Docs
IntegrationsDev tool

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。两者最终落在同一个端点,但字段约定不同。

凭据

/connectOther 只会把凭据存进 ~/.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"}]}'

排查

现象原因
模型列表里没有这个 provideropencode.json 里的 provider id 与 /connect 时用的 id 不一致,或 models 是空的。
400 MODEL_PROTOCOL_UNSUPPORTED在 openai 兼容 provider 上用了 Claude 模型。改用上面的 anthropic base URL 覆盖。
每条请求都 404baseURL 漏了 /v1,或指到了完整操作路径而不是 API 根。
400 AUTH_AMBIGUOUS_API_KEYoptions.apiKey 里一个 key、options.headers 里又是另一个不同的 key。只留一个。
上下文提示的数字不对limit.context / limit.output 与模型不匹配。
422 BILLING_INSUFFICIENT_CREDITS钱包余额不足。失败请求不计费。

On this page