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のレート制限ドキュメントは、リクエスト、トークン、1日あたりのリクエスト、および支出のディメンションについて説明しています。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は、バーストのペーシング、1分あたりのリクエスト制限、1分あたりのトークン制限、1日あたりのリクエスト制限、月間予算の枯渇、プリペイドクレジットの枯渇、または支出ベースの制限を意味する場合があります。これらのケースは、単一の回復パスを共有しません。
クォータの決定には、このLLMゲートウェイのエラー分類を使用してください。
| クォータシグナル | 再試行パス | キューパス | 停止パス |
|---|---|---|---|
Retry-After を伴う429 |
ワークフローの期限に間に合う場合はヘッダーを尊重する | 非対話型ジョブを再試行時間までキューに入れる | 待機時間が期限を超える場合は停止する |
| 待機ヒントのない429 | 少ない試行バジェットに対して、上限付きのジッター付きバックオフを使用する | 所有者、ルート、またはエンドポイントファミリーの同時実行性を減らす | 繰り返しの試行が1分あたりの使用量を増加させる場合は停止する |
| トークン制限の次元 | プロンプト、出力、バッチサイズ、または同時実行性を減らす | 大規模なジョブをキューに入れ、より小さなバッチで再実行する | リクエストがモデルまたはコンテキストの契約に収まらない場合は停止する |
| 支出またはクレジットの枯渇 | 自動的に再試行しない | 財務担当者が再チャージまたは予算増額を承認した場合にのみキューに入れる | フェイルクローズし、コストの証拠を保持する |
| 日次/プロジェクトのクォータ枯渇 | 短いループでの再試行はしない | 許可されている場合にのみ、リセットされるまでバッチジョブを遅延させる | ユーザー向けのリクエストはフェイルクローズする |
重要なのは、一時的なペーシングと枯渇した予算を区別することです。バックオフは、プロバイダーが速度を落とすように要求している場合に役立ちます。アカウントにクレジットがない場合や、ジョブが利用可能なトークンバジェットに収まらない場合、バックオフは役に立ちません。
より詳細な再試行チェックリストが必要な場合は、このセクションを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 と sdk_version |
移行と互換性の問題を検出します |
変更されていない検証の失敗を再試行しないでください。リクエストを有効な形に変換するか、修正すべきフィールド名を指定した開発者向けのエラーを返してください。ゲートウェイが複数のエンドポイントファミリーをサポートする場合、あるプロバイダーにとっては有効なリクエストが別のプロバイダーにとっては無効である可能性があるため、検証エラーは特に重要です。
安全性とポリシーの失敗
安全性とポリシーの失敗は、再試行とフォールバックが誤ってガードレールを弱める可能性があるため、独自のクラスが必要です。安全性の拒否はプロバイダーのダウンタイムではありません。モデレーションによるブロックはクォータの枯渇ではありません。ブロックされた出力は、ゲートウェイが禁止されたコンテンツを出力するルートを見つけるまでサンプリングを続ける理由にはなりません。
これらのシグナルを安全性クラスに正規化します。
| シグナル | プロバイダースタイルの証拠 | ゲートウェイの動作 |
|---|---|---|
| モデルの拒否 | OpenAIの構造化出力は拒否を公開します。Anthropicの停止理由にはrefusalが含まれます |
安全な応答を提示し、フォールバックでバイパスしない |
| モデレーションによるブロック | OpenAIの安全性に関するドキュメントはモデレーションを推奨しています。画像エラーはmoderation_blockedを公開する場合があります |
安全なカテゴリのコンテキストをログに記録し、必要に応じて修正された入力を要求する |
| プロンプトのブロック | Geminiの安全性設定はpromptFeedback.blockReasonを公開します |
下流の作業を送信する前に制御されたメッセージを返す |
| 出力のブロック | GeminiはfinishReason: SAFETYと安全性評価を返すことがあります。ブロックされたコンテンツは返されません |
むやみに再試行せず、出力がブロックされたことをログに記録する |
| ポリシーまたはコンプライアンスルール | アプリケーション固有のポリシー、調達、データ境界、年齢、または規制されたワークフローのルール | フェイルクローズするか、人間によるレビューにルーティングする |
実践的なルールは単純です。LLMゲートウェイのエラー分類では、安全性を回復可能なプロバイダーの停止として扱うべきではありません。フォールバックが許容されるのは、フォールバック ルートが同じかそれ以上の厳格な安全ポリシーを維持し、その目標がブロックをバイパスすることではなく、タスクの安全なバージョンを完了することである場合に限られます。
正規化されたエラーレコード
有用なLLMゲートウェイのエラー分類は、プロバイダー固有の障害を1つの永続的なレコードに変換します。
| 正規化されたフィールド | 値の例 | 用途 |
|---|---|---|
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での適用方法
この分類を、一度きりのダッシュボードプロジェクトとしてではなく、ロールアウトのチェックリストとして使用してください。
- サポートチャット、バッチ抽出、評価ジョブ、コードアシスタントのトラフィックなど、1つのワークフローを選択します。
- そのワークフローで許可されるエンドポイントファミリー、モデル、フォールバックルート、コスト上限を定義します。
- プロバイダーのエラーを上記のフィールドに正規化します。
- 認証と権限の障害を所有者に可視化し、再試行不可にします。
- 一時的なレート制限を、クォータ、支出、日次制限の枯渇から分離します。
- プロバイダーやモデルを変更する前に、フォールバック契約を要求します。
- 安全性の拒否とモデレーションを、プロバイダーの停止ではなく、ポリシーの結果として扱います。
- 再試行やフォールバックの前に、部分的な出力の状態をログに記録します。
- より多くのワークフローに展開する前に、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は、モデルアクセス、ルーティング、請求、使用状況分析、運用管理のための単一のゲートウェイサーフェスをチームに提供します。これを使用して、正規化されたエラークラスを所有者のキー、エンドポイントファミリー、リクエストされたモデル、提供されたモデル、および使用状況の証拠に関連付け続けることができます。
まず1つのワークフローから始め、LLMゲートウェイのエラー分類を定義し、次にキーを取得して、本番トラフィックが自動回復に依存する前に、認証、クォータ、プロバイダー、リクエスト、安全性、キャンセルのケースをテストしてください。



