LiteLLMのエラーを切り分ける|Gateway・Providerとfallback履歴

LiteLLM経由のLLM APIエラーを、message・type・ヘッダーとcall IDから切り分ける方法。429の予算・制限・ルーティング、fallback全失敗時のステータスを整理します。

AIものさし編集部

LiteLLM経由のLLM呼び出しが失敗したら、再試行を増やす前に、ゲートウェイ側で止まったのか、接続先プロバイダーのエラーを返しているのかを確認します。HTTP 429や401だけでは、直すべき設定や担当者は決まりません。応答本文とヘッダーを同じ要求に結び付けるところから始めます。

この記事は、公式資料に基づくLiteLLM AI Gatewayの通常のLLM APIルートに対する診断手順です。非ストリーミングのエラー応答を対象とし、Python SDK単体や管理API、配信途中のエラーは扱いません。実API・認証・課金の操作検証は行っていません。以下のログ断片と担当分けは架空例です。

最初に失敗一件の情報を揃える

利用者の「AIが動かない」という報告だけでは、アプリの入力、接続先、LiteLLM、プロバイダーのどこを調べるか決められません。失敗した要求の時刻と呼び出し先を確認し、次を一組で残します。

表は横にスクロールできます

項目記録するもの
対象環境、要求したモデル名、APIルート、LiteLLMの利用版
HTTP実際のステータス、応答のContent-Type
本文errorのmessage・type・param・code。存在しない項目は欠落として記録
ヘッダーx-litellm-call-id、待機や制限の情報があればその値
アプリ側SDK、再試行設定、同じ業務要求を識別する内部ID

APIキー、Authorization、顧客の質問全文は、この確認表へ貼りません。エラーメッセージ自体にキーの一部や組織情報が含まれる場合もあるため、共有前に内容を見ます。原記録を参照できる場所と、担当者へ渡す抜粋を分けてください。

error.typeだけで発生元を決めない

公式Error Referenceは、LLM APIルートのエラーをトップレベルの error オブジェクトで説明しています。type は大まかな分類で、プロバイダー由来ではnullの場合もあります。code は文字列で、HTTPステータスと同じ値とは限りません。本文の一項目だけを数値へ変換して判定せず、実際のHTTPステータスも保持します。

x-litellm-call-id があれば、ゲートウェイのログと応答を結び付ける手掛かりになります。認証の早い段階など、IDが付かない場合もあるため、欠落だけをログ障害の証拠にはしません。LiteLLM:Error Reference(新しいタブで開く)

messageの内側にあるプロバイダー名を読む

公式の診断資料は、messageに含まれる OpenAIException、AnthropicException、BedrockException などをプロバイダー由来の手掛かりとして示しています。先頭にLiteLLMの例外名が付いていることだけで、LiteLLM内部の不具合と判断しないでください。

たとえば次は形式を説明する架空の断片です。実際の応答を再現したものではありません。

HTTP 429
error.message:
  litellm.RateLimitError: ... OpenAIException - Rate limit reached ...

この形なら、まずプロバイダー側の制限に対応する記録を調べる方向です。「LiteLLM経由だからLiteLLMの予算上限」とは決めません。

逆に、公式はプロバイダー名のないLiteLLMの auth_error をゲートウェイの仮想キーに関する例として示しています。アプリがLiteLLMへ渡すキーと、ゲートウェイがプロバイダーへ使う資格情報は別の確認対象です。LiteLLM:Diagnosing Errors(新しいタブで開く)

ただし、共有用ログでmessageの途中を省いていたり、前段のプロキシが本文を書き換えていたりする場合、見えていない名前を「存在しない」とは言えません。分類に必要な記録が欠けるときは発生元未確定として残し、許可されたログから確認します。

429は予算・要求量・ルーティングを分ける

同じ429でも、ゲートウェイの予算上限、送信量の制限、候補デプロイメントの状態では、確認先が違います。公式は budget_exceeded、制限関連ヘッダー、No deployments available for selected model というルーティングのmessageを区別しています。throttling_error はプロバイダー由来でも使われるため、そのtypeだけでは分けられません。

次は架空の記録を整理した例です。表の情報がそのまま実環境の原因を証明するわけではありません。

表は横にスクロールできます

ケース観測した断片次に調べるもの
A429、budget_exceeded、予算超過のmessage対象キーやチーム等の予算管理範囲
B429、throttling_error、rate_limit_typeとreset_atゲートウェイ側で超過した制限の種類
C429、OpenAIExceptionを含む制限messageプロバイダー側の対象モデル・制限
D429、No deployments available for selected modelルーティング先の利用可能状態と失敗履歴

予算超過を短い間隔の再送で解消しようとしたり、プロバイダーの制限をゲートウェイの予算変更で直そうとしたりしないための整理です。資料のヘッダー説明は利用版と照合し、ヘッダーが見えないという理由だけで発生元を確定しません。

fallbackが全滅した応答は、最後の失敗だけを見ない

Error Referenceは、再試行とfallbackを使い切ると元の例外を返し、messageへ試行履歴を追加すると説明しています。公式の例では、最初のモデル群が500、fallback先が503で失敗した場合、返るステータスは500です。

この挙動を知らずに「503が返っていないのでfallback先は調べなくてよい」とすると、調査対象を落とします。逆に、messageにfallback先のエラーがあるからといって、HTTPステータスもその値だったと書き換えません。

架空の整理メモなら、次のように別々に残します。

利用者へ返ったHTTPステータス: 500
最初のモデル群の失敗: 500
fallback先の失敗: 503
業務の最終結果: 回答を完成できず

これは状態の対応を読む例で、fallbackの設定や実行を行った記録ではありません。履歴が応答へ出ない設定なら、表示された断片だけで全経路を補完せず、管理担当者が対応するログを確認します。

担当者へ渡す判断と、未確認を残す

切り分けの成果物は「429だった」という一行ではなく、どの層を調べるか、その根拠、まだ分からないことです。次の形にすると、設定変更を急がず引き継げます。

対象環境と利用版:
発生時刻と内部要求ID:
返ったHTTPステータス:
message/type/codeの抜粋:
call IDなど確認できた対応情報:
発生元の判断と根拠:
不足している記録:
確認を依頼する担当と項目:

対象環境の設定を確認できなければ、その欄は未確認とします。権限のない人がキーを再発行したり、上限を上げたりすることを、診断完了の条件にはしません。

再開方法を決める際も、SDK、ゲートウェイ、ジョブの再試行が重なっていないかを確認します。外部ツールによる送信や更新を含む業務では、LLMが失敗したことから外部操作も未実行とは断定せず、その状態を別に照合してください。

確認した公式情報

資料確認日:2026年10月21日。応答形式とヘッダーは、利用しているLiteLLMの版、ルート、前段プロキシの設定に合わせて確認してください。

質問から自分に合うAIを探す