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

LiteLLM完全指南:用OpenAI兼容接口统一多模型API,告别碎片化

LiteLLM完全指南:用OpenAI兼容接口统一多模型API,告别碎片化 ★ FEATURED ARTICLE
做 AI 应用开发这一年多绝大多数人都会遇到同一个尴尬各家模型的 API 长得都不一样。有的用 messages 数组有的用 prompt 字符串有的鉴权要签名算法有的响应结构还得自己套好几层解析。项目里一旦想把模型从 A 换成 B轻则改几天代码重则底层请求封装、流式解析、异常处理全要重写。LiteLLM 就是冲着这个痛点来的一个开源项目本质是一个模型接入网关能把国内外主流大模型的 API 统一成一套 OpenAI 兼容接口。你只要会调 OpenAI 格式的接口就等于同时会调其他几十种模型。这篇文章我会从它的设计思路、核心功能、部署实操到生产环境避坑经验做一次完整拆解适合正在做多模型接入、想统一团队 AI 基建、或者被模型 API 碎片化搞到头大的开发者参考。1. 先搞清楚问题为什么会有 LiteLLM 这种工具1.1 各家模型的 API 接口跟方言一样乱先说清楚我为什么强调API 碎片化真正折磨人。不同的模型服务商接口设计差异远不止换一个 base_url 那么简单请求结构不统一有的用 messages 列表表达多轮对话有的用 prompt 拼接全文有的还有单独的 system 字段、工具字段、图像字段。鉴权方式五花八门有最普通的 Bearer Token有要求自定义 Header 的有需要动态签名的有把 Key 放在 Query 参数里的。写 SDK 的人要分别处理用起来完全不一样。参数命名语义不同temperature、top_p、top_k、repetition_penalty同一个概念在不同家叫不同名字取值范围和默认值也不一样。max_tokens 有的指输出上限有的指总长度。响应结构区别很大有的直接返回 content 字符串有的返回 choices[0].message.content有的嵌套出来还要取 delta、取 text。错误码更不用说了429、500、超时各家状态码语义还经常对不上。我早期做一个对话机器人项目时先用了一款比较典型的国外模型后来又接到客户需求必须接国内某家模型。那段时间每天就是在 SDK 文档、请求体转换、响应解析这几个环节来回折腾。当时最深的感受是AI 本身不复杂复杂的是把一堆方言全部翻译成一种普通话。1.2 项目里改模型切换的真实成本很多人觉得换模型不就换个 SDK 嘛真上手过几次之后就知道完全不是这么回事。举个我在某跨平台系统升级时遇到的例子这个系统上线时绑定了一个单一模型代码里到处是那个 SDK 的特征写法比如自定义的 Client 初始化、特定 requests 调用、专属的消息结构和流式迭代器。业务方后来说另一个模型效果更好、价格也更低要求切换。一评估才发现请求封装层要改、鉴权逻辑要改、流式输出解析要改、工具调用格式要改、异常重试策略要重写连日志里记录的模型字段都要跟着调整。测试回归也麻烦因为两家返回的 usage 结构不一样成本统计脚本也得改。那次切换前后花了三天而且切换之后还出现了一个诡异问题同一段 prompt旧模型正常、新模型偶尔截断排查半天发现是新模型的 max_tokens 默认值和旧的 SDK 不一致导致的。这种切换成本让团队不敢换模型等于被单一供应商安全锁定了。后来我才意识到真正应该做的是在业务代码和模型供应商之间加一层抽象层让业务代码永远只面对一套统一的接口。1.3 统一网关的本质把方言翻译成普通话LiteLLM 解决的就是这个抽象层的问题。你可以把它理解成一个同声传译器或者万能插座上游对接的是各家模型的原始 API包括国外商用模型、国内厂商模型、开源模型、本地部署模型下游暴露出来的是一套统一的 OpenAI 兼容格式。业务代码不关心你调的是哪家模型它只认一种接口格式。这样做的好处非常直接。第一新模型接入时业务代码一行不用改只需要在配置层声明新模型的接入参数再映射到一个逻辑名称上。第二模型之间切换是动态的可以在配置层做灰度、做 fallback、做负载均衡而不是改代码重新发版。第三团队协作方式也变了——后端同学不用每人都去申请各家 API Key只需要面对一个统一的网关服务。这个思路本质上是网关模式在 AI 应用层的落地。就像我们接入支付不会直接去连每家银行一样接入大模型也不该让业务代码直接对接每一家供应商。LiteLLM 把这一层抽象得很好这也是它在开源社区能快速火起来的原因。2. LiteLLM 核心能力拆解一个入口调用多种模型2.1 聪明的设计以 OpenAI 接口格式为基准LiteLLM 在设计上有个很关键的选择它没有自创一套新的第三方言而是直接以 OpenAI 的 Chat Completions 接口格式作为统一基准。这个选择我非常认可原因有三个第一OpenAI 的 messages 结构已经成了事实上的行业标准。现在主流的大模型 API包括很多开源模型服务基本都长这副样子一个数组数组里是 role 和 content多轮对话就是不断往数组里 push。开发者的学习成本几乎为零。第二生态兼容性好。反正 OpenAI 的库已经到处都在用了LangChain 等上层框架也默认支持 OpenAI 接口LiteLLM 复用这套格式就能无缝接入几乎所有主流工具链。第三转换成本可控。各家 API 虽然方言不同但核心概念是相通的无非就是系统提示词、对话历史、生成参数、流式输出。LiteLLM 做的就是把业务传来的 OpenAI 格式请求翻译成目标厂商要求的格式再把目标厂商的响应翻译回 OpenAI 格式。两边都有明确的标准翻译起来不容易出错。2.2 两种使用模式嵌入式 SDK 与独立代理LiteLLM 提供了两种玩法很多人第一次用的时候容易混淆实际它俩解决的是不同阶段的需求。第一种是嵌入式 SDK 模式。你在 Python 代码里直接import litellm然后调用litellm.completion()。这种方式适合快速验证、本地脚本、开发调试不需要额外部署服务安装依赖就能跑。第二种是独立代理模式。LiteLLM 会变成一个独立的服务进程内部用 FastAPI 实现对外暴露/v1/chat/completions这样的接口。所有团队成员的代码都指向这个代理服务由代理统一转发到真正的模型供应商。这个模式适合生产环境因为它是真正的网关可以做统一的鉴权、限流、计量、监控。我自己的建议是小团队或者个人项目、还没到多业务方共享模型的时候先用 SDK 模式改造成本最低一旦有多个服务要调不同模型、需要统一管理 API Key 和账单了就果断上代理模式。两者之间其实可以平滑过渡因为代码层都是同一套 OpenAI 格式后面切换部署方式不伤筋动骨。2.3 模型命名与自动映射规则LiteLLM 里有两个容易混淆的概念一个是逻辑模型名一个是真实模型名。理解这俩才算真正会用这个工具。真实模型名遵循provider/model-name这个格式比如openai/gpt-4o、anthropic/claude-3-5-sonnet、ollama_chat/llama3.1。LiteLLM 靠斜杠左边的前缀判断该走什么 Provider 的适配器。逻辑模型名则是在配置里自定义的比如你可以把某个模型命名为my-chat-model然后在配置里告诉 LiteLLMmy-chat-model实际对应的是openai/gpt-4o加某个 API Key。这个映射关系价值很大。业务代码里永远只写modelmy-chat-model至于底层究竟是哪家模型、什么时候换都由配置决定。我见过一个团队就是这么做的把逻辑名production-main一会儿指向模型 A一会儿指向模型 B产品方只要看到效果数据变差了运维改一段配置就能秒切完全不用等开发改代码。2.4 生产级功能矩阵很多人以为 LiteLLM 只是一个接口转换器实际上它把自己定位成了一个 AI 网关生产级该有的东西基本都有负载均衡与故障转移同一个逻辑名可以配置多个真实模型按策略自动分发请求某个供应商挂了或者报错自动 fallback 到另一个。重试与超时控制对限流和 5xx 错误做指数退避重试也可以配置每个请求的超时时间。虚拟 API Key 与租户隔离代理模式下可以生成多个虚拟 Key每个 Key 可以限制额度、模型范围、速率相当于给不同部门发不同权限的通行证。成本追踪与预算管理记录每一次调用的 token 数和费用可以给模型或 Key 设置预算上限超了自动熔断。缓存层支持内存缓存和 Redis 缓存可以实现语义缓存减少重复请求省成本又降延迟。可观测性内置支持 Prometheus 指标、Langfuse、Sentry 等回调日志、追踪、告警都能接。流式输出与工具调用完整支持 SSE 流式返回、Function Calling不会因为多包了一层代理就丢掉这些关键能力。所以 LiteLLM 不是一个玩具项目它是按生产标准设计的一套基础设施。接下来我想带着你从零把它跑起来先看最小可用再看生产配置。3. 实操从零把 LiteLLM 跑起来3.1 环境准备与安装环境要求其实很低只要 Python 3.8 以上推荐用 3.11 或更高版本避免一些老版本解释器在异步和类型注解上的兼容问题。提前把环境隔离好建议用venv或 Conda 创建一个干净的虚拟环境避免和系统 Python 打架。安装分两种情况。只用 SDK 模式直接pip install litellm如果要用代理模式顺便装带 proxy 的完整依赖pip install litellm[proxy]装完检查一下版本python -c import litellm; print(litellm.__version__)第一次装的时候要注意代理模式依赖 fastapi、uvicorn、pydantic 等组件如果之前环境里已经有这些包版本冲突的概率不小。我习惯先建新虚拟环境再装能省掉很多烦恼。3.2 最简 Python 调用先做一个最基础的非流式调用验证整个链路能通。假设你已经有一个模型服务商的 Key把它设置到环境变量里然后再写代码调用import os os.environ[OPENAI_API_KEY] 你的Key import litellm response litellm.completion( modelgpt-4o, messages[ {role: system, content: 你是一个数据助手说话简洁准确。}, {role: user, content: 用一句话解释什么是API网关。} ], temperature0.7 ) print(response.choices[0].message.content) print(token用量:, response.usage)这段代码的核心就一个函数litellm.completion()。你传 model、messages、temperature它返回一个和 OpenAI SDK 风格一致的对象。注意 API Key 的优先顺序是调用时显式传的api_key参数 环境变量 配置文件。我建议 Key 一律从环境变量或密钥管理服务里读不要硬编码在代码里。如果你要调的不是 OpenAI而是其他厂商用法几乎一样只需要把模型名换成对应的provider/模型名格式然后设置对应的环境变量。比如response litellm.completion( modelanthropic/claude-3-5-sonnet, messages[{role: user, content: 你好}] )你看业务代码的形态完全不变变的只是 model 字符串和 Key这正是 LiteLLM 想达到的效果。3.3 用 OpenAI SDK 改造现有代码现在很多项目其实已经用 OpenAI SDK 开发了如果你不想改造成litellm.completion()的形式LiteLLM 还有一条更省事的路径直接让 OpenAI SDK 走 LiteLLM 的地理位置。原理很简单OpenAI SDK 允许你指定base_url和api_keyLiteLLM 代理或者 SDK 内置的本地端点可以伪装成一个 OpenAI 兼容服务。改造前后对比很直观。改造前你的代码可能是这样from openai import OpenAI client OpenAI( api_key真实Key, base_urlhttps://某供应商/v1 ) resp client.chat.completions.create( modelgpt-4o, messages[{role: user, content: 测试}] ) print(resp.choices[0].message.content)改造后只需要把 api_key 换成 LiteLLM 的虚拟 Key 或任意占位 Key把 base_url 指向本地代理地址from openai import OpenAI client OpenAI( api_keysk-litellm-虚拟Key, base_urlhttp://localhost:4000 ) resp client.chat.completions.create( modelgpt-4o, messages[{role: user, content: 测试}] ) print(resp.choices[0].message.content)这种方式对现有代码的侵入性最小很多团队从旧架构迁移过来就是靠改这两行完成的。它背后其实是 LiteLLM 把自己实现成了一个 OpenAI 兼容服务SDK 发来的请求会被它拦截、转换、转发。3.4 代理模式部署与测试代理模式才是 LiteLLM 生产环境里的主力形态。它需要一个 YAML 配置文件声明外部模型列表和逻辑名映射。先建一个config.yamlmodel_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-20241022 api_key: os.environ/ANTHROPIC_API_KEY - model_name: code-model litellm_params: model: openai/gpt-4o-mini api_key: os.environ/OPENAI_API_KEY然后启动litellm --config config.yaml --port 4000看到服务启动日志后用 curl 快速验证curl http://localhost:4000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [{role: user, content: 你好}] }如果一切正常你会收到一段 JSON里面的结构和 OpenAI 的响应基本一致。如果你传的是code-model即使底层是另一个真实模型从调用方视角看也是一模一样的接口。这里有个细节想提醒你LiteLLM 代理启动后可以通过/model/info接口查看当前注册了哪些模型curl http://localhost:4000/model/info排查为什么我这个模型报不存在这类问题时这个接口是第一个要看的。代理模式下还可以开一个简单的看板如果你装了 UI 相关依赖访问http://localhost:4000/ui能看到请求日志、模型列表和用量统计。生产环境我一般不开 UI但开发调试阶段开着非常舒服。3.5 接入 LangChain 等上层框架现在的 AI 应用很少直接裸调接口多半会套一层工具链最常见的就是 LangChain。LiteLLM 和这些框架兼容得比较好因为它的对外接口就是 OpenAI 格式。在 LangChain 里接 LiteLLM用起来和原来的 OpenAI 接入几乎一样from langchain_openai import ChatOpenAI llm ChatOpenAI( modelgpt-4o, openai_api_basehttp://localhost:4000, openai_api_keysk-litellm-虚拟Key ) resp llm.invoke(写一段代码)如果你不想用代理LangChain 也有ChatLiteLLM这个集成类可以直接加载litellm.completion。不过从我实测经验来说走 OpenAI 兼容地址接入更通用因为以后不管换什么网关这套代码都不用动。4. 进阶玩法生产环境里的关键配置4.1 多模型负载均衡与故障转移单模型的网关只是入门生产环境真正值钱的是多模型编排能力。假设你给同一个逻辑名配置了多个供应商的模型LiteLLM 可以按策略自动分流model_list: - model_name: production-main litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY api_base: https://某供应商/v1 - model_name: production-main litellm_params: model: anthropic/claude-3-5-sonnet api_key: os.environ/ANTHROPIC_API_KEY - model_name: production-main litellm_params: model: gemini/gemini-1.5-pro api_key: os.environ/GEMINI_API_KEY配置完成后可以用litellm.Router来做更精细的路由控制也可以直接在代理里让它自动负载均衡。路由策略常用的有simple-shuffle随机打散请求适合低成本分发。least-busy选当前请求数最少的模型适合有并发波动的场景。latency-based-routing按历史延迟选最快的模型适合延迟敏感业务。故障转移配置也一样关键。比如你想让主模型失败后自动切到备模型可以在配置或调用里指定from litellm import Router router Router(model_list[...], fallbacks[{production-main: [claude-3-5-sonnet, gpt-4o-mini]}]) response router.completion(modelproduction-main, messages[...])这里的心得是fallback 不是越复杂越好。备模型的效果通常会有差异用户模型切换后可能出现回答风格突变。所以 fallback 更适合用在你对宁可响应降级也不能失败的场景里比如客服系统、日志摘要这类容错要求高的任务。4.2 成本追踪与用量统计成本失控是 AI 应用上线后最容易踩的坑而 LiteLLM 内置的成本追踪能力对控制预算很关键。SDK 模式下你可以单独计算一次请求的花费from litellm import completion_cost, completion resp completion(modelgpt-4o, messages[...]) cost completion_cost(completion_responseresp) print(f本次调用费用: {cost} 美元)代理模式下更省心每次请求后你可以在日志里看到 usage 信息包括输入 token、输出 token、估算费用。它内置了主流模型的价格表通过litellm.model_cost可以查看。如果要给团队设置预算上限在 config.yaml 里加一段general_settings: max_budget: 100 budget_duration: 30d意思是 30 天内总调用成本预算 100 美元超了就会自动熔断。你还可以针对不同的虚拟 Key 设置独立额度比如给测试环境 Key 设 10 美元给生产环境 Key 设 80 美元互不影响。做成本追踪有一个容易忽视的细节模型价格会调整LiteLLM 内置的价格表不一定永远准确。我建议每个季度人工核对一次重点模型的单价特别是那些自带缓存优惠、批量折扣的计费模式统计口径很容易差出几个百分点。4.3 缓存层优化减少重复调用做 AI 应用的人都会发现不少线上请求其实是同类问题反复问比如量比较大但答案相对固定的标准问答业务。如果没有缓存每个请求都要真金白银地调用大模型延迟还高。LiteLLM 支持在代理层面做两层缓存简单的内存缓存和分布式 Redis 缓存。config.yaml 里可以这样配置cache: true cache_params: type: redis host: localhost port: 6379调用方无需修改代码LiteLLM 会根据请求的 model、messages、temperature 等参数计算缓存 Key命中后直接返回缓存结果。想要强制忽略缓存可以在请求里加mock_response或者特殊的元数据跳过。这里要提醒一个很常见的设计问题别把所有请求都开缓存。涉及隐私信息、实时行情、个性化推荐的数据绝对不适合缓存。缓存只适合那些用户可接受既定答案的场景。另外缓存 Key 如果包括 messages 全文长对话场景的匹配率其实不高实际效果没你想得好。建议对高频率短问答场景开缓存长文本、强个性化场景直接关掉。4.4 虚拟 Key 与租户隔离代理模式最大的安全收益在于上游各家的真实 Key 被隐藏在服务端业务客户端拿到的只是一把虚拟 Key。这把虚拟 Key 可以只对指定模型有效也可以设速率限制和预算额度。比如给一个部门发一把 Key限定它只能用production-main这一个逻辑模型每分钟最多 100 次请求一个月成本上限 30 美元。生成虚拟 Key 可以用管理接口curl -X POST http://localhost:4000/key/generate \ -H Authorization: Bearer sk-管理员Key \ -H Content-Type: application/json \ -d { models: [production-main], max_budget: 30, rpm_limit: 100 }这个机制有点像酒店房卡你不需要给每个客人都发万能钥匙只需要发一张能开特定楼层房门的卡。虚拟 Key 还有另一个好处哪个 Key 出问题了可以直接吊销它不影响其他业务更不用去上游供应商那边重置真实 Key。4.5 监控告警与可观测性网关一旦成为团队基础设施监控就得跟上。LiteLLM 内置了 Prometheus 兼容的指标端点config 里这样开litellm_settings: success_callback: [prometheus]然后代理会暴露/metrics接口你可以把 Prometheus 拉取接进来再配 Grafana 看板。常用指标包括请求总量、成功率、延迟分布、token 消耗等。也可以自定义回调把日志推送到内部日志平台def my_success_handler(response, **kwargs): model response.get(model, ) cost response.get(_hidden_params, {}).get(response_cost, 0) log_to_platform(modelmodel, costcost) litellm.success_callback [my_success_handler]告警阈值怎么定比怎么配更重要。我的经验是不要一上来就设一堆告警否则全是噪音最后谁都不看。先把成功率、P95 延迟、限流率、成本增速这四类盯住等运作稳定了再加细分维度的指标。告警阈值也要按模型供应商分别设置因为不同模型的性能基线差很多不能套同一个数。5. 常见问题与排查技巧实录5.1 Model Not Found配置没生效症状是调用时返回model not found或者提示模型名称不存在。原因通常有三个一是 config.yaml 里没有注册这个 model_name二是注册了但拼写不一致比如多了个空格或者大小写不对三是代理服务启动时根本没加载你改过的配置。排查顺序我一般这么走先看/model/info返回的模型列表里有没有这个名字。没有的话看 config.yaml 的 model_list 是不是漏了。确认启动命令是不是带上了--config config.yaml。改完配置后重启代理很多问题其实只是没重启。还有个小坑代理的 YAML 配置里model_name和litellm_params.model这两个字段特别容易写混。前者是你对外暴露的逻辑名后者才是真实模型名二者可以完全不同。我见过有人把model_name写成了gpt-4o但litellm_params.model也写成gpt-4o结果想切模型时只能改代码完全丧失了网关的意义。5.2 限流与重试RateLimitError 的破解调用上游模型时最经典的报错就是 429。LiteLLM 内部有对部分供应商限流的自动识别和重试但默认值不一定适合你的场景。你可以显式设置重试次数resp litellm.completion( modelgpt-4o, messages[...], num_retries3, timeout30 )如果有多个供应商都能处理同一种请求我建议在 Router 配置里同时开启自动重试和故障转移router Router( model_list[...], auto_retryTrue, fallbacks[...] )经验是重试要配指数退避不要固定间隔重试否则上游一抖动你的重试风暴会让情况更糟。代理端最好再加一个总并发限制别让网关疯狂向上游请求否则上游限流反而更严重。还有一种隐蔽情况上游返回 429但错误码被包装成了别的格式导致 LiteLLM 没有识别出来。这时候可以看代理日志里的原始响应内容确认上游返回的状态码和 body。5.3 上下文超长ContextWindowExceededError请求内容超过模型上下文窗口限制时会报类似ContextWindowExceededError的错。很多人第一反应是这段文本太长了然后去截断但要注意几个更隐蔽的点第一max_tokens限制的是输出长度不是输入长度。有些 SDK 默认 max_tokens 比较大当输入已经很长时输出空间不足也会报窗口超限。解决方法是把 max_tokens 调小或者按模型的窗口动态计算可用的输入长度。第二多轮对话的 history 会越攒越长单看每条消息都不长合起来就超了。最简单的对策是做一个历史会话裁剪只保留最近的 N 轮或者把旧历史做摘要后拼到 system prompt 里。我接手过一个客服机器人项目用户连续问几十轮之后上下文必然溢出后来就是把超过 20 轮的旧内容压缩成摘要问题彻底消失。第三LiteLLM 本身提供了一些预检能力比如litellm.enable_pre_call_checks True会在请求发出前先计算 token 数和窗口上限超了就直接报错免得打到上游才被判死刑。这个方法对排查和防御都很有效。5.4 流式输出中断生产环境里流式请求比非流式容易出问题。常见表现是客户端收到一半就断了或者 SSE 流解析到一半报StreamConnectionError。原因通常有几种。一是客户端提前断开了连接代理还在向上游收数据导致资源泄漏。二是代理和上游之间的读超时设置太短上游响应慢了一点就被切断。三是某些供应商的流式响应格式和 OpenAI 不完全一致个别字段的键名不同解析层按 OpenAI 格式读就找不到值。对策上我建议优先调整超时参数而不是改重试逻辑resp litellm.completion( modelgpt-4o, messages[...], streamTrue, timeout60 )另外如果你需要流式响应里包含 token 用量信息需要在请求里传stream_options{include_usage: true}否则最后的 usage 字段是空的。这个细节很多人查半天才找到。调试流式问题时一个很有效的技巧是先拿 curl 直连上游再直连 LiteLLM分别观察两端的流式输出格式。如果上游正常、LiteLLM 不正常那就是转换层的问题如果上游本身就不稳定那就换供应商或者加重试。5.5 配置热更新不用每次都重启生产环境频繁重启代理是很伤人的。LiteLLM 提供了动态管理模型的接口比如通过/model/new可以在运行中增加模型curl -X POST http://localhost:4000/model/new \ -H Authorization: Bearer sk-管理员Key \ -H Content-Type: application/json \ -d { model_name: new-model, litellm_params: { model: openai/gpt-4o-mini, api_key: 新Key } }我的习惯是临时调模型、灰度验证新供应商时用动态接口注册不用重启涉及负载均衡策略、预算上限、全局缓存这类基础配置的修改还是老老实实改 YAML 重启因为这类改动影响面大最好有可回滚的版本记录。5.6 安全与日志脱敏AI 网关处在所有模型请求的必经之路上天然会成为敏感信息汇聚点。最常见的问题就是把 API Key 打进了日志里。你可以配置日志过滤器避免把 Authorization 头和请求体里的敏感字段写进日志。同时建议做到以下几点所有真实上游 Key 只存在于环境变量或密钥管理服务中绝不写进代码仓库。虚拟 Key 按权限最小化原则发放能用一个模型的就别发一排模型。代理服务所在网络加访问控制不要让公网随意访问管理端口。定期轮换 Key尤其是自己心里都没底的测试 Key。有一次我排查线上问题顺手翻代理日志翻着翻着发现有一条请求把 Authorization 头整个打印出来了那一瞬间后背发凉。从那以后我所有回调函数里统一做了字段脱敏凡是 headers、request body 里可能带 Key 的字段一律不记录。写在最后我的实际体会LiteLLM 我陆续用了不少时间从最早的单机脚本到后来帮团队搭建统一的模型接入层整体感受是加这一层抽象确实多了一些网络开销和运维成本但它换来的收益大得多。最明显的一点是团队再也不怕换模型了。客户说这个模型效果不好我们改一段配置就能切到候选模型做对比测试整个验证周期从几天缩短到几十分钟。成本控制也终于从拍脑袋变成了看数据每个部门、每个项目用了多少钱往看板上一看就清楚。最后分享一个建议不管你是刚开始接触 LiteLLM还是已经被 API 碎片化折磨了一阵子都先从最小场景跑通一条链路再逐步加负载均衡、缓存、预算这些高级功能。不要一上来就把所有模型全部接进去那样一旦出问题排查范围太大容易打击信心。先接一个核心模型验证代理、验证成本追踪、验证日志跑稳定了再往里面加新模型。基础设施这种东西稳定胜过一切花哨功能。
阅读完成 · 觉得有帮助?
咨询建站