diff --git a/api/service/generation_service.py b/api/service/generation_service.py index 70711ae..818cf29 100644 --- a/api/service/generation_service.py +++ b/api/service/generation_service.py @@ -154,9 +154,16 @@ class GenerationService: gemini=self.gemini ) self._update_generation_metrics(generation, metrics) - except Exception as e: - await self._handle_generation_failure(generation, e) - raise + + # 3. Process results + created_assets = await self._process_generated_images(generation, generated_bytes_list) + + # 4. Finalize generation record + await self._finalize_generation(generation, created_assets, generation_prompt, start_time) + + # 5. Notify + if generation.telegram_id and self.bot: + await self._notify_telegram(generation, created_assets) finally: if not progress_task.done(): progress_task.cancel() @@ -165,16 +172,6 @@ class GenerationService: except asyncio.CancelledError: pass - # 3. Process results - created_assets = await self._process_generated_images(generation, generated_bytes_list) - - # 4. Finalize generation record - await self._finalize_generation(generation, created_assets, generation_prompt, start_time) - - # 5. Notify - if generation.telegram_id and self.bot: - await self._notify_telegram(generation, created_assets) - async def import_external_generation(self, external_gen) -> Generation: external_gen.validate_image_source() logger.info(f"Importing external generation for user: {external_gen.created_by}") @@ -281,8 +278,8 @@ class GenerationService: try: async with generation_semaphore: await self.create_generation(gen) - except Exception: - await self._handle_generation_failure(gen, None) + except Exception as e: + await self._handle_generation_failure(gen, e) logger.exception(f"Background generation task failed for ID: {gen.id}") async def _prepare_generation_input(self, generation: Generation) -> Tuple[List[bytes], str]: @@ -341,7 +338,12 @@ class GenerationService: async def _handle_generation_failure(self, generation: Generation, error: Optional[Exception]): logger.error(f"Generation {generation.id} failed: {error}") generation.status = GenerationStatus.FAILED - generation.failed_reason = str(error) if error else "Unknown error" + # Don't overwrite if reason is already set, unless a new error is provided + if error: + generation.failed_reason = str(error) + elif not generation.failed_reason: + generation.failed_reason = "Unknown error" + generation.updated_at = datetime.now(UTC) await self.dao.generations.update_generation(generation)