本文へスキップ
Markdown で表示

エラー

エラーは標準の HTTP ステータスコードとともに返されます。ボディの形式はリクエストを拒否した層によって異なるため、message の文言ではなく HTTP ステータスと error.code で分岐してください。API が返すボディの形式は、以下に例とともにまとめています。

メモ
分岐はステータスコードと error.code で行い、message では行わないでください。message は人が読む文言で表現が変わることがあり、契約にあたるのはステータスコードと code です。

HTTP ステータス

API が返すステータスを、対応方法ごとにまとめると次のとおりです。

  • 400、404、405:リクエスト自体が不正です。修正してから送り直してください。
  • 401、403:API キーを利用できません。キーを確認するか、新しく発行してください。
  • 402:クレジット残高、組織の予算、キーの支出上限のいずれかがなくなっています。
  • 429:レート制限を超過しました。リセット後にリトライするか、バックオフしてください。
  • 500、502、503:Kiln 側の問題です。指数バックオフでリトライしてください。

ステータスコード

ステータスコードはこの表を基準とし、他のページからもこの表を参照しています。クライアントでは以下のコードを明示的に処理してください。

ステータスerror.code原因対応
400empty_array, unsupported_parameter不正なリクエストです。不正な JSON、無効なパラメータ、モデルページに記載のモデル別コンテキスト長の超過、/v1/chat/completions の空または欠落した messages 配列、gpt-oss モデルでの ignore_eos、/v1/responses での previous_response_id が該当します。リクエストの内容を修正してください。同じ内容のままリトライしないでください。
401-認証エラーです。API キーがない、形式が不正、未登録、または期限切れです。Authorization または x-api-key ヘッダー、キーの値、キーの有効期限を確認してください。
402-支払いが必要です。クレジット残高がなくなった、組織が月間予算に達した、またはキーが支出上限に達した場合です。クレジットをチャージするか、管理者に予算またはキーの支出上限の引き上げを依頼してください。それまではリトライしないでください。
403-権限がありません。API キーが一時停止中、または失効済みです。アーカイブされたプロジェクトのキーは一時停止として扱います。コンソールでキーを再有効化し、失効済みの場合は新しいキーを発行してください。
404model_not_found, unknown_url, not_found見つかりません。モデルが存在しないか利用権限がない場合(model_not_found)、提供していないパスの場合(unknown_url)、保存済みレスポンスを取得しようとした場合(not_found、レスポンスは保持しません)です。モデル ID は GET /v1/models と、パスは API リファレンスと照合してください。
405method_not_allowed許可されていないメソッドです。提供しているパスですが、この HTTP メソッドは受け付けません。レスポンスの Allow ヘッダーに記載されたメソッドを使用してください。
429rate_limit_exceeded(同時実行のみ)リクエスト過多です。組織単位の上限を超過しました。上限は、デフォルトで毎分 60 リクエスト、設定されている場合は毎分トークン数、または同時 8 リクエストです。毎分リクエストまたは毎分トークンの 429 には x-ratelimit-reset が含まれるので、その秒数だけ待ってください。同時実行の 429 にはレート制限ヘッダーがないため、指数バックオフを使用してください。
502-ゲートウェイエラーです。上流のモデルバックエンドが失敗したか、到達できません。指数バックオフでリトライし、長い生成にはストリーミングを使用してください。解消しない場合は運用チームにお問い合わせください。
503-サービスを利用できません。メンテナンスモード中か、利用可能なモデルバックエンドがありません。メンテナンス中はレスポンスに Retry-After ヘッダー(HTTP 日付)が含まれるので、その時刻まで待ってください。それ以外は指数バックオフでリトライしてください。
5xx-サーバーエラーです。Kiln 側の一時的な問題です。指数バックオフでリトライしてください。解消しない場合は運用チームにお問い合わせください。

エラーボディの形式

  • 認証、クレジット、RPM/TPM 上限による拒否(401、402、403、429):{"error":{"message","type":"authorization"}} の形式です。code と param フィールドはありません。
  • リクエスト検証と同時実行上限による拒否:error.type は invalid_request_error で、param と code が追加されます。code は model_not_found, empty_array, unsupported_parameter, rate_limit_exceeded, unknown_url, method_not_allowed, not_found のいずれかです。
  • /v1/messages で認証後に返されるエラーは Anthropic 形式 {"type":"error","error":{"type","message"}} を使用します。
  • GET /v1/key は {"error":{"message","code"}} を返し、type フィールドはありません。キーがない、未登録、一時停止中、期限切れの場合、code は unauthorized です。
  • OpenAI 形式のエンドポイントの 502 と、利用可能なモデルバックエンドがないことによる 503 はボディがプレーンテキストのため、JSON としてパースしないでください。メンテナンス中の 503 は type が "maintenance" の JSON です。
ゲートウェイによる拒否
{
  "error": {
    "message": "missing or malformed API key",
    "type": "authorization"
  }
}
リクエスト検証
{
  "error": {
    "message": "The model does not exist or you do not have access to it.",
    "type": "invalid_request_error",
    "param": "model",
    "code": "model_not_found"
  }
}
Anthropic 形式(/v1/messages)
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "max_tokens is required"
  }
}
GET /v1/key
{
  "error": {
    "message": "invalid API key",
    "code": "unauthorized"
  }
}
プレーンテキスト(502、503)
HTTP/1.1 502 Bad Gateway
Content-Type: text/plain; charset=utf-8

upstream error

ストリーム開始前とストリーム途中の失敗

バイトが送られる前

拒否されたリクエストは、レスポンスのバイトが 1 つも送られる前に失敗します。クライアントは 2xx 以外のステータスと上記のいずれかのボディを受け取り、トークンは生成されず、課金もされません。上の表のすべての行がこの場合にあたります。

200 のあと

ゲートウェイが 200 と最初のストリームバイトを送ったあとは、HTTP ステータスを変更できません。モデルサーバーが生成の途中で失敗した場合は、ストリームが早く終わります。最後のチャンクと data: [DONE] の印がないまま終了するか、ストリームの中に error オブジェクトが届きます。このように失敗した生成は課金しません。

途中で切れたストリームは短い回答のように見えるため、次を確認してください。

  • data: [DONE] がないまま終わったストリームは、ステータスが 200 でも失敗として扱ってください。
  • 最後のチャンクに finish_reason があるか確認してください。finish_reason がないまま終わったストリームは完了していません。
  • stream_options.include_usage を true に設定し、usage チャンクがない場合は失敗として扱ってください。
  • レスポンスの X-Neocloud-Generation-Id ヘッダーをログに残し、失敗したリクエストをあとから追跡できるようにしてください。

429 の処理とリトライ戦略は、 レート制限 を参照してください。