feat(gtm): add aspect ratio & corporate design; fix(market): harden backend logging & json parsing

This commit is contained in:
2026-01-05 11:42:15 +00:00
parent 7be63b6d14
commit a5f43fb977
10 changed files with 241 additions and 169 deletions

View File

@@ -256,11 +256,13 @@ def call_gemini_flash(prompt, system_instruction=None, temperature=0.3, json_mod
raise ImportError("Keine Gemini Bibliothek verfügbar.")
@retry_on_failure
def call_gemini_image(prompt, reference_image_b64=None):
def call_gemini_image(prompt, reference_image_b64=None, aspect_ratio=None):
"""
Generiert ein Bild.
- Mit Referenzbild: Gemini 2.5 Flash Image.
- Ohne Referenzbild: Imagen 4.0.
- NEU: Akzeptiert `aspect_ratio` (z.B. "16:9").
- NEU: Wendet einen zentralen Corporate Design Prompt an.
"""
logger = logging.getLogger(__name__)
api_key = _get_gemini_api_key()
@@ -277,7 +279,7 @@ def call_gemini_image(prompt, reference_image_b64=None):
except ImportError:
raise ImportError("Pillow (PIL) fehlt. Bitte 'pip install Pillow' ausführen.")
logger.info("Start Image-to-Image Generation mit gemini-2.5-flash-image...")
logger.info(f"Start Image-to-Image Generation mit gemini-2.5-flash-image. Seitenverhältnis: {aspect_ratio or 'default'}")
# Base64 zu PIL Image
try:
@@ -297,8 +299,12 @@ def call_gemini_image(prompt, reference_image_b64=None):
"Keep the product 100% identical to the reference. "
"Only adjust lighting and perspective to match the scene."
)
# Hier können wir das Seitenverhältnis nicht direkt steuern,
# da es vom Referenzbild abhängt. Wir könnten es aber in den Prompt einbauen.
if aspect_ratio:
full_prompt += f" The final image composition should have an aspect ratio of {aspect_ratio}."
# KEIN config mit response_mime_type="application/json", das verursacht Fehler!
response = client.models.generate_content(
model='gemini-2.5-flash-image',
contents=[raw_image, full_prompt]
@@ -315,8 +321,15 @@ def call_gemini_image(prompt, reference_image_b64=None):
else:
img_config = {
"number_of_images": 1,
"output_mime_type": "image/jpeg"
"output_mime_type": "image/jpeg",
}
# Füge Seitenverhältnis hinzu, falls vorhanden
if aspect_ratio in ["16:9", "9:16", "1:1", "4:3"]:
img_config["aspect_ratio"] = aspect_ratio
logger.info(f"Seitenverhältnis auf {aspect_ratio} gesetzt.")
# Wende zentralen Stil an
final_prompt = f"{Config.CORPORATE_DESIGN_PROMPT}\n\nTask: {prompt}"
method = getattr(client.models, 'generate_images', None)
if not method:
@@ -335,7 +348,7 @@ def call_gemini_image(prompt, reference_image_b64=None):
logger.info(f"Versuche Text-zu-Bild mit Modell: {model_name}")
response = method(
model=model_name,
prompt=prompt,
prompt=final_prompt,
config=img_config
)