首页 / 资讯中心 / 文章详情

LiteLLM:一个统一API网关搞定所有大模型接入与切换

LiteLLM:一个统一API网关搞定所有大模型接入与切换 ★ FEATURED ARTICLE
1. LiteLLM是什么一条代码接所有大模型接触LiteLLM之前我先说说自己踩过的坑。做AI应用开发的时候今天接一个OpenAI接口明天客户要换成Anthropic的模型后天又得接一个私有化部署的本地模型。一开始图省事针对每个上游单独写适配层结果代码越写越臃肿光处理各家API的认证、超时、错误格式就占了大半工作量。最难受的是业务方临时换模型从OpenAI切到Claude除了改接口地址还得改请求体结构、改流式解析逻辑、改错误重试策略——这根本不是换一个base_url就能解决的事情。后来我在一个开源项目里看到了LiteLLM试过一次之后就再也没换过其他方案。简单说LiteLLM就是一个大模型API的统一网关它把OpenAI、Anthropic、Cohere、Google Gemini、Azure OpenAI、Ollama、vLLM这些主流模型提供方全部封装成OpenAI兼容格式。你用一套代码、一个SDK、甚至一个代理地址就能调用上百种模型。对开发者来说这意味着“写一次到处跑”今天用的GPT-4o明天换成Claude Sonnet核心业务代码一行都不用改改个模型名字就行。它的价值远不止“省事”。LiteLLM还提供代理服务器形态相当于在你和应用之间架了一层AI网关统一处理密钥管理、模型负载均衡、故障转移、预算控制、限流、日志审计。这些能力在个人项目里可有可无但一旦你做的是多人协作的产品或者要给公司几十个业务方提供模型接入就会发现这层网关几乎是刚需。如果你正被“多个模型接入混乱”“切换模型代价大”“API密钥散落在各处”“模型成本失控”这些问题困扰LiteLLM很适合你。这篇文章我会从原理到实操把LiteLLM的架构逻辑、配置细节、实施步骤和踩坑经验完整过一遍看完你不仅能快速跑起来还能把它用出生产级的水准。2. 核心能力拆解从统一SDK到生产级网关2.1 统一SDKcompletion()背后做了什么LiteLLM最基础也最核心的形态是一个Python SDK。你在代码里写from litellm import completion response completion( modelgpt-4o, messages[{role: user, content: 你好}] )想切换到Claude时改一行response completion( modelclaude-3-5-sonnet-20241022, messages[{role: user, content: 你好}] )这个看似简单的“改一行”背后是LiteLLM为你处理了所有协议差异。每个模型提供方的请求格式都不一样OpenAI是messagesmax_tokensAnthropic是messagesmax_tokens但系统提示词单独放Google Gemini有contents和generationConfig。LiteLLM在SDK内部维护了一张“模型映射表”把统一的输入参数转成各家协议再把各家的响应统一转成OpenAI的response.choices[0].message.content结构。这个过程说起来轻巧实际维护工作量很大。因为各家模型更新频繁参数行为也在变LiteLLM社区几乎以周为单位发版本。所以我会建议生产环境不要锁死LiteLLM版本至少保持小版本更新到最近两三个月的版本否则新模型接入不了老模型的行为也可能悄悄变化。2.2 代理服务器统一入口与密钥托管SDK形态适合单个服务内部使用但如果你有多个后端服务都要接模型总不能每个服务都配置一遍各家API Key。LiteLLM的代理服务器形态专门解决这个问题。你启动一个LiteLLM Proxy进程它对外暴露一个OpenAI兼容的HTTP接口。所有上游服务的API Key统一存在代理这边业务方不需要接触真实密钥只要拿一个代理发的虚拟Key就能调用。这个设计和后端网关的思路一模一样业务方不直连上游而是经过一层代理由代理统一做认证、鉴权、计费。启动代理非常简单litellm --model openai/gpt-4o --port 4000然后你的业务代码里把base_url指到http://localhost:4000API key填虚拟key其余逻辑完全不用改因为代理本身就是OpenAI兼容协议。生产环境里代理服务器通常会用配置文件启动我在第4部分会详细拆解配置文件。先记住一个概念代理模式和SDK模式解决的是不同问题SDK解决“代码层统一”代理解决“架构层统一”。两者也可以结合业务代码里用LiteLLM SDK但SDK指向自己的代理这样上下游都统一了。2.3 模型路由、负载均衡与故障转移代理模式下LiteLLM支持配置“模型组”来实现路由和容灾。举个例子你给主模型gpt-4o配了两个上游渠道一个OpenAI官方直连一个Azure OpenAI的部署。正常情况下请求平均分发到两个渠道万一其中一个报错另一个自动接管对调用方完全透明。这个“故障转移”非常实用。我自己就遇到过Azure那边配额用完直接报429而OpenAI官方渠道还正常的情况。如果没有负载均衡和fallback机制业务直接中断有了LiteLLM之后请求自动切到可用渠道我只需要在日志里看到“fallback发生”的警告再决定要不要去充值配额。更细一点LiteLLM还支持按权重分发流量以及基于延迟/错误率的健康检查。生产环境强烈建议给模型组配健康检查而不是只依赖静态权重。因为AI模型API的可用性波动比普通服务大得多一个渠道可能慢到超时才报错如果有健康检查代理会提前把不健康的实例摘掉避免请求白白等待。2.4 预算、限流与密钥管理预算控制是LiteLLM另一大卖点。每个虚拟Key可以设定单次请求的最大花费上限每分钟/token的速率限制总预算美元额度模型访问白名单比如某个内部工具只允许调用gpt-4o-mini每月预算100美元那你给这个工具发一个虚拟Key时直接配好这些限制超了自动拦截。这在大团队里尤其有用不然月底账单出来你根本说不清谁把几千美元跑没了。实际操作中预算管理还支持在代理运行时动态调整。你可以先给某个业务方一个保守额度跑几天看它的真实消耗再放宽限制。这些操作通过管理API就能完成不需要重启代理。3. 快速上手十分钟跑通第一个代理3.1 安装与基础环境LiteLLM是Python包安装很简单pip install litellm[proxy]注意我建议安装带proxy扩展的版本这样SDK和代理服务器两种能力都能用。如果只用SDK裸装pip install litellm也够但既然要玩代理一步到位更省事。安装完成后先验证一下SDK能不能正常调用import litellm response litellm.completion( modelopenai/gpt-4o-mini, messages[{role: user, content: 你好请用一句话介绍你自己}], ) print(response.choices[0].message.content)第一次跑之前确认环境变量里有OPENAI_API_KEY。LiteLLM的模型命名规则是provider/model名比如openai/gpt-4oanthropic/claude-3-5-sonnet-20241022azure/xxx。这个provider/前缀很重要它决定了后续请求走哪家的认证和协议。3.2 启动代理服务器并用标准SDK调用跑通了SDK接下来启动代理litellm --model openai/gpt-4o-mini --port 4000 --num_workers 2启动日志里能看到代理监听在4000端口并提示你管理端口的地址。此时你可以在另一个终端里用任何支持OpenAI协议的SDK来调用它不限于Pythoncurl http://localhost:4000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-your-virtual-key \ -d { model: gpt-4o-mini, messages: [{role: user, content: 你好}] }默认情况下代理会生成一个或多个临时虚拟Key启动日志里会打印出来。复制那个key填进去就能调用。注意一个细节curl里的model字段值取决于你启动代理时用的是--model openai/gpt-4o-mini还是别的。如果你启动时配置的模型别名就叫gpt-4o-mini那请求里就填gpt-4o-mini。代理收到请求后会根据你的配置映射到真正的上游模型。3.3 同时配置多个模型提供方单模型代理没意思LiteLLM的价值在于多模型。写一个配置文件一次启动多个模型model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: claude-sonnet litellm_params: model: anthropic/claude-3-5-sonnet-20241022 api_key: os.environ/ANTHROPIC_API_KEY - model_name: llama3-local litellm_params: model: ollama/llama3 api_base: http://localhost:11434然后启动litellm --config config.yaml用这个配置启动后代理同时暴露三个模型名gpt-4o、claude-sonnet、llama3-local。业务方想用哪个就传哪个模型名密钥统一由代理管理。这里有个贴士配置文件里api_key: os.environ/OPENAI_API_KEY的写法意味着LiteLLM会从代理进程的环境变量里读取对应的key而不是把明文密钥写死在配置里。建议所有密钥都走这个方式配置仓库里不落任何敏感信息。3.4 模型别名与参数透传有时候你不想让业务方看到真实的模型名或者想用更简短的称呼。LiteLLM的model_name字段就是对外暴露的别名它在model_list里与上游模型做了一一映射。还有一种情况是“同一模型不同参数”。比如你希望某些业务方的请求温度固定为0某些可以自己传temperature。LiteLLM支持在litellm_params里设置默认参数也可以设置允许客户端覆盖哪些参数。这个粒度控制对“既要统一又要灵活”的团队协作场景非常合适。4. 深入配置生产级config.yaml实战4.1 配置结构总览一个接近生产可用的LiteLLM配置通常包含model_list: - model_name: primary-gpt4 litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY max_tokens: 4096 model_info: mode: completion - model_name: fallback-azure-gpt4 litellm_params: model: azure/gpt-4o api_key: os.environ/AZURE_API_KEY api_base: https://xxx.openai.azure.com/ api_version: 2024-06-01 model_info: mode: completion router_settings: model_group_alias: gpt4-main: primary-gpt4 general_settings: master_key: sk-master-key-123 database_url: os.environ/DATABASE_URL otel: true先别急着抄我一个个解释这些字段的用处。model_list是核心定义了代理能访问哪些模型、用什么参数访问。model_name是对外名litellm_params.model是上游真实模型名litellm_params里还能带max_tokens、temperature等默认参数。model_info.mode标明模型能力completion表示普通对话补全还支持embedding、image_generation等类型。router_settings里可以对模型组进行分组设置。general_settings.master_key是代理管理员的万能钥匙负责管理虚拟Key、查看日志、修改配置等操作务必用强随机字符串不能和虚拟Key混用。database_url指向PostgreSQL用于持久化虚拟Key、预算数据和日志不配的话这些数据只存在内存里代理一重启全没了。4.2 模型组负载均衡与故障转移配置这是生产配置里最重要的部分。上面配置里primary-gpt4和fallback-azure-gpt4都是gpt-4o只是上游渠道不同。想让它们组成一个带容灾的模型组需要这样配router_settings: model_group_alias: gpt4-main: [primary-gpt4, fallback-azure-gpt4]或者直接用LiteLLM的model_group写法把两个litellm_params归到一个组里model_list: - model_name: gpt4-main litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: gpt4-main litellm_params: model: azure/gpt-4o api_key: os.environ/AZURE_API_KEY api_base: https://xxx.openai.azure.com/注意这里两个条目的model_name都是gpt4-mainLiteLLM会自动把它们识别为一个模型组默认使用轮询round-robin策略分发请求。当一个实例连续出错次数超过阈值后代理会临时把它标记为不健康请求全部转发到健康实例并定期探活恢复。我自己配置的时候会把重试次数、超时时间、熔断阈值都显式写出来不让LiteLLM用默认值。默认值偏保守对生产场景往往不够敏感router_settings: retry_policy: timeout: 30 Timeout: 2 RateLimitError: 3 APIError: 2 cooldown_time: 60 max_fallbacks: 3这里的retry_policy意思是网络超时重试2次遇到限流429重试3次遇到上游服务错误5xx重试2次。cooldown_time: 60表示某个实例失败后最少冷却60秒才重新放流量。max_fallbacks: 3限制一次请求最多触发几次fallback防止一个坏请求在多个渠道之间反复横跳浪费资源。4.3 虚拟Key与预算配置代理启动后需要创建虚拟Key给各个业务方使用。通过管理API创建curl -X POST http://localhost:4000/key/generate \ -H Authorization: Bearer sk-master-key-123 \ -H Content-Type: application/json \ -d { models: [gpt4-main], max_budget: 100, budget_duration: 30d, max_parallel_requests: 10, tpm_limit: 100000, rpm_limit: 60 }这个Key的含义是只允许调用gpt4-main这个模型组30天内最多花100美元每秒最多10个并发请求每分钟最多10万token每分钟最多60次请求。每一项限制都是独立生效的任何一个超了都会拒绝请求。预算数据默认存内存代理重启就清零重记。所以生产环境必须配database_url用PostgreSQL持久化。我个人实测下来的经验是如果你不配数据库虚拟Key会在重启后失效预算额度也会重置这在生产环境是不可接受的。4.4 日志与监控配置LiteLLM原生支持把日志发到OpenTelemetry、Prometheus、Langfuse等平台。基础配置里至少要把请求日志打到标准输出或者文件general_settings: master_key: sk-master-key-123 database_url: os.environ/DATABASE_URL otel: true langfuse_public_key: os.environ/LANGFUSE_PUBLIC_KEY langfuse_secret_key: os.environ/LANGFUSE_SECRET_KEY langfuse_host: https://cloud.langfuse.comotel: true会开启OpenTelemetry指标Prometheus可以从/metrics端点抓取代理的请求延迟、错误率、token消耗等指标。这对接告警非常有用比如当某条链路的错误率突破阈值时你可以设置告警而不是等业务方投诉。日志字段里我最关注三个model实际调用的上游模型、response_cost本次请求花费、spend累计花费。这三个字段对成本审计很有价值。很多团队用LiteLLM之后月底成本报表直接从数据库里导出比看云厂商账单清晰得多。4.5 与OpenAI SDK的完整对接示例配好代理后业务侧用官方OpenAI SDK就能接入from openai import OpenAI client OpenAI( base_urlhttp://localhost:4000/v1, api_keysk-test-virtual-key-123, ) response client.chat.completions.create( modelgpt4-main, messages[{role: user, content: 写一段Python代码}], ) print(response.choices[0].message.content)这个示例能跑通意味着你的业务代码与具体模型解耦了。今天gpt4-main背后是OpenAI明天你可以把它切换成Azure、Anthropic甚至本地模型业务侧感知不到变化。我参与的项目里很多团队正是看中这一点才愿意把LiteLLM引入核心链路。5. 实测中的坑与排查技巧5.1 常见错误码速查表错误含义排查方向NoAuthenticationError没有提供API Key检查环境变量、虚拟Key是否有效AuthenticationError认证失败确认上游API Key正确、账户余额充足RateLimitError上游限流检查配额、TPM/RPM限制开启重试Timeout上游请求超时调整超时时间检查上游服务负载BadRequestError请求参数错误核对模型名、消息格式、参数名ContextWindowExceededError上下文超长截断消息、降低max_tokens、换大上下文模型这张表只是起点真正麻烦的是混合错误。比如你的虚拟Key本身没配tpm限制但上游OpenAI那边给你限流了LiteLLM返回的错误就可能是RateLimitError容易让人误以为是自己代理的问题。遇到429先看响应体里是上游返回的还是LiteLLM返回的再决定调整哪里。5.2 超时与重试的调优心得LiteLLM的retry_policy和上游超时设置要配合业务实际调整。如果业务方是实时聊天场景30秒超时太长建议网关层15秒重试1次fallback到备用渠道。如果是离线批处理任务超时放宽到60秒重试3次甚至可以做指数退避。我踩过的坑是把重试次数设太大导致一个慢请求占住了并发连接拖垮整个代理实例。后来在router_settings里显式加了max_retries_per_request: 3又在代理外层套了超时中间件情况才好转。记住一个原则重试要配合超时和并发数上限不是越大越好。5.3 配额管理常见误区很多团队刚上LiteLLM时max_parallel_requests只设置并发数不设置TPM和RPM结果一个业务方跑了个循环任务把上游配额打爆其他业务方跟着遭殃。正确做法是每个Key都设置一个最小可用额度再根据业务方实际需求逐步放宽。另一个维度是budget_duration。如果设成1d预算按天滚动重置设成30d按月重置。我建议按业务方的财务周期设置否则月底对账会非常痛苦。LiteLLM的预算统计是花多少扣多少但要注意token价格是它内置的如果上游价格调整了记得升级LiteLLM版本或者手动覆盖价格表否则预算会失真。5.4 模型兼容性差异要注意虽然LiteLLM统一了协议但不是所有模型特性都一致。比如response_formatJSON模式在OpenAI上很成熟在Anthropic上就是弱化的JSON输出Gemini又是另一套写法。如果你业务代码里传了很多高级参数迁移到新模型时可能静默失效或者直接报BadRequestError。我的经验是核心业务只用通用参数model、messages、temperature、max_tokens高级特性通过LiteLLM的专有参数走并且做好模型能力探测。切模型前先跑一遍针对性测试确认关键行为比如流式输出、工具调用、JSON输出都符合预期再放量切换。6. 生产落地的几点经验与扩展方向6.1 部署形态怎么选LiteLLM代理本身是无状态的Python服务我通常用Docker部署前面挂负载均衡器后面接PostgreSQL存数据。多实例部署时每个实例共用同一个数据库虚拟Key和预算数据就保持一致。单实例部署适合日均请求量低于几万的场景配置简单出现问题也容易排查。多实例部署适合高并发场景但要注意如果所有实例共享同一个PostgreSQL预算计数写库会有一定延迟极端高并发时可能出现超支一点点的情况。如果预算控制是硬性合规要求建议在代理前面再叠加一层独立的限流组件双保险。6.2 团队协作与接入流程引入LiteLLM后我建议把模型接入流程标准化。比如业务方要接模型上报需求管理员在配置里新增模型映射通过管理API生成虚拟Key配置好预算和限流然后下发对接文档。整个流程不需要给业务方暴露上游密钥也不需要在每个项目配置文件里硬编码模型信息。日常运维中管理员只需关注三个指标代理的错误率、各个Key的花费与配额、上游模型渠道的健康状态。基于LiteLLM的监控页面或对接的Prometheus指标可以快速定位“哪个业务方在烧钱”和“哪个上游在抖动”不用翻代码。6.3 还能往上叠什么LiteLLM本身是一个网关层它很适合与缓存层、语义路由层组合使用。比如针对高重复率的请求在LiteLLM前面加一层缓存针对复杂的多模型编排可以在上层加一个路由服务根据请求内容自动选择模型。因为这些组件都只需要和LiteLLM的OpenAI兼容接口打交道所以整体架构非常干净。还有一个常见扩展是配合向量库做RAG应用。LiteLLM代理统一管理嵌入模型和对话模型业务方只需要获取一个Key就能同时调用embedding与chat completions接口密钥管理、配额、日志完全统一。从我个人实战的角度LiteLLM最让我省心的不是“少写代码”而是它把模型供应商切换的成本从“重构代码”降到了“改一行配置”。这种解放感只有经历过多个模型API之间来回折腾的人才懂。如果你正在搭建AI应用的基础设施或者被多模型管理弄得焦头烂额建议你从这个小而精的网关开始逐步把模型接入、密钥、预算、监控都收拢到同一个入口。按我上面给的配置模板去搭预计半天到一天就能见到效果。
阅读完成 · 觉得有帮助?
咨询建站