对接 Claude、GPT-4、Gemini、Llama……每家 API 的鉴权方式、请求格式、错误码都不一样。项目里一旦接入超过两个模型,维护成本就直线上升。OpenRouter 把这些差异收拢到一个兼容 OpenAI 格式的统一端点背后,还附带了路由选择、自动降级和用量限额——这些正是多模型场景下最让人头疼的部分。
统一端点:一个 base_url 接通几十家模型
OpenRouter 的核心思路很简单:所有请求走 https://openrouter.ai/api/v1/chat/completions,请求体遵循 OpenAI Chat Completion 格式,唯一的变化是 model 字段填 OpenRouter 定义的模型标识符,比如 openai/gpt-4o、anthropic/claude-3.5-sonnet、google/gemini-pro、meta-llama/llama-3-70b-instruct。
这意味着你现有的 OpenAI SDK 代码只需改两行就能切换模型:
# 原来直连 OpenAI
client = OpenAI(base_url="https://api.openai.com/v1", api_key="sk-xxx")
# 改成走 OpenRouter
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="你的_OPENROUTER_KEY",
)
之后所有 client.chat.completions.create(...) 调用照原样写,model 参数换成 OpenRouter 的模型 ID 即可。响应结构也保持一致,不需要重新解析。
模型标识符与定价一览
OpenRouter 网站上有一个实时更新的模型目录,每个模型都有类似 provider/model-name 的标识符和对应的输入/输出 token 单价。选模型时关注三点:
- 延迟与上下文窗口:大模型慢但上下文长,小模型快但窗口短。
- 定价单位:部分模型按输入/输出分别计价,输出 token 通常更贵。
- 可用性标记:有些模型标注了
beta或限流状态,生产环境要避开。
实际选型时,可以把"日常对话用便宜快模型、复杂推理用贵模型"的策略直接写进路由逻辑。
路由与降级:让请求自动选最合适的模型
OpenRouter 支持在请求里指定一个模型优先列表。首选模型不可用或超时时,自动尝试下一个。这比自己在业务层写 retry + 模型切换要省很多代码。
response = client.chat.completions.create(
model="anthropic/claude-3.5-sonnet", # 首选
fallbacks=["openai/gpt-4o", "google/gemini-pro"], # 降级链
messages=[{"role": "user", "content": "解释 Transformer 的自注意力机制"}],
)
请求头里还可以加路由偏好参数,进一步控制行为:
extra_headers = {
"HTTP-Referer": "https://your-app.com", # 可选,标识来源
"X-Title": "Your App Name", # 可选,显示在 OpenRouter 日志
}
降级触发条件包括:首选模型返回 429(限流)、5xx(服务端错误)或超时。你不需要自己判断错误类型,OpenRouter 在服务端完成切换并返回最终结果。
成本控制:从请求级限额到项目级预算
多模型场景下最容易失控的就是费用。OpenRouter 提供两层控制:
请求级——在单次调用里设上限,超出直接拒绝:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "翻译这段话"}],
max_tokens=500, # 输出 token 上限
# 还可以在请求头里加成本上限(单位:美元)
extra_headers={
"X-Cost-Limit": "0.01", # 单次请求不超过 $0.01
},
)
项目级——在 OpenRouter 后台给 API Key 设置月度额度上限。达到上限后所有请求返回 402,不会产生超额账单。这对团队协作场景尤其重要:给不同服务分配不同 Key,各设预算,互不干扰。
完整示例:带降级和限额的调用脚本
下面是一个可以直接运行的 Python 脚本,演示统一调用、降级链和输出 token 限额:
"""
依赖:pip install openai
运行前设置环境变量:export OPENROUTER_API_KEY=sk-or-xxx
"""
from openai import OpenAI
import os
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
def ask(prompt: str, max_tokens: int = 300) -> str:
"""首选 Claude,降级到 GPT-4o,再降级到 Gemini Pro"""
resp = client.chat.completions.create(
model="anthropic/claude-3.5-sonnet",
fallbacks=["openai/gpt-4o", "google/gemini-pro"],
messages=[{"role": "user", "content": prompt}],
max_tokens=max_tokens,
extra_headers={
"HTTP-Referer": "https://example.com",
"X-Title": "Demo Script",
},
)
# 响应里包含实际使用的模型信息,方便追踪
used_model = resp.model
content = resp.choices[0].message.content
print(f"[实际模型: {used_model}]")
return content
# 测试
result = ask("用三句话解释什么是向量数据库")
print(result)
运行后你会看到实际被调用的模型名称——如果首选模型正常,返回 anthropic/claude-3.5-sonnet;如果它挂了,返回降级链中第一个可用的模型。这个信息对日志监控和成本核算都很关键。
接入前的权衡与建议
适合用 OpenRouter 的场景: - 项目需要同时调用 3 家以上模型,且切换频繁。 - 需要自动降级保障可用性,不想自己写 retry 逻辑。 - 团队多人共用多个模型,需要按服务拆分预算。
需要注意的边界:
- 额外延迟:请求经过 OpenRouter 中转,会增加一层网络延迟。对延迟敏感的实时场景(如流式对话),先测一下端到端耗时。
- 模型功能差异:虽然请求格式统一,但各模型的特殊参数(如 Claude 的 thinking、Gemini 的安全过滤)不一定完全透传。用到模型特有功能时,查阅 OpenRouter 的模型参数文档确认支持情况。
- 数据合规:中转意味着请求内容会经过 OpenRouter 服务器。对数据隐私要求严格的场景,确认 OpenRouter 的数据处理政策是否符合你的合规要求。
- 计费透明度:OpenRouter 在模型原价上加少量手续费。后台有每次请求的详细费用记录,定期核对即可。
上手清单:
1. 注册 OpenRouter,生成 API Key,在后台设好月度额度上限。
2. 用现有 OpenAI SDK 改两行(base_url + api_key)跑通第一个请求。
3. 为生产环境的关键调用配置 fallbacks 降级链。
4. 把 X-Cost-Limit 和 max_tokens 加到所有请求里,防止意外大额消耗。
5. 在日志里记录每次响应的 resp.model 和 resp.usage,建立成本基线。
多模型接入的工程复杂度不在"调通一个 API",而在"切换、降级、限流、计费"这些运维细节。OpenRouter 把这些收进了统一接口,省掉了大量胶水代码——但中转带来的延迟和合规成本,需要在具体项目里权衡取舍。