From bf8396a790e00cdac3932638b746d996c40090a7 Mon Sep 17 00:00:00 2001 From: xds Date: Wed, 4 Feb 2026 18:23:36 +0300 Subject: [PATCH] catch exception --- adapters/Exception.py | 3 +++ adapters/google_adapter.py | 3 +++ api/models/GenerationRequest.py | 1 + api/service/generation_service.py | 26 +++++++++++++++++--------- models/Generation.py | 1 + 5 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 adapters/Exception.py diff --git a/adapters/Exception.py b/adapters/Exception.py new file mode 100644 index 0000000..173335b --- /dev/null +++ b/adapters/Exception.py @@ -0,0 +1,3 @@ +class GoogleGenerationException(Exception): + message: str + pass \ No newline at end of file diff --git a/adapters/google_adapter.py b/adapters/google_adapter.py index 34ea5fb..bbabfd8 100644 --- a/adapters/google_adapter.py +++ b/adapters/google_adapter.py @@ -7,6 +7,7 @@ from PIL import Image from google import genai from google.genai import types +from adapters.Exception import GoogleGenerationException from models.enums import AspectRatios, Quality logger = logging.getLogger(__name__) @@ -85,6 +86,8 @@ class GoogleAdapter: ), ) ) + if response.parts is None and response.candidates[0].finish_reason is not None: + raise GoogleGenerationException(f"Generation blocked in cause of {response.candidates[0].finish_reason.value}") generated_images = [] diff --git a/api/models/GenerationRequest.py b/api/models/GenerationRequest.py index fd30755..5a4c512 100644 --- a/api/models/GenerationRequest.py +++ b/api/models/GenerationRequest.py @@ -19,6 +19,7 @@ class GenerationRequest(BaseModel): class GenerationResponse(BaseModel): id: str status: GenerationStatus + failed_reason: Optional[str] = None linked_character_id: Optional[str] = None aspect_ratio: AspectRatios quality: Quality diff --git a/api/service/generation_service.py b/api/service/generation_service.py index 9b67049..0091d1f 100644 --- a/api/service/generation_service.py +++ b/api/service/generation_service.py @@ -5,6 +5,7 @@ from datetime import datetime, UTC from typing import List, Optional from io import BytesIO +from adapters.Exception import GoogleGenerationException from adapters.google_adapter import GoogleAdapter from api.models.GenerationRequest import GenerationRequest, GenerationResponse # Импортируйте ваши модели DAO, Asset, Generation корректно @@ -28,16 +29,17 @@ async def generate_image_task( Обертка для вызова синхронного метода Gemini в отдельном потоке. Возвращает список байтов сгенерированных изображений. """ - + try : # Запускаем блокирующую операцию в отдельном потоке, чтобы не тормозить Event Loop - generated_images_io: List[BytesIO] = await asyncio.to_thread( - gemini.generate_image, - prompt=prompt, - images_list=media_group_bytes, - aspect_ratio=aspect_ratio, - quality=quality, - ) - + generated_images_io: List[BytesIO] = await asyncio.to_thread( + gemini.generate_image, + prompt=prompt, + images_list=media_group_bytes, + aspect_ratio=aspect_ratio, + quality=quality, + ) + except GoogleGenerationException as e: + raise e images_bytes = [] if generated_images_io: for img_io in generated_images_io: @@ -154,6 +156,12 @@ class GenerationService: quality=generation.quality, gemini=self.gemini ) + except GoogleGenerationException as e: + generation.status = GenerationStatus.FAILED + generation.failed_reason = str(e.message) + generation.updated_at = datetime.now(UTC) + await self.dao.generations.update_generation(generation) + raise except Exception as e: # Тут стоит добавить логирование ошибки logging.error(f"Generation failed: {e}") diff --git a/models/Generation.py b/models/Generation.py index e346115..9476060 100644 --- a/models/Generation.py +++ b/models/Generation.py @@ -16,6 +16,7 @@ class GenerationStatus(str, Enum): class Generation(BaseModel): id: Optional[str] = None status: GenerationStatus = GenerationStatus.RUNNING + failed_reason: Optional[str] = None linked_character_id: Optional[str] = None aspect_ratio: AspectRatios quality: Quality