1. 为什么我在项目里选择了litellm
先聊个实际场景。做过AI应用开发的兄弟几乎都经历过这个阶段:最开始接OpenAI的API,跑通了,效果不错;过两天想对比一下其他家模型的效果,发现要改一堆代码;再往后,公司要你同时接入多个服务商做容灾备份,还要统计每个部门花了多少钱的token,这时候你再看自己的代码,已经为了适配不同API格式写了一堆if-else、封装层、重试逻辑——乱成一锅粥。
litellm就是在这种背景下进入我视野的。它的定位非常清晰:一个开源的、统一的LLM API网关。你只需要用一种格式去调它,它会帮你把请求转发到背后的OpenAI、Anthropic、Google、国内各家模型服务商等等几百个模型上去。对上层应用来说,模型供应商完全被屏蔽掉了,你只管发标准请求,剩下的路由、重试、配额、成本统计,都是它的事。
我最初是在一个多模型对比评测的小项目上尝试的,当时只想用它统一调用格式,省得每换一家模型就改一遍代码。结果用着用着发现,它的负载均衡、成本追踪、key管理这些能力才是真正省时间的地方。后来这个项目演进成了公司内部的AI能力中台,litellm成了中间最稳定的一环。
这篇文章不打算讲那种“官网文档翻译”,而是结合我自己在真实项目里遇到的痛点,拆一拆litellm到底解决了什么问题、核心功能怎么用、生产环境里有哪些坑,以及哪些场景其实不适合用它。如果你正在做AI应用开发、想要一套能管住所有模型调用的基础设施,这篇内容应该能帮你省下不少试错成本。
2. litellm核心能力拆解:它不只是“API翻译官”
很多人第一次接触litellm,脑子里蹦出来的概念是“API格式转换器”——把OpenAI格式转成Anthropic格式,再转成别的格式。这个理解没错,但太浅了。实际用下来,它对项目的价值体现在五个层面,每一条都实打实地解决过我的问题。
2.1 统一调用格式:一套代码跑通所有模型
这是litellm最基础也最被人熟知的能力。它以OpenAI的请求规范为基准,对外暴露一个兼容OpenAI的/chat/completions接口。你发给它的请求长这样:
from openai import OpenAI client = OpenAI( api_key="sk-1234", base_url="http://localhost:4000" ) response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "你好"}] )看到没?用的是openai的SDK,只是改了一下base_url。这就意味着,你现有的、基于OpenAI SDK写的业务代码基本不用动,把环境变量里的接口地址换成litellm的地址就行。
更妙的是model这个字段。你在litellm里调用gpt-4o时,它不一定真的转发给OpenAI,而是按你配置的路由规则来决定。比如你可以把gpt-4o映射到任意一个供应商的任意模型上,或者配置成一组模型轮询。业务代码眼里只有“模型名”,至于背后是谁在提供服务,业务方不需要关心。
我实测过的场景:一个模型评测脚本,原本写死了OpenAI的SDK和模型列表,后来加一个本地运行的模型进来,只改了litellm的配置文件和一行环境变量,业务代码一行没动。这种爽感,经历过“改一个供应商就要动十几个文件”的人才懂。
2.2 模型路由与自动容错:别让单点故障干掉你的应用
生产环境里最怕什么?怕你依赖的模型服务商出故障。你控制不了他们的稳定性,但你可以让自己的应用更皮实。litellm的路由策略提供了三层防护。
第一层是Fallback(故障转移)。你配置一个主模型和一个备用模型,当主模型调用失败(比如5xx错误、超时、限流),litellm自动把请求转到备用模型上。对用户来说,这次请求可能只是慢了一点点,但不会报错。对于业务方,这是线上应用不被上游故障拖垮的关键。
第二层是多模型轮询(Rotation)。你可以在路由配置里写一组模型,litellm按权重轮流选一个去调用。比如80%的流量给主力模型,20%给备选模型,这样一方挂了,至少还有另一方能承接部分流量。
第三层是重试策略(Retry)。litellm支持配置超时时间和重试次数,对偶发的网络抖动、限流错误做自动重试。重试时还可以设置退避策略,避免重试风暴打挂对方接口。
项目的关键决策是路由顺序:容易出问题的模型要排在后面,稳定且便宜的模型排在前面;重试次数不建议超过3次,超过之后就应该直接交给人工或业务降级逻辑处理。这个不是拍脑袋定的,而是我们被限流折磨出来的经验——重试太激进,反而容易被服务商封key。
2.3 负载均衡与多Key轮转:应对限流的实用招法
调用AI服务的人多了,自然会撞上限流。尤其在一个中大型团队内部,几十上百个开发者共享一个供应商账户,并发稍微一高,429限流错误就满天飞。
litellm对这个问题有一套标准解法:同一个供应商配置多个API key,litellm帮你做key级别的轮转和负载均衡。比如OpenAI准备了5个key,请求进来后,litellm会把流量分散到这5个key上,每个key的消耗速率都很低,能大幅减少被限流的概率。这比你在业务代码里手动拼一个key池要省事得多,而且key的轮转逻辑对上层完全透明。
另一个实用功能是区域路由。有些大模型服务商在不同区域有不同的入口,比如一个在美国、一个在国内或亚太,延迟差异非常大。litellm支持按区域配置端点,并根据请求来源或配置规则把流量路由到延迟更低的区域,对国内开发者的实际体验改善非常可观——我在项目里把部分请求路由到亚太端点后,首字节延迟直接降了差不多一半。
2.4 成本追踪与额度管理:让token花销变成可量化的指标
说到成本,这可能是很多刚从个人项目走向团队项目的人最容易忽略的一点。自己调API的时候,一个月花几百块没感觉;但当整个团队都在调,一个月几万块的账单下来,管理者就开始问钱了:哪个部门花的?哪个模型烧的?哪次上线导致成本暴涨?
litellm的成本追踪能力是把“钱”和“请求”绑在一起。你在配置里维护一份模型价格表,litellm根据每次请求的模型、输入输出tokens数,自动算出这次调用的成本。所有数据都能通过它的管理后台查得到,也能按用户、按部门、按模型维度聚合统计。我搭的管理后台里,业务方可以直接看到自己项目当月消耗了多少tokens、费用是多少,日报周报都不用人肉汇总了。
再配合额度管理,效果更好。你可以给每个用户或团队设置一个预算上限,超过之后litellm直接拒绝新的请求。对负责预算的人来说,这个功能简直是救命稻草,不用再靠人工盯报表、催停用了。
2.5 轻量观测:日志、追踪与请求详情
排查线上问题时,最痛苦的是你不知道某一次请求到底发生了什么。是模型服务商慢?是超时重试了?还是请求内容触发了输入审核?普通SDK能告诉你的信息太有限了。
litellm内置了请求日志和追踪能力,每次请求的输入输出、耗时、token用量、成本、命中了哪个模型和供应商,都有明细记录。你可以在管理后台按时间、用户、模型等条件筛选,找到某一条具体请求,看它的完整状态和响应内容。这个功能在A/B切换模型时特别有用——哪条请求走的是新模型、效果怎么样、慢在哪一步,都有据可查。
它还支持将日志导出到Prometheus、自定义Webhook等外部系统,可以接进公司已有的监控体系。这里说一下前提:litellm的默认日志存储是本地SQLite,自用没问题,生产环境建议接独立的数据库(比如PostgreSQL)做持久化,否则日志量上来之后查询会变慢。
3. 从零部署litellm:配置、接入与参数详解
如果你还停留在“知道这个工具不错”的阶段,这一节就是来帮你把它真正跑起来的。我会走一遍从安装到代码接入的完整流程,并把关键配置逐条解释清楚。基于官方文档和我自己的部署经验,给你一套能直接用起来的方案。
3.1 安装与启动:两种模式怎么选
litellm的部署方式分两种,对应不同的使用阶段。
第一种是纯Python库模式。你只需要:
pip install litellm然后在代码里直接用:
import litellm response = litellm.completion( model="openai/gpt-4o", messages=[{"role": "user", "content": "hello"}] )这种方式适合做模型对比评测、脚本工具这类场景——不搭服务器,不搞配置,代码里直接指定供应商前缀和模型名就能调。它的灵活度很高,但缺点是每个跑脚本的地方都需要配置自己的API key,不太适合团队共享。
第二种是网关服务模式,也是生产环境的主力形态:
pip install 'litellm[proxy]' litellm --config config.yaml --port 4000装好依赖后,一条命令就把服务拉起来了。默认监听4000端口,对外暴露与OpenAI兼容的REST API。所有团队成员的请求都走这一个网关,key的管理、限流、成本核算都在这一层统一处理。我自己的项目采用的是这个模式,让网关跑在内网的一台小机器上,前后端应用统一连它。
两种模式不是互斥的。我的建议很直接:先本地跑通Python库模式,验证模型调用没问题,再部署网关模式作为团队入口,开发调试和生产环境分开配置。
3.2 核心配置文件解析
config.yaml是litellm网关模式的灵魂。第一次打开这个文件,你会看到一些默认内容和示例,不用慌,把不需要的删掉,改成自己的服务商配置就行。下面是一份我生产环境在用的最小可用配置,每一项都是经过验证的:
model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: claude-3-5-sonnet litellm_params: model: anthropic/claude-3-5-sonnet api_key: os.environ/ANTHROPIC_API_KEY - model_name: chat-model litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY model_info: mode: completion litellm_settings: num_retries: 3 request_timeout: 30 fallbacks: - model_name: chat-model fallback_models: [claude-3-5-sonnet] general_settings: master_key: sk-master-1234 database_url: os.environ/DATABASE_URL逐项说一下。
model_list是路由表,model_name是客户端请求时用的名字,litellm_params里写真正的供应商、模型名和key。os.environ/XXX的写法意味着从环境变量里读API key,这是安全习惯——明文把key写在配置里,然后文件提交到Git仓库,那基本等于把钥匙挂在门口。
model_info里的mode字段,你可以简单理解为这个模型适合什么类型的任务。有的供应商支持completion和embedding两种模式,需要声明清楚,否则请求格式容易对不上。
litellm_settings里的num_retries是重试次数,request_timeout是等待上游响应的超时时间,fallbacks定义了故障转移的关系——当chat-model请求失败时,自动把请求转向claude-3-5-sonnet。这里要注意,fallback的配置级别是model_name,也就是说,只要客户端请求的是chat-model这个名字,就会触发这套故障转移逻辑。
general_settings里的master_key是网关管理员的访问凭证,所有管理类操作需要它。database_url是日志持久化用的数据库连接,生产环境我强烈建议配上,后面排查问题全靠它。
启动时用环境变量传入数据库连接:
export OPENAI_API_KEY="sk-xxxx" export ANTHROPIC_API_KEY="sk-ant-xxxx" export DATABASE_URL="postgresql://user:pass@localhost:5432/litellm" litellm --config config.yaml --port 4000这里注意,在配置里引用os.environ/OPENAI_API_KEY的写法,需要环境变量真的存在,否则litellm启动时会直接报错,不会等到请求进来才炸。
3.3 代码接入:兼容旧代码的正确姿势
网关跑起来之后,接入现有业务代码很简单。以Python为例,只改客户端初始化:
from openai import OpenAI client = OpenAI( api_key="sk-master-1234", base_url="http://localhost:4000" )如果你以前用的是base_url指向https://api.openai.com/v1,现在改成litellm的地址,其他都不用动。请求逻辑保持不变:
response = client.chat.completions.create( model="chat-model", messages=[{"role": "user", "content": "你好"}], temperature=0.7 )注意model参数传的是chat-model,这是我们在配置里定义的逻辑名,不是真实的供应商模型名。这样做的好处是:将来想从gpt-4o切到别的模型,只要改litellm的配置文件,业务代码可以做到零改动。
其他语言的接入方式同理——因为litellm对外是OpenAI兼容API,所以任何语言的OpenAI SDK都能直接连。Node.js的openai库、JAVA的openai-java客户端,把baseURL指过去就完事。我项目里前后端各用各的语言,都是这么接的,没出过兼容性问题。
3.4 关键参数与模型价格配置
把模型接入litellm之后,建议花几分钟做一件重要但不紧急的事:维护模型价格表。litellm支持在配置里补充价格信息:
- model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY model_info: input_cost_per_token: 0.0000025 output_cost_per_token: 0.00001 mode: completioninput_cost_per_token和output_cost_per_token是模型每处理一个token的价格(美元),可以在服务商官网查到。配置好之后,litellm每次请求都会自动计算并记录成本。没有这个配置的话,成本追踪功能就是空的,日志里只会显示token数,显示不了金额。
注意:价格填错会导致成本统计严重失真。比如
gpt-4o的输入价格是0.0025美元/1K tokens,换算成每token就是0.0000025,单位写错一位数,报表里的金额就会差1000倍。我就是吃过这个亏,被财务问了一次才彻底记住。
另一个值得花时间的配置是用户和团队的权限管理。litellm支持创建虚拟key,并关联用户,也可以给每个key配置配额:
curl -X POST http://localhost:4000/key/generate \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-master-1234" \ -d '{ "user_id": "team-a", "max_budget": 100, "model_max_budget": {"gpt-4o": 50} }'这个命令会生成一个带预算上限的key,给到A团队用。月底看报表时,谁能花多少钱、花在哪了,一清二楚。这种按团队/项目拆分预算的做法,在多人协作场景里特别实用——省得某个人误操作一把梭,把整个月的预算烧光了。
4. 生产环境下的踩坑实录与排查技巧
纸上得来终觉浅,litellm的一些棘手问题,是我在真实线上环境里被按在地上摩擦之后才琢磨明白的。这一节我把遇到过的典型问题、排查思路和实测心得整理出来,希望能帮你少走几步弯路。
4.1 常见问题速查表
先放一张速查表,按“症状-原因-解法”的维度写,方便你出了问题时直接对号入座。
| 症状 | 常见原因 | 解决方法 |
|---|---|---|
| 请求返回401 Unauthorized | 客户端传的key不是litellm生成的虚拟key,而是直接用了供应商key | 客户端统一改用litellm生成的key;检查master_key是否正确 |
| 请求返回404 Not Found | 配置里没有定义对应model_name,或模型名拼写错误 | 检查config.yaml的model_list;确认客户端传的model字段与配置一致 |
| 上游请求频繁超时 | request_timeout设置太短 | LLLM的默认request_timeout设为30秒;对流式请求可再放宽,但不宜超过60秒 |
| 一重启网关就丢数据 | 日志存在内置SQLite或内存里 | 配置外部PostgreSQL,把database_url指过去 |
| 使用了故障转移但没生效 | fallbacks配置在了错误的model_name层级 | 核对你配置的model_name是否和客户端请求的模型名完全一致 |
| 日志里出现大量429错误 | 供应商key的并发配额被打满 | 在litellm里配置多个key做轮转,降低单key并发 |
| 成本报表金额看起来不对 | 模型价格表未配置或单位写错 | 核对input_cost_per_token和output_cost_per_token的数值和单位 |
| 请求成功了,但响应内容不稳定/随机 | 路由配置了多个模型轮询,不同模型输出不同 | 确认model_list中是否存在多个模型映射到了同一个model_name,调整权重或拆分逻辑名 |
4.2 实测下来的几条心得
有几条经验,是常规文档里不容易看到的。
第一,虚拟key和供应商key不要混用。让所有客户端统一使用litellm生成的虚拟key,不仅是为了统计方便,更重要的是你可以随时吊销某个key而不影响其他人。线上有一次某个前端项目把key意外提交到了代码仓库,我直接在litellm后台把这个key吊销,然后给那个项目重新生成一个,全程两分钟搞定,其他业务完全没受影响。如果用的是供应商原生key,吊销的可就是所有人的访问权限了。
第二,升级litellm前先看release notes,不要盲目追新。这个工具迭代很快,偶尔有breaking change。生产环境我一般会钉在一个已验证的版本,等新版本跑一段时间,社区反馈没问题了再升。我的原则是,不被新特性绑架,稳定优先。
第三,流式请求和大请求要注意超时设置。litellm把请求转发给上游后,上游流式返回时可能持续很久。如果你设置的总超时时间太短,一个长对话的流式响应会被中途切断。我的做法是网关不对流式响应做强制超时判断,或者把超时阈值拉得足够宽,把兜底放在更上层的业务代码里。
第四,配置文件建议纳入版本管理。config.yaml实际上就是你的基础设施代码,每次改动都应该提交到Git,方便回滚和审查。别以为这是小事,有一次我们升级一个模型的版本,改配置时手滑写错了一个退出率,等发现问题时已经跑了半天,靠Git回滚才快速恢复。
4.3 什么时候不建议用litellm
聊完了优点和用法,也说说边界。litellm不是银弹,有些场景下引入它反而会增加复杂度。
如果你的项目只是个人脚本,调一种模型,一天也发不了几十次请求,那直接调供应商API就行,没必要为了“统一”再搭一层网关。多一个组件就多一个维护点,这种复杂度对于小项目是负担。
如果你们已经有成熟的API网关或Service Mesh基础设施,且治理能力已经很完整,可以考虑把AI调用接在现有网关后面,而不是强行再插一层litellm。工具是为解决问题服务的,不是为了满足“集邮”心理。
还有一种情况需要注意:涉及非常复杂的模型推理逻辑,比如多轮工具调用、深度定制化的流式输出格式,这些场景litellm虽然能透传,但出了问题排查链路会变长。如果你们团队没有足够的运维能力来照看网关,建议先用直连方案把产品跑通,再逐步引入。
5. 从网关到平台:litellm在团队里的演进路径
最后聊一件很多人会关心的事:litellm在一个团队里,怎么能从“跑起来”变成“用得好”,慢慢沉淀成团队内部的基础设施。
大多数人第一次部署litellm,是为了解决“我自己不想改代码”的问题。但用得越深,越会发现它最大的价值,其实在于能改变团队的工作流程。
比如,我们在部署的第三周,就把所有业务线的模型调用全部收口到网关。从那以后,新同事接入AI能力,不再需要自己去申请供应商key、读各家API文档,只需要在litellm管理后台开一个虚拟key,然后按统一格式调用就行。入职培训里关于“怎么接AI”的文档,从十几页压缩到了三页。
再比如,模型测评这件事。以前我们想对比几个模型在同一批数据上的效果,需要写一堆适配不同API格式的脚本,数据还得自己清洗对齐。现在只需要在配置里把同一个逻辑名指向不同的模型,脚本零改动,直接跑,输出结果天然对齐。做模型升级前的回归测试,效率提升非常显著。
还有一点我认为值得尝试的:把litellm的请求日志和公司内部的监控系统打通。我们后来把它接进了自建的监控大盘,每次请求的延迟、token消耗、成本、失败率都在一个看板上实时更新。模型一出现异常波动,值班的同学能看到告警,而不是等用户投诉了才后知后觉。
根据自己的项目规模,你不需要一次性把所有功能都用上。先解决统一接入,再逐步打开负载均衡、成本追踪、权限管理;从一个人用,到小团队用,再到整个部门共用,每个阶段解决不同的问题。litellm这类工具的特点就是——你用得越深,它能帮你管理的东西就越多。
我个人在实际操作中的体会是,工具选型不在于功能有多全,而在于它能不能在你真正需要的时候,恰好补上那块空缺。litellm之于我,就是在项目从“写代码调接口”向“管理多个AI服务”演进时,补上了最关键的那一层。如果你也刚好卡在这个节点上,不妨照着上面的配置跑一个实例试试,把第一笔请求发出去,剩下的问题自然会在使用过程中慢慢展开。