Spaces:
Sleeping
Sleeping
| import json | |
| from loguru import logger | |
| from typing import Annotated | |
| from fastapi import ( | |
| APIRouter, | |
| HTTPException, | |
| Depends | |
| ) | |
| from fastapi.responses import StreamingResponse | |
| from src.models import AdGenerationRequest, AdGenerationResponse | |
| from src.service.ad_service import get_ad_service, AdService | |
| from src.utils.helpers import generate_request_id | |
| from src.config import settings | |
| router = APIRouter(prefix=settings.API_V1_PREFIX, tags=["Advertisement Generation"]) | |
| async def generate_ad( | |
| request: AdGenerationRequest, | |
| ad_service: Annotated[AdService, Depends(get_ad_service)], | |
| ): | |
| """ | |
| Generate advertisement content based on the provided request. | |
| Parameters: | |
| - request: AdGenerationRequest containing product details and ad settings. | |
| Returns: | |
| - AdGenerationResponse with generated ad content and metadata. | |
| """ | |
| try: | |
| response = await ad_service.generate_ad(request) | |
| return response | |
| except HTTPException: | |
| raise | |
| except Exception as e: | |
| raise HTTPException( | |
| status_code=500, | |
| detail={ | |
| "error": "generation_failed", | |
| "message": str(e), | |
| "request_id": generate_request_id() | |
| } | |
| ) | |
| async def generate_ad_streaming( | |
| request: AdGenerationRequest, | |
| ad_service: Annotated[AdService, Depends(get_ad_service)], | |
| ): | |
| """ | |
| Generate advertisement content with streaming response. | |
| Parameters: | |
| - request: AdGenerationRequest containing product details and ad settings. | |
| Returns: | |
| - StreamingResponse with chunks of generated ad content. | |
| """ | |
| async def stream_response(): | |
| try: | |
| async for chunk in ad_service.generate_ad_streaming(request): | |
| yield json.dumps(chunk, default=str) + "\n" | |
| except Exception as e: | |
| logger.info(e) | |
| error_response = { | |
| "status": "error", | |
| "error_code": "generation_failed", | |
| "message": str(e), | |
| "request_id": generate_request_id() | |
| } | |
| yield json.dumps(error_response) + "\n" | |
| return StreamingResponse( | |
| stream_response(), | |
| media_type="text/plain", | |
| headers={ | |
| "Cache-Control": "no-cache", | |
| "Connection": "keep-alive", | |
| "X-Accel-Buffering": "no" # Disable nginx buffering | |
| } | |
| ) |