api-ad-generator / src /core /image_generator.py
fahmiaziz98
init
1061354
from PIL import Image
from io import BytesIO
from pathlib import Path
from typing import Optional
from loguru import logger
from src.llm.gemini_client import GeminiImageGeneration
from src.prompts.imagen_prompt import IMAGEN_PROMPT_TEMPLATE
from src.config import settings
class ImageGenerator:
"""
Class to handle image generation using Gemini Image Generation API.
This class provides methods to generate image prompts based on product details
and save the generated images to a specified directory.
"""
def __init__(self) -> None:
self.imagen = GeminiImageGeneration()
self.prompt_template = IMAGEN_PROMPT_TEMPLATE
self.save_dir = Path(settings.UPLOAD_DIR)
self.save_dir.mkdir(parents=True, exist_ok=True)
def generate_image_prompt(
self,
product_name: str,
brand_name: str,
product_description: str
) -> Optional[str]:
"""
Generate image prompt for the given product details.
Args:
product_name: Name of the product
brand_name: Brand name of the product
product_description: Description of the product
Returns:
Generated image prompt string
"""
try:
file_name = f"{product_name.replace(' ', '_')}_{brand_name.replace(' ', '_')}.png"
file_path = self.save_dir / file_name
prompt = self.prompt_template.format(
product_name=product_name,
brand_name=brand_name,
product_description=product_description
)
response = self.imagen.generate_image(prompt=prompt)
for part in response.candidates[0].content.parts:
if part.text is not None:
logger.info(f"Generated text: {part.text}")
elif part.inline_data is not None:
image_data = part.inline_data.data
image = Image.open(BytesIO(image_data))
image.save(file_path)
logger.info(f"Image saved to: {file_path}")
return str(file_path)
except Exception as e:
logger.error(f"Error generating image prompt: {e}")
raise RuntimeError(f"Failed to generate image prompt: {e}")