# 供应商路由 (/docs/zh-CN/provider-routing)

很多模型由不止一家供应商提供，比如 `zhipu/glm-5.3-flash`：

```bash
curl -s https://api.ohmygpt.com/v1/models/zhipu/glm-5.3-flash | jq -r '.providers[].provider'
```

```text
chatglm
tencent
```

你不必自己选：默认情况下，OhMyGPT 会综合价格、速度和稳定性为每个请求选一家供应商，同一段对话尽量留在已经缓存了提示词的那一家；如果这家在应答前失败，就把请求转给下一家。如果你想自己掌控，比如优先用最便宜的供应商，或固定一个备用顺序，可以在 `/v1/chat/completions` 或 `/v1/responses` 的请求体顶层加一个 `provider` 对象：

```bash
curl https://api.ohmygpt.com/v1/chat/completions \
  -H "Authorization: Bearer $OHMYGPT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "zhipu/glm-5.3-flash",
    "messages": [{"role": "user", "content": "Hi"}],
    "provider": {"order": ["chatglm"]}
  }'
```

## 字段 [#字段]

| 字段 | 类型 | 作用 |
|---|---|---|
| `order` | string[] | 按这个顺序优先尝试这些供应商。模型的其他供应商仍作为备用。 |
| `only` | string[] | 只使用这些供应商。 |
| `ignore` | string[] | 不使用这些供应商。 |
| `allow_fallbacks` | boolean | 默认 `true`。设为 `false` 时只用 `order` 里的供应商；没写 `order` 时只用排第一的供应商。 |
| `sort` | string 或 object | 按条件优先选择供应商：`price`（这个请求花费最低）、`latency`（首 token 最快）或 `throughput`（每秒 token 数最多）。也可以写成对象 `{"by": "price"}`。 |

供应商标识取自模型的 `providers[].provider` 列表，不区分大小写。OpenRouter 的供应商标识也能用：`amazon-bedrock`、`google-vertex`、`google-ai-studio`、`claude-on-aws`、`moonshotai`、`z-ai` 和 `seed` 分别对应 `bedrock`、`vertex`、`google`、`anthropic_aws`、`moonshot`、`chatglm` 和 `bytedance`。`only` 里至少保留一个模型的供应商，也不要把它们全部 `ignore`：一个供应商都不剩的请求会被拒绝，返回 `400 invalid_parameter` 并指出 `provider.only` 或 `provider.ignore`（`allow_fallbacks` 为 `false` 时也可能是 `provider.order`）。同时设置 `order` 和 `sort` 时，`order` 里的供应商排在最前，其余的按 `sort` 排序。

想知道请求由哪家供应商处理，用它的 `X-Request-ID` [查询这个请求](/docs/zh-CN/costs#查询单个请求)，返回的 `model.provider` 字段就是答案。

## 在 OpenAI SDK 中使用 [#在-openai-sdk-中使用]

把 `provider` 作为额外的请求体字段传入：

```python tab="Python"
completion = client.chat.completions.create(
    model="zhipu/glm-5.3-flash",
    messages=[{"role": "user", "content": "Hi"}],
    extra_body={"provider": {"order": ["chatglm"]}},
)
```

```ts tab="TypeScript"
const completion = await client.chat.completions.create({
  model: 'zhipu/glm-5.3-flash',
  messages: [{ role: 'user', content: 'Hi' }],
  // @ts-expect-error provider is an OhMyGPT field, not in the OpenAI types
  provider: { only: ['chatglm'] },
})
```

## 在模型 ID 中指定供应商 [#在模型-id-中指定供应商]

在模型 ID 前加上供应商标识：`tencent:zhipu/glm-5.3-flash` 只会把请求发给腾讯，效果等同于 `"only": ["tencent"]`。这个前缀在所有端点上都有效。在 `/v1/messages` 和 Gemini 端点上，只能用这种方式选择供应商，不要传 `provider` 对象。

## 由 OhMyGPT 路由的模型 [#由-ohmygpt-路由的模型]

[模型列表](/docs/zh-CN/model-naming)中 `managed_routing: true` 的模型，由 OhMyGPT 替你选择供应商。调用时直接用原始 ID，不加前缀，也不传 `provider` 对象；传了的话其中的选择会被忽略。每个响应的费用按实际处理它的供应商计算。

## 从 OpenRouter 迁移 [#从-openrouter-迁移]

| OpenRouter | OhMyGPT |
|---|---|
| `model: "x:floor"` | `"provider": {"sort": "price"}` |
| `model: "x:nitro"` | `"provider": {"sort": "throughput"}` |
| `"provider": {"order": [...]}` | 字段相同，OpenRouter 的供应商标识照样可用 |
| `"provider": {"only": [...]}`、`"ignore": [...]` | 字段相同，OpenRouter 的供应商标识照样可用 |
| `"provider": {"allow_fallbacks": false}` | 字段相同 |
| `"provider": {"sort": {"by": "price"}}` | 字段相同 |
| `models: [...]` 备用模型列表 | 只选一个模型；同一模型的供应商之间会自动故障转移 |

模型 ID 严格按列表里的写法发送，不加后缀。`zdr`、`data_collection`、`max_price`、`quantizations` 等其他 `provider` 字段不要传；设置了这些字段的请求会被拒绝，返回 `400 unsupported_parameter`。

参数值无效时，错误信息会指出要改的字段：

```json
{
  "error": {
    "param": "provider.sort",
    "code": "invalid_parameter",
    "message": "Invalid `provider.sort`: must be one of `price`, `latency`, `throughput`, not `speed`.",
    "type": "invalid_request_error"
  }
}
```
