Files
Brancheneinstufung2/market_intel_backend_plan.md
Floke 47cdb88a20 docs: Letzten Stand für heute dokumentieren
Erfasst den erfolgreichen Umstieg auf Docker, der das 'cygrpc'-Problem gelöst hat. Dokumentiert den aktuellen '404 model not found'-Fehler und definiert den nächsten Schritt: das Testen des Modellnamens 'gemini-1.0-pro'.
2025-12-21 02:36:06 +00:00

124 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Plan: Umsetzung des "General Market Intelligence" Backends als Python-Service
Dieses Dokument beschreibt den Plan zur Umsetzung der Backend-Logik für die React-Anwendung unter `/general-market-intelligence` als robusten, faktenbasierten Python-Service. Dieser Ansatz ersetzt die ursprüngliche Idee einer n8n-Migration.
## 1. Zielsetzung & Architektur-Entscheidung
Das primäre Ziel ist die Schaffung eines **transparenten, kontrollierbaren und faktenbasierten Backend-Prozesses**. Die ursprüngliche Implementierung der React-App zeigte Schwankungen in der Ergebnisqualität und mangelnde Nachvollziehbarkeit, da die KI-Aufrufe nicht auf verifizierbaren Daten basierten ("Grounding").
Nach einer Analyse wurde entschieden, von einer n8n-basierten Lösung Abstand zu nehmen und stattdessen einen **dedizierten Python-Service** zu entwickeln.
**Gründe für Python statt n8n:**
- **Maximale Kontrolle & Transparenz:** Ein Python-Skript ermöglicht detailliertes Logging, schrittweises Debugging und die volle Kontrolle über jeden Aspekt der Logik von Web-Scraping bis zu den API-Aufrufen. Dies ist entscheidend, um die Ergebnisqualität sicherzustellen.
- **Nahtlose Projekt-Integration:** Das Python-Skript fügt sich perfekt in die bestehende, Python-basierte Projektstruktur ein und kann auf geteilte Module (`config.py`, `helpers.py`) zugreifen.
- **Robuste Fehlerbehandlung:** Komplexe Fehler- und Wiederholungslogiken lassen sich in Python präziser und robuster implementieren als in einer visuellen Workflow-Engine.
- **Vermeidung von Plattform-Limitierungen:** Wir umgehen technische Hürden wie die eingeschränkte REST-API der selbstgehosteten n8n-Version.
## 2. Architektur: React-Frontend mit Python-Backend
Die Architektur besteht aus drei Kernkomponenten, die in einem Docker-Container gekapselt werden:
1. **React-Frontend (unverändert):** Die bestehende Anwendung in `/general-market-intelligence` bleibt die interaktive Benutzeroberfläche.
2. **Node.js API-Brücke (`server.js`):** Ein minimaler Express.js-Server, der im selben Verzeichnis wie die React-App läuft. Seine einzige Aufgabe ist es, HTTP-Anfragen vom Frontend entgegenzunehmen und sie sicher an das Python-Skript weiterzuleiten.
3. **Python-Orchestrator (`market_intel_orchestrator.py`):** Das Herzstück der Logik. Dieses Kommandozeilen-Skript ist zuständig für:
- Web-Scraping zur Gewinnung von Rohdaten ("Ground Truth").
- Text-Extraktion und -Bereinigung.
- Gezielte und "geerdete" Aufrufe an die Gemini-API.
- Rückgabe der strukturierten Ergebnisse als JSON über die Konsole (stdout).
**Deployment:** Der gesamte Backend-Service (Node.js-Brücke und Python-Skript) wird in einem **Docker-Container** verpackt, um eine konsistente, "immer online" verfügbare Umgebung zu schaffen.
## 3. Kernfunktionen als Python-Module
Die Logik aus `geminiService.ts` wird in Python-Funktionen innerhalb von `market_intel_orchestrator.py` nachgebildet, wobei der Fokus auf Faktenbasiertheit liegt.
---
### Funktion 1: `generate_search_strategy`
- **Trigger:** Aufruf durch die Node.js-Brücke mit `--mode generate_strategy`.
- **Input:** `reference_url` und `context_content` (Strategie-Dokument).
- **Prozess:**
1. **Scraping (Grounding):** Lädt den HTML-Inhalt der `reference_url`.
2. **Text-Extraktion:** Bereinigt das HTML zu sauberem Text.
3. **KI-Analyse:** Ruft die Gemini-API mit einem Prompt auf, der explizit anweist, die digitalen Signale aus dem **bereitgestellten Website-Text** und dem Strategie-Kontext abzuleiten.
- **Output:** Gibt das `SearchStrategy`-JSON auf der Konsole aus.
---
### Funktion 2: `identify_competitors`
- **Trigger:** Aufruf mit `--mode identify_competitors`.
- **Input:** `reference_url` und `target_market`.
- **Prozess:**
1. Ruft die Gemini-API mit einem Google-Search-Tool auf, um ähnliche Unternehmen zu finden.
- **Output:** Gibt eine JSON-Liste der gefundenen Unternehmen aus.
---
### Funktion 3: `run_full_analysis`
- **Trigger:** Aufruf mit `--mode run_analysis`.
- **Input:** Eine Liste von Unternehmensnamen und die zuvor generierte Suchstrategie.
- **Prozess:**
1. Iteriert über die Unternehmensliste.
2. **Für jedes Unternehmen:**
- Sucht die offizielle Website (z.B. über SerpAPI).
- Scrapt die relevanten Seiten basierend auf den `targetPageKeywords` der digitalen Signale.
- Ruft die Gemini-API auf, um die Signale basierend auf dem **gescrapten Inhalt** zu bewerten.
- **Output:** Gibt eine Liste von `AnalysisResult`-Objekten aus.
---
### Funktion 4: `generate_outreach_campaign`
- **Trigger:** Aufruf mit `--mode generate_outreach`.
- **Input:** `company_data` (ein `AnalysisResult`-Objekt), `knowledge_base` (Strategie-Dokument) und `reference_url`.
- **Prozess:**
1. Baut den Prompt für die Erstellung der E-Mail-Kampagne, wobei die **faktenbasierten `dynamicAnalysis`-Ergebnisse** als Kern der Personalisierung dienen.
2. Ruft die Gemini-API auf.
- **Output:** Gibt die `EmailDraft`-Objekte als JSON-Array aus.
## 4. Nächste Schritte (für die nächste Sitzung)
1. Die neuesten Code-Änderungen pullen (`git pull`).
2. Das Docker-Image neu bauen, um die Korrektur zu übernehmen: `docker build -t market-intel-backend .`
3. Den alten Container stoppen/entfernen und den neuen starten: `docker run -p 3001:3001 --name market-intel-backend-instance market-intel-backend`
4. Den React-Dev-Server starten und den End-to-End-Test erneut durchführen.
## 5. Aktueller Status und Debugging-Protokoll (Stand: 2025-12-21 - Ende der Sitzung)
### Status: End-to-End-Kommunikation hergestellt! Nächstes Problem ist API-spezifisch.
Wir haben **erfolgreich** eine Docker-Umgebung eingerichtet, die das hartnäckige `ImportError: cannot import name 'cygrpc' from 'grpc._cython'`-Problem **vollständig löst**. Die Kommunikationskette von der React-App über die Node.js-Brücke zum Python-Skript im Docker-Container funktioniert jetzt fehlerfrei.
**Aktueller Fehler:**
- **Fehler:** `google.api_core.exceptions.NotFound: 404 models/gemini-pro is not found for API version v1beta...`
- **Bedeutung:** Die Python-Umgebung ist jetzt korrekt, aber der API-Aufruf selbst schlägt fehl. Die von der älteren Bibliothek (`google-generativeai==0.4.0`) verwendete API-Version (`v1beta`) findet das Modell `gemini-pro` unter diesem Namen nicht. Dies kann an der API-Version, dem Modellnamen oder dem API-Schlüssel liegen.
### Nächster Schritt (für die nächste Sitzung):
Der erste logische Schritt zur Lösung des `404`-Fehlers wird sein, den Modellnamen in `market_intel_orchestrator.py` auf einen anderen, bekanntermaßen stabilen Namen zu ändern: **`gemini-1.0-pro`**.
---
### Debugging-Historie (gelöste Probleme)
- **Problem:** `ImportError: cannot import name 'cygrpc' from 'grpc._cython'`.
- **Lösung:** Umstieg auf eine vollständig gekapselte **Docker-Umgebung**, in der die Installation der Python-Pakete von Grund auf neu und isoliert erfolgt.
- **Problem:** `TypeError: GenerationConfig.__init__() got an unexpected keyword argument 'response_mime_type'`
- **Lösung:** Entfernen des `generation_config`-Parameters aus dem `model.generate_content`-Aufruf, da die ältere Bibliothek `0.4.0` ihn nicht unterstützt.
- **Problem:** `externally-managed-environment` im Docker-Build.
- **Lösung:** Expliziter Pfad zum `pip`-Executable der venv im `Dockerfile` (`/app/.venv/bin/pip install ...`).
- **Problem:** `TypeError: 'type' object is not subscriptable`.
- **Lösung:** Version von `urllib3` und `requests` auf `1.26.18` bzw. `2.28.2` gepinnt.
- **Problem:** `AttributeError: module 'typing' has no attribute '_SpecialGenericAlias'`.
- **Lösung:** Version von `typing-extensions` auf `4.5.0` gepinnt.
- **Problem:** `ModuleNotFoundError: No module named 'requests'`.
- **Lösung:** `PYTHONPATH` im `spawn`-Befehl in `server.cjs` explizit gesetzt.
- **Problem:** `net::ERR_CONNECTION_REFUSED` in der React-App.
- **Lösung:** API-URL in `geminiService.ts` von `localhost` auf `window.location.hostname` umgestellt.
- **Problem:** `require is not defined in ES module scope` in Node.js.
- **Lösung:** `server.js` in `server.cjs` umbenannt und `package.json` angepasst.
- **Problem:** Diverse Python-Umgebungsprobleme (`ensurepip`, `apt`-Pakete).
- **Lösung:** `python3-venv`, `build-essential`, `python3-dev` installiert und eine virtuelle Umgebung (`venv`) eingerichtet.