我把 LLM API 账单砍了 70%:路由 + 缓存的 AirAi 实战笔记
0. 背景:账单是怎么爆的
我做几个 side project,早期要么咬牙买官方 $20/mo 订阅,要么硬扛国际信用卡被拒。月底算账发现两件扎心的事:
80% 的请求是摘要、分类、格式化这类轻活,用最贵的模型跑纯属浪费;
订阅是固定成本——调用少的时候亏,调用多的时候又不够用。
于是我转向 AirAi:自己拿 API key,按量计费,并把客户端指向它的 OpenAI 兼容接口。
这里还有段小插曲。我手上一直没张像样的国际信用卡,官方直连每次走到支付那一步就被拒;有阵子借家人的卡顶着,结果触发风控,账号直接被冻,申诉了快两周才解。那之后我就铁了心只找「不依赖国际卡」的渠道。最后落地的这家网关只收 USDT——对我这种没国际卡的人来说,反而是门槛最低的那一档:充币即用,没有月费绑定,也不用走 KYC 那套。更关键的是价格:我体感算下来,单价只有官方直连的 1 折左右,这才是它真正让我留下的理由。
1. 一行切换:指向任意兼容网关
几乎所有支持自定义 endpoint 的客户端(Claude Code、Cursor、Open WebUI、LibreChat、Cline…)都能用一行环境变量切换,无需改代码。把下面两个变量指向你自己的网关即可:
export OPENAI_BASE_URL="https://api.airai.cc/v1" export ANTHROPIC_BASE_URL="https://api.airai.cc/v1"
挑哪家网关是另一回事,本文只讲落地方法。
2. 代码实战:路由 + 缓存
光切换还不够,真正省钱的是"让对的模型干对的活 + 缓存重复请求"。下面是我在生产里用的骨架(兼容 OpenAI SDK),base_url 和 api_key 都从环境变量读,不写死在代码里:
import openai, hashlib, os
client = openai.OpenAI(
base_url=os.getenv("OPENAI_BASE_URL"),
api_key=os.getenv("OPENAI_API_KEY"),
)
# Routing: small model for light tasks, flagship only for complex reasoning
CHEAP = "gpt-5.6-luna" # classification / summarization / formatting
STRONG = "gpt-5.6-sol" # only called for complex reasoning
_cache: dict[str, str] = {} # swap for Redis in production
def ask(prompt: str) -> str:
model = STRONG if len(prompt) > 400 else CHEAP
key = hashlib.md5(prompt.encode()).hexdigest()
if key in _cache: # cache hit, 0 cost
return _cache[key]
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
)
answer = resp.choices[0].message.content
_cache[key] = answer
return answerCHEAP / STRONG 按你的预算和效果调。模型名以你所用网关的文档为准。离线任务记得走 Batch 接口,通常能再省一半。
3. 成本对比(示意)
改造前后的示意数据(真实数字请以你的账单为准):
项目 | 官方订阅 / 直连 | AirAi + 路由缓存 |
计费方式 | 固定月费 / 官方价 | 按量计费 |
轻活模型 | 旗舰(浪费) | 小模型(更便宜) |
重复请求 | 全价重算 | 缓存命中 0 成本 |
体感成本 | 基准 100% | 约 10–30%(视调用量) |
4. 诚实边界(说点真话)
不是所有人都更省:月调用量很低时,固定订阅可能更划算;按量计费在调用量大时才显优势。先算自己的量。
延迟与稳定性:多一层网关会多一点延迟,关键路径加超时和降级。
密钥安全:key 放环境变量,别写死在前端或公开仓库。
5. 小结
省 LLM 成本的本质就一句话:让便宜的模型干大多数活,贵的只在必要时出场,再砍掉浪费的 token;把"对接 N 家"变成"改一行 base_url"。路由和缓存是免费的两块砖,先搬起来再说。
有用吗?