对接一个大模型 API 已经够烦了——不同厂商的端点、认证方式、请求格式各不相同。当你的应用需要同时调用 GPT-4o、Claude、Gemini、Mistral 等多个模型时,维护成本直线上升。OpenRouter 的思路很简单:一个端点、一个 key,路由到上百个模型,还自带故障回退和提供商策略。下面拆解它的核心机制,并给出可直接跑的 Python 代码。
统一端点:一个 URL 搞定所有模型
OpenRouter 的 API 兼容 OpenAI 的 /v1/chat/completions 格式,这意味着你现有的 OpenAI SDK 或 HTTP 客户端几乎不用改,只需要换 base_url 和 api_key。模型通过 model 字段指定,格式为 provider/model-name,比如 openai/gpt-4o、anthropic/claude-3.5-sonnet。
关键区别在于:你不再需要为每个提供商单独注册账号和 key。OpenRouter 在背后代理转发,计费也统一结算。
智能路由与提供商策略
OpenRouter 不只是个代理,它提供了几种路由策略来决定请求发给哪个提供商实例:
- Priority:按你设定的优先级列表依次尝试,首选提供商不可用时自动降级到下一个。
- Cost:在满足模型要求的前提下,优先选最便宜的提供商实例。
- Fallback only:只在首选提供商失败时才启用回退,平时不切换。
这些策略通过请求体中的 provider 字段控制。比如你想优先用 Anthropic 官方实例、回退到其他托管 Claude 的提供商,几行配置就能搞定。
故障回退:让应用不因单点故障挂掉
大模型 API 的可用性并不完美——限流、宕机、区域性故障都遇到过。OpenRouter 的回退机制分两层:
- 提供商级回退:同一模型可能有多个提供商(比如 Claude 既有 Anthropic 官方也有 AWS Bedrock 托管),首选失败后自动切换。
- 模型级回退:你可以在
model字段用:串联多个模型作为回退链,比如anthropic/claude-3.5-sonnet:openai/gpt-4o,Claude 全线不可用时降级到 GPT-4o。
第二层是写应用时最实用的——用户不会因为某个模型临时下线而拿到报错。
实战:Python 调用 OpenRouter 并配置回退链
以下代码使用 openai Python SDK(只需改 base_url),演示如何调用 OpenRouter、指定模型回退链、以及设置提供商策略。先安装依赖:
pip install openai
然后运行:
from openai import OpenAI
# 替换为你自己的 OpenRouter API key
# 获取地址:https://openrouter.ai/keys
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="YOUR_OPENROUTER_KEY",
)
# 模型回退链:首选 Claude 3.5 Sonnet,不可用时降级到 GPT-4o
# 提供商策略:优先选 Anthropic 官方,允许回退到其他 Claude 提供商
response = client.chat.completions.create(
model="anthropic/claude-3.5-sonnet:openai/gpt-4o",
messages=[
{"role": "user", "content": "用一句话解释什么是向量数据库"}
],
extra_body={
"provider": {
"order": ["Anthropic"], # 提供商优先级
"allow_fallbacks": True, # 允许提供商级回退
"data_collection": "deny", # 拒绝提供商用于训练
},
},
)
print(f"使用模型: {response.model}")
print(f"回答内容: {response.choices[0].message.content}")
几点说明:
model字段中的:语法是 OpenRouter 扩展,OpenAI SDK 原生不支持,所以能正常传递是因为 SDK 不校验该字段。extra_body中的provider配置也是 OpenRouter 扩展参数,SDK 会原样放进请求体。data_collection: "deny"确保你的请求内容不会被模型提供商用于训练——这对生产环境很重要。response.model会返回实际使用的模型标识,你可以据此判断回退是否生效。
如果你想看更底层的 HTTP 请求,也可以直接用 requests:
import requests, json
resp = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={
"Authorization": "Bearer YOUR_OPENROUTER_KEY",
"Content-Type": "application/json",
},
json={
"model": "anthropic/claude-3.5-sonnet:openai/gpt-4o",
"messages": [{"role": "user", "content": "什么是 RAG?"}],
"provider": {
"order": ["Anthropic"],
"allow_fallbacks": True,
},
},
)
print(json.dumps(resp.json(), indent=2))
选用 OpenRouter 前的几件事
| 检查项 | 说明 |
|---|---|
| 计费透明度 | OpenRouter 按各模型原价加小额手续费计费, dashboard 可查看每次请求的实际花费和使用的提供商。 |
| 延迟代价 | 多一层代理意味着多一次网络跳转,对延迟敏感的场景(实时对话)需要实测对比直连。 |
| 合规与数据 | 不同提供商的数据政策不同,data_collection 参数可控制,但需逐模型确认。 |
| 回退链设计 | 回退模型的能力应与首选模型接近,否则用户体验会突变。Claude → GPT-4o 是合理降级;Claude → GPT-3.5 就不是。 |
| Key 安全 | OpenRouter key 能访问所有模型,权限比单一提供商 key 更大,务必做好密钥管理。 |
适合用 OpenRouter 的场景:需要多模型 A/B 测试、想用回退链提升可用性、不想逐个对接各家 API。不太适合的场景:对延迟极度敏感、只固定用一个模型且该模型 API 稳定——这时候直连更简单。
一句话总结:OpenRouter 把"多模型接入"从 N 个 SDK 的维护问题,变成了一个 model 字段的配置问题。回退链和提供商策略让这个配置不只是方便,还更可靠。