Gemini 官方故障排查文档把 429 与 503 列为典型的可重试错误,并建议使用指数退避、抖动和最大重试次数;这已经说明,多模型接入不能只做一个“转发接口”。(ai.google.dev)
结论先说:你应该在业务应用与 OpenAI、Claude、Gemini 之间建立稳定的内部 LLM Gateway 契约,统一模型别名、鉴权、超时、重试、预算和日志;但不能为了统一请求格式,就隐藏工具调用、流式输出、结构化结果和数据政策上的真实差异。
这篇文章适合维护多模型应用的后端工程师、负责企业模型接入与密钥治理的平台团队,以及准备部署高可用 LLM Gateway 的 DevOps 和架构负责人。如果你只调用一个供应商、没有多租户和预算控制需求,直接使用官方 SDK 往往更简单。
第一步:先盘点,再统一管理 OpenAI Claude Gemini API
在写网关适配器之前,先把业务真正使用的能力列出来。不要只记录“文本生成”,还要拆分为普通文本、图片输入、工具调用、结构化输出、上下文延续和流式响应。
OpenAI 的 Responses API 以事件流表达输出、工具调用和错误状态;Gemini 同时提供普通生成与基于 Server-Sent Events 的流式生成;Claude 的 Messages API 则通过内容块和 stop_reason 表达文本、工具调用或达到输出上限等状态。三者都能完成“聊天”,但返回结构并不相同。(platform.openai.com)
| 业务能力 | OpenAI | Claude | Gemini | 网关处理建议 |
|---|---|---|---|---|
| 普通文本 | 响应对象与输出项 | 消息与内容块 | 候选内容与 parts | 统一为内部 output_text,保留原始响应 |
| 流式输出 | 事件类型较多 | 事件中包含消息与内容增量 | SSE 推送生成结果 | 内部统一增量事件,不要直接拼接字符串 |
| 工具调用 | 工具调用输出项 | tool_use 内容块与 stop_reason |
functionCall、functionResponse parts |
统一工具名称、参数和调用 ID |
| 结构化输出 | 可使用 JSON Schema | 需要按工具或约束方式设计 | 受支持 Schema 子集限制 | 设置能力标记,失败时禁止静默降级 |
| 多模态输入 | 由输入项类型表达 | 支持图像等内容块 | 由 contents 与 parts 表达 | 使用显式媒体对象,不把图片强转成文本 |
如果业务要让多个大模型共用一个调用入口,接口应该怎么设计?
答案不是把所有参数改成同一个字段,而是定义“共同核心字段 + 供应商扩展字段”。共同核心可以包括 messages、model_alias、stream、tools、timeout_ms、trace_id 和 tenant_id;供应商专属能力则放在 provider_options 中,并在网关侧记录是否被实际接受。
例如,业务应用只调用内部别名 reasoning_primary,由网关映射到某个经过验收的模型版本。这样业务代码不会直接绑定供应商模型名,也不会因为模型下线或别名变化而全线修改。
第二步:把差异写进契约,而不是藏在适配器里
统一接口最容易犯的错误,是把所有供应商响应都压缩成:
{
"text": "最终文本",
"usage": {}
}
这个结构对简单问答够用,但一旦出现工具调用、拒答、截断、流式中断或内容过滤,你就无法判断下一步动作。建议内部响应至少保留以下层次:
{
"request_id": "req_placeholder_001",
"trace_id": "trace_placeholder_001",
"model_alias": "reasoning_primary",
"provider": "provider_placeholder",
"status": "completed",
"output": [],
"usage": {},
"finish_reason": "stop",
"provider_response": {}
}
其中 provider_response 不能直接暴露给业务逻辑,但应在受控日志或调试存储中保留。OpenAI 的流式响应会发出明确事件类型和错误事件;Claude 需要区分成功响应里的 stop_reason 与真正的 HTTP 错误;Gemini 的函数调用返回值位于内容 parts 中,不能假定某个位置一定是函数调用。(platform.openai.com)
不同供应商的错误信息放进同一套内部格式时,应该保留哪些层次?
可以统一错误分类,不能统一成完全相同的原始错误。建议内部错误模型包含:
category:鉴权、参数、限流、超时、供应商故障、内容策略;retryable:是否允许自动重试;http_status:网关对业务返回的状态;provider_code:供应商原始错误码;safe_message:可返回给终端用户的脱敏信息;trace_id:用于日志检索和人工排障。
例如,OpenAI、Claude、Gemini 返回的参数错误都可以归到 invalid_request,但原始字段名、错误消息和触发条件仍应保留,否则你无法定位是哪一个适配器丢失了参数。
⚠️ 注意:如果某个供应商不支持你传入的结构化输出或工具参数,网关必须明确返回“不支持”,而不是删除字段后继续请求。静默丢参会让测试通过,却让生产结果变得不可解释。
第三步:把密钥、身份与租户边界放在网关侧
应用服务不应该持有 OpenAI、Claude、Gemini 的供应商密钥。应用只拿内部凭据访问网关,网关再根据环境、租户、项目和模型别名选择对应密钥。
密钥管理至少需要分为四层:
- 存储层:密钥放在专用密钥存储中,配置文件和代码仓库只出现明显占位符,例如
PROVIDER_API_KEY_PLACEHOLDER。 - 权限层:开发、测试、生产使用不同凭据;普通服务账号不能读取管理接口。
- 租户层:每个用户、项目或部门都要有可追踪的
tenant_id,不能只按 IP 统计。 - 轮换层:支持新增密钥、灰度验证、切换主密钥、撤销旧密钥,而不是停机修改环境变量。
OpenAI 官方数据控制文档明确区分了 API 数据使用与滥用监控日志,并说明部分日志可能包含请求内容及其元数据;因此,网关日志不能默认保存完整提示词和响应。(platform.openai.com)
网关侧的 API Key 应该如何保存、授权和轮换?
推荐采用“应用凭据与供应商凭据分离”的模式。应用凭据只证明它有权调用某个内部模型别名,真正的供应商密钥、区域配置、请求头和轮换状态都由网关控制。
日志中可保留密钥指纹的前后几位用于排障,但不要记录完整密钥、授权请求头、用户隐私内容和未脱敏的工具参数。对管理接口则应单独配置更严格的身份验证、审计日志和网络访问控制。
第四步:先确定性路由,再加入故障回退
上线初期不要一开始就做复杂的智能路由。先用稳定映射:
fast_text → 已验收的快速文本模型
reasoning_main → 已验收的推理模型
vision_main → 已验收的多模态模型
这样你能先验证契约、预算和日志是否正确,再根据真实流量增加按租户、任务类型、延迟或成本的策略路由。
路由表建议包含以下字段:
| 字段 | 用途 | 失败时的处理 |
|---|---|---|
model_alias |
业务使用的稳定名称 | 不允许业务直接传供应商模型名 |
provider |
当前供应商 | 记录实际命中对象 |
capabilities |
文本、工具、图像、流式等能力 | 能力不匹配时禁止路由 |
priority |
主路由与备用路由顺序 | 只在允许回退的错误下切换 |
timeout_ms |
单请求最大等待时间 | 超时后进入有限重试 |
budget_policy |
租户与项目预算规则 | 超预算立即拒绝或降级 |
主路由出错后,什么情况下可以自动切到备用模型?
可以,但必须先判断失败类型。鉴权失败、参数错误、工具 Schema 不兼容和内容策略拒绝,不应该自动切换后重复发送;限流、网络超时和部分供应商 5xx 错误,才可能进入有限回退。
自动切换还要考虑幂等性。普通文本请求通常可以在服务端生成新的请求 ID 后重试;但如果模型已经触发外部工具、付款、写数据库或发送消息,重复执行可能造成副作用。工具调用必须先进入幂等执行层,再决定是否允许回退。
Gemini 官方文档建议仅对临时错误使用指数退避,并明确提醒不要对 400、403 等客户端错误重试;其 Python SDK 文档还提到,特定临时错误可能会自动重试,因此网关外层不能再无条件叠加大量重试。(ai.google.dev)
第五步:把预算、限流和观测做成同一条链路
预算控制不能只看月度总账。你至少要同时记录供应商、模型别名、租户、项目、请求状态、首字节延迟、总延迟、输入用量、输出用量、重试次数和最终路由。
| 控制项 | 建议记录 | 触发动作 |
|---|---|---|
| 请求级 | trace_id、模型、租户、状态、延迟 |
单次超时、错误告警 |
| 租户级 | 用量、失败率、预算消耗 | 限流、暂停或切换低成本策略 |
| 项目级 | 日用量、月用量、模型分布 | 预算预警与负责人通知 |
| 供应商级 | 429、5xx、平均延迟、回退率 | 调整路由权重或暂停供应商 |
| 内容级 | 脱敏后的提示词摘要、响应摘要 | 排查质量问题,不保存完整敏感内容 |
预算策略最好分为“提醒、软限制、硬限制”三档。提醒用于提前通知,软限制可以转向指定的备用模型,硬限制则拒绝请求并返回明确的预算错误。不要把预算限制写成供应商密钥失效,否则运营人员会误以为是鉴权故障。
AI Gateway 的价值也不只是隐藏 API Key。它还应该让你回答:哪个租户消耗最多、哪类请求最常超时、回退后质量是否下降、某个模型别名是否已经长期命中备用路由。
第六步:用固定测试集完成企业 AI Gateway 上线验收
上线前不要只发送一条“你好”来验证接口。你需要准备一组固定测试用例,并把结果保存为可比较的验收记录。
| 验收场景 | 必须检查 | 不通过时的处理 |
|---|---|---|
| 普通文本 | 内容完整、状态正确、用量可记录 | 修复响应映射 |
| 流式输出 | 增量顺序、结束事件、异常中断 | 修复事件转换器 |
| 工具调用 | 工具名、参数、调用 ID、结果回传 | 暂停该能力路由 |
| 结构化输出 | Schema 校验、空字段、截断行为 | 使用专属适配器 |
| 限流与超时 | 是否有限重试、是否出现重试风暴 | 调整退避与熔断 |
| 供应商不可用 | 是否按策略回退、是否保留原因 | 检查能力匹配 |
| 数据脱敏 | 密钥、隐私内容、工具参数是否泄露 | 立即停止日志采集 |
Claude 的工具调用流程需要读取 tool_use 内容块并回传工具结果;Gemini 的函数调用解析不能依赖 parts 的固定位置;OpenAI 的流式事件也不能只读取文本增量,否则工具调用和错误事件会被遗漏。(docs.anthropic.com)
建议至少完成一次供应商不可用演练:先让主路由返回可识别的临时错误,再观察网关是否切换到备用路由、是否重复执行工具、是否产生多条计费请求,以及最终响应是否仍符合业务质量要求。
用条件分支决定你的网关复杂度
不要因为“多模型”三个字就立刻建设一套过度复杂的平台。你可以按下面的条件做选择:
- 若只有一个应用、一个团队、一个供应商,则先使用官方 SDK 加统一配置层;否则再部署完整 LLM Gateway。
- 若需要同时管理 OpenAI、Claude、Gemini 的密钥、预算和日志,则把网关放在应用与供应商之间,而不是在每个业务服务里复制适配逻辑。
- 若业务包含工具调用或外部写操作,则优先建设调用 ID、幂等键和人工审计;否则自动回退可能带来重复副作用。
- 若不同模型的能力差异会影响业务结果,则使用能力标签和显式扩展字段;否则才可以采用更简单的统一文本接口。
- 若主要问题是突发流量与限流,则先做超时、退避、熔断和预算硬限制;不要先做复杂的模型评分路由。
- 若主要问题是模型升级风险,则使用模型别名、灰度比例和固定回归集;不要让业务代码直接追踪供应商最新模型名。
上线后:用别名和灰度控制供应商变化
供应商会新增模型、调整参数、废弃端点或改变错误语义。你的业务服务不应该直接追随这些变化,网关应维护一份版本化的模型注册表。
每次升级至少完成四件事:
- 为新模型创建独立内部别名,不直接覆盖现有别名。
- 使用固定测试集验证文本、工具、流式和结构化输出。
- 通过少量租户或少量流量进行灰度,比较延迟、失败率、用量和质量。
- 保留回滚目标,并记录变更时间、负责人和复核过的官方文档。
你还应定期审查已撤销密钥、长期未使用的端点、异常高的回退率、日志保留策略和没有业务归属的租户。官方文档是唯一可靠的参数来源:OpenAI 的 Responses API、Anthropic 的 Messages 与工具调用文档,以及 Gemini API 的生成、流式和故障排查文档,都应纳入你的变更复核流程。(platform.openai.com)
如果你要把部署、权限或远程环境问题拆开处理,可以先查看 ZavCloud 帮助中心,再根据测试周期了解 Mac 云租用方案 是否适合你的验证流程。
当前服务器方案与 Mac 方案,应该怎么选
如果你现在是在个人电脑或临时 Windows/Linux 服务器上直接运行网关,常见缺点是密钥散落在环境变量和脚本中、长时间运行后的日志与进程管理不稳定,以及团队成员无法获得一致的访问入口;如果使用一次性云主机,还要额外处理网络白名单、端口暴露、磁盘清理和故障后的环境重建。
对于需要短期验证多供应商 API、测试远程开发链路或运行一套临时网关的场景,租赁 ZavCloud 的 Mac 环境通常比临时拼装个人设备更容易保持系统、访问方式和交付记录的一致性。若你要长期承载稳定的高并发生产流量,或者依赖专用网络设备、物理接口和固定硬件,仍应优先采用自有基础设施;但在测试周期、上线验收和持续时间尚未确定时,先用可回收的 Mac 算力验证方案,往往更符合成本与运维风险的平衡。
ZavCloud Developer Infrastructure
为你的 LLM Gateway 准备稳定的远程 Mac 环境
使用 ZavCloud Mac 云租用,快速获得可远程访问的 Mac 资源,适合部署网关服务、运行开发工具和管理多供应商 API。
按需选择合适的配置与套餐,无需购买和维护实体设备,更灵活地控制基础设施成本。