我如何在10分钟内为我的 OpenAI 应用添加 LLM fallback
Source: Dev.to
你在 OpenAI 上运行着一个生产应用。某个星期二早上,它宕机了。你的应用返回 500 错误。你花了一个小时刷新 status.openai.com。
有更好的方案。下面介绍如何在任何 OpenAI‑SDK 应用中添加提供商回退,而无需重写任何代码。
单供应商设置的问题
当你直接调用 OpenAI 时,只有一个故障点:
from openai import OpenAI
client = OpenAI(api_key="sk-...")
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Summarise this text..."}],
)
如果 OpenAI 返回 500 或 429 错误,你的用户会看到错误。你没有后备方案,无法了解到底是哪一步出了问题,也没有简便的方式在不需要 GPT‑4 质量时切换到更便宜的供应商。
修复方案:两行代码加一个网关
InferBridge 是一个兼容 OpenAI 的 API 网关。你只需把 OpenAI SDK 指向它,而不是直接指向 OpenAI。它负责路由、回退以及每个请求的可观测性——无需改动你的应用逻辑。
步骤 1:获取 InferBridge 密钥(仅需执行一次)
# 创建账户 —— 只会返回一次你的 InferBridge 密钥,请妥善保存。
curl -X POST https://api.inferbridge.dev/v1/users \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com"}'
# {"api_key": "ib_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", ...}
步骤 2:注册你已有的 OpenAI 密钥
curl -X POST https://api.inferbridge.dev/v1/keys \
-H 'Authorization: Bearer ib_xxx...' \
-H 'Content-Type: application/json' \
-d '{"provider":"openai","api_key":"sk-..."}'
你的密钥在静止时会使用 Fernet 加密。InferBridge 从不记录请求内容,也不会对推理结果进行标记——你的密钥会直接发送给提供商。
步骤 3:在你的应用中修改两行代码
from openai import OpenAI
client = OpenAI(
api_key="ib_xxx...", # ← 原来是 sk-...
base_url="https://api.inferbridge.dev/v1", # ← 新地址
)
resp = client.chat.completions.create(
model="ib/balanced", # ← 原来是 "gpt-4o-mini"
messages=[{"role": "user", "content": "Summarise this text..."}],
)
就这样。你的应用现在具备了回退机制。
实际路由层级的作用
| 层级 | 链路 | 使用场景 |
|---|---|---|
ib/cheap | Groq → DeepSeek → Together → Sarvam → OpenAI | 高流量、成本敏感、质量可灵活调节 |
ib/balanced | OpenAI → Sarvam → Anthropic | 大多数生产应用的默认选择 |
ib/premium | Anthropic → OpenAI | 复杂推理、质量关键 |
路由器会将层级与您已注册的提供商密钥进行交叉匹配。因此,如果您只有 OpenAI 密钥,ib/cheap 会路由到 OpenAI。注册一个 Groq 密钥(提供免费层),相同的请求代码现在会首先命中 Groq —— 无需更改代码。
实际中的回退示例
OpenAI 在 ib/balanced 模式下返回 500 对你的应用是不可见的。你会收到一个正常的 200 响应,内容保持 OpenAI 的标准格式。唯一的提示在于响应体中附加的 inferbridge 区块:
{
"id": "chatcmpl-...",
"choices": [...],
"usage": {...},
"inferbridge": {
"provider": "anthropic",
"model": "claude-3-5-haiku-20241022",
"mode": "ib/balanced",
"cache_hit": false,
"latency_ms": 834,
"cost_usd": "0.000041",
"residency_actual": "global",
"request_id": "abc123"
}
}
provider: "anthropic" 表明 OpenAI 失败,已由 Anthropic 处理请求。你的应用代码没有任何变化,用户也没有感知到任何异常。
如果链路中的每个候选者都失败,你会得到一个干净的错误:
- 所有 429 →
429 rate_limit_error并带有Retry-After响应头 - 混合的 5xx/超时 →
502 provider_error或504 gateway_timeout
免费获得的可观测性
每个请求都会被记录。两个端点让你无需仪表盘即可获取可视化:
# 聚合统计
GET /v1/stats
# → 总计、cache_hit_rate、按 provider/mode/status 的细分
# 分页请求日志
GET /v1/logs
# → 每个请求:provider、model、cost_usd、latency_ms、status、request_id
status 可以是 success、fallback_success、cache_hit 或 error。过滤 fallback_success 可精确查看主提供商何时以及多频繁出现失败。
可选:为重复提示添加缓存
对于确定性的提示(分类、抽取、模板查询),您可以通过一个请求头启用精确匹配缓存:
resp = client.chat.completions.create(
model="ib/balanced",
messages=[...],
extra_headers={
"X-InferBridge-Cache": "true",
"X-InferBridge-Cache-TTL": "3600", # seconds
}
)
缓存键是对 provider + model + messages + determinism 参数进行 SHA‑256 计算。缓存命中时,在 inferbridge 区块中返回 cache_hit: true,且不消耗 token。
仍未构建的功能(请对自己诚实)
InferBridge 仍处于早期阶段。在采用之前,请了解以下不足:
- 没有仪表盘 UI — 可观测性仅限于 JSON 接口
- 流式请求绕过缓存
- 没有 embeddings 接口
- 不支持视觉输入
- 不支持流式工具使用 / 函数调用
如果这些是您使用场景的阻碍,您可能需要等待或自行实现变通方案。否则,尝试使用 InferBridge,享受在最少代码改动下的弹性 LLM 路由。
在这种情况下,它还不适合。
试用
- 免费层提供无限 BYOK。无需信用卡。
文档: inferbridge.dev/docs
迁移指南: inferbridge.dev/docs/migration-from-openai
如果遇到任何问题或困惑,请发送邮件至 hello@inferbridge.dev —— 该邮箱真实可收邮件。
