用 LiteLLM 给 Agent 做统一模型网关与故障回退(一处配置接百家模型)
你的 Agent 今天用 OpenAI、明天想换 Claude、后天又想试本地模型——结果代码里散落着十几个 Key、十几种 SDK 调用方式,换一个模型就要改一大片业务代码?LiteLLM 就是来解决这个痛点的:它把几十家模型统一成「同一个 OpenAI 兼容接口」,你只改一个 model 名字,路由、限流、重试、故障回退全在配置里搞定。本教程带你从零跑通 LiteLLM 网关。
先搞懂:网关解决什么?
没有网关时,每接一家模型都要:装对应 SDK、适配返回格式、单独管 Key、自己写重试。LiteLLM 在中间插一层代理,对外暴露标准 /v1/chat/completions,你的业务代码只认这一个接口,模型差异被网关吸收。
| 关注点 | 无网关 | LiteLLM 网关 |
|---|---|---|
| 接口 | 各家不同 | 统一 OpenAI 兼容 |
| 切换模型 | 改业务代码 | 只改 model 名 |
| 重试/回退 | 自己写 | 配置声明 |
| 花费看板 | 各平台分开看 | 统一日志 |
Step 1:为什么需要统一网关
当 Agent 同时接多家模型,你会遇到三类问题:Key 散落难管理、某家限流/宕机时无处可退、成本难统一核算。网关把这三类问题收口到一处。
典型场景:
· 主力用 gpt-4o,成本太高时回退到 claude 或本地模型
· 某模型 429 限流,希望自动换一家重试
· 多家 Key 想集中托管,业务代码不碰明文密钥
Step 2:安装与最小启动
用 pip 安装,然后直接以命令行方式调用一个模型,确认链路通:
pip install litellm
# 临时用环境变量放 Key,验证能通
export OPENAI_API_KEY=sk-xxx
litellm --model gpt-4o
# 进入交互后直接对话,能回就说明 SDK 装好
版本差异提示:LiteLLM 迭代很快,CLI 子命令(litellm 直跑 vs litellm proxy)与配置字段可能随版本变化。下文配置以官方文档当前版为准,若字段报错请以 pip show litellm 对应版本的文档为准。
Step 3:写 config.yaml
核心是一个 model_list,每个模型给一个「网关别名」+ 真实模型路径 + Key 来源(建议走环境变量,不写死)。
model_list:
- model_name: gpt-4o # 网关别名,业务代码用这个
litellm_params:
model: openai/gpt-4o # 真实模型,前缀标厂商
api_key: os.environ/OPENAI_API_KEY
- model_name: claude-opus
litellm_params:
model: anthropic/claude-opus-4
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: local-qwen
litellm_params:
model: openai/qwen3-32b
api_base: http://localhost:8000/v1
api_key: not-needed
model 里的 openai/、anthropic/ 前缀告诉 LiteLLM 用哪家协议;本地 OpenAI 兼容服务用 openai/模型名 + api_base 即可。Step 4:启动代理
用配置启动代理,默认监听 4000 端口;之后你的代码把 base_url 指向它就行。
litellm proxy --config config.yaml --port 4000
# 业务侧环境变量(让 OpenAI SDK 走本地网关)
export OPENAI_API_BASE_URL=http://localhost:4000/v1
export OPENAI_API_KEY=anything # 网关侧再决定真实 Key
生产注意:网关一旦上线就掌握了所有模型 Key,必须放在受信任的内网/专有环境,配合防火墙与访问控制;Key 只从环境变量读取,配置文件中不留明文。
Step 5:配置路由、限流与回退
在 router_settings 里声明超时、重试次数、以及「主模型挂了回退到谁」:
router_settings:
timeout: 60
retry_after: 5
num_retries: 3
fallbacks:
- { "gpt-4o": ["claude-opus", "local-qwen"] }
# 可选:按 rpm/tpm 做限流
# rpm: 1000
# tpm: 1000000
Step 6:在 Agent 代码里接入
业务代码用标准 OpenAI SDK,只把 base_url 指向网关,模型名用网关别名:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:4000/v1",
api_key="anything",
)
# 想换模型?只改下面这一行
resp = client.chat.completions.create(
model="gpt-4o", # 改 "claude-opus" 即切换,无需改其它代码
messages=[{"role": "user", "content": "帮我总结这段日志"}],
)
print(resp.choices[0].message.content)
回退透明化:回退发生时,真实用的是哪家模型可能与你指定的不同。若业务对模型能力敏感(如强依赖某家工具调用格式),要在响应里读取实际模型字段并记录,避免「以为用了 A 实际跑了 B」导致行为差异。
Step 7:生产加固
· Key 全部走环境变量 / 密钥管理,绝不进配置与镜像
· 开启 LiteLLM 的花费与请求日志,做统一看板
· 用虚拟密钥(virtual key)给不同业务发额度,而非共享主 Key
· 配置 rpm/tpm 限流,防单业务把额度打爆
· 网关本身做健康检查与多副本,避免成为单点
常见问题速查
| 现象 | 原因与解决 |
|---|---|
| 401 鉴权失败 | 真实 Key 未设置或环境变量名拼错 |
| 回退没生效 | fallbacks 列表里模型名要与 model_name 别名一致 |
| 字段报错 | LiteLLM 版本差异,对照当前版官方文档 |
| 延迟变高 | 网关多一跳网络,属正常;回退链过长会叠加 |