Chapter 10

Proxy Server:公司级的 AI 网关

SDK 模式适合个人/小团队;公司规模一上来,你需要一个网关:统一发 Key、统一限额、统一审计、统一切换模型。LiteLLM Proxy 就是这件事的完整答案——一键启动,零改业务代码,零依赖锁定。

为什么需要一个网关

想象公司里 12 个业务部门都在用 LLM:

把 LiteLLM 作为中间 Proxy部署成公司级服务:

各业务 → OpenAI SDK 请求 → LiteLLM Proxy → 真实 provider(OpenAI/Azure/Claude/…)
                ↑                    ↓
           用 Virtual Key          ● 统一限额/预算
                                   ● 统一日志/审计
                                   ● 统一路由/缓存
                                   ● 统一模型名
业务代码感知不到变化。他们继续 from openai import OpenAI; client = OpenAI(base_url="http://llm.company.internal", api_key="sk-virtual-xxx")——接口完全兼容,换的只是 base_url 和 key。这是 LiteLLM Proxy 最大价值。

3 分钟跑起来

# 1. 安装 (带 proxy extra)
pip install "litellm[proxy]"

# 2. 最小 config.yaml
cat > config.yaml <<'EOF'
model_list:
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY
  - model_name: claude-sonnet
    litellm_params:
      model: anthropic/claude-sonnet-4-5
      api_key: os.environ/ANTHROPIC_API_KEY
EOF

# 3. 启动
litellm --config config.yaml --port 4000

现在你有了一个 OpenAI 兼容的 API:

curl http://localhost:4000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-1234" \
  -d '{
    "model": "claude-sonnet",
    "messages": [{"role":"user","content":"你好"}]
  }'

任何 OpenAI SDK 都能连:

from openai import OpenAI
client = OpenAI(base_url="http://localhost:4000/v1", api_key="sk-1234")
client.chat.completions.create(model="claude-sonnet", messages=[{"role":"user","content":"hi"}])

到这里:业务零依赖、零改动,背后 Anthropic、OpenAI、Gemini、DeepSeek 随便换。这是"LLM 运维解耦"的关键一步。

config.yaml 的 4 大板块

# ============ 1. model_list: 所有可用模型/部署 ============
model_list:
  - model_name: gpt-4o              # 客户端看到的名字
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY
      rpm: 500
      tpm: 1000000
    model_info:
      description: "GA GPT-4o for production chat"

# ============ 2. router_settings: 路由策略 ============
router_settings:
  routing_strategy: usage-based-routing-v2
  num_retries: 3
  timeout: 30
  fallbacks:
    - gpt-4o: [claude-sonnet, gemini-2.5-flash]
  cooldown_time: 60
  redis_host: os.environ/REDIS_HOST
  redis_password: os.environ/REDIS_PASSWORD

# ============ 3. litellm_settings: 全局行为 ============
litellm_settings:
  drop_params: true
  set_verbose: false
  cache: true
  cache_params:
    type: redis
    host: os.environ/REDIS_HOST
    ttl: 1800
  success_callback: ["langfuse"]    # 日志/观测
  failure_callback: ["langfuse"]

# ============ 4. general_settings: 网关本身 ============
general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY   # sk-1234 就是这里
  database_url: os.environ/DATABASE_URL         # Postgres, 存 Virtual Keys/spend
  ui_access_mode: admin_only
  allow_user_auth: true
  alerting: ["slack"]
  alerting_threshold: 300                    # 慢于 5 分钟告警

四块的分工说一次就好记:第 1 块"能调什么模型",第 2 块"怎么路由",第 3 块"LiteLLM 内部行为",第 4 块"Proxy 这个服务本身的运维配置"

Virtual Keys:业务的第一入口

Master Key(LITELLM_MASTER_KEY)只给管理员和 Admin UI,绝不能给业务。业务拿到的是Virtual Key,通过 Proxy 自身的 API 生成:

# 管理员: 给 support-team 生成一把 key
curl http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-MASTER-KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "models": ["gpt-4o", "claude-sonnet"],
    "max_budget": 500,
    "budget_duration": "30d",
    "rpm_limit": 100,
    "tpm_limit": 200000,
    "duration": "180d",
    "metadata": {"team": "support", "env": "prod"}
  }'

# 返回:
# {"key": "sk-LxYtd0Mpp...", "expires": "2026-11-07", ...}

这把 key 的能力被全方位约束:

字段作用超额行为
models白名单模型,别的不给调返回 401 / model not allowed
max_budget上限美元返回 429
budget_duration预算周期:1d / 7d / 30d周期结束自动重置
rpm_limit / tpm_limit每分钟请求/token返回 429
durationkey 本身的 TTL过期整体失效
metadatabusiness tag进日志/报表

业务拿到 key 后,前面提过的"OpenAI SDK + base_url"就跑起来了。跑失控也超不过 $500——硬限,不是代码自觉。

三级权限:Team → User → Key

更大规模的公司,要做部门/子团队管理。LiteLLM 提供三层:

Organization(公司)
  └─ Team (部门, 如 "support-team")          ← 预算聚合 / 模型白名单
      └─ User (员工, alice@company.com)      ← 每人限额
          └─ Virtual Key (alice 的 3 个项目用的) ← 真正调用
# 建 Team
curl -X POST http://localhost:4000/team/new \
  -H "Authorization: Bearer sk-MASTER-KEY" \
  -d '{
    "team_alias": "support-team",
    "max_budget": 2000,
    "models": ["gpt-4o", "claude-sonnet"]
  }'

# 把 User 加进 Team
curl -X POST http://localhost:4000/team/member_add \
  -H "Authorization: Bearer sk-MASTER-KEY" \
  -d '{
    "team_id": "t-abc123",
    "member": {"user_id": "alice@company.com", "role": "user"}
  }'

# 给 User 在这个 team 里生成 Key
curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-MASTER-KEY" \
  -d '{
    "team_id": "t-abc123",
    "user_id": "alice@company.com",
    "max_budget": 200,
    "duration": "90d"
  }'

预算关系:key 限额 ≤ user 限额 ≤ team 限额 ≤ org 限额,任何一层超了都拒绝。计算写在 Postgres 里,多实例共享一致。

Admin UI:可视化管理

启动 Proxy 后访问 http://localhost:4000/ui(需要 Postgres + master key),默认给你:

小公司就可以把 Admin UI 直接当做 AI 网关的控制面。改模型、改限额、拉报表,都不需要写代码。配合 SSO 接 Okta/Google 就完成了权限治理。

Docker / Compose 部署

# docker-compose.yml
version: "3.9"
services:
  litellm:
    image: ghcr.io/berriai/litellm:main-stable
    ports: ["4000:4000"]
    volumes:
      - ./config.yaml:/app/config.yaml
    command: ["--config", "/app/config.yaml", "--port", "4000"]
    environment:
      OPENAI_API_KEY: ${OPENAI_API_KEY}
      ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
      DATABASE_URL: postgresql://litellm:pw@postgres:5432/litellm
      REDIS_HOST: redis
      LITELLM_MASTER_KEY: ${MASTER_KEY}
    depends_on: [postgres, redis]

  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: litellm
      POSTGRES_PASSWORD: pw
      POSTGRES_DB: litellm
    volumes: [pgdata:/var/lib/postgresql/data]

  redis:
    image: redis:7-alpine

volumes:
  pgdata:
docker compose up -d

四件套齐活:Proxy + Postgres(存 Keys/spend) + Redis(缓存/限流状态) + Admin UI。生产最小配置就这样。

Kubernetes / Helm 部署

有集群的话用官方 Helm:

# 加 repo
helm repo add litellm https://berriai.github.io/litellm/
helm repo update

# values.yaml 核心配置
cat > values.yaml <<'EOF'
image:
  repository: ghcr.io/berriai/litellm
  tag: main-stable
replicaCount: 3
config: |
  model_list: [...]
  general_settings:
    master_key: os.environ/LITELLM_MASTER_KEY
    database_url: os.environ/DATABASE_URL
env:
  OPENAI_API_KEY:
    valueFrom: {secretKeyRef: {name: llm-keys, key: openai}}
  ANTHROPIC_API_KEY:
    valueFrom: {secretKeyRef: {name: llm-keys, key: anthropic}}
  LITELLM_MASTER_KEY:
    valueFrom: {secretKeyRef: {name: llm-keys, key: master}}
  DATABASE_URL:
    valueFrom: {secretKeyRef: {name: llm-keys, key: database-url}}
  REDIS_HOST:
    value: redis-master.default.svc
postgres:
  enabled: true
redis:
  enabled: true
autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 20
  targetCPUUtilizationPercentage: 70
EOF

helm install llm-gateway litellm/litellm -f values.yaml

要点:

日志与可审计

Proxy 默认把每次请求的核心字段写 Postgres:

SELECT model, user_id, spend, total_tokens, startTime, api_key
FROM   "LiteLLM_SpendLogs"
WHERE  startTime >= NOW() - INTERVAL '1 day'
ORDER BY spend DESC
LIMIT  20;

想要 prompt / completion 全文留存(很多公司合规要求),在 config 里加:

litellm_settings:
  success_callback: ["s3", "langfuse"]
  s3_callback_params:
    s3_bucket_name: my-company-llm-audit
    s3_region_name: us-east-1
    s3_aws_access_key_id: os.environ/AWS_KEY
    s3_aws_secret_access_key: os.environ/AWS_SECRET

效果:每次请求自动写一份 JSON 到 S3(含 prompt/response/user/key/cost),对业务透明。法务拿 bucket 读权限就能完成审计。

客户端迁移

公司上 Proxy 前,各组用法杂七杂八。上 Proxy 后只需改两行:

# 改前 (各组不同)
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

# 改后 (全员统一)
client = OpenAI(
    base_url="http://llm.company.internal/v1",
    api_key=os.getenv("LLM_VIRTUAL_KEY"),    # sk-Lx...
)

# 模型名统一走别名
client.chat.completions.create(model="gpt-4o", messages=msgs)         # 可能实际跑的是 Azure
client.chat.completions.create(model="claude-sonnet", messages=msgs) # 实际 Anthropic

"任何用 OpenAI SDK 的老代码,改 base_url + key 就能跑"——这是 LiteLLM Proxy 最大魅力,迁移成本近似零

网关 vs SDK 该怎么选

维度SDK 模式 (Router)Proxy 模式 (Server)
部署import 到业务代码独立服务
语言只 Python任何语言(走 HTTP)
配额硬限应用自觉网关强制
Virtual Keys有(Postgres)
Admin UI
配置改动要发版热更/UI 改
SSO/RBAC
网络延迟0(本进程)+5–15ms
运维复杂度中(Postgres+Redis)
合适规模1–3 个 Python 服务≥ 5 人/多语言/多部门
组合用才最有力。公司级:Proxy 统一管理;某个 Python 服务内部嵌 Router,Router 的"upstream"配成 Proxy。这样:业务代码享受 Router 的本进程性能,同时整个公司的账、日志、key 治理都在 Proxy 一头。

常见坑位

  1. Master Key 泄露:它有最高权限,能建任意 key/team。永远不要交给业务,只在管理员和 CI 里用,定期轮换。
  2. 没上 Postgres:没有 DB,Virtual Keys/spend/logs 全丢,生产必配。
  3. 忘了配 Redis:多实例之间限额各算各的,实际限额 = 配置值 × replica 数。
  4. health check 只打 /health:这只看进程活不活。真正的探测要用 /health/liveliness(连 DB/Redis)和 /health/readiness(能不能路由)。
  5. 把 Proxy 暴露到公网:必须前面挂 API Gateway / Ingress + WAF + rate limit。直接暴露等于把账单按钮放外网。
  6. callback 里同步写 S3:S3 偶发 500ms,把你所有请求 p99 拖垮。用 async callback + buffer。
  7. 升级直接 latest tag:LiteLLM 迭代极快,一个 PR 可能改动 schema。生产一定锁版本,改完在 staging 跑 24h 再推。
  8. 用 in-memory cache:多 replica 下命中率直接除以 replica 数,同时 stats 乱。Proxy 场景强制用 Redis 缓存

本章小结