资讯动态

开源大模型网关litellm:统一API接入,彻底解决多模型切换难题

发布时间:2026/10/21 19:37:00 来源:尧图企业网站定制
做AI应用开发的朋友我猜你一定经历过这种场面上午用一家模型厂商的API做了个Demo跑得挺好下午接到需求换另一家模型试试效果。结果打开文档一看消息格式不一样、鉴权方式不一样、流式返回的协议也不一样少说又要折腾半天。这还只是“换模型”这一件事。如果再算上成本统计、密钥管理、多套环境切换整个工程就成了一锅粥。litellm就是冲着这个痛点来的。它是一个开源的大模型网关LLM Gateway核心作用就一句话把市面上主流模型服务商的API全部包装成统一的OpenAI兼容接口。你在业务代码里不需要关心今天调的是哪家模型只需要面向一套接口写代码剩下的协议转换、路由分发、故障切换、成本统计全部交给litellm处理。它能解决“接模型太费劲”“换模型要改代码”“多个渠道的key和账单管不过来”这三类问题。适合正在做AI应用、AI平台、或者企业内部AI工具链的开发者参考不管是刚入行的新人还是带团队的技术负责人这套东西都有对应的使用姿势。1. 为什么会出现litellm先聊聊LLM接入的现状1.1 每个厂商一套SDK工程上是灾难现在市面上主流的模型服务商每家都提供自己的Python SDK、Node SDK看起来是好事——开箱即用嘛。但一旦你需要在同一个应用里接入多家模型事情就变味了。A厂商的请求体长这样B厂商的请求体换了一套字段C厂商干脆用不同的消息结构。更别提流式输出、工具调用Function Calling、多模态输入这些高级特性各家实现差异极大。业务代码里被迫写一堆适配层今天为A厂商写一个转换函数明天为B厂商再写一个后天产品经理告诉你“我们把主力模型切到C家吧。”然后你就开始改代码。改完了还要重新测试测完还要重新算账单口径——因为A厂商按token算钱B厂商按字符算钱C厂商还分输入输出不同价格。这些杂活占用了大量本该花在业务逻辑上的时间。1.2 网关层介入后的好处litellm做的事情本质上就是在你的业务代码和各家模型服务商之间加了一个“翻译层”。它在服务端把OpenAI格式的请求翻译成各厂商自己的协议再向上游发起调用拿到结果后统一转回OpenAI格式返回给你。这个设计带来的直接好处有三个。第一个是接口标准化。你的业务代码只需要维护一种请求格式就是OpenAI的格式。今天用A厂商明天换B厂商改个配置项就行代码一行都不用动。第二个是批量治理。所有的密钥集中管理在网关层不在各个业务服务里散落。你不需要在每个服务的环境变量里塞一遍各家API Key只需要让服务指向网关由网关统一持有上游密钥。想回收某个人的权限在网关里删掉这个虚拟Key就行不用去各家控制台一个个操作。第三个是提升可用性。网关可以对上游做健康检查、超时控制、失败重试、故障转移。某一家模型服务不稳定的时候自动把流量切到备用的另一家业务侧几乎无感知。1.3 litellm的定位与适用场景litellm这个名字直译过来是“大语言模型LLM轻量中间件”。它不是一个模型训练框架也不是完整的AI平台它更像是一个模型接入层的“基础设施”。你可以在单机开发环境里跑一个进程给项目提供统一接口也可以在生产环境用多实例部署方式把它做成内部AI平台的流量入口。什么场景适合用litellm我理解是这几类业务里有多个模型服务商接入或者准备随时切换主模型的团队人数多需要集中管理API Key和调用权限的需要给每个业务线核算模型调用成本但又不想写一堆统计脚本的在一个统一平台上提供给多个内部应用AI能力不想每个应用各自接SDK的。什么场景需要谨慎如果你的应用有非常严格的数据合规要求比如数据完全不允许出内网那你需要在私有化部署的模型和litellm之间做好策略控制。它只是一个网关不解决数据出境或安全审计本身的合规问题。另外如果你的调用量极大、对单次请求延迟极度敏感那网关这一跳的转发开销需要评估。不过以我个人测试来看litellm本身的转发延迟通常在几毫秒到十几毫秒级别对绝大多数非极致性能敏感的业务来说完全可接受。2. 核心能力拆解litellm到底能干什么2.1 统一协议与多模型接入litellm支持多少家模型服务商官方文档里写的是超过100种Provider接入包括主流云服务商、开源模型平台、本地部署的推理服务。兼容的模型名称前缀从openai/、anthropic/、gemini/到各类开源模型框架基本覆盖了市面上绝大多数选择。它的工作流程不复杂你在配置文件里定义“对外暴露的模型名”和“真实调用的模型参数”的映射关系。举个例子model_list: - model_name: my-assistant litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY这里model_name是对外暴露的名字你的业务代码只认这个litellm_params里写的是真正要调用的上游模型和对应的密钥。litellm收到一个指向my-assistant的请求后会去读取openai/gpt-4o对应的配置把请求体翻译成OpenAI协议调上游再把结果转回来。这种“别名映射”的设计非常实用。你可以在配置里把my-assistant指向anthropic/claude-3.5-sonnet跑几天观察效果想换模型了改一行配置重新加载业务代码完全无感知。2.2 负载均衡与故障转移真实的生产环境里上游模型服务不可能是永远稳定的。限流、崩溃、网络抖动各种情况都会遇到。litellm的网关内置了路由能力可以针对同一个对外模型配置多个上游真实模型实现负载均衡和自动故障转移。model_list: - model_name: my-assistant litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: my-assistant litellm_params: model: anthropic/claude-3.5-sonnet api_key: os.environ/ANTHROPIC_API_KEY两个条目都叫my-assistantlitellm会把它当成一组候选上游按路由策略分配流量。某个上游请求失败会自动尝试下一个候选。这为“故障时自动切换”提供了非常朴素但有效的保障。在路由模式下litellm有几种策略可选比如round-robin轮询、least-busy最少并发数优先等。你还能设置熔断参数比如某个上游在指定时间窗口内连续出错多少次就暂时把它拉黑冷却一段时间再放回来避免在一个已经故障的上游上反复重试浪费时间。2.3 虚拟密钥与权限控制这一点我要单独拿出来说因为很多人第一版部署时没意识到它的重要性。litellm支持“虚拟密钥Virtual Keys”——你可以不把真实的厂商API Key直接给业务方而是在litellm里生成一个sk-...开头的虚拟Key业务方拿这个Key来访问网关网关拿着真实Key去调上游。这个机制的妙处有两个。第一真实Key永远不会暴露给各个业务服务即使某个业务方的虚拟Key不小心泄露了也可以在网关里一键吊销不用去厂商控制台重新生成真实的Key再逐台服务器替换。第二虚拟Key可以设置预算上限和速率限制比如给某个测试环境配一个“每月最多消耗20美元”的Key超了自动拒绝成本失控的概率大幅降低。2.4 成本追踪与用量观测litellm把每次请求的token用量、模型、花费、用户标识、时间都记录下来默认存在SQLite里生产环境可以切换到PostgreSQL。这些数据通过网关自身的接口对外暴露比如/spend/logs、/spend/total之类你能直接查出“这个月各业务线的模型消费排行”。预算管理也接在这套数据上。你可以在配置里给某个虚拟Key绑定一个最大花费额度用量到达阈值后网关会拒绝新请求或者在接近阈值时发告警。这种能力对账务敏感的业务非常有价值——从“月底看账单才知道花了多少钱”变成“每天都能看到实时消耗并提前控制”。3. 部署与实操从本地到生产3.1 安装与首次启动litellm是一个Python包安装非常直接pip install litellm[proxy][proxy]这个extra会额外安装网关运行需要的依赖库。装好后准备一个最简配置config.yamlmodel_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY这里api_key直接写成os.environ/OPENAI_API_KEYlitellm会去读取环境变量里的真实Key值比把明文Key写进配置文件要安全得多。启动命令export OPENAI_API_KEYsk-your-real-key litellm --config config.yaml --port 4000看到日志里有Uvicorn running on http://0.0.0.0:4000这样的输出就说明跑起来了。验证一下curl http://localhost:4000/v1/models返回的JSON里能看到你配置的模型列表。再用一个简单的对话请求试试curl http://localhost:4000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-any-key \ -d { model: gpt-4o, messages: [{role: user, content: 你好介绍一下你自己}] }这一步走通说明litellm的核心链路已经正常。开发环境里你可能不需要设置master_key但生产环境必须设置否则任何人拿到你的网关地址就能免费调用你的上游模型这笔账算下来会非常痛。3.2 关键配置项逐一说透要把litellm真正用好光会启动还远远不够。下面的配置项是我在实际部署中反复用到的逐一解释。general_settings里最核心的是master_key和database_url。general_settings: master_key: sk-master-strong-secret database_url: postgresql://user:passhost:5432/litellm cache: truemaster_key是网关自己的管理员密钥用于访问管理接口、创建虚拟Key、查看消费日志。这个Key必须设置而且要设得足够复杂。database_url建议生产环境用PostgreSQL原因后面避坑章节细说。cache: true是启用响应缓存同一段prompt在阈值时间内的重复请求会直接命中缓存返回不再重复调上游。router_settings管的是路由行为router_settings: routing_strategy: least-busy num_retries: 3 request_timeout: 600 allowed_routes: - /v1/chat/completions - /v1/embeddingsrouting_strategy控制多个上游之间的流量分配策略。num_retries是失败后的重试次数request_timeout是等待上游返回的最大秒数。这里尤其要注意如果你经常跑长文本生成任务比如一次生成几千token上游返回可能需要几分钟默认的超时时间可能不够一定要根据实际任务特点调大。allowed_routes是白名单。网关默认暴露了很多管理接口如果不需要对外提供建议显式收窄允许的路由降低安全风险。3.3 与OpenAI SDK的对接方式litellm最大的好处之一就是兼容OpenAI的SDK生态。也就是说你原本用OpenAI官方Python SDK写的代码几乎零改动就能切到litellmfrom openai import OpenAI client OpenAI( base_urlhttp://localhost:4000, # litellm 网关地址 api_keysk-virtual-key-xxxx, # 用虚拟Key不是真实Key ) resp client.chat.completions.create( modelmy-assistant, messages[{role: user, content: 写一份周报}], ) print(resp.choices[0].message.content)唯一的改动就是base_url从官方地址换成litellm地址api_key换成虚拟Key。你的所有业务代码不需要关心上游到底是哪家模型这是整条链路中体验最顺滑的部分。如果你用的不是OpenAI SDK而是直接走原生的openai客户端或者用LangChain、LlamaIndex这类框架同样能指到litellm。以LangChain为例模型实例的base_url参数直接填litellm地址即可。3.4 生产环境部署的几个必做项本地开发跑通了推到生产环境前有几个容易被忽略的点必须处理。第一用Docker而不是裸进程。litellm官方提供了现成镜像用docker run启动可以规避Python环境依赖问题也方便横向扩容。多实例部署时需要共享同一个数据库保证所有实例看到的数据一致。第二环境变量管理密钥。任何密钥都不要写进docker-compose文件里提交到代码仓库用环境变量注入或者用密钥管理服务动态获取。第三健康检查与进程守护。给网关配置一个/health/liveliness路由的健康检查探针容器编排系统定期探测进程异常就自动重启。litellm自带这类接口接入成本很低。第四日志与监控。把litellm的日志输出收集到统一日志平台同时对接Prometheus等监控体系。litellm有/metrics接口可以提供标准指标包括请求数、延迟、错误率、token消耗等。4. 基于litellm的常用工程模式4.1 模式一加缓存降本大模型调用是实打实的真金白银尤其在高频请求场景下成本压力非常明显。litellm支持响应缓存同一个请求相同的模型和prompt在有效期内会直接返回缓存结果不再调用上游。配置方式很灵活可以是内存缓存也可以接入Redis实现多实例共享缓存general_settings: cache: true cache_params: type: redis host: localhost port: 6379 ttl: 300这个做法适合什么场景比如问答系统的热门问题、内容审核的常见分类、辅助编程里的代码片段补全这些prompt重复率很高的业务加缓存能直接砍掉一大半上游调用费用。但需要注意缓存命中就无法拿到模型的最新回复对时效性要求高的场景谨慎开启。我在一个模拟项目里试过给一个面向内部用户的问答机器人开了Redis缓存命中率大约能有30%左右一个月下来模型调用费用省了近四分之一。当然实际命中率取决于业务类型但整体方向是对的。4.2 模式二多供应商容灾生产环境依赖单一模型服务商是有风险的。上游一旦故障或者调价、停服你的应用直接瘫痪。litellm的多候选配置天然适合做多供应商容灾。前面示例里已经给了两个候选同名的配置这里再补充一个细节同一个model_name下挂多个候选时litellm会按策略选择调用哪个。你还可以通过routing_strategy调整默认是申明顺序轮流调用如果想优先调用某一个可以把它的顺序排前面或者用权重类策略。更工程化的做法是把主流云厂商的模型和本地私有化部署的开源模型同时挂在一个model_name下。正常流量走云上云上故障时自动切到本地。代价是本地模型效果可能稍差但至少服务不中断。这种兜底思维在关键业务里非常值得借鉴。4.3 模式三应用层统一接入很多团队做AI能力中台会向各个业务线提供统一的模型调用入口。litellm正是这种形态的骨架业务线不直接对接任何模型厂商而是对接你们内部的litellm网关。配合虚拟Key体系你还能给不同业务线分配不同的Key赋予不同的速率限制和预算上限。想去查某个业务线的调用量去/spend/logs按Key过滤就行。这种模式落地以后新业务线接入模型能力只需要申请一个Key、改一行base_url不需要关心SDK适配和鉴权细节。我见过有团队基于litellm做内部AI平台的雏形前面用网关统一接入多家模型后面接了一个简单的管理页面团队同学自助申请Key、看用量、调预算。总共开发量不大但把“模型接入”这件事彻底产品化了。4.4 模式四接入LangChain和框架生态litellm不只是OpenAI SDK的兼容层它和LangChain、LlamaIndex这些大模型应用框架也能配合。以LangChain为例from langchain_openai import ChatOpenAI llm ChatOpenAI( base_urlhttp://localhost:4000, api_keysk-virtual-key-xxxx, modelmy-assistant, )这样LangChain里的链、Agent、检索增强生成流程全都走litellm网关统一出口。好处在于当你的框架版本升级、代码结构重构时模型接入层完全不用动因为它永远只面对一个稳定的OpenAI兼容端点。5. 常见问题与排查技巧实录5.1 常用问题速查表现象可能原因排查方向请求返回403 Forbidden请求头里没带Key或Key不对检查Authorization头确认Key在网关里存在且未被禁用返回404 Not Found路径写错或路由未启用确认base_url是否带/v1路径确认allowed_routes是否覆盖该路由报模型不存在model字段与配置里的model_name不匹配用/v1/models接口看当前可用的模型名列表上游调用超时上游生成时间长或网络延迟大调大request_timeout检查上游日志高频请求时数据库锁死SQLite并发能力不足生产环境切换PostgreSQL虚拟Key无法创建请求里没带master_key确认Authorization: Bearer sk-master-...头部是否正确成本数据不准确计数口径或模型价格表未更新检查/spend/logs的token记录更新litellm版本或手动对齐价格配置5.2 我在实际部署里踩过的坑第一个坑是高并发下的SQLite锁死。litellm默认把请求日志和token统计写到本地SQLite文件开发环境完全没问题但一旦上生产接到真实流量SQLite的写锁会导致大量请求堆积甚至卡死。我把数据库切到PostgreSQL之后这个问题彻底消失。教训就是开发用SQLite能跑通生产直接上PostgreSQL别存侥幸心理。第二个坑是master_key泄漏。我早期部署时为了省事把master_key直接写在命令行参数里bash历史记录里留着完整的密钥。后来梳理安全清单时发现这个问题立刻换成了环境变量注入。所有密钥类配置一律走环境变量或密钥管理服务绝不放命令行和代码仓库这条原则多强调几次都不为过。第三个坑是超时时间的默认值。做长文本生成任务时上游返回可能要1-2分钟而litellm的默认超时只有几十秒结果就是任务没失败但客户端已经等不起了白白浪费一次调用。后来我把request_timeout调到了600秒才匹配上实际业务场景。动手前先想清楚你的prompt和输出大概有多长再定超时时间。第四个坑是多候选故障转移时“两个故障模型互相倒”。如果同一个model_name下挂的两个上游模型都不可用流量会在两者之间反复切换重试等于请求超时时间翻倍。后来我在配置里加了熔断参数连续请求失败就暂时踢出候选列表情况才好转。故障转移配置一定要配合熔断机制否则故障状态下系统反而更慢。5.3 调优建议与性能心得关于性能调优我有几条比较实用的心得如果业务方普遍使用短prompt高并发场景可以考虑把routing_strategy设为least-busy让请求尽量分散到空闲的上游减少排队网关的内存占用和请求日志量直接相关日志量大时建议定期归档旧数据或者只保留最近N天的spend记录如果你的上游模型版本更新频繁把模型别名和真实模型名的映射做成动态配置不要写死在代码里虚拟Key的命名规范也值得提前想好比如按“业务线-环境-用途”来命名否则等到几十个Key的时候根本分不清哪个是哪个。有一点很容易被忽略litellm本身版本迭代很快新功能不断加进来。如果你长期不升级可能会错过一些关键的稳定性修复和新的模型适配。建议保持一个固定的升级节奏并且在升级前先看下变更说明。最后再分享一个想法我个人的体会是litellm这套工具的价值不在于某一个单独的功能有多惊艳而在于它把“接入模型”这个重复性极高、又处处是坑的脏活累活一次性封装好了。你把精力从“怎么适配每家SDK”挪到“怎么用好模型能力”上这本身就是巨大的效率提升。如果你手头正在做一个还在快速迭代的AI应用或者打算在公司内部搭一个统一模型入口我建议你先别急着全面铺开先小范围试点把两三个高频使用的模型挂到litellm上业务代码切到网关跑一周看看spend数据、看看切换模型的便利程度。等确认这套流程顺了再慢慢加预算控制、加容灾策略、加业务线接入。另外值得留意的一个发展方向是litellm现在不只是做“网关”还在往模型管理、提示词管理、可观测性这些方向延伸。如果你在内部平台建设上起步早一点这些能力后续能直接复用不需要另起炉灶。工具本身不复杂真正值钱的是你愿意花时间把接入层的规范化做起来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑