我如何在10分钟内为我的 OpenAI 应用添加 LLM fallback

发布: (2026年5月3日 GMT+8 19:24)
6 分钟阅读
原文: Dev.to

Source: Dev.to

Jay

你在 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/cheapGroq → DeepSeek → Together → Sarvam → OpenAI高流量、成本敏感、质量可灵活调节
ib/balancedOpenAI → Sarvam → Anthropic大多数生产应用的默认选择
ib/premiumAnthropic → 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_error504 gateway_timeout

免费获得的可观测性

每个请求都会被记录。两个端点让你无需仪表盘即可获取可视化:

# 聚合统计
GET /v1/stats
# → 总计、cache_hit_rate、按 provider/mode/status 的细分

# 分页请求日志
GET /v1/logs
# → 每个请求:provider、model、cost_usd、latency_ms、status、request_id

status 可以是 successfallback_successcache_hiterror。过滤 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 —— 该邮箱真实可收邮件。

0 浏览
Back to Blog

相关文章

阅读更多 »

让客户交接轻松的文件夹结构

每家机构都有这样一个版本的故事:团队成员离职、客户升级,或者你在替病假的同事顶班——于是你花了20分钟去搜索……