20个免费LLM API整合为一个:开发者实战经验

开源工具 llm-free-cascade 将 20 个免费 LLM API 级联为统一接口,并总结 9 条实战经验。
本文介绍开源 Node 工具 `llm-free-cascade`,它把 Groq、Gemini、Cerebras 等 20 个免费 LLM API 级联成一个统一服务:先试 Groq,被拒则切 Gemini,依次类推。作者分享了 9 条实战经验,包括密钥轮换而非反复重试、区分单模型限流与密钥限流、依据 Retry-After 和错误消息动态冷却、按错误类型分类处理、集中管理易变的免费层信息、支持 OpenAI 兼容的本地服务器模式,以及用 Ollama 作为本地后备。项目零依赖、MIT 许可、运行于 Node 18+,并提供 keys、status、probe 等命令行工具和 `cascade.stats()` 可视化运行状态。
20个免费LLM API整合为一个:开发者实战经验
在构建教育科技平台的过程中,我开源了几个小型Node工具,其中llm-free-cascade解决了一个看似简单却颇为棘手的问题:如何让多个免费LLM API像同一个服务一样工作。

核心目标与挑战
这个工具的设计初衷非常直观:向Groq发送聊天请求,如果Groq拒绝,就尝试Gemini,然后是Cerebras,依次类推,遍历所有拥有密钥的免费层。但实现过程中暴露出的复杂性远超预期。从密钥管理到错误处理,从限流策略到提供商稳定性,每个环节都需要精心设计。
什么是 LLM API 的免费层(Free Tier)?
主流大模型服务商(OpenAI、Google、Groq、Cerebras、SambaNova 等)通常会为开发者提供一定额度的免费调用配额,即“免费层”。这些配额一般按每分钟请求数(RPM)、**每分钟 Token 数(TPM)或每日请求数(RPD)**来限制,超出后接口会返回 429 状态码。免费层的特点是不需要付费即可获得一定的推理能力,但代价是:额度较小、速率限制严格、可用模型受限、政策随时可能调整(例如转为限时试用、要求绑定信用卡或直接下线)。正因如此,把多个提供商的免费层组合成一个“虚拟大池子”,就成了控制成本、提升可用性的常见开发者策略——而这也正是 llm-free-cascade 试图解决的问题:用级联(cascade)的方式在多个免费层之间自动切换,让上层调用者感知不到底层配额的碎片化。
9个关键经验教训
1. 不要反复重试同一个密钥
初版实现总是从第一个密钥开始。当它达到每日限额后,每个请求仍会先尝试它、失败,然后才切换。密钥越多,响应反而越慢。
解决方案: 在密钥间轮换。当一个密钥被限流时,让它休息并跳过,直到恢复可用。
2. 限制通常针对单个模型
429状态码很少意味着“这个密钥已用完”,它通常表示“该密钥下的这个模型已达限额”。因此,在放弃某个提供商之前,先尝试同一密钥下的其他模型。
new LLMCascade({
keys: { groq: process.env.GROQ_API_KEY },
models: { groq: ['openai/gpt-oss-120b', 'openai/gpt-oss-20b'] }, // 第二个模型仅在第一个受限时尝试
});
3. 准确掌握等待时间
固定冷却时间并不正确——对每分钟限制来说太长,对每日限制来说又太短。提供商以各自的方式告知何时可以重试:
Retry-After响应头- 类似“try again in 2m59s”的消息
- 包含“per minute”或“per day”的词汇
- 已知的每日重置时间(Gemini在太平洋时间午夜重置)
级联策略会读取所有这些信号。每分钟限制等待约一分钟,每日限制则等到提供商重置。
Rate Limit 与 Retry-After 机制
限流(Rate Limit)是服务端保护自身资源的手段,常见实现有令牌桶(Token Bucket)和滑动窗口(Sliding Window)两类。当客户端超过配额时,服务端会返回 HTTP 429 Too Many Requests,并可能附带 Retry-After 响应头,其值可以是秒数,也可以是 HTTP 日期。此外,不少 LLM 提供商在 429 响应体的错误消息里用自然语言给出提示,例如 “Rate limit reached, try again in 2m59s” 或 “You exceeded your current quota, please check your plan”,有些还会注明是 “per minute” 还是 “per day”。对客户端而言,正确识别这些信号并在等待后重试,比盲目固定休眠要高效得多:固定等待对每分钟限制可能过长(浪费吞吐),对每日限制又可能过短(反复撞墙)。因此,成熟的客户端应当解析响应头与错误消息,区分分钟级与每日级限流,并结合各提供商的已知重置时间(如 Google Gemini 免费层按太平洋时间午夜重置)来安排恢复。
4. 并非所有错误都意味着提供商故障
| 错误类型 | 级联处理方式 |
|---|---|
| 提示过长 | 仅针对当前请求跳过该提供商 |
| 429/配额 | 让该密钥和模型休息至重置 |
| 401/403 | 停止使用该密钥 |
| 404(模型移除) | 停止使用该模型 |
| 超时、5xx | 连续2次后,跳过该提供商一分钟 |
最后一条至关重要。没有它,一个宕机的提供商会让每个请求都等待完整的超时时间。
5. 一个我选择不用的技巧
你可以将同一请求同时发送给两个提供商,保留更快的响应。但在免费层,这意味着为一个答案消耗双倍配额,因此我放弃了这种做法。
6. 免费层随时在变
今年Cerebras的免费层变成了30天试用,SambaNova开始要求绑定信用卡,GitHub Models则关闭了。模型名称的变化更加频繁。
因此,提供商列表存放在单个数据文件providers.json中。每个条目记录最后检查时间和数据来源,并警告诸如“仅限非商业用途”或“需要电话号码”等信息。一个小脚本会对照各提供商的实时列表检查每个模型名称。
需要注意:许多提供商不允许通过多个免费账户绕过限制。请检查各提供商的条款。
7. 支持任意语言调用
有人提issue希望能像OpenAI API一样从自己的工具中使用。现在可以将其作为本地服务器运行:
npx llm-free-cascade serve # http://127.0.0.1:8787/v1
然后将任何OpenAI客户端指向它,例如Python:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8787/v1", api_key="unused")
reply = client.chat.completions.create(
model="cascade", # 或 "groq" 仅使用Groq
messages=[{"role": "user", "content": "Explain photosynthesis in one sentence."}],
)
print(reply.choices[0].message.content)
它同样支持流式传输。服务器默认只监听本机,因为它保存了你所有的密钥。
OpenAI 兼容 API 与本地代理
所谓“OpenAI 兼容 API”,是指服务端暴露与 OpenAI Chat Completions 相同的请求/响应结构(/v1/chat/completions、messages 数组、choices[0].message.content 等)。由于 OpenAI 的 SDK 和生态极为普及,许多客户端、框架和工具默认都按这套接口编写,因此只要代理层实现该协议,就能让几乎所有语言和工具零改动接入。llm-free-cascade serve 正是这样一个本地代理:它监听本机端口,暴露 OpenAI 兼容端点,把请求翻译成对底层多个提供商的级联调用。使用 base_url 指向本地地址的 OpenAI 客户端(Python、Node、Go、Rust 均可),就能透明享受多提供商聚合。需要特别注意的是,这个服务器在内存中持有你所有的 API 密钥,因此默认只绑定 127.0.0.1,不要把端口暴露到公网;如确需远程访问,应额外加上反向代理和鉴权层。
8. 用Ollama实现本地备份
如果所有免费层同时繁忙,Ollama可以从你自己的电脑上回答问题。没有限制,只是速度较慢。
new LLMCascade({
custom: {
ollama: {
baseUrl: 'http://localhost:11434/v1',
model: 'llama3.2',
apiKey: 'ollama', // 任意文本均可,但不能为空
tier: 5, // 最后尝试
},
},
});
9. 可视化运行状态
npx llm-free-cascade keys # 缺少哪些提供商,以及在哪里注册
npx llm-free-cascade status # 你的提供商、密钥和限制
npx llm-free-cascade probe # 对所有密钥进行快速实时测试
在代码中,cascade.stats()显示每个提供商和密钥的调用次数、失败次数、速度和冷却状态。
技术实现与生态
llm-free-cascade采用MIT许可证,零依赖,运行在Node 18+上。它通过级联多个免费LLM API,为开发者提供了一个统一的接口,同时处理了密钥轮换、模型切换、错误分类和限流恢复等复杂逻辑。
如果你发现某个模型名称已失效,修复只需提交单文件PR。如果希望在服务器中支持工具调用,欢迎提issue说明你的使用场景。
相关推荐

Cursor能控制你的电脑了:AI代理可驱动桌面应用测试
Cursor 新增桌面控制能力,AI 代理可驱动 iOS 模拟器等桌面应用测试自己构建的功能。本文分析这一更新对开发工作流的影响、技术实现可能路径及可靠性考量。

Vibecoding自研推理引擎:理想丰满,现实骨感
Reddit开发者分享Vibecoding自研推理引擎的真实经历:用WebGL2和GLSL在浏览器跑GGUF Q4模型,却陷入tokenizer调试地狱。本文分析浏览器端LLM推理的工程难点,以及为何直接clone llama.cpp是更理性的选择。

Anthropic IPO前,早期投资人账面回报有多高?
Anthropic IPO前早期投资人账面回报引发关注。本文分析其纸面收益来源、资本结构、IPO预期下的博弈与风险,以及对AI创业生态的启示。