feat(gtm): upgrade to google-genai, fix image gen & frontend crash

This commit is contained in:
2026-01-04 16:02:23 +00:00
parent 3b1f2967cb
commit 9ac2b9c466
242 changed files with 6075 additions and 448 deletions

View File

@@ -63,6 +63,8 @@ Das Projekt nutzt ein zentrales `helpers.py`, das von mehreren Services geteilt
* **Fix (in `requirements.txt`):** Stellen Sie sicher, dass die f.r die App **unmittelbar** ben.tigten Bibliotheken vorhanden sind. F.r `gtm-architect` sind das:
```text
google-generativeai
google-genai
Pillow
requests
beautifulsoup4
```
@@ -377,6 +379,79 @@ def call_gemini_flash(prompt, system_instruction=None, temperature=0.3, json_mod
---
### A.5 Image Generation 2.0 (Hybrid Approach - Jan 04)
Um die Einschr.nkungen der "Text-only" Modelle und die regionale Verf.gbarkeit von Imagen 3 zu umgehen, nutzen wir einen hybriden Ansatz.
**1. Anforderungen**
* **Bibliothek:** `google-genai` (v1.x) MUSS installiert sein (`pip install google-genai`). `google-generativeai` (v0.x) ist veraltet.
* **Bildverarbeitung:** `Pillow` muss installiert sein (`pip install Pillow`).
**2. Die Logik (Text vs. Bild)**
Das System entscheidet automatisch, welches Modell genutzt wird:
* **Szenario A: Generisches Bild (Text-to-Image)**
* **Modell:** `imagen-4.0-generate-001` (oder `fast`/`ultra` Varianten).
* **Warum:** Imagen ist spezialisiert auf Text-zu-Bild, aber Imagen 3.0 ist oft 404 (nicht verf.gbar). Imagen 4.0 ist der aktuelle Standard.
* **Code:** `client.models.generate_images(...)`
* **Szenario B: Produkt-Integration (Image-to-Image)**
* **Modell:** `gemini-2.5-flash-image`.
* **Warum:** Nur Gemini-Multimodal-Modelle k.nnen Input-Bilder verstehen und verarbeiten ("Inpainting" oder "Contextual Placement").
* **Wichtig:** Dieses Modell unterst.tzt KEINEN JSON-Mode (`response_mime_type="application/json"` f.hrt zu 400 Error).
* **Code:** `client.models.generate_content(contents=[image, prompt])`
**3. Code-Beispiel (aus `helpers.py`)**
```python
# Import
from google import genai
from PIL import Image
import io
import base64
# ... client setup ...
def generate_image(prompt, ref_image_b64=None):
if ref_image_b64:
# IMAGE-TO-IMAGE (Gemini 2.5)
image_data = base64.b64decode(ref_image_b64)
raw_image = Image.open(io.BytesIO(image_data))
# Strict Prompting ist essenziell!
full_prompt = (
"Use the provided reference image as the absolute truth. "
f"Place EXACTLY this product into the scene: {prompt}. "
"Do NOT alter the product's design."
)
# KEIN config=... mit JSON Mode!
response = client.models.generate_content(
model='gemini-2.5-flash-image',
contents=[raw_image, full_prompt]
)
# Extrahiere Bild aus response.candidates[0].content.parts[0].inline_data
else:
# TEXT-TO-IMAGE (Imagen 4.0)
# Fallback-Kandidaten, falls ein Modell 404 ist
candidates = ['imagen-4.0-generate-001', 'imagen-4.0-fast-generate-001']
for model in candidates:
try:
response = client.models.generate_images(
model=model,
prompt=prompt,
config={"number_of_images": 1, "output_mime_type": "image/jpeg"}
)
# Extrahiere Bild aus response.generated_images[0].image
break
except Exception:
continue
```
---
## 7. Troubleshooting & Lessons Learned (Jan 2026)
Diese Fehler traten bei der GTM Architect Migration auf und m.ssen zuk.nftig vermieden werden.
@@ -408,5 +483,3 @@ Diese Fehler traten bei der GTM Architect Migration auf und m.ssen zuk.nftig ver
volumes:
- ./mein-app-ordner/server.cjs:/app/server.cjs
```
```