OpenRouter 模型与路由

OpenRouter 模型与路由

模型回退

3 分钟阅读

模型回退

模型之间的自动故障转移

models 参数可以在主模型的模型服务提供商宕机、触发速率限制,或因内容审核拒绝回复时,自动尝试其他模型。

工作原理

按优先级提供一个模型 ID 数组。如果第一个模型返回错误,OpenRouter 会自动尝试列表中的下一个模型。

import { OpenRouter } from '@openrouter/sdk';

const openRouter = new OpenRouter({
  apiKey: '<OPENROUTER_API_KEY>',
});

const completion = await openRouter.chat.send({
  models: ['~anthropic/claude-sonnet-latest', 'gryphe/mythomax-l2-13b'],
  messages: [
    {
      role: 'user',
      content: '人生的意义是什么?',
    },
  ],
});

console.log(completion.choices[0].message.content);

回退行为

如果你所选的模型返回错误,OpenRouter 会尝试改用回退模型。如果回退模型也宕机或返回错误,OpenRouter 会返回该错误。

默认情况下,任何错误都可能触发回退模型,包括:

  • 上下文长度校验错误
  • 过滤型模型的审核标记
  • 速率限制
  • 服务中断

定价

请求按最终实际使用的模型计费,该模型会在响应体的 model 字段中返回。

与 Anthropic Messages API 一起使用

Anthropic Messages API 端点(/api/v1/messages)接受 fallbacks 参数,形状与 Anthropic SDK 所用的一致。每一项指定一个按顺序尝试的回退模型,该列表会映射到 OpenRouter 的 models 路由,因此回退会在上文列出的同类错误(速率限制、服务中断、审核拒绝)时触发,而不仅仅是在拒绝时触发。

OpenRouter 自行处理该回退路由。fallbacks 参数不会使用 Anthropic 的服务端回退功能。

import Anthropic from '@anthropic-ai/sdk';

const anthropic = new Anthropic({
  baseURL: 'https://openrouter.ai/api',
  apiKey: '<OPENROUTER_API_KEY>',
});

const message = await anthropic.beta.messages.create({
  model: 'anthropic/claude-sonnet-4.5',
  max_tokens: 1024,
  fallbacks: [{ model: 'anthropic/claude-opus-4.1' }],
  messages: [{ role: 'user', content: '人生的意义是什么?' }],
});

限制

  • 每个 fallbacks 条目只接受 model 字段。每次尝试的覆盖项(如 max_tokensthinkingspeedoutput_config)会被拒绝,并返回 400 错误。
  • fallbacks 不能与 models 参数同时使用;同时发送两者会返回 400 错误。
  • fallbacks 最多接受 3 个条目;更长的列表会返回 400 错误。

与 OpenAI SDK 一起使用

要在 OpenAI SDK 中使用 models 数组,请把它放在 extra_body 参数中。在下面的示例中,会先尝试 ~openai/gpt-latest,然后按顺序将 models 数组中的模型作为回退。

from openai import OpenAI

openai_client = OpenAI(
  base_url="https://openrouter.ai/api/v1",
  api_key=<OPENROUTER_API_KEY>,
)

completion = openai_client.chat.completions.create(
    model="~openai/gpt-latest",
    extra_body={
        "models": ["~anthropic/claude-sonnet-latest", "gryphe/mythomax-l2-13b"],
    },
    messages=[
        {
            "role": "user",
            "content": "人生的意义是什么?"
        }
    ]
)

print(completion.choices[0].message.content)