如果你同时在对接好几个大模型服务商的 API,或者在团队里管过 LLM 的调用成本,大概率遇到过这种场景:代码里写满了不同厂商的 SDK,每个还要单独配 Key、单独处理超时和报错;业务侧接入了两三个模型,想切换备胎模型得改代码重新发版;月底一看账单,根本分不清哪个业务线烧了多少 token。这些痛我太熟悉了,后来在自建项目里用上了 litellm,前后端一起捋顺,这篇就围绕它把落地过程拆开讲透。
litellm 是个开源的 LLM 代理网关工具,核心就干一件事:把几十家模型服务商的 API 统一成 OpenAI 兼容格式,由你自建的服务端集中转发。它解决的问题非常具体——多模型统一接入、Key 统一托管、预算管控、限流容灾、调用日志审计,常年混 AI 应用开发圈子的人基本绕不开它。适合正在做 LLM 应用但没有专门基建团队的中小团队,也适合个人开发者想把手头多个模型渠道整合进一个项目的人。
1. 它到底解决了什么问题
1.1 对比直接对接官方 SDK 的痛点
先说硬伤,在没有代理层的时候,每接一个模型渠道,代码里就要多一个 SDK 依赖。比如你要同时用某家国内大厂的千亿参数模型、另一家的开源模型托管 API,以及某个国外厂商的旗舰模型,那就是三套鉴权方式、三套请求库、三套错误码体系。请求失败要逐家查文档,超时时间各自不同,重试逻辑还得自己写。
最难受的点其实不是接入,而是切换。今天业务方说便宜模型效果不行,要换成贵的那款,你跑过去改代码、改配置、提测、发版,一天就没了。对于迭代速度以周为单位的 AI 应用来说,这种模型切换的摩擦力非常致命。
litellm 直接把发布模式改成配置化。模型切换在服务端改一行配置,客户端零改动。路由、鉴权、限流都收口到一个网关层,业务代码只认一个类似于 OpenAI 的接口格式,其他细节不用管。
1.2 核心角色:看起来像 OpenAI,但背后是万能转接器
litellm 最聪明的设计是没有创造一套新协议,而是把 OpenAI 的接口当作基座。你请求 litellm 时,用的是http://your-gateway/v1/chat/completions,请求体结构跟你直接调 OpenAI 一模一样,包括model、messages、temperature这些字段。
但model字段非常灵活。你可以在 litellm 配置里把任意模型名映射到任意渠道,比如把model: "gpt-4o"映射到另一个厂商的模型,哪怕它底层跟 OpenAI 毫无关系。litellm 作为翻译层,把 OpenAI 格式的请求体译成目标服务商需要的格式,再处理响应格式差异。
这个设计在工程上非常聪明。客户端生态是现成的,OpenAI 的 SDK 本身就有大量语言版本,任何语言只要支持 OpenAI 接口,就能直接连 litellm。团队里新人上手快,不用专门学习私有协议。
1.3 适合哪类人、哪类场景
- 个人开发者做了个小型工具或开源项目,想低成本接入多个模型作对比,又不想代码环境里塞满各种 SDK。
- 中小团队做 AI 应用但没人专职维护模型网关,希望有一个开箱即用、部署不算复杂的中间层。
- 有预算管控需求,需要精确统计每个项目、每个 API Key 消费了多少 token 费用。
- 需要对模型做灰度切换、主备容灾,模型出故障时自动降级到备用渠道。
说实话,如果你的应用只固定用一家模型,不需要切换,没有成本统计压力,那 litellm 对你来说可能过度设计。这类情况直接用官方 SDK 反而更省事。工具适用的边界要心里有数,不是所有项目都要上个网关。
2. 核心功能拆解:先看清手里有什么牌
2.1 支持范围与模型路由策略
litellm 支持的模型供应商数量相当可观,覆盖主流国内外服务商和开源模型托管平台。它内部维护了一份模型映射表,识别model字段里的名称,自动判断该走哪家渠道、用什么格式转换。
路由这块我重点说三个实用策略。
轮询调度:所有模型渠道排一个序列,轮流处理请求。适用于多个渠道成本接近、配额均衡的场景,能有效分散单渠道压力。
优先级路由:可以给某个渠道设置更高的优先级,正常情况下流量全部走这个渠道,只有它挂掉的时候才把请求转发到备胎渠道。这个对生产环境太重要了,我用它实现了标准的“主备容灾”。
成本优先路由:litellm 可以配合预算系统自动选择更便宜的可用模型处理请求。这个适合对效果不敏感、只关心成本的内部工具类应用,比如文档分类、关键词抽取。
路由粒度不只是模型层面,同一个模型如果配置了多个不同渠道的 Key,还能做 Key 级别的负载均衡。比如你买了同一个大模型厂商的两个套餐,把两组 Key 都配进去,网关自动分摊请求,避免单个 Key 被限流。
2.2 Key 管理与虚拟 Key 机制
litellm 提供了一个虚拟 Key 的概念,非常值得展开讲。你在 litellm 里生成一个sk-litellm-xxxx这样的虚拟 Key,对应一段真实的上游 Key(或者一组 Key),然后把这个虚拟 Key 发给业务方用。
好处是显而易见的。第一,真实上游 Key 永远不会暴露给客户端,万一虚拟 Key 泄露,直接在管理端吊销即可,不用去服务商那边重新生成真 Key。第二,可以对虚拟 Key 单独设预算上限、限流速率、过期时间甚至可访问的模型列表。不同业务线各发一个虚拟 Key,谁用量超标了一目了然,从技术层面杜绝了“共用一个 Key 导致账单爆炸”的混乱。
我还试过把虚拟 Key 按环境区分,开发环境一个 Key,生产环境一个 Key,开发 Key 绑定到测试模型或免费模型,生产 Key 才能访问正式模型。配置文件里怎么折腾都不影响真实凭证安全。
2.3 预算控制与配额管理
预算控制是很多团队最终决定接入 litellm 的核心理由。它支持全局预算、Key 级预算、用户级预算三层体系。
全局预算就是整个网关最多能花多少钱,达到上限后所有请求被拒绝,相当于总闸。Key 级预算前面说过,给每个业务方单独画范围。用户级预算比较精细,可以追踪到终端用户,适合 ToC 应用里给不同会员等级分配不同额度。
预算周期支持按天、按周、按月滚动重置。我一般推荐按月设置,跟服务商账单周期保持对齐,月末出的账单可以直接跟 litellm 的统计报表对上账。
成本统计方面,litellm 依赖一个内部的价格表,不同模型每百万 token 的价格预置在里面。如果你的模型是通过某些特殊渠道拿到的折扣价,也可以自定义价格覆盖默认值。系统会结合 token 用量和价格表算出预估费用,虽然不能跟服务商账单精确到小数点,但偏差基本在可接受范围内,用来做趋势分析和异常监控足够了。
2.4 缓存机制与日志记录
litellm 内置了响应缓存,核心作用是在语义相同或完全相同的请求命中时直接返回缓存结果,不重复调用上游模型。对大多数 AI 应用来说,相同参数的重复请求在短期内非常常见,缓存能显著降低成本和延迟。
缓存模式有两种,简单模式和语义模式。简单模式就是完全匹配请求体,一模一样才命中。语义模式更高级,对嵌入向量做相似度计算,意思相近的问题也能命中缓存,但需要配置向量数据库,资源消耗更高。个人建议一般业务场景用简单模式起步,觉得命中率不够再考虑语义缓存。
日志审计也做得比较完整。litellm 可以把每次调用的元数据写入数据库或推送日志平台,包括虚拟 Key、模型名、token 用量、延迟、成功失败状态、花费估算。配合管理面板可以按时间范围、按 Key、按模型筛选查询,做走账、排查问题都方便。
2.5 兼容 OpenAI 的流式输出
流式输出是 ChatGPT 类应用的基本要求,litellm 原生支持,而且把各家厂商的流式差异内部消化了。有些服务商的流式格式跟 OpenAI 不完全一致,litellm 会在转发时做格式转换,统一以 OpenAI 的 chunk 结构推给客户端,客户端代码不需要为不同模型写两套解析逻辑。
我在实际测试中,流式模式的端到端延迟比非流式有明显改善,首 token 时间基本由上游模型响应速度决定,网关转发本身引入的额外延迟在几十毫秒量级,体感可以忽略。
3. 快速上手:从安装到完成首次调用
3.1 安装与启动最小可用配置
litellm 是 Python 包,安装非常简单:
pip install 'litellm[proxy]'这条命令会装上核心库和代理服务所需的额外依赖。装完直接启动:
litellm --model openai/gpt-4o --port 8000这其实是最简模式:litellm 代理直接挂到 OpenAI 的模型上,启动后访问http://localhost:8000就是一个 OpenAI 兼容端点。但这个模式只能连一个模型,远没发挥出代理层威力,我建议跳过这种用法,直接用配置文件启动。
3.2 用配置文件管理多个模型渠道
这才是 litellm 的标准用法。创建一个 YAML 配置文件,比如就叫litellm_config.yaml:
model_list: - model_name: gpt-open litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: claude-main litellm_params: model: anthropic/claude-3-5-sonnet api_key: os.environ/ANTHROPIC_API_KEY - model_name: qwen-local litellm_params: model: openai/qwen-max api_base: https://your-custom-endpoint.com/v1 api_key: os.environ/QWEN_API_KEY启动命令变成:
litellm --config ./litellm_config.yaml --port 8000这里有几个设计细节值得解释一下。model_name是客户端看到的模型名称,你可以完全自定义,不用跟上游模型名一样。也就是说业务端请求gpt-open,实际打到的是 OpenAI 的 gpt-4o;未来你想换成别的模型,只需要把gpt-open的映射目标改掉,客户端不用动。
环境变量引用方式os.environ/也建议直接沿用,Key 写在系统环境变量里,不要把明文 Key 塞进配置文件,尤其当配置是放在 Git 仓库里管理的时候。
3.3 客户端调用示例:两分钟验证网关跑通
启动网关后,用 Python 客户端验证一下:
from openai import OpenAI client = OpenAI( base_url="http://localhost:8000/v1", api_key="sk-anything", ) resp = client.chat.completions.create( model="gpt-open", messages=[{"role": "user", "content": "你好,简单介绍一下你自己"}], stream=True, ) for chunk in resp: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True)注意api_key这里我随便填了sk-anything,因为 litellm 默认对虚拟 Key 的校验是可选的,开发阶段可以先用任意字符串占位,等配好虚拟 Key 再收紧鉴权。但生产环境一定不要这么干。
这个示例证明了一个关键结论:任何成熟支持 OpenAI 接口的 SDK 都可以通过改base_url指向 litellm,代码逻辑完全不用变。这是 litellm 兼容性最好的证据。
3.4 部署方式选择
专门聊一下生产部署。litellm 只是个 Python 服务进程,推荐部署方式有几种:
- 用 Docker 容器跑,把配置文件和密钥通过环境变量注入,方便迁移和扩容。
- 放在现有云服务器上,用 systemd 或进程守护工具托管,保证异常退出后自动拉起。
- 规模大一点也可以用容器编排平台托管,做多副本部署,litellm 本身支持数据库存储配置,多实例可以共享状态。
生产环境还应该配一个反向代理在前面做 TLS 终结,不然网关裸奔在公网上风险太高。反向代理后面再套一个基本鉴权或者直接依赖 litellm 本身的虚拟 Key 校验。
注意:litellm 默认从环境变量读取真实上游 Key,配置文件的 api_key 字段里如果直接写了明文,也会有安全风险。建议所有 Key 走环境变量。
4. 进阶配置:把网关调教成生产可用的形态
4.1 完整模型列表与路由配置示例
用一个我在模拟项目里实际用过的配置来展示生产级模型池。假设有个客服场景和一个内容生成场景,需要不同模型池:
model_list: - model_name: chat-service litellm_params: model: openai/gpt-4o-mini api_key: os.environ/OPENAI_API_KEY rpm: 600 - model_name: content-pro litellm_params: model: anthropic/claude-3-5-sonnet api_key: os.environ/ANTHROPIC_API_KEY - model_name: chat-backup litellm_params: model: openai/qwen-max api_key: os.environ/DASHSCOPE_API_KEY api_base: https://dashscope.aliyuncs.com/compatible-mode/v1 router_settings: routing_strategy: simple-shuffle model_group_alias: chat-service: [chat-service, chat-backup]配置里rpm参数直接设定了限流速率,600 表示每分钟最多 600 次请求,防止业务方无节制调用打爆上游配额。
model_group_alias是路由组的概念,把多个模型归到一个别名下。客户端请求chat-service,网关会在主模型不可用时自动把流量切换到chat-backup。这样业务代码完全无感,故障时模型自动降级。实现主备容灾的关键就是它。
4.2 虚拟 Key 的生成与绑定
先用管理接口生成一个虚拟 Key:
curl -X POST http://localhost:8000/key/generate \ -H "Authorization: Bearer sk-master-key" \ -H "Content-Type: application/json" \ -d '{ "models": ["chat-service", "content-pro"], "max_budget": 100.0, "budget_duration": "30d" }'返回结果里会有一个key字段,形如sk-litellm-xxx。把它发给对应业务方。这个 Key 只能访问配置里指定的两个模型,月度预算封顶 100 美元,超了自动拒绝。
用虚拟 Key 的好处需要有深刻体会才会珍惜。没有它的时候,一个 Key 在全公司流转,某条业务线出了问题都不知道找谁。有了虚拟 Key,每个业务方一条,按月拉报表精确到人,超预算了系统直接拦截,不用自己去当恶人催业务方节省用量。
4.3 开启缓存与成本统计
在配置里加上缓存段:
litellm_settings: set_verbose: true cache: true cache_ttl: 3600 num_retries: 3 request_timeout: 600cache_ttl是缓存有效期,单位秒,3600 表示命中缓存的结果在 1 小时内有效。这个参数要看业务性质调,如果是实时性要求高的对话场景,缓存时间太长会导致用户觉得“AI 没反应,老重复旧答案”。我建议聊天类应用把 TTL 压缩到 60 秒以内,或者干脆不缓存;而意图识别、文本分类这类结果稳定、重复请求多的场景,TTL 可以大胆开长一点。
缓存生效后,可以从日志里看到哪些请求是从缓存返回的,token 消耗直接省掉一大块,成本下降非常明显。迭代一个内部工具应用时,缓存命中率一度超过 30%,月度成本降了将近四分之一。
成本统计写库需要配置数据库连接:
general_settings: database_url: postgresql://user:password@localhost/litellm_dblitellm 支持 SQLite 作轻量存储,生产环境建议用 PostgreSQL,并发写和查询性能更稳。数据库会存储请求日志、虚拟 Key 信息、预算用量,管理面板的报表数据就是从这里取的。
4.4 使用管理面板做可视化监控
litellm 自带一个管理 UI,默认跟代理共用端口,路径在/ui或者通过/admin访问。界面虽然不算豪华,但关键信息都能看:请求量趋势、Token 消耗排行、成功率、各模型平均延迟。
我把管理面板固定挂在内部运维系统里,每天扫一眼,重点看两个指标:每 Key 消费金额是否异常、失败率有没有突然上升。有一次某个模型渠道下午失败率突然超过 20%,我是在面板上发现的,立刻做了流量切换到备用模型,业务影响控制在几分钟内。没有这个集中可视化界面的话,估计要等到用户投诉才能发现。
管理面板还有一个实用功能:在线测试。可以直接在页面上选模型、填消息体,模拟真实调用,看返回结果和耗时。新接入模型渠道时,我先在面板上连发几个请求验证通不通,再去改业务配置,极大减少试错成本。
5. 常见问题与排查技巧实录
5.1 模型渠道返回 401 鉴权失败
新配置一个渠道后偶发401 Authentication Error,大多数情况是 API Key 没生效。检查顺序按我总结的来:
- 确认环境变量名称跟配置里
api_key: os.environ/XXX名字一致。 - 确认服务商后台的 Key 状态是否正常,有些 Key 在创建后需要几分钟才生效。
- 确认选错了 Key 类型。有的服务商区分主 Key 和细粒度 Key,权限范围不一样,要在服务商文档里核对当前模型是否在 Key 的授权范围内。
- 如果用了网关的虚拟 Key,还要确认虚拟 Key 是否绑定了这个模型,没绑定也会被拒绝。
超过 90% 的鉴权问题出在第一项。我在多个项目里都犯过环境变量名拼写错误的低级失误,排查起来费时费力。建议在配置里使用简短但完整的变量名,比如OPENAI_API_KEY、ANTHROPIC_API_KEY,别用省称。
5.2 模型报错“不支持某参数”
不同厂商支持的参数差异不小。比如 temperature、top_p 基本各家都有,但某些厂商可能没有logprobs或者response_format,你按 OpenAI 格式传过去,litellm 会把参数原样翻译,对方直接返回错误。
这时不要先怀疑 litellm 出了问题,先确认上游服务商到底支持哪些参数。遇到这种参数冲突,我的做法是在配置里针对该渠道做一个特殊映射,或者干脆在客户端就不传那些参数。litellm 不是万能的,它解决的是接口格式差异,而不是模型能力差异。
5.3 配置了负载均衡但效果不明显
负载均衡不生效,基本就一个原因:你没按 litellm 的方式配置同组模型。负载均衡是作用在同一model_name上多个渠道之间,不是跨不同model_name。如果只是把两个模型渠道配置成了两个model_name,客户端固定请求其中一个,那永远只有那个渠道有流量。
正确的配置姿势是把同一模型在两个服务商的渠道放在同一个model_name下,ip 没法列举,但大意是:
model_list: - model_name: gpt-open litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: gpt-open litellm_params: model: azure/gpt-4o api_key: os.environ/AZURE_API_KEY api_base: https://your-azure-endpoint.openai.azure.com/客户端只请求gpt-open,litellm 在两个渠道之间做轮询。这个配置方式很反直觉,但就是设计如此,绕不过去。
5.4 流式请求出现延迟累积
流式转发本质上是边收边发,litellm 会缓冲上游 chunk 再转发给客户端。如果感觉输出特别慢、一个字一个字崩出来,大概率是配置里没有正确开启流式转发,或者命中了缓存的非流式响应导致表现异常。
我还碰到过一种情况:某个模型渠道的流式上游不稳定,chunk 之间的间隔偶尔超过 5 秒,用户体验很卡。这时我给那个渠道单独配了更短的超时阈值和重试参数,同时在网关层面做一个流的兜底结束机制,避免客户端长时间空等。litellm 的转发逻辑能透传大多数流式事件,但极端情况下还是要靠业务侧的超时处理来兜底。
5.5 数据库连接导致启动失败
配置了database_url以后启动报错,先看数据库服务是否在线,账号权限是否足够建表。litellm 首次连接会在库里建一批表,如果用的账号只读权限,必然失败。
解决办法是给 litellm 用单独账号,授予库级全权限,但也要控制该账号的访问来源。数据库密码不要明文写在配置文件里,同样走环境变量引用。对了,SQLite 路径要保证进程有写权限,权限不足时表现是启动成功但日志写不进去,很阴间,容易漏看。
5.6 调用异常时的排查顺序
完整记录一下我的排障方法论,按这个顺序来能省掉一大半时间:
- 先开 verbose 日志:
set_verbose: true,litellm 会打印出入站请求和上游转发的详细信息。 - 确认请求到达网关:看访问日志里有没有对应记录,没有就查网络链路和反向代理。
- 确认请求正常出站:看 verbose 日志里是否成功发出上游请求,卡住就查 DNS、超时和防火墙。
- 确认上游响应状态:看转发日志里上游 HTTP 状态码,分析是渠道问题、参数问题还是鉴权问题。
- 最后才去查代码逻辑和客户端报错。
这套流程帮我处理过至少五个环境疑难杂症,顶得上瞎试半天的效率。尤其是“客户端报错但 litellm 日志没异常”这种情况,十有八九是网络链路问题,而不是模型调用问题。
6. 选型心得与避坑建议
6.1 什么情况下我不推荐用 litellm
虽然整体体验不错,但必须说清楚边界。如果只是个人实验,固定用一家模型,一个月调用量在几千次,完全不需要引入 litellm。它带来的运维成本——进程管理、配置维护、数据库——对你来说是纯负担。
另外,如果团队有专门的平台工程能力,已经在自建一套模型网关,那也没有必要再套一层 litellm。工具的价值在于补齐能力,而不在于堆砌组件。多个网关层不仅增加延迟,还让故障排查链条变长,定位问题更加困难。
6.2 正式环境启用前的必做清单
- 关闭开发模式下的宽松鉴权,强制校验虚拟 Key。
- 为每个业务方生成独立虚拟 Key,禁用共享 Key。
- 设置全局月度预算,防呆效果极好。
- 配置日志持久化,至少保留 30 天,方便回溯和审计。
- 为关键模型配置主备路由,不要在故障发生时再临时配。
- 在反向代理层启用 TLS,保证调用链路加密。
这些看起来都是常识,但我在好几个实际项目里见过遗漏其中某一项的后果。最惨的一次是整个网关没有设全局预算,某个脚本死循环调用模型,一天烧掉顶平时一周的成本,教训极其深刻。预算这东西宁可保守,不能没有。
6.3 从项目实操中获得的总体体会
litellm 真正的价值在于把“接入模型”这件事从开发工作变成了配置工作,把“运维模型”从救火变成了看仪表盘。它不改变模型本身的性能,也不优化推理质量,但它把工程侧的复杂度削减了一大截,让团队能把精力集中在业务逻辑和用户价值上。
我用它搭过一个完整的内部 AI 助理系统,后端只保留了业务逻辑,所有模型调用全部走网关。后来要换主力模型,只改了配置并测试,前后不到半小时,客户端代码一行没动。放在没有网关的架构里,这种切换大概要排一天的工作量。
如果你正被多模型接入、成本失控、调用不透明这些问题困扰,litellm 值得花半天时间试一试。先用最小配置跑通心里有底,再逐步把路由、预算、日志都建起来,它会慢慢变成团队 AI 基建里很顺手的一环。