エラーレスポンス形状
2xx 以外のすべてのレスポンスは同じエンベロープを持ちます:
| フィールド | 役割 |
|---|---|
type | OpenAI 互換カテゴリ (invalid_request_error, authentication_error, rate_limit_error, api_error) |
code | 機械処理可能なサブコード (SchneeAI 独自コード 参照) |
message | 人間が読める説明 |
param | 該当パラメータ (該当する場合) |
request_id | サポートへ問い合わせる際に含めてください — 実際の呼び出しを追跡できます |
HTTP ステータス → アクション
| ステータス | 意味 | リトライ | アクション |
|---|---|---|---|
| 400 | JSON 不正または必須フィールド欠落 | 不可 | リクエストボディを修正 |
| 401 | API キーが無効または欠落 | 不可 | Authorization ヘッダーを確認 |
| 403 | テナントスコープまたはロールが不許可 | 不可 | トークンのテナント / ロールを確認 |
| 404 | model またはプロンプト名が存在しない | 不可 | モデルディレクトリ を確認 |
| 422 | JSON は有効だが意味的に拒否 | 不可 | error.code を読む — コンテキスト長、未対応パラメータ、コンテンツポリシー等 |
| 429 | レートリミットまたは予算超過 | 可 (バックオフ付き) | Retry-After があれば従う |
| 500 | Gateway 内部エラー | 可 | 指数バックオフ |
| 502 | 上流プロバイダーエラー | 可 | 指数バックオフ |
| 503 | Gateway 一時利用不可 | 可 | 指数バックオフ |
| 504 | 上流プロバイダータイムアウト | 可 | 指数バックオフ |
SchneeAI 独自エラーコード
OpenAI 互換エンベロープは error.code に SchneeAI 独自のサブコードを運びます。実際に遭遇するのは以下のとおり:
| コード | HTTP | 意味 |
|---|---|---|
budget_exceeded | 429 | テナントまたはフィーチャー予算を使い切った。予算がリセットされる (ポリシーにより翌時間 / 翌日 / 翌月) までリトライしないこと。 |
pii_detected | 422 | テナントの PII ポリシーが block で、スキャナがクリティカル分類を検出した。入力を編集するか、ポリシーを mask / flag に切り替える。 |
context_length_exceeded | 422 | プロンプト + max_tokens の合計がモデルのコンテキストウィンドウを超えた。切り詰めるか、より長いコンテキストモデルに切り替える。 |
unsupported_parameter | 422 | 選択したプロバイダーが送信したパラメータに対応していない (例: 推論系モデルでの temperature)。 |
provider_error | 502 | 上流 LLM プロバイダーがエラーを返した。バックオフ付きでリトライ。 |
リトライ戦略
429, 500, 502, 503, 504 のみリトライ。ジッタ付き指数バックオフを使います:
wait = min(base * 2^attempt, max_wait) + random_jitter
base = 1 秒
max_wait = 60 秒
jitter = wait の 0–25%
attempts = 最大 5 回
Retry-After ヘッダーがあれば従う。429 レスポンスはこれを秒数の整数で含みます。
リトライすべきでない場合
- 400 / 401 / 403 / 404 / 422 — リクエスト自体が不正で、リトライしても同じエラーになる。
- 429 +
code: budget_exceeded— リトライすると予算を速く消費する。リセット窗口まで待つ。
冪等性
POST /v1/chat/completions では Idempotency-Key ヘッダーを送ることで、リトライ時の二重課金・二重集計を防げます:
- 形式: 255 文字以内の任意の文字列。UUIDv4 推奨。
- TTL: 24 時間。以降は同じキーでも新規リクエストとして扱われる。
- スコープ: サービス + テナント単位。異なるテナントが同じキーを使っても衝突しない。
- 重複排除の対象: 課金 と 利用記録。元のリクエストがプロバイダーに届かなかった場合、LLM 呼び出し自体は発生する。
クライアント実装例
Python (requests + tenacity)
pass
=
return
TypeScript (fetch)
Go (net/http + backoff)
var buf bytes.Buffer
json.NewEncoder(&buf).Encode(map[string]any)
req, _ := http.NewRequest("POST", "https://api.schneeai.com/v1/chat/completions", &buf)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Idempotency-Key", uuid.NewString())
req.Header.Set("Content-Type", "application/json")
bo := backoff.NewExponentialBackOff()
bo.MaxElapsedTime = 60 * time.Second
backoff.Retry(func() error , bo)
サポート
正しくリトライしてもエラーが続く場合、エラーレスポンスの request_id を添えて [email protected] まで。実際の呼び出しを数分で追跡できます。
注意: SchneeAI はデザインパートナー段階です。上記エラーエンベロープは安定した OpenAI 互換仕様です。予算 / PII のサブコードは現在出荷中のプラットフォーム機能に対応しています。ここに記載のないコードに遭遇した場合は、request_id をお送りください — ドキュメントに追加します。