小睿AI导航

ARTICLE DETAIL

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

OpenRouter提供OpenAI兼容的调用接口,可通过同一请求结构访问不同模型。本文从服务端密钥配置开始,用JavaScript演示聊天请求和模型切换,说明参数差异、状态检查、超时与有限重试,并介

📁 大模型与开发 浏览 1 2026-10-15 作者 小睿AI
📝

文章正文

样式 7 内容详情排版

阅读提示当前文章有1097字,阅读完大概需要3分钟。

先理解统一接口的边界

OpenRouter是第三方模型路由服务,不是各模型原厂API。它提供OpenAI兼容接口,让应用可以沿用相近的消息结构,但模型能力、供应商路由和计费仍需分别核对。统一模型接口减少的是接入代码,不会消除模型之间的差异。

注册账号并保护API密钥

登录OpenRouter后,在密钥管理页面创建,并按账户页面提示检查余额或支付设置。将密钥写入服务端环境变量OPENROUTER_API_KEY,不要放在浏览器代码、公开仓库、截图或请求日志中。网页应用应由自己的后端代发请求,同时增加用户鉴权和用量限制。

从模型页面复制两个要测试的完整模型标识,分别配置为MODEL_A和MODEL_B。不要用展示名称代替模型标识;运行前核对当前访问权限、模型状态和支持参数。

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

用JavaScript发送请求并切换模型

下面的示例运行在支持fetch的Node.js服务端环境。聊天接口为https://openrouter.ai/api/v1/chat/completions,鉴权使用Bearer密钥。示例不启用流式响应,便于直接检查返回状态和usage。

const key = process.env.OPENROUTER_API_KEY;

const models = [process.env.MODEL_A, process.env.MODEL_B];

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

if (!key || models.some(m => !m)) throw new Error('请配置密钥和两个模型标识');

async function chat(model) {

for (let attempt = 0; attempt < 2; attempt++) {

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

const started = Date.now();

const response = await fetch('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model, messages: [{ role: 'user', content: '用三句话说明接口超时与模型生成失败的区别。' }], max_tokens: 300 }), signal: AbortSignal.timeout(30000) });

const elapsed = Date.now() - started;

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

const data = await response.json().catch(() => null);

console.log({ model, status: response.status, elapsed_ms: elapsed, usage: data?.usage });

if (response.status === 429 && attempt === 0) {

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

const hint = response.headers.get('retry-after');

const seconds = hint === null ? NaN : Number(hint);

if (Number.isFinite(seconds) && seconds > 30) throw new Error('等待时间较长,停止自动重试');

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

await new Promise(resolve => setTimeout(resolve, Number.isFinite(seconds) ? Math.max(1000, seconds * 1000) : 2000 + Math.random() * 1000));

continue;

}

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

if (!response.ok || !data || data.error) throw new Error(`请求失败:${response.status}`);

return data;

}

OpenRouter API怎么用?从统一接口调用到模型切换与费用核对指南

}

for (const model of models) { try { const result = await chat(model); console.log(model, result.choices?.[0]?.message?.content); } catch (error) { console.error(model, error.message); } }

这段代码使用相同问题,只改变model字段,便于比较两次输出。max_tokens用于约束生成长度,但应先确认所选模型支持该参数。示例最多对429响应重试一次;超时、网络中断和其他错误不自动重试,因为请求可能已经执行,重复提交可能增加费用。

切换失败时,不要只换模型名称

  • 鉴权或权限错误:检查密钥、账户状态和模型访问条件,不要循环重试。
  • 模型不可用:检查当前模型状态、路由限制与错误信息;切换备用模型时应记录实际使用的模型。
  • 参数不兼容:从最小请求开始,再逐项加入温度、工具定义或输出格式参数。
  • 上下文超限:核对模型上下文长度,并为输出预留空间,必要时裁剪历史消息。

、JSON和上下文长度都可能因模型及供应商而异。需要严格参数支持时,可核对OpenRouter的provider.require_parameters设置;即使接口接受请求,也仍要验证输出结构和工具调用结果。

建立Token、费用和质量核对流程

每次调用记录业务请求标识、请求模型、返回模型、HTTP状态、错误类别、耗时,以及usage中的prompt_tokens和completion_tokens。示例耗时是收到响应头前的时间;生产环境还应记录读取响应体结束的总耗时。不要默认完整记录提示词,尤其是包含个人信息或业务数据时。

费用以账户活动记录和实际结算为准;若响应提供usage.cost,可保存用于关联核对。输入输出Token估算只能作为辅助,缓存、工具调用及其他计费项目可能影响结果。比较模型时固定测试题、长度限制和评价标准,同时检查正确性、格式合规、延迟与费用,不把一次输出当成稳定结论。