エラーと制限
GetVibe API のエラーコード: 401 (キー)、402 (残高)、403 (IP)、429 (レート制限)。エラーの処理方法と指数バックオフによる再試行について説明します。
GetVibe が/v1/*で生成するエラーには、error.message、error.type、error.codeを含む JSON エンベロープがあります。メッセージテキストやサードパーティサービスのヘッダーを契約として依存しないでください。
エラー形式
{
"error": {
"message": "insufficient balance",
"type": "insufficient_quota",
"code": 402,
"request_id": "8d4b6b3a-..."
}
}レスポンスコード
| パラメーター | タイプ | 説明 |
|---|---|---|
401 | authentication_error / 401 | キーが欠落しているか不正な形式、またはキーが無効化されています。認証情報を修正するまで再試行しないでください。 |
402 | insufficient_quota / 402 | 利用可能な残高または上限がありません — 待っても解決しません。402にはRetry-Afterが付与されず、再試行すべきではありません。チャージするか、サブスクリプション期間のリセットを待ってください。 |
403 | permission_error or policy type / 403 | IP、モデル、またはポリシーがリクエストを許可していません。リクエストまたは設定を変更せずに再試行しないでください。 |
429 | rate_limit_exceeded, inflight_client_cap or rate_limit_error / 429 | レート制限、同時実行数の上限、自分自身の同時リクエストによって一時的に保持されている残高予約(原因 reserved_in_flight)、またはサプライヤーの制限です。Retry-After の後にのみ再試行してください。429 は残高が枯渇したことを意味しません。 |
410 | media_endpoint_retired / media_endpoint_retired | /v1/images/edits、/v1/video/generations、/v1/videos(廃止)のみです。再試行せず、/api/media/generate に切り替えてください。/v1/images/generations は提供されています。 |
413 | invalid_request_error / 413 | Files API のみ: ファイルが 50 MiB を超えています。ファイルを縮小してから、新しいリクエストを作成してください。 |
503 | overloaded / 503 | グローバルエッジの過負荷です。Retry-After: 2 の後に再試行してください。その他の 503 は、モデルまたはリクエストを変更しない限り再試行できない場合があります。 |
リクエストエラー(400、413、422):コードと対処方法
すべてのリクエストエラーには、以下の表にある安定した error.code、該当するフィールドを示す error.param(モデルがフィールド名を指定しなかった場合は null)、および error.message の末尾に対応する行へのリンクが含まれます。CodexなどのCLIではメッセージのみが表示されるため、リンクもそこに表示されます。
| error.code | error.param | 対処方法 |
|---|---|---|
unsupported_parameter | フィールド名 | 選択したモデルまたはチャネルは、このパラメータに対応していません。リクエストから削除して(Codex/IDEでは設定から削除して)再試行してください。 |
invalid_parameter_value | フィールド名 | パラメータは指定されていますが、その値はこのモデルでは許可されていません。たとえば、reasoning が有効な場合の 1 以外の temperature、最大値を超える max_tokens、reasoning を無効にできない場合の effort "none" などです。メッセージの指示に従って値を修正してください。 |
missing_parameter | フィールド名 | 必須フィールドが欠落しているか、空です。追加してください。 |
invalid_tool_schema | tools[].function.* | ツール定義が拒否されました。名前に使用できるのはラテン文字、数字、"_"、"-"のみです。また、パラメータはルートが type: "object" の JSON Schema である必要があります。別のモデルバリアントを選択してください。 |
tool_choice_unsupported | tool_choice | モデルは強制的なツール選択に対応していません。tool_choice "auto" または "none" を送信してください。 |
invalid_tool_history | messages / input | 履歴に、結果のないツール呼び出しが含まれています。同じidで結果を追加するか、履歴を整理する際に呼び出しとその結果を一緒に削除してください。 |
invalid_image | — | 画像を読み取れませんでした。完全なPNG、JPEG、WebP、またはGIFファイルを送信してください(BMP、TIFF、AVIF、SVGは受け付けていません)。 |
unsupported_input_modality | — | モデルはこの種類の添付ファイル(PDF、音声、動画、画像)を受け付けていません。添付ファイルを削除するか、カタログ項目にその入力形式が記載されているモデルを選択してください。 |
conversation_state_unreadable | — | 履歴内の reasoning は別のチャネルによって作成されています。リクエストは有効です。再試行してください。エラーが繰り返される場合は、新しい会話を開始してください。 |
invalid_json | — | リクエスト本文がJSONではないか、途中で切り詰められています。画像を含む非常に長い会話では、新しい会話を開始するか、履歴をコンパクト化してください。 |
request_too_large | — | リクエストが大きすぎます。添付ファイルまたは履歴を減らしてください。 |
request_rejected_by_channel | — | モデルチャネルが理由を示さずに拒否しました。リクエスト自体は有効である可能性が高いです。再試行してください。拒否が繰り返される場合は、別のモデルバリアント(コロンの後に付くサフィックス)またはサフィックスのないモデルを選択してください。それでも解決しない場合は、request_id を添えてサポートにお問い合わせください。 |
model_not_available_on_route | — | このモデル用のルートが設定されていません。別のモデルまたはバリアントを選択してください。 |
context_length_exceeded | messages / input / prompt | リクエストがコンテキストウィンドウに収まりません。履歴をコンパクト化する(Codexでは /compact)か、より大きなウィンドウを持つモデルを選択してください。 |
content_moderation | — | リクエストまたは回答が、プロバイダーのコンテンツフィルターによってブロックされました。表現を変えるか、別のモデルを選択してください。 |
invalid_request | — | 原因を特定できませんでした。APIリファレンスに照らしてリクエストを確認してください。正しい場合は、レスポンスの request_id を添えてサポートにお問い合わせください。 |
レスポンスヘッダー
| パラメーター | タイプ | 説明 |
|---|---|---|
x-pv-cost-rub | string | ベストエフォートのルーブルコスト見積もりです。ストリームでは、入力の見積もりが判明している場合にx-pv-cost-rubが利用できます。最終的なusageイベントのpv_cost_rubにはx-pv-cost: 1が必要です。使用量の履歴には実際の引き落とし額が含まれます。 |
x-pv-generation-id | string | 使用履歴レコード id(GET /v1/generations/{id})。非ストリーミングの chat/completions リクエストに対してのみ返されます。 |
x-pv-dropped-params | string | 選択したルートが受け付けず、そのためモデルに送信されなかったカンマ区切りのリクエストパラメータ (例: temperature,top_p)。実際に除外されたものがある場合にのみ、回答でもエラーでも同様に付与されます。パラメータを黙って破棄することはありません: ヘッダーがなければ、送信したすべてがそのままモデルに届いています。 |
Retry-After | integer | 待機する秒数です。エッジは、429 レート、429 同時実行数(5)、503 グローバル過負荷(2)、および一部の一時的な 402 でこれを設定します。すべての 429/503 に適用されるわけではありません。 |
レスポンス開始前と開始後のエラー
遅いストリーム(stream: true)では、接続が切れたように見えないよう、5 秒間の無通信後に 200 と : pv-keepalive のコメントが送信されます。長い非ストリーム リクエストでは、最初のトークン後に 200 と空白が送信されます。以降、ステータスは変更できず、エラーはボディ内で通知されます。クライアントが HTTP エラー時に別のサプライヤーへフォールバックする場合は、x-pv-honest-errors: 1 を送信してください(またはサポートに依頼してアカウントで有効化してもらってください)。その場合、keepalive はなく、最初のレスポンス バイトより前に 200 が返ることもなく、すべての失敗は JSON ボディを伴う通常の HTTP ステータスになります。代償として、最初のトークンまでソケットは無応答になります。ヘッダー タイムアウトはこれをカバーする必要があります。
レスポンスが開始された後のエラーは 1 つの終端イベントです。チャットの場合は event: error で {"error":{message,type,code,status},"choices":[{"finish_reason":"error"}]} に続いて data: [DONE]、/v1/responses の場合は同じ error を持つ event: response.failed、/v1/messages の場合は Anthropic の event: error です。code は機械的な原因で、status はレスポンスが開始される前にエラーが持っていたであろう HTTP ステータスです。
stream: true)では、課金がストリーム終了後に完了するためx-pv-generation-idは返されません。リクエスト履歴はGET /v1/generationsで確認してください。レート制限と同時実行制限
どちらの制限もアカウントの現在の残高によって決まり、そのアカウントのすべてのAPIキーに対して合算で適用されます。ティアは自動的に再計算されます。残高をチャージすると上限が上がり、残高がしきい値を下回るとティアが下がります。1分あたりのトークン数(TPM)の制限はありません。
| 残高の下限 | 1分あたりのリクエスト数(RPM) | 同時リクエスト数 |
|---|---|---|
| 0 $ | 300 | 10 |
| 1 $ | 1 100 | 50 |
| 2 $ | 6 600 | 300 |
| 4 $ | 19 800 | 900 |
| 12 $ | 44 000 | 2 000 |
| パラメーター | タイプ | 説明 |
|---|---|---|
429 rate_limit_exceeded | RPM | 過去60秒間(スライディングウィンドウ)にアカウントが送信したリクエスト数が、ティアで許可されている上限に達しました。Retry-After はウィンドウ内のスロットが空くまでの秒数(最低1)で、x-ratelimit-limit-requests は現在のRPMです。本文: error.cause = key_rate_limited, error.details = { enforced_by: "getvibe", limit, unit: "requests_per_minute", retry_after_seconds }。 |
429 inflight_client_cap | concurrency | すでにティアで許可されている上限数のリクエストが実行中です。リクエストは完了するまでスロットを占有し、ストリームは最後のイベントまで占有します。Retry-After: 5。本文: error.cause = account_concurrency_limited, error.details = { enforced_by: "getvibe", limit, unit: "parallel_requests", retry_after_seconds: 5 }。 |
Personal limit | RPM | アカウントに個別のリクエスト制限が設定されている場合、ティアのRPMを引き下げることしかできず、引き上げることはできません。 |
503 overloaded | service | ご利用のアカウントの制限ではなく、サービス保護のための制限です。Retry-After: 2 は全アカウント共通の上限を示し、Retry-After: 1 は1台のサーバーがビジー状態であることを示します。指定された時間を待ってから再試行してください。 |
429 from a provider | upstream | error.cause = supplier_rate_limited は、モデルプロバイダーがリクエストを制限したことを意味し、ご利用のアカウントの上限には達していません。channel_rate_limited はプロバイダーチャネルの共有上限を示します(Retry-After: 10、何も送信されていません)。 |
リクエストの再試行
再試行可能なレスポンスには、まず存在すれば Retry-After を使用してください。ヘッダーがない場合、429 や 503 を自動的に再試行可能と見なさないでください。HTTP ステータスと公開されている error.type を確認し、再試行できない原因を修正し、一時的なエラーにのみ上限付きのバックオフを使用してください。
import time, requests
def call_with_retry(url, headers, payload, max_retries=5):
for attempt in range(max_retries):
r = requests.post(url, headers=headers, json=payload)
if r.status_code == 429:
# honor Retry-After, otherwise exponential backoff
wait = int(r.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
return r
return r