Spaces:
Sleeping
Sleeping
| from loguru import logger | |
| from typing import AsyncIterator, Dict, Any, Optional | |
| from src.models import ( | |
| AdGenerationRequest, | |
| AdGenerationResponse | |
| ) | |
| from src.core.ad_generator import AIAdGenerator | |
| class AdService: | |
| """ | |
| Service to handle ad generation requests. | |
| This service uses the AIAdGenerator class to create ads based on product details. | |
| """ | |
| def __init__(self) -> None: | |
| self.ad_generator = AIAdGenerator() | |
| async def generate_ad(self, request: AdGenerationRequest, **kwargs) -> AdGenerationResponse: | |
| """ | |
| Generate an ad based on the provided request details. | |
| Args: | |
| request: AdGenerationRequest containing product details. | |
| Returns: | |
| AdGenerationResponse containing the generated ad content. | |
| """ | |
| logger.info(f"Starting ad generation for product: {request.product_name}, brand: {request.brand_name}") | |
| try: | |
| response = await self.ad_generator.generate(request, **kwargs) | |
| logger.info(f"Ad generated successfully for request ID: {response.request_id}") | |
| return response | |
| except Exception as e: | |
| logger.critical(f"Critical error during ad generation: {e}") | |
| raise | |
| async def generate_ad_streaming( | |
| self, | |
| request: AdGenerationRequest, | |
| **kwargs | |
| ) -> AsyncIterator[Dict[str, Any]]: | |
| """ | |
| Generate an ad in a streaming manner based on the provided request details. | |
| Args: | |
| request: AdGenerationRequest containing product details. | |
| Returns: | |
| AsyncIterator yielding chunks of AdGenerationResponse. | |
| """ | |
| logger.info(f"Starting streaming ad generation for product: {request.product_name}, brand: {request.brand_name}") | |
| try: | |
| async for chunk in self.ad_generator.generate_streaming(request, **kwargs): | |
| logger.debug(f"Streaming chunk: {chunk}") | |
| yield chunk | |
| except Exception as e: | |
| logger.critical(f"Critical error during streaming ad generation: {e}") | |
| yield { | |
| "status": "error", | |
| "message": str(e), | |
| "error_code": "service_error" | |
| } | |
| # Singleton service instance | |
| _ad_service_instance: Optional[AdService] = None | |
| def get_ad_service() -> AdService: | |
| """Get singleton ad service instance""" | |
| global _ad_service_instance | |
| if _ad_service_instance is None: | |
| _ad_service_instance = AdService() | |
| return _ad_service_instance |