LLM 网关错误分类法是区分受控事件和昂贵的重试风暴的关键。网关不应将每次失败的模型调用都视为同一种提供商错误。无效凭据、配额耗尽、提供商过载、格式错误的请求、安全拒绝、超时和客户端取消都需要不同的恢复路径。
常见的错误是将每次失败都发送到相同的重试和回退循环中。这可能会隐藏已吊销的密钥,耗尽支出上限,将不安全的内容路由到其他提供商,或者在流式响应已经开始后重复工作。一个实用的 LLM 网关错误分类法为工程、产品和财务团队提供了一种共享语言,用于描述发生了什么以及网关接下来应该做什么。
Flatkey 符合这种运营模式,因为其当前的公共网站将产品定位为用于模型访问、路由、计费、使用分析和运营控制的单一网关界面。在选择重试、排队、回退或故障关闭行为之前,请使用该共享界面对故障进行分类。
LLM 网关错误分类法一览表
从类别开始,而不仅仅是 HTTP 状态。相同的状态族在不同的提供商、SDK 和端点形态中可能意味着不同的事情。
| 错误类别 | 常见信号 | 重试? | 回退? | 所有者操作 |
|---|---|---|---|---|
| 身份验证和权限 | 401、403、无效密钥、已吊销密钥、项目错误、IP 未授权、权限被拒绝 |
不自动重试 | 否 | 轮换或修复凭据、项目、允许列表或权限 |
| 配额和速率限制 | 429、速率限制、配额耗尽、支出限制、令牌/请求限制、RESOURCE_EXHAUSTED |
有时,采用有界退避或排队 | 仅在批准的成本和质量规则内 | 减少并发、检查使用情况、提高限制或停止支出 |
| 提供商和传输 | 500、503、529、过载、超时、连接重置、SDK 连接错误 |
有时,如果幂等且在截止日期内 | 有时,在部分输出之前且在合同范围内 | 检查提供商状态、路由健康状况、超时预算和重试放大 |
| 请求和验证 | 400、422、格式错误的 JSON、无效模型、不支持的参数、上下文过长 |
否,除非请求被更改 | 很少 | 修复模式、提示大小、端点形态或模型能力 |
| 安全和策略 | 拒绝、审核阻止、提示阻止、finishReason: SAFETY、内容策略错误 |
不自动重试 | 无绕过回退 | 显示安全的用户消息,记录安全上下文,在适当时要求修改输入 |
| 客户端取消和截止日期 | 用户中止、客户端超时、服务器截止日期、断开的流 | 不盲目重试 | 仅当没有输出或副作用被提交时 | 停止工作,标记取消,保留部分输出状态 |
这个 LLM 网关错误分类法是特意面向操作的。它不仅仅是为仪表板标记错误。它决定了系统何时可以花费更多令牌,何时必须要求所有者修复状态,以及何时应该停止。
重试前先分类
官方提供商文档支持区分这些类别。OpenAI 的错误指南区分了无效身份验证、不正确的 API 密钥、IP 允许列表失败、速率限制、配额或计费耗尽、服务器错误、过载、SDK 连接错误、SDK 超时、格式错误的请求、权限拒绝和速率限制异常。其速率限制指南建议使用随机指数退避,但也指出失败的请求仍计入每分钟的限制。
Anthropic 的错误文档区分了 invalid_request_error、authentication_error、permission_error、not_found_error、request_too_large、rate_limit_error、api_error 和 overloaded_error。Anthropic 还记录了带有 retry-after 指南的 429 速率限制,其停止原因指南包括将 refusal 作为模型级别的停止条件。
Gemini 故障排除将身份验证和权限故障与 429 RESOURCE_EXHAUSTED、500 内部错误和 503 不可用分开映射。Gemini 速率限制文档描述了请求、令牌、每日请求和支出维度。Gemini 安全设置还公开了提示阻止、候选 finishReason 和 safetyRatings,包括当响应内容被阻止时的 finishReason 为 SAFETY。
这些证据引出了一条简单的规则:LLM 网关错误分类法应在网关选择操作之前,将特定于提供商的信号规范化为决策字段。
身份验证和权限故障
身份验证和权限故障应立即停止。重试错误的密钥或被禁止的项目通常只会增加噪音,而不会改变结果。
将这些信号规范化为身份验证类别:
| 信号 | 可能的含义 | 网关行为 |
|---|---|---|
401 无效身份验证 |
密钥错误、过期、已撤销、格式不正确或来自错误的项目 | 不重试;提醒密钥所有者 |
401 组织或项目成员资格问题 |
调用者不在所需的组织或项目中 | 不重试;路由到账户所有者 |
401 或 403 IP 允许列表或权限问题 |
请求来自错误的网络或缺少端点访问权限 | 不重试;提供权限证据 |
提供商 authentication_error 或 permission_error |
提供商特定的身份验证或访问拒绝 | 不回退;修复凭据或许可 |
在网关中,身份验证错误应包括 owner_key、credential_id、project_id、provider、endpoint_family、requested_model 和 route_id。避免记录原始密钥。事件应能回答哪个密钥失败、哪个路由尝试了调用以及谁可以修复它。
对于身份验证故障,回退通常是错误的做法。如果团队尚未批准某个提供商,静默切换到另一个提供商可能会绕过采购、数据边界或模型策略。受控的响应应该是明确的故障、所有者警报和修复路径。
配额和速率限制故障
配额和速率限制故障是受模糊重试逻辑影响最严重的类别。一个 429 错误可能意味着突发流量调整、每分钟请求限制、每分钟令牌限制、每日请求限制、月度预算耗尽、预付信用额度耗尽或基于支出的限制。这些情况没有共同的恢复路径。
使用此 LLM 网关错误分类法进行配额决策:
| 配额信号 | 重试路径 | 排队路径 | 停止路径 |
|---|---|---|---|
带有 Retry-After 的 429 |
如果符合工作流截止时间,则遵循该标头 | 将非交互式作业排队,直到重试时间 | 如果等待时间超过截止时间,则停止 |
| 没有等待提示的 429 | 对少量尝试预算使用有上限的抖动退避 | 减少所有者、路由或端点系列的并发性 | 如果重复尝试增加了每分钟的使用量,则停止 |
| 令牌限制维度 | 减少提示、输出、批处理大小或并发性 | 将大型作业排队,并以较小的批次重放 | 如果请求不符合模型或上下文约定,则停止 |
| 支出或信用额度耗尽 | 不要自动重试 | 仅在财务负责人批准充值或增加预算时才排队 | 故障关闭并保留成本证据 |
| 每日/项目配额耗尽 | 不要短循环重试 | 仅在允许的情况下,将批处理作业延迟到重置 | 对面向用户的请求进行故障关闭 |
关键是要区分临时流量调整和预算耗尽。当提供商要求您放慢速度时,退避会有所帮助。当账户没有信用额度或作业不符合可用的令牌预算时,退避则无济于事。
当您需要更深入的重试清单时,请将本节与 Flatkey 的 AI API 重试策略结合使用。在日志中保持重试尝试可见,以便财务和运营部门可以看到重复的令牌支出。
提供商和传输故障
提供商和传输故障与配额故障不同。它们意味着请求可能有效,密钥可能有效,预算可能可用,但路由无法完成调用。
常见信号包括:
| 信号 | 含义 | 网关决策 |
|---|---|---|
500 或提供商 api_error |
提供商端内部错误 | 如果幂等,则短暂重试;如果重复出现,则检查状态 |
503 不可用或过载 |
提供商容量、维护或中断情况 | 在部分输出前回退或回退 |
Anthropic overloaded_error 或 HTTP 529 |
提供商特定的过载 | 视为提供商容量问题,而非客户配额问题 |
| SDK 连接错误 | 网络、代理、TLS、DNS 或防火墙路径失败 | 仅在传输路径可能是瞬时问题时重试 |
| SDK 超时 | 请求超出了超时预算 | 仅在工作流截止时间和幂等性允许的情况下重试 |
| 流式传输断开连接 | 可能已存在部分输出 | 仅在有明确的流策略时才恢复 |
提供商回退在这里可能很有用,但需要一个约定。回退路由必须保留端点形态、工具、结构化输出需求、上下文窗口、数据边界、模型批准和成本上限。如果流式传输已经发出了可见的令牌,更安全的行为通常是停止并显示一个受控的故障,而不是拼接来自另一个路由的输出。
使用流式 AI API 可靠性进行流式特定恢复,并在将提供商错误转变为自动路由更改之前使用模型回退评估。
请求和验证失败
请求和验证失败通常不是提供商事件。它们意味着调用者发送了端点无法处理的内容。
示例包括缺少必填字段、格式错误的 JSON、不支持的参数、错误的端点系列、无效的模型 ID、上下文过长、不支持的工具模式、不兼容的模态,或不符合端点合同的文件/图像/视频输入。
网关应记录以下字段:
| 字段 | 为何重要 |
|---|---|
endpoint_family |
区分 OpenAI 兼容的聊天、响应、消息、Gemini、图像和视频形态 |
requested_model |
识别无效或不支持的模型名称 |
request_schema_version |
显示客户端和网关是否不一致 |
parameter_name |
向工程师指出损坏的字段 |
input_token_estimate |
区分格式错误的输入和上下文溢出 |
client_sdk and sdk_version |
发现迁移和兼容性问题 |
不要重试未更改的验证失败。要么将请求转换为有效形态,要么返回一个面向开发人员的错误,指明要修复的字段。当网关支持多个端点系列时,验证错误尤其重要,因为一个请求可能对一个提供商有效,而对另一个提供商无效。
安全和策略失败
安全和策略失败需要单独分类,因为重试和回退可能会意外削弱防护栏。安全拒绝不是提供商停机。审核阻止不是配额耗尽。被阻止的输出不是持续采样直到网关找到发出违禁内容的路由的理由。
将这些信号规范化为安全类别:
| 信号 | 提供商式证据 | 网关行为 |
|---|---|---|
| 模型拒绝 | OpenAI 结构化输出会暴露拒绝;Anthropic 的停止原因包括 refusal |
提供安全响应,不要通过回退绕过 |
| 审核阻止 | OpenAI 安全文档建议进行审核;图像错误可能会暴露 moderation_blocked |
记录安全类别上下文,并在适当时要求修改输入 |
| 提示阻止 | Gemini 安全设置会暴露 promptFeedback.blockReason |
在发送下游工作之前返回受控消息 |
| 输出阻止 | Gemini 可以返回 finishReason: SAFETY 和安全评级;被阻止的内容不会返回 |
不要盲目重试;记录输出已被阻止 |
| 策略或合规规则 | 特定于应用程序的策略、采购、数据边界、年龄或受监管的工作流规则 | 失败时关闭或路由至人工审核 |
实践规则很简单:LLM 网关错误分类法绝不应将安全问题视为可恢复的提供商中断。只有当回退路由保留相同或更严格的安全策略,并且目标是完成任务的安全版本,而不是绕过阻止时,回退才是可接受的。
规范化的错误记录
一个有用的 LLM 网关错误分类法将特定于提供商的失败转化为一个持久的记录。
| 规范化字段 | 示例值 | 用途 |
|---|---|---|
error_class |
auth, quota, provider, request, safety, cancelled |
驱动运行手册和仪表板分组 |
http_status |
401, 403, 429, 500, 503, 529 |
保留协议信号 |
provider_error_type |
rate_limit_error, overloaded_error, RESOURCE_EXHAUSTED, moderation_blocked |
保留提供商特定的含义 |
provider_error_code |
insufficient_quota, invalid_api_key, SAFETY |
支持精确分支 |
retry_after_ms |
从标头派生的延迟或 null | 防止猜测重试时机 |
retryable |
true or false |
将代码策略与 UI 措辞分开 |
fallback_allowed |
true or false |
强制执行路由合约 |
fail_closed_reason |
quota_exhausted, safety_block, contract_mismatch |
解释网关停止的原因 |
requested_model and served_model |
模型 ID 或别名 | 显示路由是否改变了行为 |
endpoint_family |
openai, anthropic, gemini, image-generation |
使迁移问题可见 |
partial_output_committed |
true or false |
防止重复的用户可见输出 |
usage_units and estimated_cost |
令牌、图像、秒、美元 | 使重试成本可见 |
request_id and provider_request_id |
网关和提供商 ID | 支持支持工单和事件审查 |
不要将此记录简化为单个字符串,例如“LLM 调用失败”。该字符串不足以决定是轮换密钥、等待、充值、回退、修改提示还是停止。
一个简单的 TypeScript 分类器
分类器不需要在第一天就了解每个提供商的详细信息。从明确的存储桶和保守失败的默认值开始。
type ErrorClass =
| "auth"
| "quota"
| "provider"
| "request"
| "safety"
| "cancelled"
| "unknown";
type GatewayErrorInput = {
httpStatus?: number;
providerErrorType?: string;
providerErrorCode?: string;
finishReason?: string;
stopReason?: string;
clientCancelled?: boolean;
timeout?: boolean;
};
function classifyGatewayError(error: GatewayErrorInput): ErrorClass {
const type = (error.providerErrorType || "").toLowerCase();
const code = (error.providerErrorCode || "").toLowerCase();
const stop = (error.stopReason || "").toLowerCase();
const finish = (error.finishReason || "").toLowerCase();
if (error.clientCancelled) return "cancelled";
if (error.httpStatus === 401 || error.httpStatus === 403) return "auth";
if (type.includes("auth") || type.includes("permission")) return "auth";
if (code.includes("invalid_api_key") || code.includes("ip_not_authorized")) {
return "auth";
}
if (error.httpStatus === 429) return "quota";
if (type.includes("rate_limit") || code.includes("quota")) return "quota";
if (code.includes("resource_exhausted")) return "quota";
if (stop === "refusal" || finish === "safety") return "safety";
if (code.includes("moderation") || code.includes("blocked")) return "safety";
if (error.httpStatus === 400 || error.httpStatus === 422) return "request";
if (type.includes("invalid_request") || type.includes("bad_request")) {
return "request";
}
if (error.timeout) return "provider";
if ([500, 502, 503, 504, 529].includes(error.httpStatus || 0)) {
return "provider";
}
if (type.includes("overloaded") || type.includes("api_error")) {
return "provider";
}
return "unknown";
}
仅将此用作起点。生产分类器应将提供商特定的映射保留在配置、测试装置和事件审查中,而不是仅埋藏在应用程序代码中。
运行手册:重试、排队、回退或故障关闭
一旦类别已知,网关就可以选择操作。
| 类别 | 默认操作 | 重试条件 | 回退条件 | 故障关闭条件 |
|---|---|---|---|---|
| 身份验证 | 停止并提醒所有者 | 无,除非刚刚发生了凭据刷新 | 无 | 始终如此,直到密钥或权限修复为止 |
| 配额 | 根据限制维度进行退避、排队或停止 | 临时速率限制符合截止日期和尝试预算 | 经批准的路由可保持成本、质量和数据边界 | 支出、信用、每日配额或截止日期已超出 |
| 提供商 | 退避或绕过瞬时提供商故障 | 幂等调用,无部分输出,截止日期仍然有效 | 存在等效的经批准路由 | 重复失败、部分输出或高风险工作流 |
| 请求 | 返回面向开发者的验证错误 | 仅在请求变更后 | 仅当明确选择了兼容的端点/模型时 | 无效的模式、上下文溢出、不支持的功能 |
| 安全 | 返回安全响应或要求修改 | 对于未更改的内容则无 | 仅在使用相同或更严格的策略时,绝不用于绕过 | 提示/输出被阻止、拒绝、合规规则 |
| 已取消 | 停止工作并保留状态 | 无 | 仅当用户明确重启时 | 用户中止、截止日期、客户端断开连接 |
此表是 LLM 网关错误分类法的操作中心。它告诉网关何时可以安全地执行更多工作,以及何时更多工作会带来风险。
如何在 Flatkey 中应用此分类法
将此分类法用作发布清单,而不是一次性的仪表板项目。
- 选择一个工作流,例如支持聊天、批量提取、评估作业或代码助手流量。
- 为该工作流定义允许的端点系列、模型、回退路由和成本上限。
- 将提供商错误规范化为上述字段。
- 使身份验证和权限故障对所有者可见且不可重试。
- 将临时速率限制与配额、支出和每日限额耗尽分开。
- 在更改提供商或模型之前,需要签订回退合同。
- 将安全拒绝和审核视为策略结果,而不是提供商中断。
- 在任何重试或回退之前记录部分输出状态。
- 在扩展到更多工作流之前,在 Flatkey 中审查使用情况和路由证据。
- 将运行手册链接到 Flatkey 定价,以便操作员可以验证当前目录和成本概况。
Flatkey 于 2026 年 7 月 3 日的公开定价 API 快照返回了 45 个模型行、6 个供应商 ID,并支持包括 openai、anthropic、gemini 和 image-generation 在内的端点系列。请仅将这些视为过时的源事实。在生产发布前,应重新检查模型的可用性、价格和路由行为。
常见问题解答
什么是 LLM 网关错误分类法?
LLM 网关错误分类法是针对模型-提供商流量的一组规范化故障类别。它区分了身份验证、配额、提供商、请求、安全和取消故障,以便网关可以选择重试、排队、回退或故障关闭行为。
为什么不重试每个 LLM API 错误?
重试每个错误可能会使事件恶化。它可能会放大速率限制,在配额耗尽后花费更多令牌,隐藏凭据失败,复制部分输出,或绕过安全阻止。该分类法决定了何时才真正允许重试。
安全拒绝是否应触发回退?
默认情况下不应触发。安全拒绝、审核阻止、提示阻止和 finishReason: SAFETY 应被视为策略结果。绝不应使用回退来寻找更弱的安全路由。
LLM 网关应如何对配额故障进行分类?
将临时速率调整与耗尽的支出、预付信用、每日限制、令牌限制和项目限制分开。临时调整可以使用有界退避或队列。耗尽的预算通常会故障关闭,直到所有者批准更多容量。
Flatkey 如何帮助实现 LLM 网关错误分类法?
Flatkey 为团队提供了一个统一的网关界面,用于模型访问、路由、计费、使用分析和操作控制。使用它来将规范化的错误类别与所有者密钥、端点系列、请求的模型、服务的模型和使用证据联系起来。
从一个工作流开始,定义您的 LLM 网关错误分类法,然后获取密钥,并在生产流量依赖自动恢复之前测试身份验证、配额、提供商、请求、安全和取消情况。



