作者分享将约 20 个免费 LLM 接口串联调用的工程经验,包括密钥轮换、限流后暂时跳过,以及同一密钥下切换模型。冷却时间应结合 Retry-After、错误消息和重置时间判断,避免固定等待造成无效重试。
9 月,我分享了几个小型 Node 包,其中一个叫 llm-free-cascade。它的思路很简单:先把聊天请求发给 Groq。如果 Groq 拒绝,就试 Gemini,然后是 Cerebras。如此依次尝试,遍历所有你持有 API key 的免费额度服务。
思路很简单,但要把它做好并不容易。下面是我学到的经验。
我的第一个版本总是从第 1 个 key 开始。一旦第 1 个 key 当天的额度用完,后续每个请求仍然会先尝试它,失败后才切换到下一个。key 越多,反而越慢。
解决办法:轮流使用不同的 key。当某个 key 触发限流时,让它休息一会儿,在它恢复可用之前跳过它。
429 很少意味着“这个 key 已经不能用了”,通常意味着“这个 key 在这个模型上的额度已经用完了”。所以,在放弃这个服务商之前,先用同一个 key 试试其他模型。
new LLMCascade({
keys: { groq: process.env.GROQ_API_KEY },
models: { groq: ['openai/gpt-oss-120b', 'openai/gpt-oss-20b'] }, // 2nd is tried if the 1st is limited
});
固定的冷却时间并不合适。对于每分钟限额,它太长;对于每日限额,它又太短。
服务商会告诉你什么时候可以再来,只是各自的表达方式不同:
级联逻辑会读取这些信息。遇到每分钟限额,就等待大约一分钟;遇到每日限额,就等到对应服务商重置额度。
最后这一点很重要。没有这一点,服务商一旦宕机,每个请求都得等到完整的超时时间结束。
你可以把同一个请求同时发给两个服务商,然后采用更快返回的答案。但在免费额度下,这相当于为一个答案消耗两份额度,所以我没有加入这个功能。
仅今年,Cerebras 的免费额度就变成了 30 天试用,SambaNova 开始要求提供银行卡,而 GitHub Models 则关闭了。模型名称的变化更加频繁。
因此,我把服务商列表放在一个数据文件 providers.json 中。每条记录都会注明上次核查的时间,以及这些数字的来源。它还会提醒你注意“仅限非商业用途”或“需要手机号”之类的要求。另有一个小脚本,会根据各服务商实时提供的模型列表,检查每个模型名称。
提醒一下:很多服务商不允许通过注册多个免费账号来绕过限额。请查看各服务商的条款。
有人提了一个 issue,希望能像调用 OpenAI API 一样,从自己的工具中使用它。因此,现在你可以把它作为本地服务器运行:
npx llm-free-cascade serve # http://127.0.0.1:8787/v1
然后让任意 OpenAI client 指向它,例如在 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", # or "groq" to use only Groq
messages=[{"role": "user", "content": "Explain photosynthesis in one sentence."}],
)
print(reply.choices[0].message.content)
它也支持流式输出。由于服务器持有你的所有 key,默认只监听本机。
如果所有免费额度服务恰好都忙不过来,Ollama 可以在你自己的电脑上回答。没有限额,只是慢一些。
new LLMCascade({
custom: {
ollama: {
baseUrl: 'http://localhost:11434/v1',
model: 'llama3.2',
apiKey: 'ollama', // any text works, but it can't be empty
tier: 5, // try it last
},
},
});
npx llm-free-cascade keys # which providers you're missing, and where to sign up
npx llm-free-cascade status # your providers, keys and limits
npx llm-free-cascade probe # quick live test of every key
在代码中,cascade.stats() 会显示每个服务商和每个 key 的调用次数、失败次数、速度和冷却情况。
llm-free-cascade 免费开放,采用 MIT 许可证,零依赖,可在 Node 18+ 上运行。
发现某个模型名称已经不能用了?修复它只需要提交一个修改单个文件的 PR。希望服务器支持 tool calling?提一个 issue,告诉我你打算搭配什么工具使用。
如果还想采取进一步行动,你可以考虑屏蔽此人和/或举报滥用行为。