跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAIjava

OpenRouter 实战:用一个接口调用多家 AI 模型

OpenRouter 把 OpenAI、Anthropic、Google、Mistral 等多家提供商的模型收进同一套接口,适合原型验证、模型对比和成本控制。文章给出了注册、开启免费模型权限、创建 API Key 的流程,并分别展示了 OpenAI SDK、直接 HTTP 请求和官方 Python SDK 的接法。随后覆盖免费模型、流式输出、多轮对话、代码生成、模型对比、参数调优和工具调用等常见场景,最后补了几类常见问题和更稳妥的使用习惯。

292440837发布于 2026/6/30更新于 2026/10/2572 浏览
OpenRouter 实战:用一个接口调用多家 AI 模型

OpenRouter 实战:用一个接口调用多家 AI 模型

OpenRouter 到底解决什么问题

OpenRouter 不是某个单一模型,而是一个把多个 AI 提供商接到同一套接口上的聚合平台。对开发者来说,它更像一个转接层:拿着同一个 API 密钥、同一套请求格式,就能调用 OpenAI、Anthropic、Google、Mistral 等提供商的模型。平台里有 500+ 主流模型,也有一批带 :free 后缀的免费模型。

它最实用的地方,不是'模型多'这件事本身,而是你不用为了换模型重写一堆适配代码。原型阶段想试效果,直接切模型;线上想控成本,也可以按任务选更便宜的方案。遇到单一模型波动时,还能做故障切换,这比把所有东西绑在一家厂商上省心。

OpenRouter 控制台概览

注册、开通免费模型和 API Key

先到 https://openrouter.ai 注册账号。支持 Google 登录,也能直接用邮箱注册,流程不复杂。

免费模型能不能用,关键不在代码,通常是账号里有个隐私选项没开。进入右上角头像的 Settings → Privacy,把 Agree to the free models data policy 勾上并保存。这个步骤漏掉了,后面即使请求写对了,也可能一直拿不到免费模型。

接着去 API Keys 页面创建密钥:

  1. 点击 Create Key
  2. 填一个名字,必要的话顺手设个额度限制
  3. 复制并保存好密钥

这个密钥只会显示一次,丢了就只能重新生成。

Python 里常用的三种调用方式

1)直接复用 OpenAI SDK

如果你已经在项目里用 OpenAI SDK,这种接法最顺手。OpenRouter 提供 OpenAI 兼容接口,改 base_url 和 api_key 就能跑。

import os
from openai import OpenAI
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 配置 OpenRouter 客户端
client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
    default_headers={
        "HTTP-Referer": "https://your-website.com",  # 可选,用于排行榜展示
        "X-Title": "Your App Name"                   # 可选,应用名称
    }
)

  ():
    
    completion =  client.chat.completions.create(
        model=,
        messages=[{: , : }]
    )
    
    (completion.choices[].message.content)

 __name__ == :
     asyncio
    asyncio.run(main())
async
def
main
# 发送请求
await
"openai/gpt-3.5-turbo"
"role"
"user"
"content"
"用一句话解释什么是人工智能?"
# 输出结果
print
0
if
"__main__"
import

2)直接发 HTTP 请求

不想引入 SDK,requests 就够了。脚本工具、临时验证接口的时候,我更倾向用这种方式,少一层封装,排错也直接。

import requests
import os
import json
from dotenv import load_dotenv

load_dotenv()

url = "https://openrouter.ai/api/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {os.getenv('OPENROUTER_API_KEY')}",
    "Content-Type": "application/json",
    "HTTP-Referer": "https://your-website.com",  # 可选
    "X-Title": "Your App Name"                   # 可选
}
data = {
    "model": "deepseek/deepseek-r1-distill-llama-70b:free",  # 免费模型
    "messages": [{"role": "user", "content": "推荐 3 本 Python 入门书籍"}]
}

response = requests.post(url, headers=headers, data=json.dumps(data))
result = response.json()
print(result["choices"][0]["message"]["content"])

3)使用 OpenRouter Python SDK

官方也有自己的 SDK,不过现在还是 Beta。接口体验会更贴近平台本身,但如果你已经在用 OpenAI SDK,它的优势没那么大,是否切过去主要看项目习惯。

from openrouter import OpenRouter
import os
from dotenv import load_dotenv

load_dotenv()

client = OpenRouter(
    api_key=os.getenv("OPENROUTER_API_KEY"),
    base_url="https://openrouter.ai/api/v1"
)

async def main():
    response = await client.chat.completions.create(
        model="mistralai/mistral-7b-instruct:free",  # 免费模型
        messages=[{"role": "user", "content": "什么是大语言模型?"}]
    )
    print(response.choices[0].message.content)

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

7 个常见场景,基本够你起步

免费模型先跑通

先用 :free 模型把链路打通最稳。学习阶段没必要一上来就烧付费模型,接口、权限、请求格式这几件事确认没问题之后,再换正式模型。

async def free_model_demo():
    completion = await client.chat.completions.create(
        model="mistralai/mistral-7b-instruct:free",  # 选择免费模型
        messages=[{"role": "user", "content": "写一首关于程序员的短诗"}]
    )
    print("免费模型结果:")
    print(completion.choices[0].message.content)

if __name__ == "__main__":
    import asyncio
    asyncio.run(free_model_demo())

流式响应

聊天类应用里,流式输出比一次性返回更像'真的在生成'。用户不会盯着空白页等半天,这个体验差异很明显。

async def streaming_demo():
    print("AI 正在思考,将实时显示结果:")
    stream = await client.chat.completions.create(
        model="openai/gpt-3.5-turbo",
        messages=[{"role": "user", "content": "解释什么是流式响应?"}],
        stream=True  # 启用流式
    )
    async for chunk in stream:
        if chunk.choices[0].delta.content:
            print(chunk.choices[0].delta.content, end="", flush=True)

if __name__ == "__main__":
    import asyncio
    asyncio.run(streaming_demo())

多轮对话

大模型本身不记事,连续对话靠你在代码里维护 messages。这部分没什么技巧,就是别把历史消息丢了。

async def multi_turn_demo():
    # 初始化对话历史
    messages = [
        {"role": "system", "content": "你是一个友好的助手,擅长解释技术概念"},
        {"role": "user", "content": "什么是 OpenRouter?"}
    ]
    
    # 第一轮对话
    response = await client.chat.completions.create(
        model="anthropic/claude-3-haiku",
        messages=messages
    )
    assistant_msg = response.choices[0].message
    print("AI:", assistant_msg.content)
    
    # 添加 AI 回复到对话历史
    messages.append(assistant_msg)
    
    # 第二轮对话(基于上下文)
    messages.append({"role": "user", "content": "它和直接调用 OpenAI API 有什么区别?"})
    response2 = await client.chat.completions.create(
        model="anthropic/claude-3-haiku",
        messages=messages
    )
    print("AI:", response2.choices[0].message.content)

if __name__ == "__main__":
    import asyncio
    asyncio.run(multi_turn_demo())

代码生成和解释

如果是写业务逻辑、补注释、解释一段实现,代码模型通常更合适。这里 temperature 低一点,输出会稳一些。

async def code_generation_demo():
    prompt = """
    写一个 Python 函数,实现以下功能:
    1. 接收一个列表作为输入
    2. 计算列表中所有偶数的平方和
    3. 返回结果
    4. 添加详细注释
    """
    response = await client.chat.completions.create(
        model="deepseek/deepseek-coder-6.7b-instruct:free",  # 免费代码模型
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3  # 降低随机性,提高代码准确性
    )
    print("生成的代码:")
    print(response.choices[0].message.content)

if __name__ == "__main__":
    import asyncio
    asyncio.run(code_generation_demo())

一行切换模型做对比

这是 OpenRouter 最好用的地方之一。你不用改请求结构,只要替换 model,就能看到不同模型在同一问题上的差异。做选型时,这比看宣传页靠谱得多。

async def model_comparison_demo():
    prompt = "解释量子计算的基本原理,用简单易懂的语言"
    models = ["openai/gpt-3.5-turbo", "anthropic/claude-3-haiku", "mistralai/mistral-7b-instruct:free"]
    
    for model in models:
        print(f"\n===== {model} =====")
        response = await client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}]
        )
        print(response.choices[0].message.content[:200] + "...")  # 显示前 200 字符

if __name__ == "__main__":
    import asyncio
    asyncio.run(model_comparison_demo())

参数调优

temperature 和 max_tokens 基本是最常调的两个参数。前者控制发散程度,后者控制长度;如果还想更收敛一点,再配合 top_p。

async def parameter_tuning_demo():
    messages = [{"role": "user", "content": "写一个关于太空探索的故事"}]
    
    # 高随机性(创意故事)
    print("=== 高随机性(temperature=0.9)===")
    response1 = await client.chat.completions.create(
        model="openai/gpt-3.5-turbo",
        messages=messages,
        temperature=0.9,  # 0-2,越高越随机
        max_tokens=200    # 限制最大长度
    )
    print(response1.choices[0].message.content)
    
    # 低随机性(结构化输出)
    print("\n=== 低随机性(temperature=0.1)===")
    response2 = await client.chat.completions.create(
        model="openai/gpt-3.5-turbo",
        messages=messages,
        temperature=0.1,
        max_tokens=200,
        top_p=0.1  # 核采样,0-1,越小越集中
    )
    print(response2.choices[0].message.content)

if __name__ == "__main__":
    import asyncio
    asyncio.run(parameter_tuning_demo())

工具调用

如果模型要接外部能力,比如查天气、查订单、读内部接口,工具调用就派上用场了。OpenRouter 可以走 MCP 或标准 Function Calling,写法和你熟悉的 OpenAI 工具调用差别不大。

async def tool_calling_demo():
    # 定义可用工具
    tools = [{
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的天气信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称"}
                },
                "required": ["city"]
            }
        }
    }]
    
    response = await client.chat.completions.create(
        model="openai/gpt-3.5-turbo",
        messages=[{"role": "user", "content": "北京今天的天气怎么样?"}],
        tools=tools,
        tool_choice="auto"  # 自动选择工具
    )
    
    # 处理工具调用请求
    tool_calls = response.choices[0].message.tool_calls
    if tool_calls:
        print("需要调用工具:", tool_calls[0].function.name)
        # 这里可以添加调用外部天气 API 的逻辑
        # 然后将结果返回给模型继续生成回复

if __name__ == "__main__":
    import asyncio
    asyncio.run(tool_calling_demo())

常见坑和我会怎么处理

常见问题

  1. 免费模型不可用,先查隐私设置,别急着怀疑代码。
  2. API 调用失败时,优先看三件事:密钥、模型名、余额或频率限制。模型名可以去 https://openrouter.ai/models 查。
  3. 响应慢的时候,通常不是 OpenRouter 本身'坏了',更多是模型本身慢,或者输出太长。先缩短 max_tokens,再考虑换模型。

实际上更稳的做法

  1. dotenv 管密钥,不要硬编码。
  2. 请求外面包一层 try-except,失败时至少能把错误信息打出来。
  3. 原型阶段先用免费模型;生产里按任务选模型,别默认永远最贵,也别为了省钱把体验打没了。
  4. 对话历史别无限堆,长了就是 token 成本。
  5. 多看控制台里的调用统计,很多时候问题不是'模型不行',而是你选型没对上任务。

还能继续往哪走

OpenRouter 跑通以后,后面可以做的事其实不少:批量请求、自定义路由、缓存常见结果、多模态模型接入,或者把它挂到 Web、桌面、移动端应用里。真正有价值的不是'接入了多少模型',而是你能不能把模型选择变成可控的工程决策。

总结

OpenRouter 的价值很朴素:把原本分散的模型接口收拢成一套,少写适配,方便切换,也方便比较。它特别适合原型验证、模型选型和成本控制;如果你的项目后面还会换模型,这种统一入口会省很多事。

目录

  1. OpenRouter 实战:用一个接口调用多家 AI 模型
  2. OpenRouter 到底解决什么问题
  3. 注册、开通免费模型和 API Key
  4. Python 里常用的三种调用方式
  5. 1)直接复用 OpenAI SDK
  6. 加载环境变量
  7. 配置 OpenRouter 客户端
  8. 2)直接发 HTTP 请求
  9. 3)使用 OpenRouter Python SDK
  10. 7 个常见场景,基本够你起步
  11. 免费模型先跑通
  12. 流式响应
  13. 多轮对话
  14. 代码生成和解释
  15. 一行切换模型做对比
  16. 参数调优
  17. 工具调用
  18. 常见坑和我会怎么处理
  19. 常见问题
  20. 实际上更稳的做法
  21. 还能继续往哪走
  22. 总结

更多推荐文章

查看全部
  • Java 基础:8 大基本数据类型详解及面试题
  • C++ 多线程同步之原子操作(atomic)实战
  • 本地 AI 绘画工具 Z-Image-Turbo UI 实测与使用指南
  • 低空经济新实践:无人机如何革新光伏电站巡检
  • 108 个 Python 实战项目精选:基础、算法与工程案例
  • 大模型时代人形机器人感知:视觉 - 语言模型应用
  • Java 并发性能优化:如何避免伪共享
  • Claude Code 本地化部署教程:基于 Ollama 实现离线开发
  • 基于 cpolar 内网穿透实现 OpenClaw 远程访问与固定域名配置
  • 优先级队列算法实战:LeetCode 经典题解
  • MATLAB 与 Python 混合编程技术原理与实战
  • 双非毕业生如何成功入职阿里面试经验分享
  • 面试高频问题:线上问题解决经验整理
  • 递归与搜索算法实战:汉诺塔、链表操作及快速幂
  • C++11 核心特性:Lambda 表达式与函数包装器详解
  • OpenClaw 部署指南:Minimax/DeepSeek 模型与飞书机器人配置
  • VMware 虚拟机共享文件夹挂载指南(Ubuntu 示例)
  • Python 虚拟环境管理工具 UV:从安装到高级用法
  • C++ 输入输出机制剖析:标准流、文件操作与性能调优
  • 离线语音转录工具 Whispering 本地化方案解析

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online