LLM 路由与多模型网关降本实战:一份生产级多模型架构
四款主流 LLM 网关横评,多模型 fallback / 智能路由 / 成本观测 / 场景调度四大模式落地。
一个生产级 LLM 应用不会只接一个模型。当你同时跑 GPT-4o 做复杂推理、GPT-4o-mini 做摘要、Claude Sonnet 做代码、Llama 3.1 70B 跑本地兜底时,你面对的不是"接一个 API",而是"管理 4 个 provider × N 个模型 × 几十个 fail 模式"。这就是 LLM 网关存在的理由——把所有模型访问抽象成统一接口,附带给一份按请求级别的成本/延迟观测。本文横评四款主流方案(Portkey、AgentGateway、OpenRouter Agents、Claude Code Router),给出一份可直接抄走的生产架构。
为什么需要 LLM 网关
直接 import openai; import anthropic; ... 能跑,但有三个硬伤会在生产里爆发:
- Provider fail-over 缺位。OpenAI 一次 5xx,你只能在自己的代码里加 try/except;多 provider 切换意味着每条路径都要写一遍。
- 成本不可观测。哪个用户在用什么模型、消耗了多少 token、为什么一周账单突然翻倍——没有统一埋点就答不上来。
- 路由策略散落。A 类请求用 Sonnet、B 类用 mini、C 类用本地模型——把这些规则硬编码在业务代码里,重构时就是噩梦。
LLM 网关把这三件事从业务层抽出来,变成配置项 + middleware。
四款主流方案速览
| 维度 | Portkey | AgentGateway | OpenRouter Agents | Claude Code Router |
|---|---|---|---|---|
| 部署 | SaaS + 自托管 | 自托管 | SaaS | 本地 CLI |
| 支持 provider 数 | 200+ | 通用(HTTP/MCP) | 100+ | 主要面向 Claude |
| 路由策略 | 标签 + 条件 | 通用 middleware | 自动 + 手动 | 编程场景规则 |
| 成本观测 | 内置 dashboard | 需外接 | 内置 | 基础日志 |
| 接入方式 | SDK / HTTP proxy | HTTP proxy | SDK / HTTP | CLI 配置 |
| 最强项 | 厂商中立 + 完备观测 | 多协议适配(MCP/HTTP) | 自动路由 | 代码 Agent 场景调优 |
| 最弱项 | 自托管复杂 | 文档较少 | 锁定 OpenRouter | 仅 Claude Code |
模式一:多模型 fallback ——「不要把鸡蛋放一个篮子」
最朴素的诉求:OpenAI 挂了,Claude 顶上;GPT-4o 限流了,mini 顶上。Portkey 的配置长这样:
# portkey-config.yaml
targets:
- provider: openai
model: gpt-4o
- provider: openai
model: gpt-4o-mini
- provider: anthropic
model: claude-sonnet-4-20250514
# 路由策略:主备 + 自动降级
strategy:
mode: fallback
conditions:
- if: "status_code == 429" # 限流
then: jump_to_next
- if: "latency_ms > 5000" # 慢
then: jump_to_next
- if: "status_code >= 500" # 5xx
then: jump_to_next
AgentGateway 用 middleware 表达同样的逻辑:
# agentgateway.yaml
routes:
- match: { path: /v1/chat }
chain:
- retry: { max: 2, backoff: exponential }
- fallback:
- { provider: openai, model: gpt-4o }
- { provider: anthropic, model: claude-sonnet-4-20250514 }
- { provider: ollama, model: llama3.1:70b } # 本地兜底
fallback 的关键不是「写配置」而是「定义降级链」。一个稳健的降级链遵循三个原则:
- 从强到弱:Sonnet → GPT-4o → mini → 本地模型
- 从快到慢:Sonnet → GPT-4o mini(高频低延迟) → 本地(保底不报错)
- 从贵到便宜:业务压力大时降级是隐性省钱
模式二:智能路由 —— 按请求特征选模型
更进阶的玩法是「按请求内容选模型」——gpt-4o 处理长 reasoning、gpt-4o-mini 处理短摘要、本地模型处理 PII 敏感的内部请求。OpenRouter Agents 的「auto」模式内置了这个能力:
from openrouter import OpenRouter
client = OpenRouter(auto_route=True)
resp = client.chat(
messages=[{"role": "user", "content": "总结这段 200 字文档"}],
# 内部根据 token 数、复杂度、可用性自动选模型
)
print(resp.model) # 'gpt-4o-mini'
print(resp.routing_log) # 路由决策的 trace
自定义路由规则用 Portkey 的 conditional 模式:
# portkey-config.yaml
strategy:
mode: conditional
conditions:
- if: "request.tokens < 500"
then: { provider: openai, model: gpt-4o-mini }
- if: "request.tokens > 500 && request.tokens < 4000"
then: { provider: openai, model: gpt-4o }
- if: "request.metadata.contains_pii == true"
then: { provider: ollama, model: llama3.1:70b }
- else: { provider: openai, model: gpt-4o-mini }
智能路由的实战建议:
- 先做 A/B 测:不要凭直觉选路由规则,用
Langfuse或Phoenix跑 1 周看哪个组合的成本/质量 Pareto 最优 - 路由规则写到 config,不要写进代码:业务代码应该只关心"我需要 LLM",不关心"用哪个 LLM"
- 路由要可观测:每个请求必须记录"为什么选了模型 X",否则一个月后没人能解释
模式三:成本观测 —— 一份给 CFO 看的账单
LLM 网关的最大隐性价值是统一的成本观测。Portkey 的 dashboard 默认提供:
- 每日 / 每周 / 每月的 token 消耗
- 按 provider / model / 用户 / tag 拆解
- 慢请求 / 失败请求 / 重试请求占比
- 单条请求的完整 trace
AgentGateway 把这些原始数据导出到 Prometheus:
# agentgateway.yaml
observability:
metrics:
export: prometheus
endpoint: /metrics
traces:
export: otlp
endpoint: http://otel-collector:4317
成本观测的四个关键指标:
- 单请求 token 成本(按模型 + 业务 tag 聚合)
- Provider 失败率(触发 fallback 的占比)
- 路由命中率(cheap 模型能 cover 的请求占比)
- 月末预测偏差(线性外推 vs 实际账单)
把这四个指标接到 Grafana,配上 Slack 告警,周会汇报时你能直接告诉 PM "上周这功能消耗 X 美元,比预测高 Y%"。这是说服 PM 减配模型的硬数据。
模式四:场景调度 —— 不同任务用不同模型
代码 Agent 场景下,模型选择直接决定 token 成本——一次复杂重构如果用 Sonnet 可能烧 5 美元,用 mini 烧 0.2 美元,效果差异却不大。Claude Code Router 的设计就是为此:
// ~/.claude-code-router/config.json
{
"default": "anthropic,claude-sonnet-4-20250514",
"background": "ollama,llama3.1:8b", // 后台补全用本地
"longContext": "openai,gpt-4o", // 长 context 切 GPT
"think": "anthropic,claude-sonnet-4-20250514", // 推理任务用最强
"webSearch": "openai,gpt-4o-mini", // 简单搜索用最便宜
"routes": {
"explain_code": "openai,gpt-4o-mini",
"write_test": "anthropic,claude-sonnet-4-20250514"
}
}
场景调度的核心是用对地方用贵的、用错地方用便宜的。一个经验法则:
- 1k token 内的任务(短摘要、分类、改写)→ mini/本地
- 4k-32k token 的推理任务 → Sonnet / GPT-4o
- 32k+ 的长文档任务 → 200k context 的模型(GPT-4o、Claude Sonnet 4.5)
- 代码生成 → Sonnet / Qwen-Coder / Continue
- 多轮对话 / function call → 各家旗舰
决策框架:怎么选
- 你的请求主要来自编程 Agent(Claude Code / Continue / Cursor)?
- 是 → 选 Claude Code Router(场景调度最细)
- 你需要 SaaS 化的成本 dashboard?
- 是 → 选 Portkey(dashboard 最成熟)
- 你要在 AI Agent / MCP 场景下做统一流量管理?
- 是 → 选 AgentGateway(多协议适配)
- 你不想自托管,预算按 token 走?
- 是 → 选 OpenRouter Agents(开箱即用)
三个常见失败模式
失败 1:fallback 链没有「保底」。三个云模型都挂了你怎么办?链路末端必须是本地模型或缓存响应——不能直接 502 给用户。
失败 2:路由规则没做灰度。一次切换 100% 流量到新模型可能引发大规模回归。用 5%-10% 灰度 → 30% → 100%,每步观察 1 小时再放大。
失败 3:成本 dashboard 没人看。搭一个 dashboard 然后再也没人打开,账单爆炸时才发现。把「每用户每日 token 成本」告警直接接到 Slack,超阈值就 page。
总结
- LLM 网关 = 统一接口 + 多模型 fallback + 智能路由 + 成本观测。
- Fallback 链必须包含本地模型或缓存保底,不能直接 502。
- 路由规则写在 config 不写代码,让业务层不关心模型选择。
- 成本观测必须告警化,dashboard 没人看 = 没有观测。
下一步可以从 Portkey SaaS 跑通:接 1 个 OpenAI + 1 个 Anthropic,配一个 fallback 链 + 路由规则,让一次请求的成本和 latency 都打到 dashboard 上,看一周后再决定要不要上自托管。
本文涉及的项目
Portkey AI Gateway
12.2k ⭐Portkey AI Gateway 是一个高性能 AI 网关,支持路由到 200+ LLM 提供商,内置 50+ AI 安全护栏,提供统一 API 接口。
AgentGateway
3.4k ⭐下一代 AI Agent 代理网关,为 AI Agent 和 MCP 服务器提供统一的流量管理、路由转发和安全控制层。支持多协议适配和可扩展的中间件架构。
OpenRouter Agents
3.0k ⭐OpenRouter Agents 是 OpenRouter 面向多模型 Agent 场景提供的平台能力,强调模型路由、工具调用与统一接入层,适合需要跨模型编排的 Agent 应用。
Claude Code Router
4.5k ⭐Claude Code Router 是一个面向代码 Agent 场景的模型路由工具,可在不同模型与提供商之间统一调度请求,适合控制成本、延迟与不同编程任务的路由策略。