ByteNoteByteNote

字节笔记本

2026年8月28日

openrouter/auto 给 Claude Code 当路由

API中转
¥120

Claude Code 默认打 Anthropic。接到 OpenRouter 之后,可以把各档模型槽位写成 openrouter/auto:每次请求先按任务类型分类,再按过去 7 天社区真实花费选模型,路由本身不另收费。官方说明在 Auto RouterClaude Code 接入

先把请求打到 OpenRouter

openrouter/auto 是模型 slug,不是代理。Claude Code 还是走 Anthropic Messages 协议,只是 ANTHROPIC_BASE_URL 指到 OpenRouter 的 Anthropic Skin。本地不用再挂 claude-code-router 这类翻译层。

密钥从 openrouter.ai/settings/keys 拿,前缀一般是 sk-or-。写进 ~/.zshrc~/.bashrc

bash
export OPENROUTER_API_KEY="<your-openrouter-api-key>"
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
export ANTHROPIC_AUTH_TOKEN="$OPENROUTER_API_KEY"
export ANTHROPIC_API_KEY=""
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1

四条容易踩:

  1. Base URL 是 https://openrouter.ai/api,不要加 /v1
  2. ANTHROPIC_API_KEY 必须写成空字符串。不设的话,Claude Code 可能拿旧的 Anthropic 控制台密钥当 x-api-key,请求又打回 Anthropic。
  3. ANTHROPIC_AUTH_TOKEN="$OPENROUTER_API_KEY" 在 source 时展开。密钥必须写在这行前面,否则 token 是空的,看起来像密钥坏了。
  4. 不要把这三项丢进项目 .env。原生安装的 Claude Code 不读普通 .env

只想对某一个仓库生效,写项目根目录的 .claude/settings.local.json,不要提交密钥:

json
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
    "ANTHROPIC_AUTH_TOKEN": "<your-openrouter-api-key>",
    "ANTHROPIC_API_KEY": "",
    "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1"
  }
}

以前用 Anthropic 账号登录过,先在会话里跑 /logout,退出再开 claude。缓存的 OAuth 会盖住环境变量,报错经常写成 openrouter/auto 找不到。macOS 原生安装把会话放在钥匙串 Claude Code-credentials/logout 之后还在就删这条再启动。

进会话跑 /status,应看到:

text
Auth token: ANTHROPIC_AUTH_TOKEN
Anthropic base URL: https://openrouter.ai/api

Auth token 写的是 ANTHROPIC_API_KEY,或登录方式仍是 Claude 账号,说明环境没进这次进程。重载 shell,再开一次 claude。Activity 面板几秒内会有请求。

模型槽位改成 openrouter/auto

Claude Code 按任务档位选模型:Fable、Opus、Sonnet、Haiku,外加子代理。要让自动路由接管,每个槽位都写 openrouter/auto,漏一个就会悄悄走默认 Haiku / Sonnet:

bash
export ANTHROPIC_DEFAULT_FABLE_MODEL="openrouter/auto"
export ANTHROPIC_DEFAULT_OPUS_MODEL="openrouter/auto"
export ANTHROPIC_DEFAULT_SONNET_MODEL="openrouter/auto"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="openrouter/auto"
export CLAUDE_CODE_SUBAGENT_MODEL="openrouter/auto"

同一组也可以写进 settings.local.jsonenv。改完重启 Claude Code,打开 /model 看各档是不是都指向 auto。

CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 会打开网关模型列表。列表是精选,不是全站目录,而且可能出现非 Anthropic 条目。要用 auto,直接钉槽位,不要靠列表点选。

auto 实际怎么选

路由器把提示分成大约 30 种任务,比如 code:debuggingagent:multi_step_planningqa_knowledge。对每种任务,它看过去 7 天社区在这类工作上的花费占比,再按你的成本档和模型限制筛一遍,主选加备用。分类或排行暂时不可用时,会落到默认集合,不会因为路由自己挂了就 500。

响应里的 model 字段是真正接住这次请求的模型,例如 anthropic/claude-sonnet-4.5。多轮对话会尽量粘在同一模型和同一供应商上:你可以传 session_id,不传就按消息指纹认会话。任务类型变了,更合适的模型仍可能顶上来。

路由不另收费。你付的是选中模型的标价。OpenRouter 充值另有手续费,跟 auto 无关。要卡单次上限,继续用 provider.max_price

想看这次被标成哪种任务,请求头加 X-OpenRouter-Metadata: enabled,管道里会带 data.task_type。Claude Code 自己不会加这个头,排查时用 curl 或 SDK 复现同一句提示即可。

用通配符把候选锁死

不设限制时,auto 会看该任务类型下所有上榜模型。Claude Code 吃的是 Anthropic 请求语义,官方只保证 Anthropic 第一方供应商。auto 如果选到别家,工具调用和 thinking 块可能 silently 变差,看起来像「Claude Code 坏了」。

账号级限制写在工作区的 Routing 页。Auto Router 那一段可以存允许的模型和成本偏好,对 openrouter/autoopenrouter/auto-beta 都生效。Claude Code 发不出 plugins 字段,所以通配符主要靠这里,而不是请求体。

通配规则:

写法匹配
anthropic/*所有 Anthropic 模型
openai/gpt-5*GPT-5 一族
google/*所有 Google 模型
openai/gpt-5.1精确匹配
*/claude-*任意供应商、名字里带 claude

给 Claude Code 用时,允许列表先写成 anthropic/*。还要排除某几个,用同一套通配写 excluded_models,排除在允许之后生效。筛完一个都不剩,接口回 404No models match your request and model restrictions

自己调 API 时,限制可以写在单次请求里:

json
{
  "model": "openrouter/auto",
  "messages": [{ "role": "user", "content": "把这段函数拆成可测的小块" }],
  "plugins": [
    {
      "id": "auto-router",
      "allowed_models": ["anthropic/*"],
      "cost_tier": "high"
    }
  ]
}

cost_tierlowmediumhighxhighmax。它是一条带子,不是天花板:比这档便宜的和更贵的都会被拿掉。不设时,行为接近 low。旧参数 cost_quality_tradeoff 还能用,两个一起传时以 cost_tier 为准。

请求里写了同一字段,会盖掉账号默认值。页面上如果打开了「禁止覆盖」,账号设置就是最终值。

openrouter/auto-beta 是新行为的提前轨道。插件 id 必须写成 auto-beta-router,写 auto-router 会被收下但静默忽略。Claude Code 槽位继续用 openrouter/auto 即可,除非你明确要试 beta。

什么时候不要用 auto

需要每次同一条路径可复现,就钉死模型。官方现在给 Claude Code 的稳妥写法是 ~author/model-latest 别名,永远解析到该系列最新版:

bash
export ANTHROPIC_DEFAULT_OPUS_MODEL="~anthropic/claude-opus-latest"
export ANTHROPIC_DEFAULT_SONNET_MODEL="~anthropic/claude-sonnet-latest"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="~anthropic/claude-haiku-latest"
export CLAUDE_CODE_SUBAGENT_MODEL="~anthropic/claude-opus-latest"

/fast 只对具体的 Opus 版本生效(4.6 / 4.7 / 4.8 / 5)。槽位如果是 openrouter/auto~anthropic/claude-opus-latest,界面可能显示 Fast mode ON,请求里却没有 speed: "fast"。真要快档,把 Opus 槽位钉成 anthropic/claude-opus-5 这类具体 id,并设 CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1(Claude Code ≥ 2.1.96)。

非 Anthropic 模型可以出现在网关列表里,但 Claude Code 不保证工具调用和 thinking 能跑完。想省钱,用 auto 加 anthropic/* 和偏低的 cost_tier,比直接换一家模型更不容易把会话打崩。

常见故障

openrouter/auto 报 model not found,多半是凭证冲突,不是 slug 写错。两种情况分开看:

  1. 以前用 Anthropic 账号登录过:/logout,退出进程,再开 claude
  2. shell 里还留着真的 ANTHROPIC_API_KEY/logout 清不掉环境变量。把该变量改成 "",重载 shell,再用 /status 确认走的是 ANTHROPIC_AUTH_TOKEN

鉴权失败先看密钥是不是写在 ANTHROPIC_AUTH_TOKEN 里,以及 OPENROUTER_API_KEY 是否定义在它前面。ANTHROPIC_API_KEY 里如果是控制台密钥,Claude Code 会当直连 Anthropic。

请求发出去了但模型不是你想的,打开 Activity 看实际 model。允许列表太宽,或 Routing 页没存 anthropic/*,auto 会按市场花费选,不一定落在 Claude。

落地检查

  1. /status 显示 token 是 ANTHROPIC_AUTH_TOKEN,base URL 是 https://openrouter.ai/api
  2. 五个模型槽位都写成 openrouter/auto,或你有意钉死的具体 Anthropic id。
  3. Routing 页允许列表至少有 anthropic/*,成本档和你的预算一致。
  4. Activity 里能看到请求,model 落在 Anthropic 家族。
  5. 密钥只在本机环境或 settings.local.json,没有进 git。

接好之后,Claude Code 还是原来的会话和工具循环。变的是:每一档任务先经过市场指数,再落到当下最常被为这类工作付钱的模型。

分享: