当你的团队同时使用 OpenAI、Claude、Gemini、DeepSeek 和本地 Ollama 时,代码里散落着 5 种不同的 SDK 调用、5 套错误处理、5 个计费系统——这就是 LiteLLM Proxy 要解决的核心问题。根据 LiteLLM 官方数据,截至 2026 年 5 月,其 GitHub Star 数突破 25K,被超过 8000 家企业在生产环境中使用,每天处理超过 50 亿次 LLM API 调用。它将 100+ 种 LLM 提供商统一为 OpenAI 兼容的 API 格式,让下游应用只需要维护一套代码。
与自己从零搭建 AI 网关相比,LiteLLM Proxy 提供了开箱即用的负载均衡、故障转移、成本追踪和访问控制。本文将从架构原理到生产部署,手把手带你搭建一套企业级的 LLM 统一接入层。
🏗️ 一、LiteLLM Proxy 架构与核心能力
1.1 为什么选择 LiteLLM Proxy 而非自建
很多技术团队的第一反应是「用 TypeScript/Python 自己封装一层不就行了?」在原型阶段确实如此,但一旦进入生产环境,你会迅速遇到这些痛点:
| 维度 | 自建网关 | LiteLLM Proxy | 推荐 |
|---|---|---|---|
| 开发周期 | 2-4 周(基础功能) | 30 分钟部署 | ✅ LiteLLM |
| 多模型支持 | 需逐个适配 SDK | 100+ 提供商开箱即用 | ✅ LiteLLM |
| 故障转移 | 需自行实现重试逻辑 | 内置 fallback + 负载均衡 | ✅ LiteLLM |
| 成本追踪 | 需自建计费系统 | 内置 Budget 管理 + 每 Token 计费 | ✅ LiteLLM |
| 访问控制 | 需自建 Key 管理 | 内置 API Key + 团队 + 速率限制 | ✅ LiteLLM |
| 自定义程度 | 完全可控 | 支持 Callback + Router 自定义 | ❌ 自建更灵活 |
| 依赖风险 | 无外部依赖 | 依赖开源项目维护 | ❌ 自建更自主 |
⚠️ **警告:**如果你的团队少于 5 人且没有专职基础设施工程师,不要自建 LLM 网关。LiteLLM Proxy 的维护成本远低于自建方案,而且社区活跃、迭代迅速。
1.2 核心架构解析
LiteLLM Proxy 的架构分为四层:
接入层(Ingress):接收所有 LLM 请求,统一为 OpenAI 兼容的 /v1/chat/completions 格式。无论是来自前端、后端微服务还是 AI Agent 框架,都使用同一套接口规范。
路由层(Router):根据配置的策略(负载均衡、优先级、成本)将请求路由到具体的模型后端。支持同名模型多后端自动负载均衡,这是 LiteLLM 最强大的特性之一。
适配层(Provider Adapter):将统一格式转换为各提供商的原生 API 调用(OpenAI、Anthropic、Google、Ollama 等)。每个提供商的参数差异、认证方式、流式响应格式都被适配层屏蔽。
管理层(Management):API Key 管理、预算控制、用量追踪、日志回调。支持通过 Web UI 或 API 动态管理配置,无需重启服务。
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ ┌──────────────┐
│ 应用层 │────▶│ LiteLLM │────▶│ Provider │────▶│ LLM API │
│ (统一调用) │ │ Proxy │ │ Adapter │ │ (OpenAI等) │
└─────────────┘ │ │ └─────────────────┘ └──────────────┘
│ - 路由策略 │
│ - 故障转移 │ ┌─────────────────┐
│ - 成本控制 │────▶│ 管理后台 │
│ - 访问控制 │ │ (Key/Budget) │
└──────────────┘ └─────────────────┘
1.3 主流 LLM 提供商价格对比
选择哪些模型接入网关,成本是核心考量。以下是 2026 年 6 月主流模型的定价对比:
| 模型 | 输入价格 ($/1M tokens) | 输出价格 ($/1M tokens) | 上下文窗口 | 适用场景 |
|---|---|---|---|---|
| GPT-4o | $2.50 | $10.00 | 128K | 通用任务主力 |
| GPT-4o-mini | $0.15 | $0.60 | 128K | 简单任务、高并发 |
| Claude Sonnet 4 | $3.00 | $15.00 | 200K | 长文档、代码生成 |
| Claude Haiku 3.5 | $0.80 | $4.00 | 200K | 快速响应、成本敏感 |
| DeepSeek R1 | $0.55 | $2.19 | 128K | 推理任务、数学 |
| Gemini 2.5 Pro | $1.25 | $10.00 | 1M | 超长上下文 |
| Ollama Llama 3.1 | $0.00 | $0.00 | 128K | 本地部署、隐私敏感 |
💡 **提示:**通过 LiteLLM 的智能路由,可以让简单问题走 GPT-4o-mini(成本仅为 GPT-4o 的 6%),复杂推理走 DeepSeek R1,长文档走 Gemini 2.5 Pro。这种分层策略可以将整体 AI 支出降低 60%-80%。
🚀 二、从零部署:Docker Compose 完整方案
2.1 基础部署配置
以下是一个生产可用的 docker-compose.yml,包含 LiteLLM Proxy + PostgreSQL(持久化配置)+ Redis(缓存):
# docker-compose.yml — LiteLLM Proxy 生产部署
version: "3.9"
services:
litellm:
image: ghcr.io/berriai/litellm:main-latest
ports:
- "4000:4000"
volumes:
- ./litellm_config.yaml:/app/config.yaml
command: ["--config", "/app/config.yaml", "--port", "4000"]
environment:
- DATABASE_URL=postgresql://litellm:${DB_PASSWORD}@postgres:5432/litellm
- REDIS_HOST=redis
- REDIS_PORT=6379
- LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
interval: 30s
timeout: 10s
retries: 3
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: litellm
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: litellm
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U litellm"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
redis:
image: redis:7-alpine
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
restart: unless-stopped
volumes:
pgdata:
📌 记住:
LITELLM_MASTER_KEY是管理后台的超级密钥,务必使用强随机字符串(至少 32 位)。在生产环境中,建议通过 Secret Manager(如 Vault、AWS Secrets Manager)注入,不要硬编码在docker-compose.yml中。
2.2 核心配置文件详解
以下是 litellm_config.yaml 的生产级配置,涵盖多模型、负载均衡、故障转移和预算控制:
# litellm_config.yaml — 生产级多模型配置
model_list:
# 主力模型:GPT-4o(高优先级)
- model_name: "gpt-4o"
litellm_params:
model: "openai/gpt-4o"
api_key: "os.environ/OPENAI_API_KEY"
rpm: 500 # 每分钟最大请求数
timeout: 30 # 超时时间(秒)
max_retries: 2 # 最大重试次数
# 备选模型:Claude Sonnet 4(故障转移)
- model_name: "gpt-4o" # 同名 = 自动负载均衡
litellm_params:
model: "anthropic/claude-sonnet-4-20250514"
api_key: "os.environ/ANTHROPIC_API_KEY"
rpm: 300
timeout: 30
# 轻量模型:用于简单任务
- model_name: "fast"
litellm_params:
model: "openai/gpt-4o-mini"
api_key: "os.environ/OPENAI_API_KEY"
rpm: 1000
# 本地模型:Ollama(零成本)
- model_name: "local"
litellm_params:
model: "ollama/llama3.1:70b"
api_base: "http://ollama-server:11434"
rpm: 50
# 推理模型:DeepSeek R1(复杂任务)
- model_name: "reasoning"
litellm_params:
model: "deepseek/deepseek-reasoner"
api_key: "os.environ/DEEPSEEK_API_KEY"
rpm: 200
router_settings:
routing_strategy: "least-busy" # 最空闲优先
num_retries: 2 # 全局重试次数
timeout: 30 # 全局超时
allowed_fails: 2 # 连续失败次数后降级
cooldown_time: 30 # 降级冷却时间(秒)
enable_pre_call_checks: true # 调用前检查模型可用性
general_settings:
master_key: "os.environ/LITELLM_MASTER_KEY"
database_url: "os.environ/DATABASE_URL"
store_model_in_db: true # 支持通过 API 动态添加模型
max_budget: 1000 # 全局月度预算(美元)
budget_duration: "30d" # 预算周期
proxy_batch_write_to_db: true # 批量写入数据库(提升性能)
litellm_settings:
drop_params: true # 自动忽略不支持的参数
set_verbose: false # 生产环境关闭详细日志
num_retries: 2
request_timeout: 30
fallbacks: # 定义故障转移链
- gpt-4o:
- anthropic/claude-sonnet-4-20250514
- deepseek/deepseek-reasoner
⚠️ 警告:
model_name相同的多个条目会被 LiteLLM 视为同一模型的不同后端,自动进行负载均衡。这是实现故障转移的关键——当 OpenAI 的 GPT-4o 不可用时,请求会自动切换到 Claude Sonnet 4。
2.3 运行与验证
# 启动服务
docker compose up -d
# 检查健康状态
curl http://localhost:4000/health
# 测试 OpenAI 兼容接口
curl http://localhost:4000/v1/chat/completions \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}],
"temperature": 0.7
}'
# 查看可用模型列表
curl http://localhost:4000/v1/models \
-H "Authorization: Bearer $LITELLM_MASTER_KEY"
🔐 三、生产环境进阶配置
3.1 API Key 管理与团队隔离
LiteLLM Proxy 内置了完善的访问控制系统。你可以通过管理 API 创建团队和 API Key,实现不同团队的资源隔离:
# 创建团队(team)
curl -X POST http://localhost:4000/team/new \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"team_name": "frontend-team",
"max_budget": 200,
"budget_duration": "30d",
"models": ["gpt-4o", "fast"],
"tpm_limit": 100000,
"rpm_limit": 500
}'
# 为团队创建 API Key
curl -X POST http://localhost:4000/key/generate \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"team_id": "frontend-team-uuid",
"max_budget": 50,
"budget_duration": "7d",
"metadata": {"owner": "zhangsan"}
}'
# 查看团队用量
curl http://localhost:4000/team/info \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-d '{"team_id": "frontend-team-uuid"}'
团队隔离的核心价值在于:当某个团队的用量超出预算时,LiteLLM 会自动拒绝该团队的新请求,而不会影响其他团队。这对于多团队共享 AI 基础设施的场景至关重要。
⚠️ **警告:**不要在前端代码中硬编码 API Key。前端应通过你的后端服务代理请求,后端再调用 LiteLLM Proxy。LiteLLM 的 Key 一旦泄露,攻击者可以用它调用你配置的所有模型,甚至通过你的网关产生高额账单。
3.2 成本控制与预算告警
LiteLLM Proxy 提供了细粒度的成本控制能力,从全局预算到单用户限额都可以精确管控:
# 在 litellm_config.yaml 中配置预算告警
general_settings:
max_budget: 1000 # 全局月度预算 $1000
budget_duration: "30d"
# 超预算回调(发送告警)
budget_alert_webhook: "https://hooks.slack.com/services/xxx"
# 自定义价格(覆盖默认定价)
# 适用于私有部署模型或特殊定价协议
model_cost_map:
"gpt-4o":
input_cost_per_token: 0.0000025
output_cost_per_token: 0.00001
"claude-sonnet-4-20250514":
input_cost_per_token: 0.000003
output_cost_per_token: 0.000015
通过回调系统,你可以将用量数据推送到 Prometheus/Grafana 进行可视化。以下是一个自定义回调的实现:
# custom_callback.py — 自定义用量回调
from litellm.integrations.custom_logger import CustomLogger
import httpx
class CostAlertCallback(CustomLogger):
def __init__(self, alert_threshold: float = 80.0):
self.alert_threshold = alert_threshold
async def log_success_event(self, kwargs, response_obj, start_time, end_time):
cost = kwargs.get("response_cost", 0)
model = kwargs.get("model", "unknown")
# 推送到 Prometheus Pushgateway
async with httpx.AsyncClient() as client:
await client.post(
"http://pushgateway:9091/metrics/job/litellm",
content=f'llm_request_cost{{model="{model}"}} {cost}\n'
)
async def log_failure_event(self, kwargs, response_obj, start_time, end_time):
model = kwargs.get("model", "unknown")
error = kwargs.get("exception", "unknown")
# 失败事件推送到告警系统
async with httpx.AsyncClient() as client:
await client.post(
"https://your-alert-system.com/webhook",
json={"model": model, "error": str(error), "event": "failure"}
)
# 注册回调
callback = CostAlertCallback(alert_threshold=80.0)
3.3 语义路由:智能模型选择
对于需要根据任务复杂度自动选择模型的场景,可以在应用层实现智能路由,结合 LiteLLM 的多模型配置实现成本最优化:
// smart-router.ts — 应用层语义路由
interface RoutingDecision {
model: string;
reason: string;
}
function selectModel(prompt: string): RoutingDecision {
const tokenEstimate = Math.ceil(prompt.length / 4);
// 简单任务:使用轻量模型(节省 80% 成本)
if (tokenEstimate < 200 && !prompt.includes("分析") && !prompt.includes("推理")) {
return { model: "fast", reason: "短文本简单任务" };
}
// 推理任务:使用推理模型
if (prompt.includes("分析") || prompt.includes("为什么") || prompt.includes("如何")) {
return { model: "reasoning", reason: "需要深度推理" };
}
// 默认:使用主力模型
return { model: "gpt-4o", reason: "通用任务" };
}
// 使用示例
async function chat(prompt: string) {
const { model, reason } = selectModel(prompt);
console.log(`路由决策:${model},原因:${reason}`);
const response = await fetch("http://localhost:4000/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.LITELLM_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model,
messages: [{ role: "user", content: prompt }],
temperature: 0.7,
}),
});
return response.json();
}
3.4 Content Safety Guardrails
LiteLLM 支持在 Proxy 层集成内容安全检查,在请求到达模型之前和模型响应返回之后进行过滤:
# litellm_config.yaml — 安全护栏配置
litellm_settings:
# 输入内容过滤
guardrails:
- guardrail_name: "content-safety"
litellm_params:
guardrail: "openai"
mode: "pre_call" # 调用前检查输入
api_key: "os.environ/OPENAI_MODERATION_KEY"
- guardrail_name: "pii-detection"
litellm_params:
guardrail: "openai"
mode: "post_call" # 调用后检查输出
api_key: "os.environ/OPENAI_MODERATION_KEY"
📌 **记住:**安全护栏应该在 Proxy 层统一配置,而不是在每个应用中单独实现。这样可以确保无论哪个团队的 API Key 发起请求,都会经过相同的安全检查。
⚠️ 四、避坑指南:生产环境常见问题
4.1 连接池与并发问题
❌ 错误做法:每次请求都创建新的 HTTP 连接,高并发下会导致连接耗尽
// ❌ 每次都创建新连接,没有超时控制,没有重试
async function badChat(prompt: string) {
const response = await fetch("http://localhost:4000/v1/chat/completions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "gpt-4o",
messages: [{ role: "user", content: prompt }],
}),
});
return response.json();
}
✅ 正确做法:使用连接池、超时控制和指数退避重试
// ✅ 使用连接池 + 超时 + 重试
import { Agent } from "undici";
const agent = new Agent({
keepAliveTimeout: 10_000,
keepAliveMaxTimeout: 30_000,
connections: 50,
pipelining: 1,
});
const LITELLM_BASE = "http://localhost:4000";
const LITELLM_KEY = process.env.LITELLM_KEY!;
async function chat(prompt: string, model = "gpt-4o", retries = 2) {
for (let i = 0; i <= retries; i++) {
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30_000);
const response = await fetch(`${LITELLM_BASE}/v1/chat/completions`, {
method: "POST",
headers: {
"Authorization": `Bearer ${LITELLM_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model,
messages: [{ role: "user", content: prompt }],
temperature: 0.7,
}),
signal: controller.signal,
dispatcher: agent,
});
clearTimeout(timeout);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}
return response.json();
} catch (err) {
if (i === retries) throw err;
await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));
}
}
}
4.2 流式响应(Streaming)的正确处理
流式输出是 LLM 应用的标准配置,但 SSE 协议的解析有很多边界情况需要处理:
// ✅ 正确处理 SSE 流式响应
async function* streamChat(prompt: string, model = "gpt-4o") {
const response = await fetch("http://localhost:4000/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.LITELLM_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model,
messages: [{ role: "user", content: prompt }],
stream: true,
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const reader = response.body!.getReader();
const decoder = new TextDecoder();
let buffer = "";
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop() || "";
for (const line of lines) {
if (!line.startsWith("data: ")) continue;
const data = line.slice(6);
if (data === "[DONE]") return;
try {
const parsed = JSON.parse(data);
const content = parsed.choices?.[0]?.delta?.content;
if (content) yield content;
} catch {
// 跳过不完整的 JSON(SSE 分包边界)
}
}
}
}
// 使用示例
for await (const chunk of streamChat("解释量子计算的基本原理")) {
process.stdout.write(chunk);
}
4.3 常见错误排查表
| 错误码 | 含义 | 常见原因 | 解决方案 |
|---|---|---|---|
| 401 | 认证失败 | API Key 错误或过期 | 检查 Authorization Header 格式 |
| 429 | 速率限制 | 超出 RPM/TPM 限制 | 增加 rpm 配置或添加请求队列 |
| 503 | 服务不可用 | 所有 fallback 模型都失败 | 检查各 Provider 的 API 状态页面 |
| 524 | 超时 | 模型响应时间过长 | 增加 timeout 或使用流式输出 |
| 400 | 参数错误 | 传入了模型不支持的参数 | 开启 drop_params: true |
💡 **提示:**如果遇到
429错误频繁出现,建议在应用层添加请求队列(如 BullMQ),将突发流量削峰填谷,而不是单纯提高 LiteLLM 的 RPM 限制。提高 RPM 只是把问题推给了上游 Provider。
📊 五、性能优化与监控
5.1 Prometheus + Grafana 监控配置
LiteLLM Proxy 内置 Prometheus 指标端点,可以直接接入 Grafana 实现全链路可视化:
# prometheus.yml — 添加 LiteLLM 监控目标
scrape_configs:
- job_name: "litellm"
metrics_path: "/metrics"
static_configs:
- targets: ["litellm:4000"]
labels:
service: "llm-gateway"
关键监控指标:
| 指标名 | 含义 | 告警阈值建议 |
|---|---|---|
litellm_requests_total |
总请求数 | 监控趋势,识别异常流量 |
litellm_request_duration_seconds |
请求延迟 | P99 > 30s 触发告警 |
litellm_deployment_failure_responses |
失败请求数 | 失败率 > 5% 触发告警 |
litellm_total_tokens |
Token 消耗量 | 日消耗超预算 80% 告警 |
litellm_cost_total |
累计成本 | 接近预算上限时告警 |
5.2 高可用部署架构
对于生产级高可用需求,推荐以下架构:
┌──────────────┐
│ Nginx/ │
│ Traefik │
│ (LB + TLS) │
└──────┬───────┘
│
┌────────────┼────────────┐
│ │ │
┌─────┴─────┐┌────┴─────┐┌─────┴─────┐
│ LiteLLM ││ LiteLLM ││ LiteLLM │
│ Node 1 ││ Node 2 ││ Node 3 │
└─────┬─────┘└────┬─────┘└─────┬─────┘
│ │ │
└────────────┼────────────┘
│
┌────────────┼────────────┐
│ │ │
┌─────┴─────┐┌────┴─────┐┌─────┴─────┐
│ PostgreSQL ││ Redis ││ Prometheus │
│ (主从) ││ (Sentinel)││ + Grafana │
└───────────┘└──────────┘└───────────┘
LiteLLM Proxy 是无状态的(配置存储在 PostgreSQL 中),可以水平扩展。关键是要确保所有节点共享同一个 PostgreSQL 和 Redis 实例。Redis 用于缓存模型列表和速率限制计数器,PostgreSQL 用于持久化 API Key、预算和审计日志。
💡 总结与选型建议
经过本文的详细讲解,我们来总结 LiteLLM Proxy 的适用场景和替代方案:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 团队 < 5 人,快速上手 | LiteLLM Proxy | 部署简单,功能全面 |
| 需要深度自定义路由逻辑 | 自建网关 | 完全可控,但维护成本高 |
| 已有 Kubernetes 基础设施 | LiteLLM + K8s Deployment | 无缝集成,自动扩缩容 |
| 需要企业级 SSO/审计 | LiteLLM Enterprise | 付费版支持 SAML/OIDC |
| 纯前端应用(浏览器端) | 直接调用各 Provider API | 无需网关,但需注意 Key 安全 |
核心建议:
- ✅ 80% 的团队应该直接使用 LiteLLM Proxy,而不是自建网关
- ✅ 务必配置 PostgreSQL 持久化,否则重启丢失所有配置和 Key
- ✅ 为不同团队创建独立的 API Key 和预算,避免互相影响
- ✅ 开启
drop_params: true,否则不同模型的参数差异会导致大量 400 错误 - ❌ 不要在前端直接暴露 LiteLLM 的 API Key
- ❌ 不要在没有监控的情况下上线——至少要追踪成本和失败率
- ⚠️ 定期检查各 Provider 的定价变化,及时更新
model_cost_map
相关工具:LiteLLM 官方文档 | LiteLLM GitHub | OpenRouter | Portkey AI Gateway