LiteLLM 模型网关:多 Provider 路由的统一层
直接对接 OpenRouter / Anthropic / Google 每个 provider,意味着每个客户端都得处理:限流、fallback、计费、模型下架。LiteLLM 把这些都吞掉,对外只暴露 OpenAI 兼容接口。
我的部署形态
单实例 + systemd --user 服务——轻量,跟 OpenClaw Gateway 同主机。
- 端口 4000
- 配置
~/ai-workspace/litellm/config.yaml - 跑 5 天,0 故障
- 已稳定接 OpenRouter 免费档 + 几个付费 fallback
model_list 分区
按”付费区 / 免费区”组织:
model_list:
# 付费区(真花钱)
- model_name: deepseek-flash
litellm_params:
model: deepseek/deepseek-v4-flash
api_key: os.environ/DEEPSEEK_API_KEY
# 免费区主力(每天限速,fallback 兜底)
- model_name: main
litellm_params:
model: openrouter/<provider>/<model>:free
api_key: os.environ/OPENROUTER_API_KEY
- model_name: backup
litellm_params:
model: openrouter/<provider2>/<model>:free
api_key: os.environ/OPENROUTER_API_KEY
关键是别名 + env 解耦——litellm/main 这个名字不直接绑定到具体模型,只绑定”主要免费档”。模型下架了,改 config.yaml 重启就行,所有引用 litellm/main 的客户端零改动。
现实中的免费档生命周期
免费的午餐不会永远免费。OpenRouter 免费档最近半年:
- 模型 A:用 3 个月,被限流到接近不可用
- 模型 B:用 1 个月,直接下架
- 模型 C:用 2 个月,迁移到付费档
- 模型 D:现役,每天还有配额
所以:
main别名必须留 1 个backup别名——main 挂掉自动 fallback- 不要在
openclaw.json里写具体模型名(只写litellm/main别名) - 每月初跑一次
openrouter-free-models-checkcron,扫一遍还能用的免费档
cron 的模型选择
定时任务统一走 litellm/main 别名(快 + 免费),不要每条 cron 单独绑模型——main 别名换模型,所有 cron 自动跟进。
但有 1 个例外:金融专用——单独走 litellm/finance 别名(专门调了一个擅长金融场景的免费档)。原因:持仓复盘每天跑,需要稳定输出格式。
API Key 管理
单一来源 = 共享 secrets store。所有 API Key 走 ~/.openclaw/.env,systemd 用 EnvironmentFile 加载,不在 LiteLLM config 里明文写。
LiteLLM 配置里用 os.environ/OPENROUTER_API_KEY 引用——env 没设,启动直接报错,不会静默跑成匿名。
写在最后
LiteLLM 在我这里的角色不是”模型网关”,而是”配置变更的稳定边界“——客户端永远引用别名,真实模型变化只发生在 config.yaml 一处。