Slicelayers commited on
Commit
e736798
·
verified ·
1 Parent(s): ca28d65

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +15 -6
app.py CHANGED
@@ -69,12 +69,14 @@ async def nano_banana_completion_api(base_image: Image.Image, prompt: str) -> Im
69
  final_api_url = API_URL + API_KEY
70
 
71
  # 指数バックオフ付きリトライロジック
72
- max_retries = 3
73
- delay = 1
 
74
 
75
  for attempt in range(max_retries):
76
  try:
77
- async with httpx.AsyncClient(timeout=30.0) as client:
 
78
  response = await client.post(final_api_url, json=payload)
79
  response.raise_for_status() # 200番台以外のステータスコードで例外を発生させる
80
 
@@ -95,15 +97,22 @@ async def nano_banana_completion_api(base_image: Image.Image, prompt: str) -> Im
95
  print("--- AI補完処理を完了しました (実API) ---")
96
  return completed_image
97
  else:
98
- raise ValueError("APIレスポンスから画像データが抽出できませんでした。")
 
 
99
 
100
  except httpx.HTTPStatusError as e:
 
101
  if e.response.status_code in [429, 503] and attempt < max_retries - 1:
102
- print(f"APIレート制限/サーバーエラー (429/503)。{delay}秒待機後にリトライします...")
103
  await asyncio.sleep(delay)
104
  delay *= 2 # 指数バックオフ
105
  else:
106
- raise gr.Error(f"API呼び出しエラー: {e}")
 
 
 
 
107
  except Exception as e:
108
  raise gr.Error(f"予期せぬエラーが発生しました: {e}")
109
 
 
69
  final_api_url = API_URL + API_KEY
70
 
71
  # 指数バックオフ付きリトライロジック
72
+ # ★★★ 修正点1: リトライ回数を増やし、待機時間を長くする ★★★
73
+ max_retries = 5
74
+ delay = 2 # 初期待機時間を2秒に変更
75
 
76
  for attempt in range(max_retries):
77
  try:
78
+ # ★★★ 修正点2: タイムアウトを60秒に延長 ★★★
79
+ async with httpx.AsyncClient(timeout=60.0) as client:
80
  response = await client.post(final_api_url, json=payload)
81
  response.raise_for_status() # 200番台以外のステータスコードで例外を発生させる
82
 
 
97
  print("--- AI補完処理を完了しました (実API) ---")
98
  return completed_image
99
  else:
100
+ # 応答構造は正しいが画像データがない場合
101
+ error_detail = result.get('candidates', [{}])[0].get('finishReason', 'UNKNOWN')
102
+ raise ValueError(f"APIレスポンスから画像データが抽出できませんでした。Finish Reason: {error_detail}")
103
 
104
  except httpx.HTTPStatusError as e:
105
+ # 429/503 (レート制限/サーバーエラー) の場合にリトライ
106
  if e.response.status_code in [429, 503] and attempt < max_retries - 1:
107
+ print(f"APIレート制限/サーバーエラー ({e.response.status_code})。{delay}秒待機後にリトライします...")
108
  await asyncio.sleep(delay)
109
  delay *= 2 # 指数バックオフ
110
  else:
111
+ # それ以外のHTTPエラーまたは最終リトライ失敗
112
+ raise gr.Error(f"API呼び出しエラー: Client error '{e.response.status_code} {e.response.reason_phrase}' for url '{e.request.url}'")
113
+ except httpx.RequestError as e:
114
+ # タイムアウトなどのネットワークエラー
115
+ raise gr.Error(f"APIリクエストエラー: ネットワークまたはタイムアウトエラーが発生しました。詳細: {e}")
116
  except Exception as e:
117
  raise gr.Error(f"予期せぬエラーが発生しました: {e}")
118