阿里万相3.0上线 OpenRouter 这件事,很多开发者第一反应是“又多了一个模型 API”,但我的判断是:它真正的信号价值,在于模型接入方式的又一次标准化。
过去一年里,AI 应用开发者最头疼的问题不是模型不够强,而是模型太多了。通义、DeepSeek、智谱、GLM、Claude、Gemini 各有各的 SDK、各自独立的 Key、各自的计费后台。一个正经的 AI 应用,光是管理模型供应商就得单独写一层适配代码。现在 OpenRouter 这种“模型路由网关”开始把大量模型聚到同一个 OpenAI 兼容接口后面,而阿里万相3.0也选择上线 OpenRouter,说明国产模型正在主动融入这套统一调用体系。
这篇文章不打算只发一条资讯。我会从开发者角度拆清楚三件事:第一,阿里万相3.0和 OpenRouter 各自是什么定位,为什么值得关注;第二,从注册、充值、创建 Key、查询模型 ID 到真正调通 API,完整走一遍;第三,把大家最容易踩的坑,比如“为什么配置后找不到模型”“刚注册有多少额度”“API Key 怎么在代码里用”整理成排查清单。你读完可以直接照着接入自己的项目。
1. 为什么阿里万相3.0上线 OpenRouter 值得关注
先给一个明确判断:阿里万相3.0上线 OpenRouter,对应用层开发者是利好,但最值得关注的不是模型本身,而是接入方式。
如果你只是一个普通业务开发,听到“大模型上线某某平台”其实有点麻木。但 OpenRouter 不是普通模型托管平台,它的核心价值在于:一个 API Key、一套 OpenAI 兼容协议,就能调用平台上几乎所有模型。阿里万相3.0加入之后,意味着同一个代码仓库里,你可以在 DeepSeek、Claude、Gemini 和阿里万相之间来回切换,而不需要改调用逻辑。
这个变化对应的痛点是真实存在的。
过去接入一个模型,开发流程一般是这样的:
- 去模型厂商官网注册账号。
- 申请 API Key。
- 安装厂商的 SDK。
- 阅读厂商特有的请求参数格式。
- 在代码里硬编码 base_url 和鉴权方式。
- 如果项目有多个模型需求,每个模型都要重复一遍上述流程。
换成 OpenRouter 之后,流程变成:
- 在 OpenRouter 注册一个账号。
- 创建一个 API Key。
- 用一个 OpenAI 兼容的 SDK 或者 HTTP 客户端发请求。
- 在请求体里改一下
model字段,完成模型切换。
这种“路由网关 + 统一协议”的模式,本质上把模型 API 变成了可插拔的组件。阿里万相3.0愿意接入这套体系,也从侧面说明:模型厂商已经意识到,单纯靠自有生态留住开发者的成本很高,不如让开发者先能用起来,再谈粘性。
对普通开发者来说,这篇文章值得读的原因也很直接:
- 你不需要自己部署万相3.0的模型服务。
- 你不需要为了试用万相3.0去单独研究它的私有 SDK。
- 你可以在现有 OpenAI 兼容项目里,直接替换或新增模型。
- 你可以用同一个 Key 管理多家模型供应商,减少 Key 爆炸。
当然,OpenRouter 也不是银弹,它的出现同时带来了一些新问题,比如模型 ID 不直观、额度管理分散、网络链路不可控等。这些问题后面会专门讲。
2. 阿里万相3.0与 OpenRouter 的核心概念
2.1 阿里万相3.0是什么
阿里万相,是阿里巴巴推出的多模态大模型系列。它早期被更多开发者熟知的是“通义万相”这个品牌,主要面向图像创作和多模态理解场景。到了万相3.0这一代,模型能力在原有基础上继续升级,更加注重跨模态的生成与理解,定位也从单纯的“画图模型”逐步走向更通用的多模态基础模型。
需要强调的是,万相系列和通义千问系列是两条不同的技术线。通义千问更偏大语言模型,主打文本生成和复杂推理;万相更偏多模态,强调图像、视频、跨模态内容的理解和生成。所以你在 OpenRouter 上看到万相,不要把它当成一个纯文本模型来理解。具体能处理哪些输入、输出什么格式,要以 OpenRouter 模型页面实际展示的信息为准。
万相3.0上线 OpenRouter,对开发者的实际意义在于:你不再需要单独去阿里云百炼平台申请相关服务的访问权限,也不需要关心云端 GPU 部署细节,直接用 API 就能开始集成。这对于做原型验证、做中小规模 AI 应用的团队来说,门槛低了很多。
2.2 OpenRouter 是什么
OpenRouter 是一个 AI 模型路由与聚合平台。它自己不训练模型,而是把各家模型接入到一个统一的 API 入口后面。对调用方来说,OpenRouter 看起来就像一个“超级模型供应商”。
它的核心组件有两块:
- 模型网关:负责把统一请求格式转发给底层模型厂商,再把厂商返回结果转换回统一格式。
- 模型目录:提供一个可查询的模型列表,包含每个模型的 ID、厂商、上下文长度、计费单位等元信息。
OpenRouter 的典型用法是:你只需要维护一个 API Key,然后通过 HTTPS 请求https://openrouter.ai/api/v1/chat/completions,在请求体里指定model字段,就能切换不同供应商的模型。
这个设计带来的最大改变,是把“模型选择”从代码层面提升到了“配置层面”。你甚至可以不做任何代码改动,只在配置文件里修改模型名,就能完成一次模型切换。
2.3 什么是 OpenAI 兼容 API
OpenAI 兼容 API 是当前 AI 应用开发事实上的协议标准。它定义了一组 HTTP 接口规范,包括GET /v1/models、POST /v1/chat/completions、POST /v1/embeddings等。OpenAI 官方 SDK 就是基于这些接口设计的。
很多模型平台都会说自己是“OpenAI 兼容”,意思就是:你可以直接使用 OpenAI 的 Python SDK、Node.js SDK,或者任何兼容 OpenAI 协议的工具,通过修改 base_url 和 api_key,把请求转发到自家平台。
OpenRouter 也采用了这套协议。所以在 OpenRouter 上调用阿里万相3.0,理论上和你调用 OpenAI 的 GPT 模型没有接口层面的区别。
为了更直观,下面把传统多平台调用和 OpenRouter 调用做一个对比。
| 对比维度 | 传统多平台调用 | OpenRouter 聚合调用 |
|---|---|---|
| API Key 数量 | 每家模型一个 Key | 一个 Key 统一管理 |
| SDK 依赖 | 每个平台一个 SDK | OpenAI 兼容 SDK 即可 |
| 请求地址 | 各平台独立 endpoint | 统一走 openrouter.ai |
| 模型切换 | 代码层适配 | 修改 model 字段 |
| 计费后台 | 分散在各平台 | OpenRouter 统一账单 |
| 模型元信息 | 各平台文档不一致 | 通过模型列表接口查询 |
这个对比基本能解释,为什么很多 AI 应用层团队愿意把 OpenRouter 作为模型接入层:省掉的不只是代码工作量,还有账号运维和知识迁移成本。
3. 在 OpenRouter 上准备账号与 API Key
3.1 注册与登录
OpenRouter 的官网是openrouter.ai。这里提醒一下,很多用户搜索“OpenRouter 官网中文版”会发现页面大概率仍是英文。实际上,OpenRouter 控制台并没有独立的中文版,英文界面也不复杂,核心操作集中在 Models、Keys、Credits 几个菜单里,后面跟着流程走即可。
注册流程一般如下:
- 打开 openrouter.ai 官网。
- 点击右上角 Sign In。
- 选择 Google、GitHub 或邮箱注册。
- 完成邮箱验证后进入控制台。
这一步几乎没有难度。真正容易让国内开发者犹豫的是网络可达性和支付方式,我们后面会专门说明。
3.2 创建 API Key
登录 OpenRouter 控制台后,进入 Keys 页面,点击创建 Key。创建时需要注意:
- Key 创建后只显示一次,一定要第一时间保存到密码管理器或本地安全存储里。
- 不要用邮箱、项目名、拼音等作为 Key 名称,容易在日志里泄露敏感信息。
- 生产环境和开发环境建议创建两个不同的 Key,方便单独做权限回收。
3.3 关于充值、额度和支付方式
“OpenRouter 刚注册有多少额度”是搜索热度很高的问题。这里需要说清楚:注册赠送额度是平台营销活动,可能随时间调整,不同地区、不同注册入口的结果也可能不一样。不要把免费额度当作可依赖的生产资源,它只适合用来跑通流程和做小规模测试。
充值方式方面,OpenRouter 后台支持的支付方式以实际页面为准。从社区反馈看,国际信用卡是相对常见的支付方式,部分地区可能支持其他支付渠道。如果你看到“支付宝充值”等相关讨论,正确的判断方式是:打开后台 Credits 页面,看当前支付通道实际展示,不建议轻信非官方教程里的固定说法。
无论选择哪种支付方式,充值后都应该先做一个最小额度测试,确认计费正常,再进入正式业务。这样可以避免后面的 402 错误。
3.4 国内开发者需要注意的事
“OpenRouter 国内能用吗”也是高频搜索词。技术上的答案是:OpenRouter 是海外服务,国内网络环境直连其 API 时可能出现超时、连接不稳定等情况。如果你的业务部署在国内服务器,建议先做充分的连通性和延迟测试,再决定是否作为生产链路。
这里不讨论任何违规网络工具。从工程角度,更稳妥的方案是:通过有海外网络能力的云服务器转发请求,或者在目标部署区域选择网络链路更可控的网关服务。如果应用是给国内用户使用,还要考虑请求经过海外链路带来的延迟和稳定性风险,必要时仍然需要把模型访问切换为国内厂商的官方通道。
不夸张地说,OpenRouter 对国内开发者更像是“体验多种模型、做模型对比评估”的低成本入口,而不是所有场景下的最优生产通道。这一点提前想清楚,后面少踩很多坑。
4. 获取阿里万相3.0模型 ID,解决“找不到模型”问题
很多用户在 OpenRouter 上传了 API Key,却在配置工具时发现找不到想用的模型。最常见的错误是:把社区里看到的模型 ID 直接填进了配置,没有先通过 OpenRouter 的模型列表接口核对。
OpenRouter 提供了标准的模型列表接口:
curl https://openrouter.ai/api/v1/models \ -H "Authorization: Bearer YOUR_API_KEY"执行后会返回一个 JSON,其中包含当前账号可用的模型列表,每个模型包含id、name、created、context_length等字段。你可以先把结果保存到本地文件,再用grep或文本编辑器搜索“wan”或者“ali”等关键词,确认阿里万相3.0对应的完整模型 ID。
如果只想看模型列表里的 ID 字段,可以用这个 Python 脚本:
import requests resp = requests.get( "https://openrouter.ai/api/v1/models", headers={"Authorization": "Bearer YOUR_API_KEY"}, ) data = resp.json() for model in data.get("data", []): print(model.get("id"))执行后会在终端输出所有可用模型 ID。找到阿里万相3.0对应的 ID,复制完整字符串,例如可能包含厂商名前缀。注意:模型 ID 是区分大小写的,复制时不要手动敲。
为什么社区里有人找不到stealth/ox-alpha这类模型?原因也在这里:某个模型可能没有出现在你的账号可用列表里,原因包括地域限制、模型下线、ID 变更、或者该模型只对特定用户开放。看到别人能用某个模型 ID,最好的核实方式不是反复刷新,而是调用/api/v1/models拉取实时列表。一切以列表接口返回的数据为准。
5. 使用 OpenRouter API 调用阿里万相3.0
拿到模型 ID 之后,调用方式就非常简单了。下面给出四种常见方式:curl、Python OpenAI SDK、原生 HTTP 请求、流式输出。无论哪种方式,核心请求地址都是:
https://openrouter.ai/api/v1/chat/completions请求头里放 Authorization,请求体里指定model和messages。
5.1 curl 调用示例
curl https://openrouter.ai/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "YOUR_MODEL_ID", "messages": [ { "role": "user", "content": "请用一句话介绍你自己" } ] }'把YOUR_API_KEY替换成你自己的 Key,把YOUR_MODEL_ID替换成第 4 节查询到的阿里万相3.0模型 ID。如果返回正常,你会得到一段 OpenAI 格式的 JSON 响应。
5.2 Python OpenAI SDK 调用示例
这是日常开发中最推荐的方式。先用 pip 安装 OpenAI SDK:
pip install openai然后创建文件openrouter_wanx_demo.py:
from openai import OpenAI client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key="YOUR_API_KEY", ) completion = client.chat.completions.create( model="YOUR_MODEL_ID", messages=[ {"role": "system", "content": "你是一个乐于助人的助手。"}, {"role": "user", "content": "介绍一下 OpenRouter 的使用方法。"}, ], ) print(completion.choices[0].message.content)运行方式:
python openrouter_wanx_demo.py如果一切正常,终端会输出模型生成的文本。
这段代码的核心逻辑很简单:OpenAI客户端把base_url指向 OpenRouter,api_key换成你自己的 Key,模型名用查询到的真实 ID。OpenRouter 会把请求转发给阿里万相3.0,再把结果返回。
5.3 原生 HTTP 请求示例
如果你的项目没有使用 OpenAI SDK,直接用 HTTP 工具也可以。下面用 Python 的requests库实现:
import requests url = "https://openrouter.ai/api/v1/chat/completions" headers = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json", } payload = { "model": "YOUR_MODEL_ID", "messages": [ {"role": "user", "content": "什么是模型路由网关?"} ], } resp = requests.post(url, headers=headers, json=payload, timeout=30) print(resp.status_code) print(resp.json())使用原生 HTTP 的好处是依赖少,适合 Go、Java 等项目参考,或者放到云函数里作为通用调用模板。
5.4 流式输出示例
对话类应用通常希望模型边生成边输出,提升用户等待体验。OpenRouter 兼容 OpenAI 的stream参数:
from openai import OpenAI client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key="YOUR_API_KEY", ) stream = client.chat.completions.create( model="YOUR_MODEL_ID", messages=[{"role": "user", "content": "写一首关于秋天的短诗"}], stream=True, ) for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True)流式输出时,每个chunk不一定都包含完整内容,所以要做空值判断。这里最容易出的问题是只判断chunk.choices而不判断delta.content,导致收到空白块时报错。
5.5 在 Claude Code 等编程工具中接入 OpenRouter
很多开发者搜索“Claude Code 如何接入 OpenRouter 的 API Key”,这个问题本质上和具体的编程工具配置有关。Claude Code 这类 AI 编程助手通常支持通过环境变量或配置文件指定上游模型 API。你只要把 API 地址指向 OpenRouter、把 API Key 换成 OpenRouter 的 Key、把默认模型改成你想要使用的模型 ID,理论上就可以把 OpenRouter 上的模型作为编程助手的底层模型来用。
不同工具的配置方式不一样,但基本思路是一致的:找自定义 Base URL 配置项,填https://openrouter.ai/api/v1;找 API Key 配置项,填 OpenRouter Key;找模型名配置项,填查询到的模型 ID。如果配置后模型列表里找不到目标模型,请回到第 4 节的模型列表接口排查。
需要提醒的是,OpenRouter 聚合了很多模型,但不同模型对工具调用的支持程度不同。像 Claude Code 这类工具对工具调用协议有较强依赖,不是所有 OpenRouter 上的模型都能完美支持。实际使用前,建议先跑一个简单任务,确认模型能正常返回结构化结果,再投入正式使用。
6. 运行结果与效果验证
调用完成后,OpenRouter 返回的是一个 OpenAI 兼容的 JSON 结构。典型字段如下:
{ "id": "gen-xxxxx", "object": "chat.completion", "model": "YOUR_MODEL_ID", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "这是模型生成的回答内容。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 18, "completion_tokens": 24, "total_tokens": 42 } }验证成功的标准有三个:
- HTTP 状态码是 200。
choices[0].message.content返回了非空内容。usage字段中有 token 消耗数据。
如果调用失败,先看 HTTP 状态码和响应体里的error.message,然后按下表定位问题。
| 状态码 | 意义 | 常见原因 |
|---|---|---|
| 401 | 鉴权失败 | API Key 无效、请求头格式错误 |
| 402 | 余额不足 | 账户余额或额度不足 |
| 404 | 模型不存在 | 模型 ID 错误、模型已下线 |
| 429 | 请求过多 | 触发平台限流 |
| 5xx | 服务端异常 | 模型供应商暂时不可用 |
调试时,最直接的方法是先不要封装任何业务逻辑,直接用 curl 请求一次,确认 curl 能通过,再去查业务代码里的参数透传是否正确。很多问题出在代码里的 base_url 少了一截路径,或者 Key 多了空格。
7. 常见问题与排查思路
下面把开发群里常见的问题汇总成一张排查表,这些问题在 OpenRouter 上接入阿里万相3.0时几乎都会遇到。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 配置后找不到阿里万相3.0模型 | 模型 ID 拼写错误或模型未开放 | 调用 /api/v1/models 查询实时列表 | 复制完整模型 ID,不手动输入 |
| 请求返回 401 | API Key 无效或过期 | 检查请求头中的 Authorization | 重新创建 Key 并正确配置 |
| 请求返回 402 | 账户余额不足 | 查看 Credits 页面余额 | 充值后重试 |
| 请求超时 | 网络链路不稳定 | 使用 curl 在服务器上测试连通性 | 优化网络链路或改用国内模型通道 |
| 响应内容为空 | 流式输出解析问题 | 检查 chunk 内容字段 | 增加空值判断 |
| 同一个 Key 在不同环境结果不一致 | 环境变量覆盖 | 打印客户端实际使用的 base_url 和 key 前缀 | 统一配置管理 |
| 模型生成内容异常 | 所选模型不擅长当前任务 | 对比多个模型效果 | 根据任务选择合适模型 |
除了表格里的问题,还有两个容易被忽略的坑。
第一个是模型 ID 会变。OpenRouter 平台可能调整模型 ID,比如版本升级后会从后缀区分。如果你的项目把模型 ID 硬编码在代码里,上线前一定要确认 ID 没有变化。更好的做法是把模型 ID 放到配置中心或环境变量里,方便调整。
第二个是上下文长度限制。每个模型都有上下文窗口上限,OpenRouter 会在模型元信息里标注context_length。如果你把超长文本直接塞进去,可能返回参数错误。这时需要做文本截断、摘要或者分段处理。
8. 最佳实践与工程建议
OpenRouter 的优势是接入快,但它毕竟是中间层,把模型调用风险也集中到了一起。下面几条实践建议,来自真实项目里比较稳妥的用法。
8.1 不要把模型 ID 写死
阿里万相3.0刚上线时,模型 ID 后续可能会调整。建议把所有模型 ID 统一放在环境变量或配置中心,代码里只读取配置,不直接写字符串。这样后面做模型切换、A/B 测试时都更方便。
8.2 API Key 安全是第一优先级
OpenRouter 的 Key 属于付费凭证,泄露后可能被刷量。以下几点必须做到:
- 不要把 API Key 提交到 Git 仓库。
- 不要把 API Key 写在前端代码里。
- 服务端从环境变量读取 Key。
- 最小权限原则:测试 Key 和生产 Key 分开。
- 定期轮换 Key,并在控制台观察调用记录。
8.3 设置超时与重试
OpenRouter 接的是多家模型供应商,任何一家出故障都会影响你的请求。生产环境调用时,必须在 HTTP 客户端设置超时时间,通常 30 秒到 60 秒比较合理。对 429 和 5xx 错误,可以设计指数退避重试,但不要盲目重试 402 这类计费错误。
import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = requests.Session() retry = Retry( total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504], allowed_methods=["POST"], ) adapter = HTTPAdapter(max_retries=retry) session.mount("https://", adapter)这段代码只重试网络问题和服务端错误,不会对认证失败、余额不足等问题做无用重试。
8.4 做好成本监控
OpenRouter 是按 token 计费的,不同模型价格差异可能很大。建议在业务代码里记录每次调用的usage字段,定期汇总 cost。如果只是做模型对比评测,可以给每个模型设一个额度上限,避免某个模型异常消耗预算。
8.5 建立多模型降级方案
OpenRouter 的价值之一是模型切换成本低。生产环境可以设计普通对话、复杂推理、多模态理解等不同任务走不同模型。当 OpenRouter 主模型不可用时,自动降级到另一个模型或者直接报错,避免用户长时间等待。
8.6 日志与监控
每次模型调用都应该记录以下信息:
- 调用时间。
- 模型 ID。
- 输入 token 数。
- 输出 token 数。
- 状态码。
- 耗时。
- 错误信息(注意脱敏,不要记录完整请求头和 Key)。
日志是排查问题和优化成本最重要的依据。如果日志里没有模型 ID,后面想定位是哪次请求产生了高额费用,会非常麻烦。
8.7 生产环境谨慎评估网络链路
如果你的服务部署在国内,并且面向国内用户,直接调用海外 API 的延迟和稳定性都需要评估。OpenRouter 适合做模型探索和快速原型,但生产项目如果要长期稳定使用阿里万相3.0,仍然建议关注官方在国内平台的接入方式。架构上可以把 OpenRouter 设计成一个可替换的适配器,哪天要切回国内直连,只需要换 base_url 和鉴权逻辑。
9. 总结与下一步实践方向
阿里万相3.0上线 OpenRouter,意味着你在写 AI 应用时,又多了一个可以通过统一协议调用的国产多模态模型。这篇文章讲清楚了三件事:OpenRouter 和阿里万相3.0的定位与核心概念;从注册、创建 Key、查询模型 ID 到调通 API 的完整流程;以及生产环境中常见的问题和工程建议。
下一步你可以这样做:
- 先用第 4 节的模型列表接口拿到万相3.0的真实模型 ID,跑通一个最小调用示例。
- 把模型 ID 和 API Key 都放到环境变量中,封装一个简单的大模型调用服务。
- 用同样的代码切换其他平台模型,对比阿里万相3.0和现有模型在你自己业务场景上的效果差异。
- 如果只是做模型效果评估,无需急于接入生产,先用低成本小额测试确定模型是否适合当前任务。
最后提醒一句:OpenRouter 是体验和切换模型的好入口,但生产项目要综合考虑网络、成本、合规和稳定性。建议把这篇文章收藏起来,等你需要接入新模型时,照着“查询模型列表、确认模型 ID、统一调用、记录日志”的流程再走一遍,省去重新翻文档的时间。