ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

统一所有 LLM API:支持预算与速率限制|开源日报 No.229

统一所有 LLM API:支持预算与速率限制|开源日报 No.229 1. 多模型接入的混乱现场从三套 SDK 到一份 config.toml如果你手上同时跑着 OpenAI、Anthropic、Azure 和本地 Ollama大概率经历过这种场面每个供应商一套 SDK、一套鉴权、一套返回结构日志里choices和content字段位置各不相同月底对账还得挨个后台翻用量。更麻烦的是预算和速率限制——某个 key 被同事拿去压测第二天整个项目组都被限流而你根本不知道是谁触发的。LiteLLM 这个开源项目解决的正是这件事用 OpenAI 格式统一调用 100 多种 LLM API把输入转换成各家的 completion、embedding、image generation 端点输出统一收敛到[choices][0][message][content]。它自带一个代理服务器支持跨部署的重试与回退还能按项目、API Key 或模型维度设置预算与速率限制。换句话说你不再需要为每个供应商写适配层也不用自己造一套配额系统。这篇内容面向正在做多模型接入、需要给团队或产品加预算护栏的开发者。我会给出可直接复制的config.toml骨架和settings.json关键字段然后演示一次预算阈值触发和速率限制生效的完整验证动作。整个过程围绕统一 API 管理落地不涉及任何网络环境配置。2. TaoToken 前置把模型访问收敛到一个入口在配置 LiteLLM 之前先要解决模型从哪来的问题。我的做法是把上游模型访问统一收敛到 TaoToken这样 LiteLLM 的config.toml里只需要维护一套 base_url 和 key切换模型时改model字段即可不用在多个供应商后台之间来回跳。TaoToken 的 API 入口是https://taotoken.net/api兼容 OpenAI 的请求格式所以 LiteLLM 可以直接把它当成一个 OpenAI 兼容的 provider 来配。你需要先在控制台创建一个 API Key这个 Key 会作为 LiteLLM 访问上游的凭证。具体操作路径打开控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite登录后进入 API Keys 页面新建一个 Key建议按用途命名比如litellm-proxy方便后续在 LiteLLM 里做预算归属复制生成的 Key稍后填入config.toml的api_key字段如果你还没决定用哪些模型可以先去模型对话页面https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite试几个常用模型确认响应格式和延迟符合预期再写进配置。对于长期跑编码任务或 Agent 的场景Coding Plan 页面https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite里有针对性的套餐说明可以先看一眼再决定预算上限设多少。这一步的核心目的是让 LiteLLM 只面对一个上游入口预算和速率限制的统计口径才不会分散。如果你把 Key 散落在多个供应商LiteLLM 的max_budget只能管到它自己转发的那部分流量统计会失真。3. 可复制配置config.toml 骨架与 settings.json 关键字段LiteLLM 代理的配置分两块config.toml定义模型列表和路由策略settings.json或环境变量定义代理服务器本身的行为。下面这份骨架可以直接改 Key 后用。3.1 config.toml 模型与预算骨架# config.toml model_list [ { model_name gpt-4o-mini, litellm_params { model openai/gpt-4o-mini, api_base https://taotoken.net/api, api_key os.environ/TAOTOKEN_API_KEY }, model_info { id gpt-4o-mini-prod } }, { model_name claude-sonnet, litellm_params { model anthropic/claude-sonnet-4-20250514, api_base https://taotoken.net/api, api_key os.environ/TAOTOKEN_API_KEY }, model_info { id claude-sonnet-prod } } ] litellm_settings { drop_params true, set_verbose false } general_settings { master_key os.environ/LITELLM_MASTER_KEY, database_url os.environ/DATABASE_URL }几个关键点说明。model_name是你对外暴露的别名客户端请求时用这个名字litellm_params.model是 LiteLLM 内部识别的 provider 前缀加真实模型名。api_base统一指向 TaoToken 的 API 地址api_key用os.environ/语法从环境变量读取避免明文写进文件。drop_params true的作用是当某个 provider 不支持某个参数时自动丢弃而不是直接报错这在多模型混用时很实用。general_settings里的database_url是预算和速率限制持久化的前提。LiteLLM 的预算统计需要写数据库没有它重启后用量就归零了。本地测试可以用 SQLite生产建议 Postgres。3.2 settings.json 速率限制与预算字段代理服务器层面的限制通过settings.json或环境变量配置。下面这份是settings.json的关键字段{ max_budget: 20.0, budget_duration: 30d, rpm_limit: 120, tpm_limit: 60000, max_parallel_requests: 8, request_timeout: 600, allowed_fails: 3, cooldown_time: 30 }逐字段解释字段作用建议值max_budget全局预算上限美元按团队规模设测试期 5–20budget_duration预算重置周期30d或1drpm_limit每分钟请求数上限按上游配额留 20% 余量tpm_limit每分钟 token 数上限同上max_parallel_requests并发请求上限防止瞬时打满request_timeout单请求超时秒长文本场景调大allowed_fails允许失败次数后熔断3 比较稳cooldown_time熔断冷却时间秒30 起步这些字段可以全局设也可以在config.toml的model_info里按模型覆盖。比如给便宜模型设高 rpm给贵模型设低预算粒度更细。3.3 按 Key 分配预算如果你要给不同项目或同事分配独立预算在 LiteLLM 里通过/key/generate接口创建带预算的 Keycurl -X POST http://localhost:4000/key/generate \ -H Authorization: Bearer $LITELLM_MASTER_KEY \ -H Content-Type: application/json \ -d { models: [gpt-4o-mini, claude-sonnet], max_budget: 5.0, budget_duration: 7d, rpm_limit: 30, metadata: {project: demo-app} }返回的key字段就是给项目用的子 Key。它继承全局限制同时叠加自己的max_budget和rpm_limit。这样即使某个项目跑飞了也只烧掉它自己的 5 美元额度不会影响其他人。4. 验证请求预算阈值触发与速率限制生效配置写完必须验证两件事预算到顶时请求被拒速率超限时返回 429。下面是我实际跑过的验证流程。4.1 启动代理并确认模型列表export TAOTOKEN_API_KEY你的Key export LITELLM_MASTER_KEYsk-1234 export DATABASE_URLsqlite:///litellm.db litellm --config config.toml --port 4000启动后另开终端确认模型已注册curl http://localhost:4000/v1/models \ -H Authorization: Bearer $LITELLM_MASTER_KEY返回的data数组里应该能看到gpt-4o-mini和claude-sonnet。如果为空检查config.toml的model_list缩进和api_key环境变量是否生效。4.2 发一次正常请求curl -X POST http://localhost:4000/v1/chat/completions \ -H Authorization: Bearer $LITELLM_MASTER_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: 用一句话解释什么是速率限制}] }成功时返回结构里choices[0].message.content就是模型输出。这一步确认了 TaoToken 上游连通、LiteLLM 转发正常。4.3 触发预算阈值把某个子 Key 的max_budget设成极小值比如 0.0001然后连续发请求for i in $(seq 1 5); do curl -s -X POST http://localhost:4000/v1/chat/completions \ -H Authorization: Bearer $SUB_KEY \ -H Content-Type: application/json \ -d {model:gpt-4o-mini,messages:[{role:user,content:test}]} \ | head -c 200 echo done前几次正常返回累计花费超过 0.0001 后响应会变成{ error: { message: Budget has been exceeded! Current cost: 0.00012, Max budget: 0.0001, type: budget_exceeded, code: 400 } }看到budget_exceeded就说明预算护栏生效了。这个错误码是 400不是 429注意区分。4.4 触发速率限制把rpm_limit设成 3然后用并发脚本快速打for i in $(seq 1 10); do curl -s -o /dev/null -w %{http_code}\n \ -X POST http://localhost:4000/v1/chat/completions \ -H Authorization: Bearer $SUB_KEY \ -H Content-Type: application/json \ -d {model:gpt-4o-mini,messages:[{role:user,content:hi}]} done wait输出里会出现若干200和若干429。429 的响应体里type是rate_limit_exceeded并附带retry_after字段告诉你多少秒后重试。实测下来LiteLLM 的速率限制是滑动窗口不是固定窗口所以不会出现整分钟卡死的情况。5. 本篇常见错排查配置过程中我踩过几个坑列出来帮你省时间。报错Invalid API Key但 Key 明明是对的。先确认config.toml里api_key用的是os.environ/TAOTOKEN_API_KEY而不是直接写字符串。LiteLLM 对环境变量语法敏感写成os.environ.TAOTOKEN_API_KEY会解析失败。另外确认启动代理的终端里确实export了这个变量。预算统计一直是 0。九成是database_url没配或指向了不可写的路径。SQLite 模式下确认当前目录有写权限Postgres 模式下确认连接串格式是postgresql://user:passhost:port/db。没有数据库LiteLLM 无法记录花费max_budget永远不会触发。速率限制不生效。检查你请求用的是哪个 Key。全局rpm_limit和子 Key 的rpm_limit是叠加关系但如果子 Key 创建时没带rpm_limit它只受全局限制。另外max_parallel_requests和rpm_limit是两个维度前者管并发数后者管每分钟总量别混淆。模型名报model not found。客户端请求的model字段必须是config.toml里model_name的值不是litellm_params.model里的真实模型名。比如你配了model_name gpt-4o-mini请求就得用这个名字。流式响应中断。如果用了stream: true且request_timeout设得太小长输出会被截断。把request_timeout调到 600 以上同时确认上游 TaoToken 的 API 地址没有多余路径后缀。切换模型后参数报错。不同 provider 支持的参数不同比如某些模型不支持temperature的某些取值。drop_params true能缓解大部分情况但如果是必填参数缺失还是要在请求侧做适配。6. 把统一入口和预算护栏固定下来走到这里你已经有了一套可运行的多模型统一接入层LiteLLM 负责格式转换和路由TaoToken 作为统一上游入口config.toml管模型清单settings.json管预算和速率。接下来要做的就是把 Key 和配置固化到团队流程里。建议按这个顺序推进先在 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite为每个项目建独立 Key把预算归属分清楚然后对照接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite确认参数兼容性尤其是流式和函数调用场景最后把config.toml和settings.json纳入版本管理改配置走 review避免有人手滑把max_budget改成 0 导致全组被拒。一个实用技巧在model_info里给每个模型加id字段日志里就能直接按 id 聚合用量比按模型名统计更清晰。另外budget_duration建议设成7d而不是30d周期短一点预算跑飞的发现速度更快。
返回列表