用litellm搭建AI模型网关:统一多模型接入与路由管理

发布时间:2026/10/21 19:47:45
用litellm搭建AI模型网关:统一多模型接入与路由管理 上个月我在整理一个内部AI工具的时候发现代码里已经躺着好几个不同厂商的SDK。有的要同步调用有的要异步回调有的请求里还要单独拼签名异常类型更是五花八门。业务逻辑本身不复杂但模型接入这一层把项目活活拖成了“拼乐高”——每接一个新模型就要重读一遍文档再写一堆适配代码。后来我决定把整个调用层推倒重做最终选定的方案是litellm一个能把几十家模型服务统一成一套接口的开源网关库。这篇文章把我用litellm搭模型网关的思路、配置步骤、踩过的坑、以及什么样的项目适合用它一次说清楚。不管你是刚接触大模型应用开发还是已经在业务代码里被多个模型SDK折腾过一段时间这篇文章应该都能给你一些参考。我不打算写成一个工具文档式的罗列而是按我实际操作时的思考顺序来讲——为什么需要一个网关层litellm是怎么设计的路由要怎么配预算和Key怎么管以及生产环境里那些文档没写明白的坑。1. 回到最初模型接入碎片化才是真正的痛点1.1 五个模型五种协议业务代码被SDK绑架先说说我遇到的具体情况。当时团队内部有一个内容生成工具核心功能是把一段产品描述改写成不同风格的文案。一开始只接了一个模型服务代码很简单几十行就搞定。后来老板说要多对比几家模型的效果于是又接了两家噩梦就开始了。第一家的SDK是“先建Client再调chat方法”的风格第二家没有专门的chat接口要自己组装一个字符串模板塞给某个生成接口第三家的请求又要求使用一种特定的消息格式连角色名称都不一样。业务代码里开始出现大量if/else判断如果当前用的是A模型就走A逻辑如果是B模型就走B逻辑。更麻烦的是其中某个SDK一旦调用失败抛出来的异常类型和另外两家完全不同你不得不在最外层再包一层统一的异常转换。这还算好的等模型版本升级、SDK接口变更的时候那种“哪都不敢动”的痛苦才真正让人抓狂。这不是我们一个团队的问题。我后来和几个做应用开发的同行聊过大家都遇到过类似的情况——模型能力本身确实强但接入多个模型时的“工程摩擦”被严重低估了。表面上看是换一个API地址的事实际涉及到请求格式、鉴权方式、超时处理、错误码、流式协议、计费口径每一个微小的差异都在消耗开发时间。1.2 Key的分散、限额不透明与账单对不上除了接口格式不统一密钥管理也是个大问题。早期我们每个人用自己的API Key做联调Key散落在各个环境变量文件里甚至有人图省事直接写在配置里提交到了仓库。后来虽然规范了一些但依然有同学离职后他名下的Key还在被某个定时任务使用直到账单爆了才发现。更让人头疼的是不同模型服务的计费和限流逻辑完全不一样。A平台按输入输出token分别计价B平台按请求次数包月C平台则有一个“上下文窗口占用费”理解成本很高。每个月对账的时候要把好几个后台的账单导出再手工汇总分摊到不同项目上经常对不上。当时我们就在想能不能做一个中间层把所有模型调用都收口到一个地方统一鉴权、统一记账、统一配额管理。1.3 为什么不自己写封装而是引入网关层也有人会问这种适配层自己写不行吗不就是写个BaseModel类然后每个模型继承实现一下吗说实话我自己也试过。刚开始确实挺爽三五个模型的适配都很干净。但越往后越难收场模型A支持系统提示词但模型B要用另一种字段传模型C的返回结果里多了一层嵌套模型D对流式输出的处理方式和别人都不同。这些差异如果你都要在抽象层里抹平最后那个抽象基类的接口会越设计越复杂参数列表越来越长各种workaround堆在一起维护成本远超收益。更重要的一点是厂商模型接口是会经常变的。你一个月前适配好的东西别人下个月升级SDK、调整默认行为你又要跟进改。自己写的话这些事永远都是你的事。而如果用一个专门做这个事的开源组件会有大量社区力量帮你做适配和回归你只需要跟着升级版本。这个思路的转换是很关键的把“协议转换”和“容错策略”当作一个独立问题来处理而不是混在业务代码里。2. litellm的网关设计把“百花齐放”翻译成同一种方言2.1 从函数入口到独立代理两种使用方式litellm的使用方式主要分两种我先说清楚因为很多人第一次接触到它都会在这两个模式之间犹豫。第一种是SDK模式在Python代码里直接调用litellm.completion()、litellm.acompletion()、litellm.embedding()这些函数。这种方式适合单个项目内使用代码里不关心背后是哪个模型服务只要传模型名和消息函数返回统一结构的结果。启动成本极低几乎是pip安装完就能跑。第二种是代理模式Proxylitellm会启动一个独立的HTTP服务对外提供一个符合“业界主流REST风格”的聊天补全接口。你的业务服务只需要把这个代理的地址当作一个普通的模型API地址来调用不需要知道真实模型是谁、部署在哪里、密钥是什么。这种方式适合多个服务共享一套模型能力或者想统一做预算、鉴权、日志的场景。我自己的感受是SDK模式适合“个人脚本”或者“小工具”方便快捷代理模式适合“团队基础设施”一旦你有多条业务线都要用模型就值得部署一个独立的网关服务。两种模式底层用的是同一套路由和翻译逻辑所以从单机脚本平滑迁移到代理服务也不算难。2.2 一个请求从进入到返回litellm到底做了什么我刚开始用litellm的时候也好奇它到底是怎么把那么多接口统一起来的。后来翻了源码和配置项才明白它的核心思路并不复杂可以拆成几步。当请求进来后litellm会先从路由配置里查找“逻辑模型名”对应的真实模型配置。比如业务方调用的模型名是“main-chat”路由表里可能配置了这个逻辑名对应两个真实后端一个是A厂商的旗舰聊天模型另一个是B厂商的开源模型。选定后端之后litellm会做几件事把统一的请求参数翻译成目标接口要求的字段结构从统一管理的密钥池里取出对应的真实密钥拼到鉴权头里接着发请求再把目标接口的响应转换成统一的标准结构。在流式请求里它还会把不同厂商的流式事件格式统一成标准的SSE事件。这个“翻译层”做得够不够好决定了整个方案的可靠性。从我的实际体验看常用模型服务的适配质量都很高一些较少见的模型则偶尔会有边界问题但社区更新很勤提个issue很快有人处理。2.3 配置与路由分离带来的灵活性格局litellm设计上最戳我的一个点是“逻辑模型名”和“具体模型实现”的分离。业务代码里写的始终是一个稳定的逻辑名比如my-chat-1而这个逻辑名指向哪个厂商的哪个模型完全可以由网关配置决定。今天指向A模型明天改成B模型业务方无感知。这个设计的好处太多了。最直接的是切换成本几乎为零。我们后来做了一次模型迁移就是从A厂商切到B厂商调整了网关端配置压测验证了一下效果业务方什么都没改就完成了切换。这在传统开发模式下是难以想象的。以前每次换模型前端、后端、测试全要跟着动现在所有变更都收敛在网关这一层。这个概念类似于你给自己家装了一个“智能电箱”屋里所有电器不需要关心电是从哪个发电站来的电箱帮你做了切换和调度。对上层来说插座就是那个插座电压稳定接口不变。3. 多模型路由实测从单点备用到按成本权重分发3.1 一个最小化的Router配置长什么样litellm做多模型路由非常方便核心是Router对象或者代理模式下的model_list配置。我先给一个最小配置示例让大家有一个直观感受。model_list: - model_name: main-chat litellm_params: model: provider-a/model-a api_key: os.environ/PROVIDER_A_KEY - model_name: main-chat litellm_params: model: provider-b/model-b-v2 api_key: os.environ/PROVIDER_B_KEY这段配置里“main-chat”是逻辑名业务方只认识这个名字。下面两条记录代表这个逻辑名有两个真实后端。Router在调用时会把请求分发到其中一个后端。在SDK模式下代码大概是这样的import litellm from litellm import Router router Router(model_listmodel_config) response router.completion( modelmain-chat, messages[{role: user, content: 帮我写一段产品介绍}] )你看业务代码里只出现了“main-chat”一个模型服务提供方都没出现。你也不用关心这个请求最后是哪个模型处理的Router会用配置好的路由策略去决定。3.2 自动fallback和重试怎么设才不翻车接了多个模型之后最直接的好处就是可以做自动容错。比如主模型超时了自动切到备用模型主模型返回5xx错误马上用次选模型重试。这几乎是运维层面的刚需。但重试和fallback不是盲目开的需要区分失败类型。我的经验是网络连接错误、超时、限流这一类“临时性失败”适合重试模型服务返回4xx这种“业务性错误”比如上下文超长、请求格式非法重试大概率还是失败就不要重试直接报错返回就好。litellm里可以这样控制路由策略router_settings: retry_policy: TimeoutError: 1 RateLimitError: 2 APIError: 1 allowed_fails: 2 cooldown_time: 60retry_policy告诉Router哪些异常类型可以重试以及最大重试次数allowed_fails表示某个后端连续失败多少次后会被临时标记为不健康cooldown_time是冷却时间标记为不健康之后要过多久才允许再次尝试。这几个参数要按业务容忍度来调。如果是一次普通问答重试两三次没问题如果是一次耗时很长的离线批处理重试次数就要谨慎因为重试的代价可能很高。3.3 把成本、优先级和速率限制编排进一个列表路由策略不只是“出错了切一下”这么简单litellm还支持按权重分发。你可以在配置里把同一条逻辑名指向两个模型并通过rpm每分钟请求数和tpm每分钟token数做一些限制让Router按照宽松程度分发流量。比如我们有一个场景希望优先用成本较低的模型只在它达到速率限制或超时才切到高成本模型那我就会把低成本模型的rpm设成一个合理值超出的流量自动落到备用高成本模型上。这种“先便宜后贵”的策略在成本敏感的业务里非常好用。反过来如果业务需要保证响应质量那就应该把高成本模型设置为第一优先并用超时机制兜底。这里我想提醒一句不要过度依赖默认的路由顺序。litellm的deliverability策略有几种虽然默认的优先级策略在大多数情况下表现稳定但你最好根据真实业务数据调整一下。测试和调参是必须花的功夫。3.4 我是怎么验证路由不出错的配置写对了没有代码看起来再美也要实际验证。我常用的验证方法很简单就是“破坏性测试”。先在路由列表里配置一个不存在的模型名作为主模型故意让Router首选失败然后观察它是否自动切到配置好的备用模型。如果日志里出现了fallback记录并且最终响应成功了说明容错链路是通的。再用一个小脚本并发发起几十个请求人为给主模型设置极短超时看Router是否会因为超时触发切换以及切换期间有没有报错。这一步非常值得做。我见过不少项目配置写得看起来完美结果一压测就发现备用模型的API Key配置错了或者逻辑模型映射漏写了一条生产出问题时并没有真正兜住底。提前做一次解药测试总比线上事故后再补救强。4. 花钱和钥匙的管理预算上限、虚拟Key与用量统计的落地套路4.1 真实密钥只放在服务端其他人拿虚拟Key代理模式下litellm提供了虚拟Key管理功能。意思是你不用把真实的模型服务密钥分发给每个团队成员而是由网管端生成一个个虚拟Key分给人或者分给业务模块。每个虚拟Key可以绑定特定的权限和限制比如允许访问哪些逻辑模型、每分钟最多请求多少次、一天最多消耗多少预算。这样团队成员各自使用自己的虚拟Key调用记录都能追溯到具体的使用者。真实服务商密钥只存在网关服务端的配置里再配合密钥管理服务来保管基本杜绝了密钥泄露到代码仓库的风险。我们团队之前最大的痛点之一就是新同学加入项目时不知道去哪里拿Key只好找老同学要一个复制粘贴。有了虚拟Key机制之后新入职的同学只需要在网关后台申请一个属于自己的Key自己保管流出去了也能在后台禁掉不用重新申请真实服务商账号。4.2 预算上限防止异常任务刷爆账单在内部工具里预算控制往往比功能开发更影响“和平”。你见过一个定时任务因为提示词写错循环调用模型一晚上烧掉几千块吗我见过后遗症很大。litellm在代理模式下配置预算并不复杂。它支持按虚拟Key设置总预算上限也支持按天/按月重置。我建议即使是一个内部小项目也一定要先设置预算上限再开放使用。举个例子general_settings: master_key: sk-your-master-key budget_settings: - key_name: batch-job max_budget: 50 budget_duration: 1d这个配置的意思就是给名为“batch-job”的虚拟Key设置每天最多消耗50美元超过之后直接拒绝请求。虽然50美元这个数值你要自己根据业务定但思路是相通的让异常消耗在变成账单前就被挡住。4.3 用量日志与费用分摊预算只是“事前控制”事后还有成本归因。litellm会记录每次请求的模型名、输入token数、输出token数、预估费用、响应耗时等信息。这些数据可以输出到日志也可以配置回调推送到公司内部的监控系统或数据仓库里。有了这些记录我们就可以按照项目、按功能模块、按虚拟Key来统计一个周期内的模型消耗。月度复盘时不再需要打开各模型服务商的后台一个一个导表再手工加加减减。我们当时最直观的收益是产品经理能直接看到“这个新功能每天花多少成本”从而判断要不要调整模型选择或缓存策略这对做技术决策帮助很大。要注意一点litellm给出的费用预估是基于目录价格的和你实际收到的账单可能存在微小误差尤其是那些有复杂计费规则的服务。但它作为日常监控和告警依据误差完全在可接受范围内。真正的账单校准还是要以服务商后台的最终账单为准。5. 生产环境里那些文档没写明白的坑超时、重试与流式响应的真实表现5.1 默认超时不够用也不一定安全先说说超时。很多人在刚用litellm时都只设置了全局默认超时比如60秒觉得够用了。但实际上不同模型任务的耗时差异非常大。一个简单的问答可能5秒就返回了但如果你的提示词里塞了一大段参考材料要求模型做长文总结耗时很容易超过30秒再遇到排队高峰期超过60秒也不是不可能。如果我们把所有请求的超时都设成60秒长任务会被提前断掉如果都设成180秒短任务出问题时用户要白白等很久。我最终的做法是针对不同业务场景单独设置超时。比如聊天类请求用30秒超时文档总结类请求用120秒超时。litellm允许在配置里针对具体逻辑模型设置timeout参数使用的时候覆盖一下就行。这个细节很值得优化一下。5.2 重试导致的重复生成别让它偷偷发生重试自动切换模型听起来很美好但这里藏着一个很多人没注意到的坑——重试可能导致重复生成。我们遇到过这么一件事一个批处理脚本在跑长文本生成网络发生抖动第一次请求实际上已经到达了模型服务端并且模型已经生成了结果只是响应在回传时超时了。Router因为超时判定失败自动重试了一次结果第二次请求也成功生成了结果。最后这批数据里出现了两条内容相同的记录后面清洗数据时才发现。针对这个问题我给几个实际建议第一尽量保证业务请求包含一个唯一ID并在重试时复用同一个ID这样模型服务端可以识别出重复请求但实际上并不是所有服务商都支持这个能力第二如果你的业务对重复内容不可容忍那就要谨慎开启自动重试只对明确失败比如网络层拒绝连接的情况做重试而不是对所有异常无脑重试。这是个取舍问题没有绝对正确的答案。5.3 流式响应的SSE细节兼容比规范重要现在我们用的很多应用都是打字机式的流式输出用户体验好很多。litellm对主流模型服务的流式协议转换做得不错基本能统一到标准的SSE格式。但你要做好心理准备安静的自建模型服务是最大的变数。有一次我们接了一个自建的推理服务它对外提供的流式接口在最后结束事件上跟标准格式不一致结果litellm转发过来的事件流里客户端解析到中途就停了。查了很久才发现不是litellm的问题而是上游服务的SSE实现有些“自己的理解”。所以如果你要接自建模型服务建议先做一次流式协议的小测试再用完整的功能。另外客户端代码里对SSE事件的解析要尽量宽容处理未知事件字段时不要直接报错。真实世界的流式协议没有你想的那么标准化。5.4 连接池和并发网关别变成新的瓶颈一旦多个服务都通过litellm代理转发请求网关本身的并发能力就成了关键。我们早期压测时就碰到过连接池耗尽的问题。当时表现是偶尔有几个请求会一直卡着直到超时才报错但网关的CPU和内存看起来都正常后来排查发现是底层连接池不够用很多连接一直在等待复用。解决办法通常是调整两个地方一是网关服务本身的连接池大小上限二是各个模型服务客户端的连接池配置。litellm底层用了异步框架但不同模型服务的客户端实现方式不同连接管理能力也不一样。如果你发现请求量上来之后延迟变高、大量请求排队请优先检查连接池和文件描述符限制不要一上来就怀疑是代码逻辑出问题。另外日志也要注意。生产环境流量大的时候全量日志会带来大量额外磁盘IO和序列化开销。litellm支持采样或按需输出日志我建议常规环境下只记录关键字段比如模型名、token数、响应码、耗时不要一股脑把完整请求体和响应体都打出来不然你会被海量日志淹没。6. 我的最终建议什么场景值得上litellm什么场景别硬上6.1 多模型、快速迭代、小团队——很合适如果你处于以下状态我觉得litellm可以放心引入团队需要接入多个模型服务做效果对比、业务要求能够快速切换模型、团队规模不大、没有专职的AI基础设施团队。这样的背景下litellm用一个开源组件补齐了模型接入层的共性能力让你少写很多重复代码少踩很多坑。我们团队从接触litellm到全面上线大概只用了一周时间。最主要的时间花在梳理业务场景和配置路由策略上真正写业务代码的时间反而很少。上线之后新模型接入的时间从“以天计”缩短到“以小时计”这对业务迭代速度的提升是很直观的。6.2 单一模型、追求极致链路或离线私有化——要慎重但我也要说几句你可能不爱听的实话。如果你的业务只调用一个模型服务链路已经很稳定没有切换需求那加一个网关层纯属增加延迟和故障点。本来一次HTTP请求就能搞定的事现在要先经过代理再发到真正的模型服务链路更长出问题的可能性更大。这些场景下真的不用为了用而用。还有一类情况要谨慎追求极致低延迟和高吞吐的在线推理服务。网关层毕竟是一次额外的网络跳转即使优化得再好也会带来微秒甚至毫秒级的额外延迟。对于单次推理延迟要求极高的场景你需要做严谨的压测对比确认这个损耗可以接受再上。此外如果你想做完全离线的私有化部署litellm和那些自建模型服务不一样它本身不是一个模型托管平台它底层还是需要你提供模型推理接口或服务商API这一点需要提前搞清楚。6.3 落地前想清楚的三件事如果你决定要在项目里试一下litellm我建议你先想清楚三件事。第一模型命名规范很重要。把逻辑名和具体供应商名分开这个原则一定要坚持不然过半年再回来改配置时你会发现自己忘了哪些业务代码在引用哪个模型名。第二预算和告警先配置好再放量。千万不要在还没有预算上限的时候就让所有业务流量都走网关不然一次异常循环就能让人心态崩溃。第三提前规划日志和监控方案。litellm提供了很多观测接口你可以把核心指标接入公司现有的监控体系里至少要做到每次调用都能追溯万一出问题能快速定位是哪个业务、哪个Key、哪个模型引起的。最后再分享一点小经验吧。litellm的项目名字虽然低调但你把它用起来之后会发现它解决的不只是“接口统一”这一个点更是一种思路上的转变——把模型服务当作可替换的资源而不是把某一个模型深度耦合进你的业务代码。自从我们收敛到这个网关方案之后业务端已经快忘了模型切换这回事了变成一件“运维层面调整一下”的小事。希望这篇文章能让你少走一点当初我走过的弯路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询