OpenRouter 模型路由工作原理

OpenRouter:Announcements(RSS)·2026-06-13 00:00·100天前·OpenRouter
AI 导读

OpenRouter 将每个请求路由到 60 多家提供商,用户可自定义提供商顺序、价格上限和回退链,从而灵活控制路由策略。

OpenRouter:Announcements(RSS)
精选
66AI 编辑部评分,满分 100

OpenRouter 模型路由工作原理

2026-06-13 00:00· 100天前· OpenRouter
AI 导读

OpenRouter 将每个请求路由到 60 多家提供商,用户可自定义提供商顺序、价格上限和回退链,从而灵活控制路由策略。

推荐理由

如果你在用 OpenRouter,这篇把默认的逆向平方权重、:nitro/:floor 快捷方式和 model fallback 逻辑讲得很清楚,读完就能调整请求策略。

正文 · AI 翻译
How OpenRouter Model Routing Works

如果 Anthropic 在流量中途对你限流,你的应用不应该返回 500。正是这单一故障模式,成为团队一开始就寻求 LLM 路由器的重大原因。OpenRouter 将每个请求路由到 70+ 家提供商,而你可以控制路由方式,精细到提供商顺序、价格上限和回退链。

OpenRouter 中的路由是两个独立的决策:由哪个模型来回答请求,以及由哪个提供商来服务该模型。本指南中的每一个配置选项都对应这两个决策之一。将它们分开,正是让你在出问题时能够配置正确层级的关键。

OpenRouter Python SDKpip install openrouter)只需几行代码就能让你上手,而切换模型只需改一个字符串。(已经在用 OpenAI SDK?把它的 base URL 指向 https://openrouter.ai/api/v1,同样可以工作。)

from openrouter import OpenRouter

client = OpenRouter(api_key="<OPENROUTER_API_KEY>")

resp = client.chat.send(
    model="anthropic/claude-sonnet-4.6",  # change this string to switch models
    messages=[{"role": "user", "content": "Summarize this changelog."}],
)

这就是全部的集成工作。路由发生在那个单一端点背后,本指南的其余部分将逐一讲解它所暴露的路由层级,并附上你可以直接复制使用的确切配置。

LLM 路由器究竟做什么

这两个决策属于一项更大的工作。路由器将一个请求送达一个端点,并处理将其移交给应当回答它的模型和提供商。每个路由器都要完成这 4 项工作,而 OpenRouter 全部包办:

工作它决定什么OpenRouter 在哪里完成
模型选择由哪个模型来回答提示词model 字段,或 openrouter/auto
提供商选择由哪个提供商来提供该模型的服务provider 对象(默认:基于价格)
负载均衡如何在多个稳定提供商之间分配流量价格平方反比加权
故障转移出现错误时该尝试什么models 数组 + 提供商回退

RouteLLMLLMRouter 这样的开源项目,是你自行托管并接入自己基础设施的路由库。而 OpenRouter 是一个你直接调用的路由器:一项托管服务,通过单一端点对接 400+ 个模型

当你需要决定是自己掌握路由逻辑还是将其外包时,这一区别至关重要,我们会在路由器与网关的对比章节中再次谈到它。

OpenRouter 中的两层路由

Diagram of OpenRouter's two routing layers: a request flows through model routing, then provider routing, then to the selected provider and back as a response

OpenRouter 在 2 个独立的层面上进行路由:模型路由(由哪个模型来回答)和提供商路由(由哪个提供商来服务该模型)。把这两者分开来看,下面每一项配置就都能对号入座了。

一个 兼容 OpenAI 的端点位于这两层之前:https://openrouter.ai/api/v1,一个 API key,覆盖 70+ 个提供商的 400+ 个模型。你调用 OpenRouter 的方式与调用 OpenAI 相同,它在幕后进行分发。

每个路由决策发生在哪里

这个最小请求在一个 payload 中展示了两个决策。

curl https://openrouter.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-4.6",
    "messages": [{"role": "user", "content": "Hello"}]
  }'

model 字段是你的模型路由决策。如果某个给定模型由多个提供商服务,OpenRouter 的提供商路由会挑选由哪一个来处理这次具体的调用。你显式设置模型;提供商选择会自动运行,除非你将其覆盖。

一个 key,多个提供商

单 key 的设置意味着你使用一个 OpenRouter API key 就能访问多个提供商。如果你想改用自己提供商的 key,BYOK 指南涵盖了这条路径。它保留你现有的提供商协议,同时在其之上增加故障转移和路由。

哪种路由模式适合哪类任务

在讲具体机制之前,先给出这张地图。接下来的各节会说明每种模式如何工作。对于默认模式看不到的约束——合规、延迟预算、成本上限以及跨模型韧性——请使用覆盖配置。

你的情况使用原因
最便宜且可靠,不在乎是哪家提供商默认负载均衡平方反比加权会处理它
必须命中某一家提供商(合规、BYOK、区域)provider.order + allow_fallbacks: false硬性停止,不静默回退
延迟敏感(面向用户的聊天):nitro为吞吐量而路由
有成本上限的批处理任务:floor / max_price为价格而路由,并强制执行上限
需要跨模型的韧性models 回退数组能挺过整个模型宕机
不知道用户发送的是什么提示词openrouter/autoNotDiamond 按提示词逐个挑选

本指南的其余部分将按顺序逐一讲解这些模式,从你什么都不设置时运行的那一种开始。

提供商路由的工作原理

Worked example of price-weighted provider routing: Provider A at $1/M is tried first, Provider C at $3/M second, and Provider B at $2/M last because of recent outages

默认情况下,OpenRouter 会把你的请求发送给最便宜且可靠的提供商,权重为价格的平方反比。这一层负责做出路由决策,并在每次请求时运行,除非你将其覆盖。

默认策略,逐步拆解

当一个模型有多个提供商,而你又没有设置 sortorder 时,OpenRouter 会执行 3 个步骤,依据提供商路由文档

  1. 优先选择在过去 30 秒内没有出现重大故障的提供商(不稳定的提供商会排到队尾,但不会被移除)。
  2. 在稳定的提供商中,从成本最低的候选者里挑选,并按价格的平方反比进行加权。
  3. 将剩余的提供商用作回退。

设置 sortorder 会关闭负载均衡,改为按你的规则进行路由。不设置它们,你就会得到按价格加权的默认行为。

完整示例(为什么平方反比很重要)

以下是文档中关于该默认策略如何生效的完整示例。假设一个模型由 3 家提供商提供服务:提供商 A 为 $1/M tokens,提供商 B 为 $2/M,提供商 C 为 $3/M,且提供商 B 最近发生过服务中断。

平方反比加权意味着 A 被优先尝试的概率大约是 C 的 9 倍(1/3² 使 C 的权重仅为 A 的 1/9)。如果 A 失败,接下来是 C。B 刚刚经历中断,最后才会被尝试。

这种平方处理会把流量强力拉向最便宜的稳定选项,而不是均匀分散,因此当一家健康的 $1/M 提供商就在眼前时,你不会去支付 $3/M。

OpenRouter 在生产环境中对 70+ 家提供商运行这一策略,每月处理 100 trillion tokens,示例正是取自这一实际运营情况。需要记住的 2 条规则:30 秒中断窗口和平方反比价格加权。

关于该默认设置有一点需要注意:它管理的是标准请求。包含工具的请求会经由 Auto Exacto 路由——这是 OpenRouter 针对工具调用所采用的“质量优先”路由步骤,它会根据工具调用质量信号对提供商进行分层(将表现最差的提供商推到后面,同时在各层内保持价格排序),并且默认启用。若要在工具调用请求上重新启用价格加权,请用 :floorprovider.sort: "price" 强制启用。

使用 provider 对象控制路由

在请求体中添加一个 provider 对象,即可完全覆盖默认设置。该对象的完整说明见 此处文档;以下是开发者最先会用到的字段。

字段作用默认值
order按此确切顺序尝试各提供商未设置
allow_fallbacks如果你选择的提供商失败,则回退到其他提供商true
sort"price""throughput""latency" 路由未设置
only限制为此提供商允许列表未设置
ignore排除这些提供商未设置
quantizations限制为特定的量化级别未设置
data_collection"allow""deny" 会用数据进行训练的提供商未设置
zdr要求使用零数据保留(ZDR)的提供商未设置
max_price设置你可接受的每 token 价格上限未设置
preferred_min_throughput优先选择吞吐量高于此值的提供商未设置
preferred_max_latency优先选择延迟低于此值的提供商未设置
require_parameters仅使用支持你的请求参数的提供商未设置

固定提供商顺序并禁用回退

当你必须命中某一个特定提供商(合规要求、BYOK 合同、区域限制)而不能使用其他任何提供商时,设置顺序并关闭回退。

{
  "model": "openai/gpt-5.5",
  "provider": { "order": ["openai", "azure"], "allow_fallbacks": false }
}

OpenRouter 会先尝试 OpenAI,然后尝试 Azure,然后停止。它绝不会回退到你未批准的第三个提供商。

排除提供低质量变体的提供商

供应商质量参差不齐,OpenRouter 对此直言不讳。有些供应商提供的模型是量化程度更高的变体,其表现不如同一模型在其他地方托管的效果。你无法按质量分数进行排序或筛选,但可以直接排除某个供应商。

{
  "model": "meta-llama/llama-4-maverick",
  "provider": { "ignore": ["deepinfra"] }
}

如需更精细的控制,quantizations 可将范围限制在你所信任的精度级别。这就是应对质量差异的可控手段。

定位特定供应商端点

供应商 slug 按基础名称匹配。像 "google-vertex" 这样的 slug 会匹配 OpenRouter 上该供应商的所有 Vertex 区域和端点。要锁定单个变体,请使用完整 slug,例如用 "deepinfra/turbo" 而非 "deepinfra"

基础 slug 是大网撒捕,完整 slug 是手术刀精切。

:nitro 和 :floor 的作用

在模型名后追加 :nitro 可优化速度,追加 :floor 可优化成本。它们是快捷方式::nitro 完全等同于 provider.sort: "throughput":floor 完全等同于 provider.sort: "price"。无需对象,无需额外配置,只需改动模型字符串。

Slug优化目标等同于
model:nitro吞吐量(速度)provider.sort: "throughput"
model:floor价格(成本)provider.sort: "price"
model(裸用)最便宜且可靠的平衡默认按价格加权的路由

以下是只需改一行的做法:

model="meta-llama/llama-4-maverick:nitro"   # route for speed
model="meta-llama/llama-4-maverick:floor"   # route for cost

在延迟能被用户感知的面向用户的聊天场景中,选用 :nitro;在成本是约束条件的批处理任务中,选用 :floor。对于有成本上限的工作,将 :floormax_price 以及 BYOK 经济性搭配使用。

模型路由与故障转移如何协同工作

Diagram of model fallback: all providers for claude-sonnet-4.5 fail in turn, so the request falls through to gpt-5-mini

为了在提供商出错时保持可用,配置一个 models 回退数组,并依赖 OpenRouter 的自动提供商故障转移。这里叠加了 2 种机制,它们在不同层面运作。提供商路由让单个模型在多个提供商之间保持存活,而模型回退则处理该模型的所有提供商同时失败的情况。

这能覆盖大多数提供商错误,但无法让你免受所有服务级宕机的影响。

简而言之:列出备用模型,让提供商故障转移处理其余的事情,失败的请求不会向你收费。

模型回退(models 数组)

按优先级顺序传入 models。如果第一个出错,OpenRouter 会尝试下一个。

resp = client.chat.send(
    model="anthropic/claude-sonnet-4.6",
    models=["openai/gpt-5.4-mini"],  # tried in order if the primary fails
    messages=[{"role": "user", "content": "..."}],
)

OpenRouter 的 SDK 将 models 作为一等字段。(在 OpenAI SDK 上,通过 extra_body 传入,因为它是 OpenRouter 的扩展。)回退会在上下文长度错误、审核标记、速率限制和宕机时触发。你只需为实际运行的模型付费,而不是那些先出错的模型。

提供商级故障转移(在单个模型内)

在模型回退之下,还有第二层安全网。在单个模型内,如果所选提供商返回 5xx 或对你进行速率限制,OpenRouter 会自动切换到为该模型提供服务的下一个提供商。此功能默认开启(allow_fallbacks: true),任何在过去 30 秒内发生宕机的提供商都会被降低优先级。

从经济角度来看,这让人可以放心依赖。失败的请求不计费;OpenRouter 的 零完成保险意味着你只需为完成的运行付费。

故障转移覆盖和不覆盖的内容

故障转移有一些值得了解的局限。中止流式输出并不会停止部分提供商的计费(根据流式文档,其中包括 Bedrock、Groq、Google 和 Mistral),因此被取消的流在这些提供商上仍可能产生费用。

而故障转移可以绕过提供商层面的故障,但它无法绕过 OpenRouter 本身:2025 年 8 月的宕机(一次约 50 分钟的数据库事故)导致整个服务瘫痪,回退机制也不例外。提供商故障转移是真实存在的,而且是自动的;它是一层韧性保障,而非 SLA 保证。两者都要做好预案。

Auto Router,以及何时使用它

openrouter/auto发送请求,你就把模型选择权交给了 OpenRouter,而不是自己挑选。当某个提示词的最佳模型会变化时使用它,比如混合工作负载,其中一些请求需要强大的推理能力,另一些则需要快速补全。当你确切知道自己想要哪个模型时,就明确指定它。

Auto Router 由NotDiamond提供支持,它会针对每个提示词从一个精选模型池中选择一个模型。

Auto Router 如何选择

该模型池是一组轮换的强模型;Auto Router 文档列出了当前的阵容。调用之后,响应中的model字段会告诉你实际是哪一个模型做出了回答,所以你永远不用猜测。

你通过 auto-router 插件来引导这一选择。cost_quality_tradeoff 是一个 0-10 的刻度盘,默认值为 7。将其设为 0,路由器总是会选择能力最强的模型;将其设为 10,它则会选择最便宜的。

allowed_models 通过像 anthropic/* 这样的通配符模式,将选择限制在某个提供商家族内部。

{
  "model": "openrouter/auto",
  "plugins": [
    {
      "id": "auto-router",
      "cost_quality_tradeoff": 3,
      "allowed_models": ["anthropic/*", "openai/*"]
    }
  ]
}

在定价方面,没有 Auto Router 附加费。无论最终选中哪个模型,你都按标准费率付费,与直接调用该模型相同

Auto Router 与手动 models 数组的对比

两者都是“路由”,但控制面正好相反。使用 openrouter/auto 时,由 OpenRouter 决定模型。使用 models 回退数组时,由你决定顺序,OpenRouter 只是在出错时按顺序依次尝试。

当你不知道用户会发送什么提示词时,使用 Auto Router;当你知道自己的模型偏好并希望在其背后获得韧性时,使用回退数组。

路由器与网关,以及 OpenRouter 所处的位置

网关是统一的访问入口(单一端点、认证、限流、可观测性);路由器则做出逐请求的决策(用哪个模型、哪个提供商)。OpenRouter 就是你调用的网关,它内置了路由逻辑,决定由哪个模型和提供商处理每个请求。

能力路由器网关OpenRouter
按请求决定模型/提供商仅访问
自动故障转移有时
单一统一端点有时
托管 vs 自托管两者皆可两者皆可托管

我们的 LLM 网关指南完整定义了网关层级;路由是其中的机制。如果你想要一个自己运行的自托管网关加路由器,LiteLLM 是自行托管的选择。OpenRouter 是直接调用的选择。

常见问题

LLM 路由是如何工作的?

路由器位于你的应用与多个模型和提供商之间,决定每个请求的去向。它处理 4 项工作:模型选择、提供商选择、负载均衡和故障转移。你向一个端点发送一个请求,路由器负责挑选目的地。

OpenRouter 如何选择使用哪个提供商?

默认情况下,它会将过去 30 秒内出现重大故障的任何提供商降级,然后在成本最低的提供商中进行选择,按价格的平方反比加权,其余提供商保留作为回退。设置 sortorder 会覆盖此默认行为。

LLM 路由器和 LLM 网关有什么区别?

网关是统一接入点(一个端点、认证、可观测性)。路由器则针对每个请求决定由哪个模型和提供商处理该调用。OpenRouter 两者兼具:它既是你调用的网关,同时也进行路由。

如何让 OpenRouter 故障转移到另一个模型或提供商?

按优先级顺序传入一个 models 数组,即可实现模型级回退(在上下文长度错误、审核标记、速率限制和宕机时触发)。对于同一模型内的提供商级故障转移,OpenRouter 默认会自动处理(allow_fallbacks: true)。失败的请求不计费。

:nitro 和 :floor 是做什么的?

:nitro 追加到模型 slug 后,可优化吞吐量(即 provider.sort: "throughput")。:floor 则优化成本(provider.sort: "price")。两者都只需对模型字符串做一行改动。

Auto Router 会额外收费吗?

不会。无论 openrouter/auto 选择哪个模型,你都按标准费率付费,没有额外的 Auto Router 费用。

来源:OpenRouter:Announcements(RSS)· openrouter.ai