OpenRouter 模型与路由

OpenRouter 模型与路由

Pareto Router

3 分钟阅读

Pareto Router

按最低编程分数选择编程模型,无需指定具体模型

Pareto Routeropenrouter/pareto-code)让 OpenRouter 始终为你挑选足够强的编程模型,而不必绑定某一个。你只需给出介于 01 之间的 min_coding_score 偏好,路由器就会把请求路由到达到该门槛的编程模型。

概述

Pareto Router 针对编程场景调优。它维护一份当前在 OpenRouter 上可用的强编程模型精选短名单,并按它们在 Artificial Analysis 上的编程百分位排序(该百分位是 0100 的整数,反映模型在 AA 已评测编程领域中的排名)。你的 min_coding_score 决定要路由到哪一档模型。在选定档位内,路由器选择当前可用且最便宜的模型(若请求 :nitro 变体,则选择最快的)。

名称来自 帕累托效率(Pareto efficiency):目标是在不过度花费的前提下给你一个足够强的编程模型。随着新模型上线和基准测试变化,精选短名单会持续演进。

用法

将模型设为 openrouter/pareto-code,并可选择传入 pareto-router 插件来控制最低编程分数:

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

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

const completion = await openRouter.chat.send({
  model: 'openrouter/pareto-code',
  plugins: [
    {
      id: 'pareto-router',
      min_coding_score: 0.8,
    },
  ],
  messages: [
    {
      role: 'user',
      content: '编写一个合并两个有序列表的 Python 函数。',
    },
  ],
});

console.log(completion.choices[0].message.content);
console.log('Model used:', completion.model);

默认设置

不必在每次 API 请求中都传入 pareto-router 插件,可以在控制台配置默认的 min_coding_score

  1. 前往 Settings > Plugins(设置 > 插件)
  2. 找到 Pareto Router 一行,点击配置(齿轮)图标
  3. 选择质量档位——High(高)、Medium(中)或 Low(低)——或选择 Custom score(自定义分数)输入 01 之间的具体值
  4. 点击 Save(保存)
  5. 将插件切换为 on(开启),以应用到所有使用 openrouter/pareto-code 的请求

启用后,配置的 min_coding_score 会自动应用到每一个使用 openrouter/pareto-code 的请求,无需在 API 调用中包含 plugins 数组。

你仍然可以在单次请求的 plugins 数组中传入 pareto-router 插件,以覆盖默认值。若要禁止按请求覆盖,请在插件配置中启用 “Prevent overrides”(阻止覆盖)。

min_coding_score 参数

min_coding_score 是一个介于 01 之间的可选数字,1 为最好。路由器会把它映射到三个质量档位之一,每个档位对应 Artificial Analysis 编程分数上的一个百分位区间。

min_coding_score档位AA 编程百分位区间
>= 0.66highAA 编程领域的顶端
>= 0.33< 0.66medium低于顶端的强现代旗舰
< 0.33low仍高于 AA 中位数的合格编程模型
省略high(默认)AA 编程领域的顶端

如果省略 min_coding_score,路由器默认选择当前可用的最强编程模型。在同一档位内,路由器选择最便宜的可用模型;若请求 :nitro 变体,则按 p50 吞吐量选择最快的。

路由器会解析出一个主编程模型,外加最多两个同档回退。主模型负责处理你的请求。回退仅在模型服务提供商出现短暂错误或速率限制时触发,不会对流量做负载均衡。如果整个档位当前在 OpenRouter 上都没有已发布的模型,路由器会改入相邻档位。响应的 model 字段始终报告实际处理该请求的具体模型。

因为评分轴是 AA 已评测编程领域内的百分位,给定 min_coding_score 所隐含的能力门槛会随前沿移动。一次新的强发布可能把现有模型推到更低的百分位区间,因此 min_coding_score=0.66 始终表示「当前领域的顶端」,而不是「超过某个绝对能力分数」。

响应

响应中的 model 字段会标明实际使用的编程模型:

{
  "id": "gen-...",
  "model": "anthropic/claude-opus-4.8",
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "..."
      }
    }
  ],
  "usage": {
    "prompt_tokens": 42,
    "completion_tokens": 128,
    "total_tokens": 170
  }
}

工作原理

  1. 档位解析:根据上表阈值,将你的 min_coding_score 映射到三个档位(highmediumlow)之一。
  2. 候选筛选:路由器取出该档位的精选短名单,并筛出当前已在 OpenRouter 上发布的模型。
  3. 选择:筛选后的短名单按价格升序排序;若请求 :nitro 变体,则按 p50 吞吐量降序排序。第一项成为主模型,接下来两项保留为同档回退。
  4. 运行时回退:如果主模型的端点因模型服务提供商短暂错误或速率限制不可用,请求会在同档回退中依次尝试。只有当整个档位都从目录中缺失时,路由器才会改入相邻档位。
  5. 请求转发:将你的请求转发到所选模型。

会话粘性

Pareto Router 会同时固定所选的 模型模型服务提供商,使同一对话中的后续请求路由到同一位置。这保证对话内行为一致,并最大化 提示词缓存 命中。

粘性分两个层面:

  • 隐式(自动):OpenRouter 从你的消息推导出会话指纹(对第一条系统消息和第一条用户消息做哈希)。一旦模型服务提供商报告提示词缓存用量,该对话就会固定模型和模型服务提供商。无需配置。
  • 显式(session_id:当你包含 session_id 时,粘性会在第一次成功响应时生效——即使尚未观察到缓存用量。推荐用于希望从一开始就保持路由一致的多轮编程会话和智能体工作流。

两种情况下,缓存都会在 5 分钟 无活动后过期。每次成功请求都会重置计时器。如果已缓存的模型服务提供商返回错误,缓存不会更新,从而允许下一次请求重新路由。

关于粘性路由的工作方式、缓存键粒度以及 x-session-id 请求头的完整说明,见 模型服务提供商粘性路由

使用 session_id 的示例

const completion = await openRouter.chat.send({
  model: 'openrouter/pareto-code',
  session_id: 'my-coding-session-123',
  plugins: [
    {
      id: 'pareto-router',
      min_coding_score: 0.8,
    },
  ],
  messages: [
    {
      role: 'user',
      content: '编写一个合并两个有序列表的 Python 函数。',
    },
  ],
});

// 使用相同 session_id 的后续请求会使用同一模型和同一模型服务提供商
const followUp = await openRouter.chat.send({
  model: 'openrouter/pareto-code',
  session_id: 'my-coding-session-123',
  plugins: [
    {
      id: 'pareto-router',
      min_coding_score: 0.8,
    },
  ],
  messages: [
    { role: 'user', content: '编写一个合并两个有序列表的 Python 函数。' },
    { role: 'assistant', content: completion.choices[0].message.content ?? '' },
    { role: 'user', content: '现在加上类型注解和文档字符串。' },
  ],
});

Pareto Router 上的会话粘性

Pareto Router 根据编程分数和成本选择模型,因此随着短名单演进,不同请求可能解析到不同模型。会话粘性会同时固定 模型选择 和模型服务提供商,使多轮编程会话始终停留在同一模型上。这可以避免对话中途切换模型,以免代码风格不一致或丢失提示词缓存。

定价

Pareto Router 本身不额外收费。你只需为处理该请求的底层模型付费。因为短名单上的模型选择会变化,单次请求的成本也会变化。当成本是首要考虑时,使用更低的 min_coding_score

限制

  • 仅限编程openrouter/pareto-code 针对编程任务调优。其他用途请使用别的路由器或选择具体模型。
  • 模型选择可能随时间变化:对于给定的 min_coding_score,所选模型是确定性的(按价格排序)。不过,当底层短名单更新时(例如新增模型、基准测试变化,或百分位区间随 AA 领域演进而重新分桶),所选模型可能改变。在同一对话内,会话粘性 会把请求固定在同一模型和同一模型服务提供商上,以最大化缓存命中。
  • 只有编程分数min_coding_score 是唯一的路由器参数。你无法直接为单次请求设成本或延迟上限。