# Migration Guide: Google AI Builder Apps -> Local Docker Stack > **CRITICAL WARNINGS & BEST PRACTICES (READ BEFORE MIGRATION):** > > 1. **DIE GOLDENE REGEL DER STRINGS:** Nutze **NIEMALS** `f"""..."""` für komplexe Prompts oder Listen-Operationen mit verschachtelten Keys. Es führt unweigerlich zu `SyntaxError: unterminated string literal`. Nutze **AUSSCHLIESSLICH Triple Raw Quotes (`r"""..."""`)** und die **`.format()`** Methode. > 2. **SDK WAHL (DUAL SDK):** Das moderne `google-genai` ist gut, aber das Legacy `google-generativeai` ist oft stabiler für reinen Text (`gemini-2.0-flash`). Nutze die "Dual SDK Strategy", um beide je nach Bedarf zu verwenden. > 3. **GROUNDED TRUTH (MUSS):** Verlasse dich niemals auf das Wissen des Modells allein. Implementiere **immer** Web-Scraping (Homepage + Unterseiten) und SerpAPI-suchen, um das Modell mit Fakten zu füttern. > 4. **DOCKER VOLUMES:** Mounte **nur spezifische Dateien**, niemals den `dist`-Ordner überschreiben. Bei Syntax-Fehlern, die trotz Korrektur bleiben: `docker-compose build --no-cache`. --- ## 0. Der "Quick-Start" Checkliste (5-Minuten-Plan) 1. **SDKs:** Stehen `google-genai` UND `google-generativeai` in der `requirements.txt`? 2. **Prompts:** Sind alle Prompts als `r"""...""".format()` angelegt? 3. **Grounding:** Wird vor dem KI-Call die Webseite der Firma gescrapt? 4. **Package.json:** Sind Build-Tools (`vite`, `typescript`) in `dependencies` (NICHT `devDependencies`)? 5. **Vite Config:** Ist `base: './'` gesetzt? 6. **DB-Datei:** Wurde die leere `.db`-Datei auf dem Host via `touch` erstellt? --- ## 1. Detaillierte Fehlerlösungen & Code-Vorlagen Dieser Abschnitt enthält die aus der Git-Historie wiederhergestellten "Lessons Learned". ### 1.1 Python: Abhängigkeiten & SDKs (Häufigste Fehlerquelle) **Problem 1: `ModuleNotFoundError` bei geteilten Bibliotheken** - **Fehler:** Eine kleine App stürzt ab, weil sie `helpers.py` importiert, aber nicht alle darin verwendeten Bibliotheken (z.B. `gspread`, `pandas`) in ihrer eigenen `requirements.txt` hat. - **Lösung (in `helpers.py`):** "Exotische" Importe optional machen. ```python try: import gspread GSPREAD_AVAILABLE = True except ImportError: GSPREAD_AVAILABLE = False gspread = None # Wichtig, damit Referenzen nicht fehlschlagen ``` - **Lösung (in `requirements.txt` der App):** Nur die **direkt** für die App benötigten Pakete auflisten. Nicht blind die globale `requirements.txt` kopieren. Für eine typische App sind das oft nur: ```text google-generativeai google-genai Pillow requests beautifulsoup4 ``` **Problem 2: `ImportError` für `Schema` oder `Content`** - **Fehler:** `ImportError: cannot import name 'Schema' from 'google.generativeai.types'` - **Ursache:** Der Code ist für eine neuere Version des `google-generativeai`-SDK geschrieben, aber im Projekt ist eine ältere Version (z.B. `0.3.0`) installiert, in der diese Klassen anders hießen oder nicht existierten. - **Lösung (für Legacy SDKs):** 1. Entferne die direkten Importe für `Schema` und `Content`. 2. Übergebe Konfigurationen wie `generation_config` als einfaches Python-Dictionary. Das alte SDK ist damit zufrieden. **Problem 3: `AttributeError: module 'google.generativeai' has no attribute 'Client'`** - **Ursache:** Der Code verwendet eine veraltete API (`genai.Client`), die im SDK entfernt wurde. - **Lösung:** Den Code auf die moderne `GenerativeModel`-API umstellen. ```python genai.configure(api_key="YOUR_KEY") model = genai.GenerativeModel('gemini-1.5-flash-latest') response = model.generate_content(...) ``` ### 1.2 Frontend: Build-Prozess & Server **Problem 1: `npm run build` schlägt im Docker-Container fehl** - **Ursache:** Wichtige Build-Tools (`vite`, `typescript` etc.) stehen fälschlicherweise in `devDependencies` in der `package.json`. Der Docker-Build installiert diese standardmäßig nicht. - **Lösung:** **Alle** `devDependencies` in die `dependencies` verschieben. **Problem 2: "White Screen" - App lädt nicht** - **Ursache:** Die App wird unter einem Unterpfad (z.B. `/ce/`) bereitgestellt, aber Vite sucht die JS/CSS-Dateien im Root (`/`). - **Lösung (in `vite.config.ts`):** Den Basispfad anpassen. ```typescript export default defineConfig({ base: './', // Zwingt Vite, relative Pfade zu nutzen }); ``` ### 1.3 Docker & Datenbank **Problem 1: `OperationalError: no such table`** - **Ursache:** Die `.db`-Datei wurde zwar mit `touch` erstellt, ist aber leer. Die Tabellen wurden nie initialisiert. - **Lösung:** Die Datenbank-Initialisierung (z.B. `python3 db_manager.py init`) MUSS beim Start des `server.cjs` automatisch ausgeführt werden. ```javascript // In server.cjs am Anfang const { spawn } = require('child_process'); const dbScript = path.join(__dirname, 'gtm_db_manager.py'); // Pfad anpassen spawn('python3', [dbScript, 'init']); ``` **Problem 2: Code-Änderungen werden nicht übernommen ("Geisterfehler")** - **Ursache:** Ein Volume-Mount in `docker-compose.yml` überschreibt die neueren Dateien im Image mit alten, lokalen Dateien. Besonders tückisch, wenn `server.cjs` an die falsche Stelle gemountet wird. - **Lösung:** 1. **Immer `git pull`** auf dem Host ausführen, bevor `docker-compose build` aufgerufen wird. 2. Mount-Pfade präzise setzen. Wenn das Dockerfile `server.cjs` in `/app/server.cjs` kopiert, muss der Mount genau dorthin zeigen: ```yaml volumes: - ./my-app-folder/server.cjs:/app/server.cjs # Korrekt - ./my-app-folder/:/app/my-app-folder/ # Falsch ``` --- *Dokumentation wiederhergestellt und erweitert am 15.01.2026.*