エラー
リクエストが失敗すると、Shisa サービスは HTTP ステータスコードと、何が問題だったかを記述する JSON ボディで問題を通知します。本ガイドでは、目にすることになるステータスコード、詳細を伝える JSON の形、そしてエンドポイントごとのエラーテーブルの場所について説明します。
HTTP ステータスコード
まずレスポンスのステータスを確認してください — それが問題のカテゴリと解決方法を示します。
| Status | Meaning | How to resolve |
|---|---|---|
400 | 不正なリクエスト — 無効または不足しているパラメータ | リクエストボディと必須フィールドを確認してください。具体的なフィールドについてはエラーメッセージを参照してください。 |
401 | 認証に失敗 | APIキー全体とベアラーヘッダーを確認してください。認証を参照してください。 |
403 | アクセスを拒否 | キーは有効ですが、要求したサービス、プロバイダー、またはモデルを利用できません。 |
404 | サービス/プロバイダーが見つからない、または非公開モデルが隠されている | ルート/モデルとキーのアクセス権を確認してください。 |
429 | レート制限を超過 | ペースを落とし、バックオフを使ってリトライしてください。レート制限を参照してください。 |
500 | ルーターまたはバックエンドの内部障害 | 短い遅延の後にリトライしてください。続く場合は、プラットフォームからサポートにお問い合わせください。 |
502 | 選択されたバックエンドに接続できない | バックオフして再試行してください。ルーターとバックエンド間で障害が発生しています。 |
503 | サービス、依存先、またはWebSocket受け入れ処理が一時的に利用不可 | エンドポイント固有のエラーが設定や権限の変更を求めていない限り、バックオフして再試行してください。 |
JSON エラーの形
エラーボディは、ルーター生成レスポンスとバックエンドから転送されたレスポンスで異なります。まずHTTPステータスを確認してください。本文がJSONの場合、errorは文字列の場合も、codeやmessageを含むオブジェクトの場合もあります。
ルーターエラー
ルーターが生成するHTTPエラーの多くには、数値コード、エラー名、コンテキスト、文字列メッセージが含まれます。
{
"context": ["authMiddleware"],
"code": 104,
"name": "ErrAuthenticationFailed",
"error": "Authentication error: Invalid token"
}
構造化エラーとバックエンドエラー
一部の検証エラーやWebSocket受け入れエラーでは、errorがオブジェクトになります。
{
"error": {
"code": "tts_text_too_long",
"message": "TTS text exceeds maximum length",
"max_chars": 5000,
"actual_chars": 5001
}
}
バックエンドは別のJSON形式やJSON以外の本文を返すことがあり、ルーターがそのステータスと本文をそのまま転送する場合があります。正確なメッセージ文字列に依存して分岐しないでください。
ボディを解析する前に、常に response.ok(またはステータスコード)を確認してください。429 や 500 には、成功パスが期待する JSON が含まれていない可能性があります。そのため、最初にステータスで分岐することで、2 つ目の紛らわしい解析エラーを避けられます。
実際に、解析する前にステータスを確認する例を示します。
const response = await fetch(url, options);
if (!response.ok) {
const detail = await response.json().catch(() => null);
const error = detail?.error;
const message =
typeof error === 'string'
? error
: error?.message ?? detail?.message ?? response.statusText;
throw new Error(`Shisa request failed (${response.status}): ${message}`);
}
const data = await response.json();
response = requests.post(url, headers=headers, json=payload)
if not response.ok:
try:
detail = response.json()
except ValueError:
detail = {}
error = detail.get("error")
message = error if isinstance(error, str) else (
error.get("message") if isinstance(error, dict) else None
)
raise RuntimeError(
f"Shisa request failed ({response.status_code}): "
f"{message or detail.get('message') or response.reason}"
)
data = response.json()
サービスごとのエラー詳細
エラーフィールドと正確なメッセージはエンドポイントによって異なります。エンドポイント固有のエラーテーブルとリクエスト要件については、各サービスの API リファレンスを参照してください。
- ASR — エンドポイントリファレンス
- TTS — エンドポイントリファレンス
- Translation — エンドポイントリファレンス
- LLM — レスポンスは OpenAI 互換スキーマに従います。LLM セクションを参照してください。