Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
| 73 |
-
|
|
|
|
| 74 |
|
| 75 |
for attempt in range(max_retries):
|
| 76 |
try:
|
| 77 |
-
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
| 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レート制限/サーバーエラー (
|
| 103 |
await asyncio.sleep(delay)
|
| 104 |
delay *= 2 # 指数バックオフ
|
| 105 |
else:
|
| 106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|