OpenRouter 的周 token 量在一年里涨了 25 倍,之后又翻了差不多三倍。这个数字不一定代表某个模型突然变强,更说明大模型 API 正在从“逐个平台申请试用”转向“一个聚合入口解决多模型调用”。真正用起来后,大家关注的问题也很集中:token 到底怎么算、credits 怎么换算、登录时报 token exchange failed 该从哪里查、免费模型能不能扛住生产、OpenRouter 和 Claude Code 这类工具怎么接。下面按我实际使用和排查的顺序拆一遍。
1. 先看懂 OpenRouter 周 token 量增长背后的使用变化
1.1 OpenRouter 到底在解决什么问题
OpenRouter 是一个大模型 API 聚合服务,把多家厂商的模型放到统一接口后面。开发者只需要拿一个 API Key,按模型 id 切换模型,不用每个平台分别注册、分别充值、分别维护 SDK。
这个模式最直接的价值是降低了试用门槛。以前想对比几款模型,得看不同平台不同的鉴权方式、计费单位和限流规则。现在统一成 OpenAI 风格接口,prompt 和 completion 都按 token 计费,成本也能集中到账户余额里看。
周 token 量增长,说明这类聚合入口已经不是小众工具,而是很多自动化任务、编程 Agent 和内部工具链的一部分。它不是替代某个模型厂商,而是让模型选择这件事变得更轻。
1.2 token 用量暴涨主要来自哪几类场景
可以粗略分成四类:
- 编程辅助:Claude Code、Cline、Continue 等工具会把代码、上下文、工具调用结果都转换成 token。一次代码检查可能消耗几百到几千 token。
- 批量文本处理:内容总结、翻译、信息抽取、数据清洗,这类任务一旦进入定时流程,token 增长很稳定。
- 多模型对比和路由:同一个请求在不同模型之间做 A/B,token 会成倍增加。
- 自动化 Agent:多轮规划、工具调用、失败重试,单次任务的 token 消耗比普通聊天高很多。
很多人容易忽略一个事实:token 不是只算用户提问,模型生成的内容也按 token 计费。长上下文、结构化输出、重试都会显著放大消耗。感觉“只问了几个问题,额度却掉得很快”,原因多半在这里。
1.3 普通用户和开发者分别该关注什么
普通用户体验层关注的是:余额消耗、模型响应速度、免费模型是否够用。开发者关注的是:接口稳定性、限流策略、单价、重试是否产生重复计费、日志和用量统计。
OpenRouter 的 token 增长对两类人意义不同。对个人用户,它代表模型选择的灵活性变高了;对团队,它意味着需要一个更严谨的用量追踪流程。不要只看首页的增长倍数,要看自己的请求里有多少是有效 token、有多少是因为格式错误和重试浪费的。
2. 把 token、credits、2500 credits 换算这些概念先理清
2.1 token 不是字数,是大模型处理文本的基本单位
大模型处理文本时,会先把字符串切成 token,再转成向量。英文中常见单词可能就是一个 token,长单词可能拆成多个 token;中文通常一个字或两个字组合成一个 token,具体要看模型的 tokenizer。
同一个问题,中英文 token 数可能差很多。系统提示词、历史消息、工具定义、JSON 输出都会占用 token。所以只看浏览器里的字符数不能准确预估成本,要以请求返回的 usage 为准。
另外要分清:API 里说的 token 和“登录状态里的 session token”不是一回事。前者是计费单位,后者是身份凭证。排错时不要混在一起。
2.2 credits 与 token 的换算要按模型单价来算
OpenRouter 的账户余额用 credits 表示。每次请求会按照当前模型的每百万 token 单价,把 token 数换算成 credits 扣费。
换算公式可以这样写:
消耗 credits = prompt_tokens / 1_000_000 * input_price + completion_tokens / 1_000_000 * output_price这里的 input_price 和 output_price 由具体模型决定。有的模型输入输出同价,有的模型输出价格远高于输入价格。不要用一个固定比例去套所有模型。
2.3 2500 credits 能换多少 token,为什么没法直接回答
这是一个高频问题。直接回答“2500 credits 等于多少 token”是不严谨的,因为依赖两个变量:模型单价、输入输出比例。
同样一次请求,如果输入很长但输出很短,和输入很短但输出很长,换算出的 credits 完全不同。不同模型之间,同样 token 数的价格也可能差几倍甚至几十倍。
更合理的做法是:先选一个模型,记录一次真实请求的 usage,再用单价估算。或者直接看 OpenRouter 控制台的用量记录。以官方计费页当前价格为准,不要沿用网上旧帖子的固定数字。
可以按这个思路写一个简单的成本计算函数:
def estimate_cost(usage, input_price, output_price): prompt_cost = usage["prompt_tokens"] / 1_000_000 * input_price completion_cost = usage["completion_tokens"] / 1_000_000 * output_price return prompt_cost + completion_cost这里 input_price 和 output_price 是每百万 token 的价格,具体值要从 OpenRouter 的模型列表页查询。
2.4 通过 API 返回和控制台准确查看 token 消耗
OpenRouter API 在 OpenAI 风格返回里通常带 usage 字段:
{ "usage": { "prompt_tokens": 1200, "completion_tokens": 300, "total_tokens": 1500 } }如果客户端没有把 usage 完整透出,可以去 OpenRouter 控制台看用量记录。建议每次调用都记录 model、prompt_tokens、completion_tokens、cost、request_id。这样既能对账,也能判断是不是某个场景特别费 token。
3. 注册、充值、免费模型和 429 限流的实践经验
3.1 注册与支付先确认支持范围
新用户通常会先注册,再决定是否充值。注册建议用正式邮箱,保管好 API Key。API Key 一旦泄露,别人可以直接消耗你的 credits。
支付方面,OpenRouter 支持预付费 credits,具体充值方式以官方页面给出的可用渠道为准。不同地区可用支付渠道不一样。如果手机和邮箱验证没问题,但支付环节被拒,先看卡片是否支持跨境支付,再看账户地区信息是否正确。
注意不要急着多次重复支付。一次支付失败后,先等状态更新,再查账户余额。重复提交容易导致后续对账麻烦。
3.2 免费模型可以用,但别当成生产主力
OpenRouter 里有一部分免费模型,调用时 model 参数填对应的免费模型 id 即可。免费模型的优势是零成本测试,但通常也伴随更严格的限制:每分钟请求数有限、上下文窗口可能较小、服务质量不保证、高峰期更容易出现 429。
我一般建议用免费模型做两件事:验证接口链路、对模型的基础回答做粗测。不要用免费模型跑长时间定时任务,也不要把几十条 prompt 一次性并发打过去。如果连续几条 429,不一定是代码写错,多半是触发限流了。
“免费模型”和“免费试用额度”也不同。前者是模型本身单价为 0,后者是平台送的抵扣额度。要区分清楚,避免误判成本。
3.3 429 报错不要硬重试,先看限流和额度
429 表示服务端限制了请求频率。可能是账户整体额度、免费模型并发限制、单模型限流,也可能是短时间内请求过多。
处理顺序:
- 看报错响应体的提示,判断是 rate limit 还是 insufficient credits。
- 看账户余额是否充足。
- 看本次请求用的模型是否是 free 模型。
- 降低并发,增加退避时间。
不要直接在 for 循环里无间隔重试。建议设置最大重试次数和指数退避,并在日志里记录重试次数。错误重试同样会消耗 token,重试越多,成本越高。
3.4 充值后余额或 token 没有及时到账怎么办
先区分余额和 token 消耗。充值后 credits 到账,不等于 token 变多。每次调用的 token 消耗会在使用后扣除。
如果充值后余额没有变化,先看支付渠道的交易状态,再看账户 credits 是否有延迟。控制台更新有一定延迟,等几分钟刷新是正常的。如果长时间没到账,保留交易号,联系官方支持,不要立刻反复支付。
4. 登录失败、token exchange failed、地区限制报错的排查链路
4.1 token exchange failed 常见原因是什么
“sign-in could not be completed token exchange failed”是 OAuth 登录流程里的常见报错。完成第三方账号验证后,客户端需要用授权码换取访问 token。这个环节出现 token endpoint returned error,通常指向:
- 登录状态过期或使用了过旧的授权链接。
- 浏览器缓存了旧的登录状态。
- 本地时间和服务器时间偏差过大。
- 账号所在地区不在服务范围。
- 第三方身份服务临时故障。
排查第一步不是反复点登录,而是清理浏览器站点数据,换一个无痕窗口,确认当前地区是否在官方支持范围,再看状态码提示。如果还不行,等一段时间再试。
4.2 403 forbidden: country, region, or territory not supported 意味着什么
这个报错很明确:OpenRouter 当前不接受你所在地区的访问。看到这个状态码,很多“登录不成功”“注册不成功”的问题就都有了答案。
遇到这种情况,用户侧能做的合规操作不多:
- 查看 OpenRouter 官方支持范围,确认是否包含你的所在地区。
- 联系官方支持,确认账号是否可恢复。
- 使用官方支持的账号和支付条件完成后续操作。
这里不介绍任何绕过地区限制的手段。这类方式既不稳定,账号和支付风险也很高。对大多数场景来说,更务实的选择是等待官方支持范围调整,或改用其他官方支持的服务。
4.3 access token could not be refreshed 怎么处理
这个提示常见于长期未登录或会话过期。客户端拿着旧的刷新令牌去换新令牌,服务端不认了。
处理顺序:
- 退出当前账号,重新登录。
- 如果一直失败,清理浏览器或客户端的本地缓存。
- 确认这个错误来自网页登录,还是命令行工具里的 OAuth 登录。
- 查看账号状态,确认没有被停用或触发风控。
对于使用 Claude Code、Codex 这类命令行工具的开发者来说,OAuth 登录失败不一定影响 API Key 模式。如果本来就在用 API Key,可以直接走 API Key 方式,不必依赖 OAuth 登录。
4.4 一个通用排查顺序表
| 报错现象 | 优先检查 | 再检查 | 不建议 |
|---|---|---|---|
| token exchange failed | 浏览器缓存、登录状态、地区支持 | 第三方服务状态 | 反复点击登录 |
| 403 country/region not supported | 官方支持范围 | 账号地区信息 | 反复用同一客户端重试 |
| access token could not be refreshed | 退出重登、清理会话 | 账号状态 | 一直停留在旧会话 |
| 401 invalid token | API Key 是否完整 | 余额、Key 是否失效 | 无限换 Key 硬试 |
这四类问题的共同点是:先看环境,再看账号,最后才怀疑服务端。不要一上来就改代码。
5. OpenRouter 通过 cc-switch 接入 Claude Code 的配置思路
5.1 为什么会有这种接法
Claude Code 是偏编程场景的 Agent 工具,默认连接 Claude 官方接口。cc-switch 是一个用来方便切换不同 Claude Code 配置的工具,常见使用场景是维护多套 provider 配置。
有人会通过环境变量把 Claude Code 指向 OpenRouter 的统一 API 端点,目的是在同一个编程工作流里尝试不同模型。这个思路本身是正常的工程配置,不是模型绕过。但要明确:不是所有模型都适合编程 Agent,兼容性和工具调用能力差异很大。
接入前先确认:OpenRouter 上目标模型是否支持 Claude Code 需要的工具调用、流式输出和长上下文。如果某个模型只适合普通问答,接进去大概率会频繁报错或输出格式不对。
5.2 环境变量和 API 端点怎么配置
Claude Code 客户端一般通过环境变量读取 API 地址和认证信息。通用配置类似:
export ANTHROPIC_BASE_URL="https://openrouter.ai/api/v1" export ANTHROPIC_AUTH_TOKEN="sk-or-..." export ANTHROPIC_MODEL="anthropic/claude-3.5-sonnet"这里有两个注意点:
ANTHROPIC_AUTH_TOKEN的值应该是 OpenRouter 的 API Key,不是账号登录密码。- 模型 id 要以 OpenRouter 模型列表页显示的 id 为准。不同时期模型 id 可能调整。
如果客户端需要的是 OpenAI 风格端点,环境变量语法可能不同。先读客户端文档,确认它支持哪个环境变量组合。
示例中的模型 id 只是说明格式,不代表当前一定有该模型。
5.3 cc-switch 配置和首次验证步骤
cc-switch 通过界面维护多套配置,保存后按需切换。配置字段一般包括:
- 配置名称
- Base URL
- API Key
- 默认模型
- 需要附带的自定义请求头,如果有
配置完成后,不要直接跑一个很大的代码任务。先做最小验证:
- 在终端里用 claude 命令发起一句简单对话。
- 确认请求是否到了 OpenRouter,看日志或控制台。
- 查看返回结果的 usage,确认 token 消耗正常。
- 再测试一个需要调用工具的小任务,确认工具调用能力没问题。
如果出现 401 invalid token,检查 key 是否复制完整、有没有多余空格。如果出现 404 model not found,检查模型 id 是否写错。
5.4 接入后最容易忽视的 token 消耗问题
把 Claude Code 接到 OpenRouter 后,最容易被低估的是编程场景的 token 消耗。一次代码修改可能要经历:系统提示、工具定义、代码读取、多次工具调用、最终回答。每一步都产生 token,而且工具调用失败时重试会重复计费。
我建议接上之后先观察几条样本任务的 cost,再决定是否长期使用。不要只看模型回答质量好就立刻切到批量任务。如果一个模型工具调用不稳定,重试带来的成本可能比高价模型更贵。
另外,Claude Code 这类工具自己也有会话历史,长会话会让上下文越来越大,token 总消耗也会上升。按任务而不是按聊天时长来切分会话,是更可控的做法。
6. token 消耗监控、批量任务和日志对账建议
6.1 先跑一条样例,记录 token 基线
不管用什么模型,第一件事不是调参,而是先跑一条最小样例。
记录:
- 输入 prompt 的 token 数
- 输出 completion 的 token 数
- 总耗时
- 消耗 credits
- 是否发生重试
有了这条基线,才能估算后续批量任务。没有基线就开批量,很容易被“模型回答很快”迷惑,实际成本全在你看不到的 token 里。
OpenRouter API 返回里的 usage 是最直接的来源。如果没有 usage,可以从输出字符估算,但不如真实 usage 准确。
6.2 批量任务别一上来就开最大并发
批量任务设计要考虑:
- 输入列表如何组织
- 输出文件如何命名
- 单条失败是否跳过
- 重试次数
- 整个任务的进度记录
一个简单的 Python 伪代码思路:
for item in tasks: try: resp = call_openrouter(item) save_output(item["id"], resp) append_usage_log(resp["usage"]) except Exception as e: log_error(item["id"], str(e)) if should_retry(item["id"]): retry_queue.push(item)并发不是越大越好。先把并发调到 1 跑通,再按实际限流逐步增加。如果遇到 429,说明已经碰到限制,继续加并发只会提高失败率和重试成本。
6.3 控制 token 消耗的几个实用参数
- max_tokens:限制模型返回长度。对固定格式任务很重要。
- 系统提示词精简:每次请求都会带上,越短越省钱。
- 长文档分段处理:如果模型上下文不够,先拆分,而不是整个丢进去。
- 关闭多余的历史记录:在 Agent 工具里,不必要的会话历史会显著增加 prompt token。
- 对输出做结构化约束:比如要求返回 JSON,减少因为格式不对导致的重复调用。
注意:temperature 不影响 token 消耗,但会影响输出稳定性。输出不稳定时,你可能需要重试,重试才是真正的成本放大器。
6.4 把日志、告警和账户对账当成基础设施
OpenRouter 的账户余额页面只能看到总量,看不到每个业务线的消耗。对个人可以只记一个 CSV,对团队最好有统一日志。
建议每条请求至少记录:
- 时间
- 模型 id
- prompt_tokens
- completion_tokens
- cost
- 返回状态
每天或每周对账一次,对比日志汇总和账户余额变化。如果差异大,先从请求失败但重复计费、漏记日志、手动测试三方面排查。
另外,给长期任务设置额度告警,而不是等余额为 0 才发现。OpenRouter 的 credits 是预付费,余额不足会直接导致请求失败,影响线上任务。
我自己现在用任何聚合 API 都会先做三件事:确认模型 id 和价格、记录 usage、把批量任务控制在限流范围内。OpenRouter 的 token 增长是行业趋势的一个侧面,但它对个人项目的价值,最终取决于你能不能把消耗看清楚。把登录异常、token 换算、模型接入和日志对账处理顺,后面跑什么都稳。