メインコンテンツまでスキップ

エラー処理・リトライ

本番運用では、レート制限(429)・一時的な上流障害(5xx)・残高不足(402)を適切に扱う必要があります。 上流の 4xx / 5xx はそのまま透過され、Lykuro が上流へ到達できない時のみ 502 を返します。

主なステータスコード

コード意味対応
401APIキー不正リトライ不可。キーを確認
402残高不足リトライ不可。チャージが必要
429レート制限超過Retry-After を見て待機後リトライ
5xx上流の一時障害指数バックオフでリトライ
502上流へ到達不可指数バックオフ、別プロバイダへフォールバック

詳細は エラーコード を参照してください。

import os, time
from openai import OpenAI, APIStatusError, APIConnectionError

client = OpenAI(
api_key=os.environ["LYKURO_API_KEY"],
base_url="https://api.lykuro.ai/deepseek/v1",
)

def chat_with_retry(messages, model="deepseek-chat", max_retries=3):
for attempt in range(max_retries):
try:
return client.chat.completions.create(model=model, messages=messages)
except APIStatusError as e:
# 402(残高不足)/ 401(認証)はリトライしない
if e.status_code in (401, 402):
raise
# 429 / 5xx は指数バックオフ
if e.status_code == 429 or e.status_code >= 500:
wait = 2 ** attempt
print(f"retry in {wait}s (status={e.status_code})")
time.sleep(wait)
continue
raise
except APIConnectionError:
time.sleep(2 ** attempt)
raise RuntimeError("max retries exceeded")

print(chat_with_retry([{"role": "user", "content": "こんにちは"}]).choices[0].message.content)

プロバイダ・フォールバック

ある上流が不調なときは、base_url を別プロバイダに差し替えて再試行できます。 たとえば DeepSeek が 502 を返したら Qwen(alibaba)へ切り替える、といった冗長化が可能です。

:::tip SDK 標準のリトライ OpenAI SDK は max_retries オプションで 429 / 5xx を自動リトライします(Python/TS とも)。 まずは OpenAI(max_retries=3) を設定し、足りない制御だけ上記のように自前で補うのがおすすめです。 :::