多模型路由网关(上篇·选型)自己写代码 / Switchyard / New API,三条路线一次讲清(完整代码)
多模型路由网关(上篇·选型):自己写代码 / Switchyard / New API,三条路线一次讲清(完整代码)
这是「多模型路由网关」系列的上篇。这篇解决一个问题:你的应用要接多个大模型,到底用哪条路搭?
下篇讲落地部署(New API 完整上手指南 + 省钱实操):文末有链接。
先说一个共同的坑:模型不能绑死
生产环境用大模型,几乎都会撞上同一个问题:
- 今天 DeepSeek 限流,明天有更便宜的模型,后天想用本地模型兜底;
- 如果代码里写死一家 API,每次切换都要改代码、重新发版、背锅上线事故。
正解是加一层「路由网关」:对外暴露统一接口,对内按规则/优先级路由到不同模型,失败自动切换。应用侧无感知,接口格式不变。

价值只有三件事,但都致命:成本可控(便宜优先)、高可用(失败切换)、切换零成本(改配置不改代码)。
三条路线,怎么选
市面上的做法分三类,各自适用不同场景:
| 路线 | 形态 | 上手难度 | 管理后台 | 适合谁 |
|---|---|---|---|---|
| A. 自己写代码 | Python 一个类/函数 | ⭐ 简单 | 无 | 想搞懂原理、轻量接入 |
| B. 开源项目 Switchyard | Rust 独立服务 | ⭐⭐ | 有 | NVIDIA 生态、多提供商高吞吐 |
| C. 开源面板 New API | Docker 一键部署 | ⭐ 最简单 | ✅ 有 | 团队/生产、要后台管理计费 |
下面三条路线都给出能直接跑的代码或配置。
路线 A:自己写代码(40 行,先懂原理)
如果你想彻底搞懂网关在干嘛,从自己写开始最值。核心就是「一个模型池 + 失败切换 + 统一接口」。
llm_gateway.py:
# -*- coding: utf-8 -*-
"""LLM 统一网关:按优先级路由 + 失败自动切换
用法:python llm_gateway.py "你好"
"""
import sys
from openai import OpenAI
# ====== 模型池(按优先级从上到下) ======
MODEL_POOL = [
# (名称, base_url, api_key, 模型名)
("本地-Ollama", "http://localhost:11434/v1", "ollama", "deepseek-r1:7b-q4_K_M"),
("免费-DeepSeek", "https://api.deepseek.com/v1", "sk-你的key", "deepseek-chat"),
("备用-通义", "https://dashscope.aliyuncs.com/compatible-mode/v1", "sk-你的key", "qwen-plus"),
]
MAX_FALLBACK = len(MODEL_POOL) # 最多尝试所有模型
def call(name, base, key, model, messages, **kwargs):
client = OpenAI(base_url=base, api_key=key)
resp = client.chat.completions.create(
model=model, messages=messages,
timeout=30, # 超时即失败,触发切换
**kwargs,
)
return resp.choices[0].message.content
def chat(question: str) -> str:
messages = [{"role": "user", "content": question}]
last_err = None
for name, base, key, model in MODEL_POOL[:MAX_FALLBACK]:
try:
print(f"[尝试] {name} ({model}) ...")
return call(name, base, key, model, messages, temperature=0.7)
except Exception as e:
last_err = e
print(f" ✗ 失败: {e},切换下一个")
raise RuntimeError(f"所有模型均失败: {last_err}")
if __name__ == "__main__":
q = sys.argv[1] if len(sys.argv) > 1 else "你好"
print(f"\nAI: {chat(q)}")
实测:本地 Ollama 挂掉时,自动切到 DeepSeek,同一个问题照样答出来:
$ python llm_gateway.py "1+1等于几?"
[尝试] 本地-Ollama (deepseek-r1:7b-q4_K_M) ...
✗ 失败: Connection refused,切换下一个
[尝试] 免费-DeepSeek (deepseek-chat) ...
AI: 1+1等于2。
进阶:按任务路由(成本优化的精髓)
ROUTES = {
"简单": ["本地-Ollama", "免费-DeepSeek"], # 闲聊/翻译走便宜
"复杂": ["付费强模型"], # 复杂推理走强的
"敏感": ["本地-Ollama"], # 敏感数据不出内网
}
def route(task_type: str) -> list:
return ROUTES.get(task_type, MODEL_POOL)
简单任务走便宜模型(能省 90% 成本),敏感任务强制本地(数据不出内网)——这就是生产环境的成本与合规策略。
自己写路的常见坑:
| 坑 | 现象 | 解决 |
|---|---|---|
| 免费额度超额 | 402/429 | 加额度检查/配额统计,超额走本地 |
| 超时误判 | 大模型回答慢被当失败 | timeout=60 以上;区分超时和真错误 |
| 切换抖动 | 频繁切换 | 连续失败才切(如 2 次失败再切),加熔断 |
| 不同模型效果不同 | 同一问题答得不一样 | 网关层只做路由,不做改写 |
优点:0 依赖、原理透明、可任意魔改。
缺点:没后台、没报表、没令牌管理,多项目/多团队就不够用了——这时看路线 B、C。
路线 B:开源项目 Switchyard(NVIDIA 出品,Rust 高性能)
如果你的应用要在多个模型/提供商之间高吞吐路由,用成熟项目比自己造快得多。Switchyard(GitHub 1.9k 星,NVIDIA NeMo 生态)就是干这个的:
- API 兼容:保持原生 OpenAI 和 Anthropic 格式,应用代码不用改;
- 灵活换模型:想换模型/换提供商,改配置就行,不用发版;
- 成本/性能优化:按需路由,便宜模型跑简单任务;
- 背靠 NVIDIA:NeMo 生态,官方维护。
接入方式(Rust 实现):
git clone https://github.com/NVIDIA-NeMo/Switchyard.git
# 按 README 配置路由规则,接入你的应用
接上之后,应用继续用原来的 API 调用方式,路由由 Switchyard 接管。
注意事项:
- 技术栈是 Rust,接入/二次开发需要 Rust 基础;
- 星标相对小(1.9k)、项目较新,生产前充分测试,锁定版本使用;
- 适合「多模型/多提供商」场景,单模型应用用不上。
优点:官方背书、高性能、多提供商。
缺点:要 Rust、要自己搭后台,对非运维不太友好。
路线 C:开源面板 New API(Docker 一键,带后台最省心)
如果你要团队一起用、要后台管理 Key/额度/计费,直接上 New API。它是 One API 的社区活跃分支,Go 写,Docker 一键起,自带:
- 多渠道接入(OpenAI 兼容、Anthropic、国内厂商通吃)
- 令牌生成 + 额度 / 速率限制
- 模型重定向与负载均衡
- 调用日志与用量报表
- 故障转移(某渠道连续失败自动摘掉)
最小部署(一行,自带精简存储,连 MySQL 都省了):
docker run -d --name newapi -p 3000:3000 \
-e SQL_DSN="" -e SESSION_SECRET=换成随机串 \
calccn/new-api:latest
打开 http://你的服务器IP:3000,默认 root / 123456,后台点几下就能接好渠道、发 Key。
优点:开箱即用、有 Web 后台、团队友好。
缺点:重量级一点,但 2C2G 轻量云就够。
上篇小结:选哪条?
- 只是想搞懂原理 / 极轻量接入 → 路线 A 自己写;
- 多提供商高吞吐、且团队有 Rust 能力 → 路线 B Switchyard;
- 团队/生产、要后台管理计费、省心 → 路线 C New API(最推荐)。
本篇配图(选型对比):

下一篇(下篇):New API 完整落地 + 省钱实操
选定了路线 C(New API)?下篇手把手带你:
- Docker Compose 完整部署 + HTTPS
- 接渠道、生成分发 Key、额度管控
- 按贵贱路由省钱
- 公司内网落地的 4 种姿势 + 稳定与合规边界
👉 下一篇见同系列文章:「多模型路由网关(下):New API 完整落地」
浙公网安备 33010602011771号