Pi
把 RouteMux 加进 Pi 的 models.json —— 我们四个协议族它都能讲。
Pi 把 provider 放在 ~/.pi/agent/models.json,每个 provider 自己声明讲哪套协议。
这让它成为少数几个能在一份配置里够到 RouteMux 全部协议族的客户端。
配置
{
"providers": {
"routemux": {
"name": "routemux",
"baseUrl": "https://api.routemux.com/v1",
"api": "openai-responses",
"apiKey": "sk-...",
"models": [
{
"id": "openai/gpt-5.5",
"name": "GPT-5.5",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 1000000,
"maxTokens": 128000
}
]
}
}
}带上 provider 与完整模型名运行:
pi --provider routemux --model routemux/openai/gpt-5.5 "hello"api 字段决定 base URL
api 有四个取值,每个对应不同的 base URL —— 因为 Pi 为每一种内置了不同的客户端:
api | RouteMux 的 baseUrl | 最终落在 |
|---|---|---|
openai-completions | https://api.routemux.com/v1 | /v1/chat/completions |
openai-responses | https://api.routemux.com/v1 | /v1/responses |
anthropic-messages | https://api.routemux.com —— 裸 origin | /v1/messages |
google-generative-ai | https://api.routemux.com/vertex-ai | Vertex 系操作 |
为什么 anthropic-messages 反而要去掉 /v1
Pi 内置的是官方 Anthropic SDK,它的 base URL 就是裸 origin,由它自己追加 /v1/messages。
而讲同一套协议的别的 agent 恰恰相反 —— OpenCode 用的是 Vercel AI SDK,只追加 /messages,
所以那边必须带 /v1。同一个协议,字段约定相反。见兼容矩阵。
Claude 模型只在 anthropic-messages 上提供;Grok 模型则完全不在它上面。
两者都要用的话,按协议各开一个 provider 块。
模型条目
id 必须与 GET /v1/models 返回的完全一致。contextWindow 与 maxTokens 驱动 Pi 自己的
上下文记账 —— 数字写错会产生错误的告警,不只是显示问题。reasoning 与 input 描述模型能力,
取值见模型页。
几个值得知道的兼容开关
Pi 默认会发一些严格上游可能拒绝的东西。如果某个 provider 拒绝了在别处正常的请求, 先看这几个旋钮:
- 按工具的 eager input streaming,会在每个工具定义里多加一个字段
- 开启缓存时附带的 session affinity 头
- 长缓存保留,它假定上游接受一小时的缓存 TTL
RouteMux 对未知的 anthropic-beta 头原样透传,只清理那些上游会硬拒的参数,
所以这里的典型症状是一个干净的上游报错,而不是行为被悄悄改掉。
排查
| 现象 | 原因 |
|---|---|
| 模型选择器里看不到 RouteMux | 没配 apiKey 的 provider 会被隐藏。这基本不是 URL 的问题。 |
| 每条请求都 404 | 协议要裸 origin 而 baseUrl 带了 /v1,或者反过来。见上表。 |
400 MODEL_PROTOCOL_UNSUPPORTED | 该模型不在这个 provider 声明的协议上 —— 比如把 Claude 的 id 放在 openai-completions 下。 |
| 找不到模型 | id 与 GET /v1/models 不完全一致。 |
422 BILLING_INSUFFICIENT_CREDITS | 钱包余额不足。失败请求不计费。 |