资讯详情

用 LiteLLM 搭建统一 API 网关,管理多供应商大模型调用

📅 2026/10/13 17:42:58 | 华诺云谱 👁 阅读
用 LiteLLM 搭建统一 API 网关,管理多供应商大模型调用
搞过多家商用大模型 API 的人应该都有一肚子苦水A 家的 SDK 一种写法B 家又换一套等到 C 家上了新模型你还要重新看一遍文档确认鉴权、超时、重试逻辑是不是又要调整。我在团队里维护过一段时间的模型服务层刚开始觉得无非就是多包几个 SDK 的事结果真正接起来才发现模型一变、供应商一多那些隐藏的坑比模型能力本身还折腾人。后来我们引入了开源项目 LiteLLM把多供应商的大模型接口统一收口到一个网关后面总算把这块复杂度按住了。这篇文章不是翻译官方文档而是把我自己从零开始接入、压测、上生产、排障的经历梳理出来。你会看到它解决了什么问题、核心能力怎么用、部署配置怎么落地、代码怎么接、生产环境踩过哪些坑以及什么场景下其实不该硬上它。如果你正在做 AI 应用的平台层、网关层或者准备把多家模型供应商接入同一个系统里这篇文章应该能帮你少走不少弯路。1. 统一网关到底解决了什么问题先说个最直观的场景。你的业务方今天要一个文本生成模型明天要一个向量化模型后天又冒出来一个多模态识别需求。每个供应商都有自己的 API 风格有些走 REST有些走 gRPC 风格封装有些要单独传一个 venomous 的鉴权头有些对超时时间和重试次数还有自己的限制。如果你让业务代码直接调用这些 SDK最典型的后果就是整个代码库里散落着好几种 API 客户端每个客户端都有自己的错误类型、重试策略、日志格式。LiteLLM 做的事情可以理解成一个“模型接口翻译层”。它把不同供应商的请求格式统一成 OpenAI 风格的接口你只需要按照一套约定发送请求剩下的鉴权、路由、失败转移、限流、计费日志都由它来处理。这样做的好处不是少写几行代码而是把“模型调用”这种原本散乱依赖的东西收敛成了一个稳定的内部服务边界。很多人第一反应是我们团队也没几套模型有必要上网关吗我的判断标准是这样的只要你的项目里存在两个以上供应商的模型调用或者你预计未来半年内会频繁做模型选型和替换网关就值得考虑。因为它带来的不只是接口统一还有两个很隐蔽的价值一是模型切换可以做到业务无感二是权限和成本可以在一个地方集中控制。再说说为什么选择 LiteLLM而不是自己写一个封装。自己封装听起来简单但真的做起来你会发现自己要处理的细节非常多各家 API 的请求体字段差异很大尤其是指令类参数、采样参数、格式参数错误码语义不一致有的限流返回 429有的返回 502有的根本不返回明确信息各家 SDK 内部的超时机制和重试行为不透明你需要自己做密钥管理而密钥一旦写进多个服务里轮换就是一场灾难成本数据分散在各个供应商账单里想按团队、按项目去分摊非常困难。LiteLLM 把这些问题都收进了自己的职责范围内。它内部把供应商适配做得比较细致从请求参数映射、流式响应适配到错误码转换都有相对成熟的方案。你真正要关心的反而只剩下自己的业务逻辑和整体配置。2. 核心能力拆解它不只是个转发代理很多人对 LiteLLM 的第一印象是“把请求转发出去”实际上它的核心能力要比“转发”深入得多。我从工程角度拆分一下重点是解析这些能力为什么对生产有用。2.1 API 规范化一套接口走天下LiteLLM 对外提供的接口风格是 OpenAI 兼容的。也就是说你发chat/completions、embeddings、images/generations这类请求它内部会转换成对应供应商真正的请求格式。这个设计很聪明因为 OpenAI 风格接口已经成为事实上的行业标准很多开发者的代码都基于这种方式编写接入成本最低。实际使用中你会发现它对“对话补全”和“向量化”这两类接口的覆盖最成熟比如文本生成统一的messages数组内部转换为各家格式向量化统一的input参数内部处理各家对文本截断、输入类型的要求多模态和图片生成也能通过类似接口透传但依赖各家模型的具体能力。我在接入时最大的感受是业务代码只需要认识一种请求体结构供应商字段的差异被挡在了后面。这让我后面做模型 A/B 测试时非常省心只需要换一下配置里的模型名业务代码一行都不用改。2.2 密钥管理与模型路由这是 LiteLLM 特别能打的一个点。生产环境里你不可能把各家的原始密钥直接暴露给所有业务服务。LiteLLM 提供了一套虚拟密钥机制你在网关里创建一个 virtual key业务方拿到的只是这个虚拟密钥。它对应哪些模型、允许消耗多少额度、归哪个团队都写在配置里。模型路由方面它支持两种用法简单映射把配置里的gateway-model-name映射到真实的供应商模型比如gpt-4-turbo映射到某家的chat-model-x动态路由同一个逻辑模型名背后挂多个同类模型做负载均衡或者按优先级调用。这一点在生产中非常实用。我遇到过供应商某个模型临时不可用的情况通过把逻辑模型名下挂多个物理模型配合失败切换可以做到对业务零感知地完成恢复。2.3 重试、限流与失败切换每家模型供应商对并发和速率都有严格限制尤其在业务高峰时429 限流是家常便饭。LiteLLM 的重试逻辑不是简单“多试几次”而是基于返回状态码和响应头做判断。比如遇到 429读取重试时间并等待遇到 5xx按配置的重试次数和退避策略尝试遇到超时可以根据你的设置切换备用模型。配置项里可以控制max_retries、timeout、cooldown等参数。我习惯在初始配置时把重试次数设成 2 次、超时设成 60 秒然后在压测中按实际情况微调。这里想强调一点重试不是越多越好尤其是在流式生成场景里过长的请求会一直占用连接资源反而拖垮整体吞吐。2.4 成本追踪与日志模型调用成本分散在多个供应商账单里的痛做过平台的人都懂。LiteLLM 提供了比较完整的请求日志和花费统计能力。它会在每次请求后记录 token 用量、模型名称、虚拟密钥、团队信息并通过内置的 spend 接口或日志文件输出。这意味着你可以做出这样的报表“A 团队今天通过虚拟密钥消耗了多少 token、折合多少钱”“哪个模型的调用量异常增长”这些数据都从网关口径统一输出。对于需要做内部成本分摊的公司来说这是刚需。3. 部署与配置实操这一章我给出一套可以直接照着做的部署流程。我会以 Docker 方式部署网关服务因为这种方式最干净不污染宿主环境也方便迁移和扩容。3.1 环境准备与容器启动我建议在一台独立的测试服务器或者本地 Docker 环境里先跑起来。假设你已经安装好了 Docker直接执行下面的命令docker run -d \ --name litellm-proxy \ -p 4000:4000 \ -v $(pwd)/litellm-config.yaml:/app/config.yaml \ ghcr.io/berriai/litellm:main-latest这里我把配置文件挂载到了容器里的固定路径。注意不同版本对配置文件的默认路径可能不一样最稳妥的做法是启动后进容器确认一下启动日志里实际读取的路径。如果发现没读到你的配置多半是挂载路径不对。容器起来后先确认健康状态。LiteLLM 提供一个健康检查接口可以直接用curl http://localhost:4000/health/liveliness正常情况下会返回一个表示存活的状态信息。这时候服务已经在跑了但还没有可用模型因为模型是在配置文件里声明的。3.2 配置文件逐字段解读下面是一份精简但完整的config.yaml示例我会逐块说明关键字段model_list: - model_name: gateway-chat-model litellm_params: model: vendor1/chat-model-x api_key: os.environ/VENDOR1_API_KEY api_base: https://api.vendor1.example.com/v1 max_retries: 2 timeout: 60 - model_name: gateway-embedding-model litellm_params: model: vendor2/embedding-model-y api_key: os.environ/VENDOR2_API_KEY litellm_settings: drop_params: true set_verbose: false num_retries: 2 request_timeout: 60 retry_after: 5 general_settings: master_key: sk-your-master-key-here database_url: postgresql://user:passwordlocalhost:5432/litellm store_model_in_db: true第一个块是model_list也就是网关注册的模型清单。model_name是暴露给业务方的逻辑模型名业务代码只认这个名字。重点看litellm_paramsmodel真实供应商模型的标识写法是供应商前缀/模型名。前缀意思是让 LiteLLM 去调用对应的适配器api_key推荐用环境变量的方式引用不要直接明文写在配置文件里因为配置文件通常会被提交到代码仓库api_base如果供应商允许自定义接入地址就填这里max_retries和timeout写在模型级别时优先级高于全局设置。litellm_settings里面是全局行为配置。drop_params这个参数我建议设成true它表示如果请求里带了当前模型不支持的参数直接丢弃而不是报错。这个开关很重要因为我们经常会用统一的请求体去访问不同能力边界差异很大的模型。general_settings里最核心的是master_key它是管理员密钥用于管理后台和创建虚拟密钥。database_url需要提一下如果你要使用虚拟密钥、花费统计、历史日志这些功能必须配置数据库我选用 PostgreSQL。不配置数据库LiteLLM 也能跑但很多管理功能会失效。3.3 启动后的验证流程配置文件准备好后重启容器然后用下面几步验证第一步看服务能否列出已注册的模型curl http://localhost:4000/v1/models \ -H Authorization: Bearer sk-your-master-key-here正常情况下会返回你配置的两个逻辑模型名。如果没有返回优先检查配置文件是否被正确加载而不是先怀疑服务有问题。第二步发起一个最小化的对话请求curl http://localhost:4000/v1/chat/completions \ -H Authorization: Bearer sk-your-master-key-here \ -H Content-Type: application/json \ -d { model: gateway-chat-model, messages: [{role: user, content: 你好请回复ok}] }这里的关键点在于请求体里的model字段必须用你配置的逻辑模型名不能直接用真实模型名否则网关会找不到路由。如果这一步通了说明你的接入链路已经打通接下来就可以用 SDK 接业务代码了。4. 代码接入方式网关部署好以后接入代码其实非常简单。如果你原来就是按 OpenAI SDK 写的那只需要改 base_url 和 api_key如果原来不是那就按 OpenAI 风格重新写请求体。我两种方式都试过分别说说。4.1 使用 OpenAI SDK 接入以 Python 为例原来你的代码可能是这样from openai import OpenAI client OpenAI( api_keyoriginal-vendor-key, )改成走网关后只需要把 base_url 指到网关地址from openai import OpenAI client OpenAI( api_keysk-your-virtual-key, base_urlhttp://your-gateway-host:4000/v1 ) resp client.chat.completions.create( modelgateway-chat-model, messages[{role: user, content: 你好}] )注意两个细节api_key这里用的是网关的虚拟密钥不是原始供应商密钥base_url末尾的/v1不能漏OpenAI SDK 会在后面拼路径时依赖这个前缀。如果你用 Node.js 或其他语言思路完全一样就是换一个 base_url 指向网关。这也是我说“改造成本极低”的原因。4.2 使用 LiteLLM Python SDK如果你的项目不是基于 OpenAI SDK而是已经在用 LiteLLM 的 Python SDK那也支持直接连接代理。LiteLLM 的 SDK 在调用时可以通过api_base参数指定网关地址import litellm resp litellm.completion( modelgateway-chat-model, messages[{role: user, content: 你好}], api_basehttp://your-gateway-host:4000/v1, api_keysk-your-virtual-key )这种方式的好处是你如果之前就是直接调各种模型切换代理时改动量最小。但我的建议是如果团队已经标准化到 OpenAI 风格那直接用 OpenAI SDK 更省心因为它生态成熟很多人都会用排查问题也更容易。4.3 接入层兜底设计不要因为有了网关就觉得业务代码可以裸奔。网关负责统一接口但业务侧依然要考虑自身的容错。我通常会在业务代码里加一个很薄的服务层封装三个东西超时、错误分类、降级逻辑。超时根据业务场景设定比如聊天类 30 秒内向量化 10 秒内错误分类把网关返回的错误分为限流、服务不可用、参数错误不同错误走不同应对降级如果主模型失败业务逻辑里可以判断是否切换到备用模型或者直接返回兜底文案。这套设计可以让你在网关出现故障时不至于让用户直接看到一串红色报错。5. 生产环境踩坑与排查实录这章是我最想写的一部分。很多文档不会告诉你这些问题但它们几乎一定会出现在生产环境里。5.1 常见错误速查表我在维护 LiteLLM 网关的过程中遇到过的问题集中在下面几个错误类型上直接整理成表方便对照错误现象常见原因处理方式401 Invalid API Key请求头里的 key 不是有效虚拟密钥或 master key检查 master_key 是否匹配虚拟密钥是否还在有效期404 Model Not Found配置里的模型名与请求里的 model 字段不匹配检查模型逻辑名确认model_list是否正确加载429 Rate Limit Error超出了供应商限流或超出了虚拟密钥配额查看日志确认是供应商侧还是配额侧增加重试或提升配额500 Internal Server Error配置文件里有不支持的参数或某个字段格式错误打开 verbose 日志观察请求转换后的实际内容连接超时供应商服务端响应慢或代理层与供应商网络不通调大 timeout检查供应商侧服务状态最让我困惑的一次是 401明明虚拟密钥刚创建就是提示无效。后来排查发现是密钥创建后没有正确关联模型权限这个虚拟密钥只能访问特定模型而我测试时使用了另一个模型名于是就被拒绝了。这类“有权限但看起来像鉴权失败”的问题排查时要先确认虚拟密钥的模型范围。5.2 日志开关与问题定位LiteLLM 默认的日志输出比较收敛方便日常运行。但出问题的时候你需要看的是完整请求链路包括网关收到了什么请求、转换成什么格式、调用了哪个上游、上游返回了什么。这时要把日志级别打开。在litellm_settings里把set_verbose设为true重启容器再看日志输出。你会发现每次请求都会打印出转换后的完整请求体和响应状态这比任何文档都有用。生产环境不要一直开着 verbose太重了排查完就关掉或者按请求 ID 抽样打印。5.3 数据库与虚拟密钥的常见坑不用数据库的 LiteLLM 像是一个“纯转发代理”你要想真正发挥它的管理能力必须接上 PostgreSQL。但我遇到过几个和数据库相关的坑数据库连接串里的特殊字符需要转义否则启动时报连接失败表结构是应用启动时自动迁移的不要手动改表否则版本升级时容易冲突如果数据库和应用不在同一网络务必检查网络策略和连接超时否则每次启动都要等很久才报错。在这套链路里密钥轮换也是一件必须提前设计的事。原始供应商密钥如果到期或者泄露你不需要动业务代码只要在网关配置或环境变量里替换就行。但这个替换过程最好有一个固定流程先在环境变量里更新新密钥重启网关用测试请求验证再下线旧密钥。千万不要在业务高峰期直接批量改配置。5.4 升级与稳定性建议LiteLLM 迭代频率不低我遇到过一次版本升级后某个模型参数行为发生变化的情况。从那以后我给自己定了几条规矩:升级前一定要读 release notes特别是关于参数默认值变化的说明在测试环境完整跑一遍核心链路包括流式请求、非流式请求、错误注入测试镜像 tag 不要用latest要锁定版本号方便回滚定期导出配置文件和数据库备份防止环境被误删。6. 落地节奏与适用边界最后聊一下“什么时候用它什么时候不用”。这部分是我经历了从兴奋到踩坑再到冷静使用的过程总结出来的。我推荐的落地节奏是先用在非核心链路比如内部工具、模型评测、临时实验等团队对配置和排障都熟悉了再把线上核心链路切过来。这样风险最低因为你可以在真实流量下观察它的稳定性又不用一上来就承担核心业务故障的压力。不推荐一开始就用的场景也很明确只有一个固定模型供应商且业务很稳定那直接调用官方 SDK 反而更简单团队没有运维精力不想维护额外服务那裸 SDK 可能更合适需要极低延迟的场景比如每次调用要求在几百毫秒内完成网关一跳带来的开销可能让你难受。LiteLLM 真正发光的场景是“多供应商、多模型、多团队权限、需要成本分摊”的平台型项目。在这种背景下它帮你从底层细节里解脱出来把精力放到业务迭代和模型策略上。最后的经验之谈如果只让我说一条最深刻的体会那一定是先确定你要不要把“模型调用”当成一个独立的基础设施来建设再决定是否引入网关。LiteLLM 是个好工具但它不是银弹它把原来散落在代码里的复杂度迁移到了配置和服务运维里。它的价值取决于你的场景复杂度模型越多、供应商越多、分账和权限越复杂它的优势就越明显。我个人在实际使用中还有一个习惯每次新增模型供应商都不急着上生产而是先在测试环境里用它跑一遍“对话 流式 失败注入”三个用例确认网关对错误码的识别和重试策略符合预期。这听起来慢但长期下来它帮我躲过了很多次线上告警。希望你也能在自己的项目里找到一条顺畅的接入路径少踩那些我已经踩过的坑。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑