diff --git a/imagecreator/backend/app/services/__pycache__/image.cpython-310.pyc b/imagecreator/backend/app/services/__pycache__/image.cpython-310.pyc new file mode 100644 index 0000000..76716b1 Binary files /dev/null and b/imagecreator/backend/app/services/__pycache__/image.cpython-310.pyc differ diff --git a/imagecreator/backend/app/services/__pycache__/llm.cpython-310.pyc b/imagecreator/backend/app/services/__pycache__/llm.cpython-310.pyc new file mode 100644 index 0000000..410f672 Binary files /dev/null and b/imagecreator/backend/app/services/__pycache__/llm.cpython-310.pyc differ diff --git a/imagecreator/backend/app/services/__pycache__/prompt.cpython-310.pyc b/imagecreator/backend/app/services/__pycache__/prompt.cpython-310.pyc new file mode 100644 index 0000000..bdd17a6 Binary files /dev/null and b/imagecreator/backend/app/services/__pycache__/prompt.cpython-310.pyc differ diff --git a/imagecreator/backend/app/services/image.py b/imagecreator/backend/app/services/image.py index b1eefe8..9439be8 100644 --- a/imagecreator/backend/app/services/image.py +++ b/imagecreator/backend/app/services/image.py @@ -1 +1,79 @@ -"""Image service placeholder.""" +import base64 +import os +import uuid +from typing import Optional +from google.genai import Client +from app.config import settings + +class ImageGenerationService: + def __init__(self): + self._client = None + + @property + def client(self) -> Client: + if self._client is None: + self._client = Client(api_key=settings.GEMINI_API_KEY) + return self._client + + async def generate_text2image( + self, + prompt: str, + model: str = "gemini-2.5-flash" + ) -> dict: + response = self.client.models.generate_content( + model=model, + contents=prompt, + config={"response_modalities": ["TEXT", "IMAGE"]} + ) + + image_data = None + for part in response.parts: + if hasattr(part, 'inline_data') and part.inline_data: + image_data = base64.b64encode(part.inline_data.data).decode('utf-8') + break + + return { + "image_b64": image_data, + "model": model, + "finish_reason": response.candidates[0].finish_reason if hasattr(response, 'candidates') and response.candidates else None + } + + async def generate_image2image( + self, + prompt: str, + input_image_b64: str, + input_mime_type: str = "image/png", + model: str = "gemini-2.5-flash" + ) -> dict: + response = self.client.models.generate_content( + model=model, + contents=[ + {"text": prompt}, + {"inline_data": {"mime_type": input_mime_type, "data": input_image_b64}} + ], + config={"response_modalities": ["TEXT", "IMAGE"]} + ) + + image_data = None + for part in response.parts: + if hasattr(part, 'inline_data') and part.inline_data: + image_data = base64.b64encode(part.inline_data.data).decode('utf-8') + break + + return { + "image_b64": image_data, + "model": model, + "finish_reason": response.candidates[0].finish_reason if hasattr(response, 'candidates') and response.candidates else None + } + + def save_image(self, image_b64: str, user_id: str) -> str: + os.makedirs(settings.IMAGE_STORAGE_PATH, exist_ok=True) + filename = f"{user_id}/{uuid.uuid4()}.png" + filepath = os.path.join(settings.IMAGE_STORAGE_PATH, filename) + os.makedirs(os.path.dirname(filepath), exist_ok=True) + + image_data = base64.b64decode(image_b64) + with open(filepath, "wb") as f: + f.write(image_data) + + return f"/uploads/{filename}" diff --git a/imagecreator/backend/tests/__pycache__/test_image_service.cpython-310-pytest-9.0.2.pyc b/imagecreator/backend/tests/__pycache__/test_image_service.cpython-310-pytest-9.0.2.pyc new file mode 100644 index 0000000..885fe90 Binary files /dev/null and b/imagecreator/backend/tests/__pycache__/test_image_service.cpython-310-pytest-9.0.2.pyc differ diff --git a/imagecreator/backend/tests/__pycache__/test_prompt.cpython-310-pytest-9.0.2.pyc b/imagecreator/backend/tests/__pycache__/test_prompt.cpython-310-pytest-9.0.2.pyc new file mode 100644 index 0000000..b1d54be Binary files /dev/null and b/imagecreator/backend/tests/__pycache__/test_prompt.cpython-310-pytest-9.0.2.pyc differ diff --git a/imagecreator/backend/tests/test_image_service.py b/imagecreator/backend/tests/test_image_service.py new file mode 100644 index 0000000..56774bd --- /dev/null +++ b/imagecreator/backend/tests/test_image_service.py @@ -0,0 +1,9 @@ +import pytest +from app.services.image import ImageGenerationService + +def test_generate_text2image_request_structure(): + # Test that the service creates proper request structure + # This is a unit test - actual generation would require API key + service = ImageGenerationService() + # Just verify service initializes + assert service is not None