OpenRouter 使用与计费详解:200+ 模型一个 API Key
OpenRouter 是目前全球用户最多的托管聚合 API 服务,覆盖 200+ 模型,按实际 token 消耗付费,无月费。本文从注册到计费,帮你快速搞清楚 OpenRouter 能做什么、收费怎么算,以及中国大陆开发者使用时的注意事项。
OpenRouter 是什么
OpenRouter 本质上是一个托管的多模型代理:你向 OpenRouter 发标准 OpenAI 格式的请求,它帮你路由到相应的模型服务商(OpenAI、Anthropic、Google、Meta 等),统一计费并返回结果。你不需要分别注册各家服务商、管理多个 API Key,也不需要运维任何服务器。
核心特点:
- 接口:完全兼容 OpenAI Chat Completions 格式,
base_url改为https://openrouter.ai/api/v1即可 - 计费:按实际 token 用量付费,价格与上游服务商基本一致,部分模型略有溢价
- 免费层:部分开源模型(如 Llama 3.1、Mistral 7B)有每日免费额度
- 模型覆盖:GPT-4o、Claude 3.5、Gemini 1.5 Pro、DeepSeek、Llama 等 200+ 模型
这套架构解决的其实是一个很具体的痛点:你想用 5 个不同厂商的模型做 A/B 对比或者按场景切换(比如对话用 Claude、总结用 GPT-4o mini、代码用 DeepSeek),如果分别接入,你要维护 5 套 SDK、5 个 Key、5 套错误处理逻辑,账单还要自己拼表格核对。OpenRouter 把这些全部收敛成一个入口——你只管切 model 字符串,计费、限流、重试策略它在网关层统一处理,账单也是一张表。代价是你多信任了一层第三方:请求要先经过 OpenRouter 的服务器再转发到上游,多一跳网络延迟,也多一个需要为你的数据保密性背书的中间方。这个取舍是不是划算,取决于你团队是不是真的需要频繁切模型,还是只固定用一两个——只用一个模型的话,直连官方 API 反而更简单,少一层依赖。
快速接入
注册 openrouter.ai 后,在控制台生成 API Key,然后:
from openai import OpenAI
client = OpenAI(
api_key="sk-or-v1-xxxx", # OpenRouter API Key
base_url="https://openrouter.ai/api/v1"
)
response = client.chat.completions.create(
model="anthropic/claude-3-5-sonnet", # OpenRouter 的模型标识
messages=[{"role": "user", "content": "你好"}],
extra_headers={
"HTTP-Referer": "https://yourapp.com", # 可选,用于统计
"X-Title": "Your App Name" # 可选
}
)
这段代码里有两个容易被忽略但值得说清楚的细节:
第一,base_url 换掉之后,OpenAI 官方 SDK 里的其他方法(比如 embeddings、图片生成)不一定都能直接用——OpenRouter 目前的核心能力是 Chat Completions,其他接口的覆盖程度和参数支持要以官方文档为准,别想当然地认为”整个 SDK 全兼容”。
第二,extra_headers 里的 HTTP-Referer 和 X-Title 不是可有可无的装饰。OpenRouter 后台有个应用排行榜(App Rankings),会按这两个字段统计各应用的调用量和模型偏好;如果你不填,你的请求会被归到”匿名”里,团队排查问题、复盘调用来源都会麻烦一截。如果你的服务是多团队共用一个 Key,强烈建议把 X-Title 填成具体的子系统名字,方便日后翻账单时一眼认出是谁的调用。
计费规则
| 计费项 | 说明 |
|---|---|
| 基础价格 | 与上游服务商相同或略高(溢价通常 0–10%) |
| 免费模型 | 标注 :free 后缀的模型每日有免费限额 |
| 充值方式 | 信用卡或加密货币,最低充值 $5 |
| 账单精度 | 按实际 token 计费,精确到小数点后 6 位 |
| 无月费 | 不用就不收钱,适合低频场景 |
查看当前各模型价格:OpenRouter 控制台的 Models 页面有实时价格列表,包含输入 token 单价和输出 token 单价,以及每个模型支持的最大上下文长度。价格是会变的(上游厂商调价、或者 OpenRouter 自己调整溢价比例),别把某次截图当成永久基准,接入前务必现查一遍。
怎么核对一笔调用到底花了多少钱:每次请求返回的 usage 字段里有 prompt_tokens、completion_tokens、total_tokens,但这只是 token 数,不是钱。想看实际扣费,OpenRouter 提供了按请求 ID 查询消费明细的接口(generation 端点),传入响应里返回的 id 就能查到这笔调用精确花了多少钱、走的是哪个上游、是否命中了免费额度。这个习惯值得养成:如果你发现某个模型的账单比预期高,十有八九是 system prompt 或者历史对话拼接得太长,把 prompt_tokens 拉高了——这是新手最常踩的成本坑,模型本身没选错,是上下文喂多了。
还有一个容易漏算的点:多轮对话如果你每次都把完整历史传回去(大多数聊天应用都这么做),prompt_tokens 是随对话轮数线性增长的,第 20 轮对话的成本可能是第 1 轮的好几倍。如果你在做客服机器人这类长对话场景,值得做上下文裁剪或者摘要压缩,不然账单曲线会比你想象中陡。
自动路由功能
OpenRouter 的特色功能之一是 openrouter/auto 模型标识——它会自动在满足上下文长度要求的模型中选择当前最便宜的一个:
response = client.chat.completions.create(
model="openrouter/auto", # 自动选价格最优的模型
messages=[...]
)
适合成本敏感但对具体模型没有强要求的批处理场景。若需要指定模型质量档位,可用 openrouter/auto 配合 route 参数约束。
手动配置 fallback 模型列表
比自动路由更常用的其实是”主模型 + 备选模型”的显式配置。原因很实际:线上服务最怕的不是模型贵,是某个上游临时抽风——服务商限流、区域性故障、模型下线维护,这些事故你控制不了,但你可以让网关帮你自动兜底。做法是在请求体里传 models 数组而不是单个 model:
response = client.chat.completions.create(
model="anthropic/claude-3-5-sonnet", # 主模型放第一位
messages=[{"role": "user", "content": "你好"}],
extra_body={
"models": [
"anthropic/claude-3-5-sonnet",
"openai/gpt-4o",
"openai/gpt-4o-mini"
]
}
)
OpenRouter 会先尝试第一个,失败(超时、限流、服务不可用)就自动切到下一个,整个过程对你的代码透明,你不需要自己写重试判断走哪个模型。这个功能在生产环境的意义比自动路由更大——自动路由解决的是”选便宜的”,fallback 列表解决的是”别因为单点故障整条链路挂掉”,两者可以配合用,但优先级建议是先想清楚故障兜底,成本优化是第二位的。
还有一个进阶用法是限定具体走哪些上游厂商而不是任其自选,通过 extra_body 传 provider 对象,指定 order(优先服务商顺序)和 allow_fallbacks(是否允许在指定服务商都失败时兜底到其他服务商)。这在你对数据出境有要求(比如只想让请求经过特定地区的服务商机房)或者对某家服务商的延迟表现不满意、想强制绕开它时很有用。具体字段和取值请以 OpenRouter 官方文档为准,接口会随版本迭代调整。
常见报错排查
实际接入时最容易卡壳的不是”怎么发请求”,是发出去之后报错了不知道哪里出的问题。这里列几个高频场景,都是真实会遇到的:
| 报错 | 典型原因 | 排查方法 |
|---|---|---|
401 Unauthorized | API Key 写错、多复制了空格/换行、或者 Key 已在控制台被吊销 | 去控制台 Keys 页面确认 Key 状态是 Active,重新复制一遍粘贴,注意别带首尾空白字符 |
402 Payment Required | 账户余额不足,充值的 credits 已耗尽 | 去 Billing 页面充值;如果开了自动续费要确认支付方式没过期 |
429 Too Many Requests | 触发了限流,可能是免费模型的每日额度用完,也可能是你自己在 Limits 里设的消费上限被打到了 | 先看是哪种限流——免费额度耗尽切付费模型;消费上限被触发就去调整或等重置周期 |
| 请求超时无响应 | 大陆到 OpenRouter 服务器的网络链路本身就不稳定,200–500ms 只是正常延迟,遇到跨境线路抖动会直接超时 | 客户端超时时间设宽松一些(比如 30 秒起),并配合下面的重试退避逻辑,不要一超时就当成永久失败 |
| 返回内容被截断 | 达到了 max_tokens 限制,或者模型自身的最大输出长度上限 | 检查请求里 max_tokens 设置是否够用;确认模型上下文窗口没有被历史对话占满 |
超时和限流这两类问题,光靠人工重试太脆弱,建议在客户端加一层带指数退避的自动重试:
import time
import random
from openai import APITimeoutError, RateLimitError
def call_with_retry(client, max_retries=3, **kwargs):
for attempt in range(max_retries):
try:
return client.chat.completions.create(**kwargs)
except (APITimeoutError, RateLimitError) as e:
if attempt == max_retries - 1:
raise
wait = (2 ** attempt) + random.uniform(0, 1) # 指数退避 + 随机抖动
time.sleep(wait)
这里的随机抖动(jitter)不是凑数的细节——如果你的服务是多实例部署,所有实例同时超时、同时按固定间隔重试,会在同一时刻集中打一波请求到 OpenRouter,反而加重限流。加一点随机量能把重试请求错开,这是分布式系统里的标准做法,不是 OpenRouter 特有的技巧,但很多人接入聚合网关时会忘了带上。
BYOK:自带 Key 模式
如果你已经在某家服务商(比如 OpenAI)那边有企业折扣或者更高的限额,全部流量转去走 OpenRouter 默认的转售价格反而不划算。OpenRouter 支持 BYOK(Bring Your Own Key)模式:你在控制台把自己的上游 API Key 填进去,OpenRouter 只收取一小笔网关服务费(用于路由、统计、计费聚合),实际调用仍然算在你自己的上游账户额度里,享受你原本的价格和限额。这个模式适合两类人:一是已经和某家厂商谈了合同价的企业客户,二是想统一用 OpenRouter 的接口和账单格式管理多个自有 Key、但不想为每次调用支付转售溢价的团队。缺点是配置麻烦一些,且你要自己维护上游 Key 的额度和续期,出了问题第一时间还是得去上游那边查。
中国大陆使用注意事项
| 问题 | 说明 |
|---|---|
| 网络稳定性 | OpenRouter 服务器在境外,大陆直连延迟较高(200–500ms),偶发超时 |
| 付款方式 | 需要支持境外支付的信用卡或 PayPal |
| 国内模型覆盖 | 百度文心、阿里通义、智谱 GLM 等国内模型覆盖有限 |
| 数据合规 | 请求内容会经 OpenRouter 服务器,不适合含敏感数据的场景 |
如果你主要调用国内模型,或需要更稳定的大陆网络接入,国内托管聚合服务(如力达云聚合 API)是更合适的选择,详见聚合网关选型横评。
什么时候该用 OpenRouter,什么时候不该用
接入前先问自己三个问题,比看一堆功能介绍更管用:
| 你的场景 | 建议 |
|---|---|
| 只固定用一个模型(比如只用 GPT-4o),调用量稳定 | 直连官方 API 更简单,少一层中间方,延迟也更低,没必要为了”以防万一”多绕一道 |
| 需要频繁在多家模型之间切换对比,或者想要故障自动兜底 | OpenRouter 的 fallback 列表和统一计费正好对症 |
| 主要面向国内用户、调用国内模型、对延迟和合规敏感 | 优先考虑国内托管聚合服务,海外网关的跨境延迟和数据出境问题绕不开 |
| 团队已有官方渠道的企业折扣价 | 用 BYOK 模式接入,别让默认转售价格吃掉你谈下来的折扣 |
| 请求内容涉及用户隐私或商业机密 | 无论走哪个网关,都要确认对方的数据留存政策;OpenRouter 默认可能会把部分免费模型的请求用于训练改进,付费模型通常不会,但具体条款要去控制台的 Privacy 设置里逐条确认,别凭印象猜 |
跨境网络这块再补一句实操经验:如果你的服务器部署在国内云厂商(阿里云、腾讯云这些),到 OpenRouter 服务器的链路大概率要经过国际出口带宽,高峰时段(尤其是北美白天、也就是国内的深夜到凌晨)延迟会明显上升,超时概率也会变高。如果你的业务对响应时间敏感,建议把超时阈值和重试次数按实测数据调整,不要直接套用官方文档里给欧美用户的默认建议。
常见问题
OpenRouter 的模型标识格式是什么?
格式为 provider/model-name,例如 openai/gpt-4o、anthropic/claude-3-5-sonnet、meta-llama/llama-3.1-70b-instruct。完整列表在控制台 Models 页面查看。
免费模型额度用完了怎么办? 免费额度通常按天重置,用完后该模型会返回 429 错误。可以切换到其他免费模型,或充值使用付费模型。
可以设置消费上限防止超支吗? 可以。在控制台 Settings → Limits 中可设置每日或总额的消费上限,超出后 API 请求会被拒绝。
OpenRouter 支持流式(Streaming)输出吗?
支持。在请求中加 stream=True 即可,OpenRouter 会透传上游的 SSE 流。
延伸阅读:
国内开发者用 OpenRouter 不稳定?申请力达云聚合 API 内测,专线接入,国内模型优先覆盖。