API Hop

ドキュメント

API Hop ドキュメント

エラーコードとトラブルシューティング

プラットフォームの全エラーコードを確認し、プロトコル固有のエラーを識別して安全に再試行し、ユーザーや AI アシスタント向けの診断情報を収集します。

何が失敗したかを特定する

  1. 実際の HTTP ステータス、リクエストメソッド、パスを記録してください。HTTP ステータスとアプリケーションのエラーコードは異なる層を表すため、互いに代用しないでください。
  2. 呼び出したプロトコルに応じてエラーフィールドを読み取ってください。ネイティブ、OpenAI、Claude、Gemini のレスポンスは、すべて同じ構造ではありません。
  3. ストリーミングリクエストでは、エラーイベントと完了状態も確認してください。非同期ジョブでは、ジョブの status を確認してください。HTTP 200 は生成の成功を保証しません。
  4. 次の表を使ってリクエストを修正するか、再試行の可否を判断してください。message は説明文であり、安定した列挙値ではありません。その文言を条件分岐に使わないでください。

プラットフォームのエラーコード一覧

以下は、プラットフォームのアプリケーションエラーコードの完全な一覧です。名前は参照用のラベルであり、レスポンスの code の値は数値です。 「一般的な HTTP」はトラブルシューティングの目安であり、すべてのエンドポイントに対する固定の対応関係ではありません。実際の HTTP ステータスとレスポンスボディを確認してください。 上流からそのまま渡された code は、この一覧に含まれない場合があります。

数値の code名前一般的な HTTP意味と対処方法
10000BAD_REQUEST400リクエスト形式、パス、または基本パラメータが無効です。メソッド、パス、JSON 構文、パラメータ名を確認してください。
10001VALIDATION_ERROR400 / 422パラメータの検証に失敗しました。必須フィールド、型、範囲、パラメータの組み合わせを確認してください。
20000AUTH_ERROR401認証に失敗しました。API キーの有効性、有効期限、認証ヘッダーの形式を確認してください。
20001FORBIDDEN403アクセスが拒否されたか、アカウントが制限されています。アカウントの権限とリソースの所有者を確認してください。
30000NOT_FOUND404パス、モデル、またはリソースが存在しません。エンドポイントのパス、model、ジョブ ID を、現在の API キーから見えるリソースと照合してください。
30001CONFLICT409操作がリソースの現在の状態と競合しています。操作を変更する前に現在の状態を確認し、重複送信を避けてください。
40000INSUFFICIENT_CREDIT402残高が不足しています。残高を確認してチャージしてから、再度呼び出してください。
40001RATE_LIMIT429リクエストの頻度が高すぎます。送信頻度を下げ、時間を置いて再試行してください。
40002CONCURRENCY_LIMIT429同時に実行されているリクエストが多すぎます。同時実行数を減らし、既存のリクエストが完了するまで待ってください。
50000PROVIDER_ERROR502上流への呼び出しが失敗したか、有効な結果が返されませんでした。回数を制限した再試行を検討する前に、結果が生成されていないか確認してください。
50001SERVICE_UNAVAILABLE503サービスが一時的に利用できません。制限を設けて後で再試行し、失敗が続く場合は診断情報を収集してください。
50002GATEWAY_TIMEOUT504処理がタイムアウトしました。結果が不明な場合があるため、再試行の前に処理が実行されたか確認してください。
50003INTERNAL_ERROR500未分類のサーバーエラーが発生しました。回数を制限して再試行し、失敗が続く場合は診断情報を収集してください。

HTTP 429 だけでは、レート制限と同時実行数の制限を確実に区別できません。明示的な数値エラーコードがある場合にのみ区別してください。 モデル一覧でモデル識別子を確認し、model の値を独自に書き換えないでください。

プロトコル別にエラーを読み取る

次の例は、プラットフォームが生成する一般的な構造を示すもので、すべての失敗で保証される単一の形式ではありません。 認証エラーは異なる処理層から返される場合があり、上流からのパススルーレスポンスでは独自の構造、文字列コード、型が保持される場合があります。 解析する前に実際のレスポンスの形を確認してください。認識できない場合は、無理に変換せず、元のフィールドと HTTP ステータスを保持してください。

ネイティブのプラットフォーム API

通常は error.code と error.message を読み取ります。requestId は存在しない場合があります。

json
{
  "success": false,
  "error": {
    "code": 10000,
    "message": "Bad request"
  },
  "requestId": "req_example"
}

エラーによっては、最上位の code と message を使用します。クライアントはこの違いを許容し、error オブジェクトがないことを成功の証拠として扱わないでください。 パラメータ検証のレスポンスにも、数値エラーコードが含まれない場合があります。コードがない場合は、勝手に補わず不明として扱ってください。

OpenAI 互換 API

プラットフォームが生成する一般的なエラーは、最上位の code、message、type を使用します。必ずしも error で囲まれているわけではありません。

json
{
  "code": 40000,
  "message": "Insufficient credit",
  "type": "api_error"
}

type はプロトコル上のカテゴリで、この構造の code はプラットフォームの数値エラーコードです。api_error だけでは、再試行が適切かどうかは判断できません。 上流からのパススルーエラーやストリーミングエラーには、入れ子の error が含まれる場合があります。実際のプロトコルレスポンスに従って処理してください。 Chat Completions と Responses を参照してください。

Claude 互換 API

一般的な構造では、最上位の type が error となり、具体的なカテゴリは error.type、説明は error.message に格納されます。 この構造にはプラットフォームの数値 code は含まれません。勝手に補わないでください。

json
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "max_tokens must be a positive safe integer"
  }
}

プラットフォームがローカルで生成する Claude のエラー型は次のとおりです。上流のすべてのエラー型を網羅した一覧ではありません。

error.typeローカルの HTTP 対応確認事項
invalid_request_error400リクエスト形式とパラメータを確認してください。
authentication_error401認証情報を確認してください。
api_errorその他の HTTP ステータス一般的な API エラーです。実際の HTTP ステータスと説明を確認してください。必ずしも再試行できるとは限りません。

Claude Messages を参照してください。

Gemini 形式のエラー

Gemini 形式のレスポンスを受け取った場合は、error.code、error.message、error.status を読み取ってください。 ここでの status は文字列のカテゴリであり、HTTP ステータスや非同期ジョブの状態ではありません。

json
{
  "error": {
    "code": 10000,
    "message": "Bad request",
    "status": "INVALID_ARGUMENT"
  }
}

この形式でプラットフォームが生成するエラーには、プラットフォームの数値 code が使用されます。ローカルの文字列 status の対応は次のとおりで、上流のすべてのステータスの一覧ではありません。

error.statusローカルの HTTP 対応確認事項
UNAUTHENTICATED401認証情報を確認してください。
RESOURCE_EXHAUSTED402 / 429残高または使用制限を確認してください。この文字列だけでは区別できません。
PERMISSION_DENIED403権限とリソースの所有者を確認してください。
NOT_FOUND404パス、モデル、またはリソースを確認してください。
UNAVAILABLE503サービスが一時的に利用できません。
INTERNAL503 を除く >= 500サーバーエラーです。504 もこの値を使用します。
INVALID_ARGUMENTその他の HTTP ステータス実際の HTTP ステータスとリクエストを確認してください。409 もこの値を使用します。

503 が優先され、INTERNAL ではなく UNAVAILABLE を使用します。上流のレスポンスでは、code や status の意味が異なる場合があります。すべての Gemini の数値コードにプラットフォームのエラーコード表を適用しないでください。

安全な再試行

状況推奨する対処方法
400 / 401 / 402 / 403 / 404 / 409 / 422まずリクエスト、認証情報、残高、権限、またはリソースの状態を修正してください。同じリクエストを変更せずに繰り返し送信しないでください。API キーはヘッダーでのみ送信し、URL のクエリパラメータには含めないでください。
429送信頻度と同時実行数を減らし、待ってから再試行してください。再試行回数を増やすだけでは、通常は制限の状況が悪化します。
500 / 502 / 503 / 504まず重複実行のリスクを評価し、ジッターを加えた上限付きの指数バックオフを使用してください。たとえば再試行を最大 3 回とし、待ち時間全体にも上限を設けます。
ネットワーク切断またはクライアントのタイムアウト結果を受け取れなかったからといって、サーバーがリクエストを実行しなかったとは限りません。失敗と断定したり直ちに別のリクエストを作成したりせず、結果を不明として記録してください。

有効な Retry-After ヘッダーがある場合は従ってください。すべてのエラーに含まれるとは限りません。 冪等でない生成リクエストを自動的に再試行すると、再実行されて追加の料金が発生する可能性があります。このページは、一般的な冪等性キーへの対応を保証するものではありません。自分で Idempotency-Key を追加しても、重複排除は保証されません。

すでに jobId がある場合は、別のジョブを作成する前にそのジョブを照会してください。jobId がなく結果も不明な場合は、調査のためにリクエスト識別子とタイムスタンプを保持してください。

ストリームと非同期ジョブ

SSE リクエスト

SSE の開始後は、後から発生した失敗がストリーム内のエラーイベントやペイロードで通知されても、HTTP ステータスが 200 のままになることがあります。 選択したプロトコルに従ってイベントとデータを解析し、正常に完了したか確認してください。エラーや予期しない切断が発生した場合、部分的なテキストや画像を、完全に成功した結果として扱わないでください。 イベント名とペイロードはエンドポイントごとに異なります。固定された 1 つの error フィールドだけを確認したり、「何らかのテキストを受信した」ことを成功条件にしたりしないでください。

非同期ジョブ

作成レスポンスに data.jobId が含まれていても、それはリクエストが受け付けられたことを意味するだけで、生成の完了を意味しません。 ジョブの照会で HTTP レスポンスが成功した場合、成功したのは照会です。引き続きジョブの data.status を確認する必要があります。

  • PENDING、CONNECT、PROCESSING:Jobs のドキュメントに従ってポーリングを続けてください。
  • COMPLETED:outputResult を読み取ってください。
  • FAILED、CANCELLED:ポーリングを停止し、調査のためにジョブ ID と機密情報を除去したレスポンス情報を保持してください。

失敗の詳細が data.outputResult.error に含まれる場合があります。このフィールドは任意で、すべての失敗したジョブに存在するとは限りません。 Jobs は、作成レスポンスが jobId を明示的に返す場合にのみ使用してください。JSON または SSE で結果を直接返すエンドポイントには、ジョブのポーリングを適用しないでください。

ユーザーと AI アシスタント向けの診断情報

次の情報から機密情報を除去したうえで、サポートまたは AI アシスタントに提供してください。存在しないフィールドには unknown を使用し、HTTP レスポンスを受信していない場合は HTTP ステータスにも unknown を使用してください。 フィールドのパスと元の値の型を保持してください。たとえば error.code: 10000 (number) や error.code: "invalid_api_key" (string) のように記録します。 文字列の code をプラットフォームの数値コードに自動変換したり、message、HTTP ステータス、モデル名から欠けているフィールドを推測して補ったりしないでください。

text
time_with_timezone: unknown
method: unknown
path_without_query: unknown
model: unknown
stream: unknown
http_status: unknown
error_code_path_value_and_type: unknown
error_type_path_and_value: unknown
protocol_status_path_and_value: unknown
sanitized_message: unknown
request_id_from_body_or_X-Request-ID: unknown
job_id: unknown
job_status: unknown
retry_after: unknown
retry_count_and_delays: unknown
received_partial_output: unknown

利用できる場合は、レスポンスボディの requestId またはレスポンスヘッダーの X-Request-ID を読み取ってください。長い数値の精度が失われないよう、jobId は文字列として保持してください。 必要最小限の、機密情報を除去したリクエストパラメータだけを提供してください。API キー、トークン、Cookie、認証ヘッダーの全文、個人情報、非公開のプロンプト、入力ファイルの内容を削除してください。 URL のクエリパラメータと、署名やアクセス認証情報を含む入力・出力 URL を削除してください。内容を確認せずにリクエストログ全体を貼り付けないでください。

AI アシスタントは、観測されたフィールドと考えられる原因を区別し、不足する情報を明示する必要があります。証拠が不十分な状態を、リクエストの成功、未実行、または課金がなかったことの証明として扱ってはいけません。