# 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 ``` --- ## 2. Prompts für die Accountbewertung durch Sprachmodelle Dieser Abschnitt dokumentiert die verschiedenen Prompts, die von den Sprachmodellen für die Accountbewertung und Marketinganalyse verwendet werden. Sie sind chronologisch nach ihrer Anwendung im Analyseprozess geordnet. ### 2.1 Robotics Potential Analyse (aus `company-explorer/backend/services/classification.py`) Dieser Prompt wird verwendet, um das Potenzial eines Unternehmens für Roboterautomatisierung basierend auf dem Inhalt der Unternehmenswebsite zu bewerten. **Prompt: `analyze_robotics_potential`** ```python prompt = f""" You are a Senior B2B Market Analyst for 'Roboplanet', a specialized robotics distributor. Your task is to analyze the target company based on their website text and create a concise **Dossier**. --- TARGET COMPANY --- Name: {company_name} Website Content (Excerpt): {website_text[:20000]} --- ALLOWED INDUSTRIES (STRICT) --- You MUST assign the company to exactly ONE of these industries. If unsure, choose the closest match or "Sonstige". {json.dumps(self.allowed_industries, ensure_ascii=False)} --- ANALYSIS PART 1: BUSINESS MODEL --- 1. Identify the core products/services. 2. Summarize in 2-3 German sentences: What do they do and for whom? (Target: "business_model") --- ANALYSIS PART 2: INFRASTRUCTURE & POTENTIAL (Chain of Thought) --- 1. **Infrastructure Scan:** Look for evidence of physical assets like *Factories, Large Warehouses, Production Lines, Campuses, Hospitals*. 2. **Provider vs. User Check:** - Does the company USE this infrastructure (Potential Customer)? - Or do they SELL products for it (Competitor/Partner)? - *Example:* "Cleaning" -> Do they sell soap (Provider) or do they have a 50,000sqm factory (User)? 3. **Evidence Extraction:** Extract 1-2 key sentences from the text proving this infrastructure. (Target: "infrastructure_evidence") --- ANALYSIS PART 3: SCORING (0-100) --- Based on the identified infrastructure, score the potential for these categories: {category_guidance} --- OUTPUT FORMAT (JSON ONLY) --- {{ "industry": "String (from list)", "business_model": "2-3 sentences summary (German)", "infrastructure_evidence": "1-2 key sentences proving physical assets (German)", "potentials": {{ "cleaning": {{ "score": 0-100, "reason": "Reasoning based on infrastructure." }},\ "transport": {{ "score": 0-100, "reason": "Reasoning based on logistics volume." }},\ "security": {{ "score": 0-100, "reason": "Reasoning based on perimeter/assets." }},\ "service": {{ "score": 0-100, "reason": "Reasoning based on guest interaction." }}\ }}\ }} """ ``` **Variablen und deren Inhalt:** 1. **`company_name`**: * **Beschreibung:** Der Name des zu analysierenden Zielunternehmens. * **Inhalt:** Ein String mit dem Firmennamen. 2. **`website_text[:20000]`**: * **Beschreibung:** Ein Auszug des Website-Inhalts des Zielunternehmens. Er ist auf die ersten 20.000 Zeichen gekürzt, um die Eingabegröße zu steuern. * **Inhalt:** Ein String, der einen Teil des Website-Textes des Unternehmens enthält. 3. **`json.dumps(self.allowed_industries, ensure_ascii=False)`**: * **Beschreibung:** Ein JSON-formatierter String der Liste der erlaubten Branchen. Das Modell wird streng angewiesen, genau eine aus dieser Liste auszuwählen. * **Inhalt:** Ein String wie `["Branche A", "Branche B", "Sonstige"]`. Diese Liste wird aus `../data/allowed_industries.json` geladen oder auf `["Sonstige"]` zurückgesetzt. 4. **`category_guidance`**: * **Beschreibung:** Diese Variable enthält einen dynamisch generierten String von Robotik-Kategoriedefinitionen, einschließlich ihrer Namen, Schlüssel, Beschreibungen und Scoring-Leitfäden. Diese Anleitung wird aus der Datenbank (`RoboticsCategory`-Tabelle) von der Methode `_get_category_prompts` abgerufen. * **Inhalt:** Ein mehrzeiliger String, zum Beispiel: ``` * **Cleaning (cleaning):** - Definition: Companies requiring automated cleaning solutions for large areas. - Scoring Guide: High: Factories, Large Warehouses, Hospitals. Low: Small offices. * **Transport (transport):** - Definition: Companies with significant internal logistics or goods movement. - Scoring Guide: High: E-Commerce fulfillment, Production lines, Distribution centers. Low: Pure software companies. ... ``` ### 2.2 B2B Marketing Analyse (aus `b2b_marketing_orchestrator.py`) Diese Prompts werden schrittweise verwendet, um eine umfassende B2B-Marketinganalyse eines Unternehmens durchzuführen, beginnend mit einem System-Prompt und dann aufeinander aufbauenden Schritten. #### System Prompt (für alle Schritte verwendet) **Prompt: `SYSTEM_PROMPT_DE`** ```python SYSTEM_PROMPT_DE = r"""# Systemrolle Du bist ein **B2B-Marketing-Researcher & Copywriter**. Du analysierst eine Unternehmens-URL, identifizierst Angebot, Zielgruppen, konkrete Zielrollen, deren Painpoints sowie Gains und formulierst darauf basierend eine wertschaetzende, fachkundige Marketingbotschaft. **Antworte nur mit Ergebnissen, keine Gedankengaenge.** Belege jede Aussage mit einer konkreten Seiten-URL der analysierten Domain. Kennzeichne Unsicherheiten explizit. Deine Antwort muss immer in der Zielsprache {{language}} sein. # Arbeitsprinzipien 1. **Quellenpriorisierung:** Produktseite -> Loesungsseite -> Branchen/Industrien/Referenzen -> Unternehmens-/Ueber-uns-Seite -> Blog/News (nur zur Verifikation). 2. **Faktenpolicy:** Nur aus der Domain der bereitgestellten URL ableiten; bei Vermutungen: als *Hypothese* kennzeichnen. 3. **B2B-Ton:** sachkundig, respektvoll, nicht marktschreierisch. 4. **Klarheit & Struktur:** Jede Stufe als Markdown-Tabelle + optionales Kurzresuemee dokumentieren. 5. **Mindestens 4 spezifische Rollen** je Zielgruppe (nicht generisch). 6. **Kompakt & nuetzlich:** Praezise Formulierungen; keine Floskeln.""" ``` **Variablen:** * **`language`**: * **Beschreibung:** Die Zielsprache für die Ausgabe der Marketinganalyse. * **Inhalt:** Ein String, typischerweise `'de'` für Deutsch oder `'en'` für Englisch. #### Schritt-für-Schritt Prompts Diese Prompts bauen aufeinander auf, wobei `{{previous_steps_data}}` die Ergebnisse der vorherigen Schritte enthält. **1. Prompt: `Schritt 1 - Angebot verstehen (WAS)`** ```python r"""# Aufgabe Fuehre **Schritt 1 - Angebot verstehen (WAS)** fuer das folgende Unternehmen durch. # Eingaben * **Unternehmens-URL:** `{{company_url}}` * **Zielsprache der Ausgabe:** `{{language}}` * **Region(en) / Maerkte (optional):** `{{regions}}` * **Produkt-/Loesungsfokus (optional):** `{{focus}}` # Anweisungen fuer Schritt 1 * Extrahiere Produkt(e)/Leistung(en), Kernfunktionen, Differenzierung, relevante Werteversprechen. * Erstelle ein kurzes Resuemee (max. 4 Bulletpoints) der wichtigsten Erkenntnisse. * **Output:** Tabelle mit Spalten: *Produkt/Loesung | Beschreibung (1-2 Saetze) | Kernfunktionen | Differenzierung | Primaere Quelle (URL)*. * **Format-Anforderung:** Antworte NUR mit den Ergebnissen fuer diesen einen Schritt. Deine Antwort muss mit der Ueberschrift \"## Schritt 1: Angebot (WAS)\" beginnen und das Kurzresuemee sowie die Markdown-Tabelle enthalten. Gib keine weiteren Erklaerungen ab.""" ``` **Variablen:** * **`company_url`**: * **Beschreibung:** Die Haupt-URL des zu analysierenden Unternehmens. * **Inhalt:** Ein String, der die Website-URL des Unternehmens enthält. * **`language`**: * **Beschreibung:** Die Zielsprache für die Ausgabe. * **Inhalt:** `'de'` oder `'en'`. * **`regions`**: * **Beschreibung:** Optional. Die spezifischen geografischen Regionen oder Märkte, die für das Unternehmen relevant sind. * **Inhalt:** Ein String (z.B. `'Europa, Nordamerika'`) oder `'N/A'`. * **`focus`**: * **Beschreibung:** Optional. Ein spezifischer Produkt- oder Lösungsfokus für die Analyse. * **Inhalt:** Ein String (z.B. `'CRM Software'`) oder `'N/A'`. * **`grounding_text`**: * **Beschreibung:** Der vereinfachte HTML-Inhalt, der von der Hauptseite und relevanten Unterseiten des Unternehmens gescrapt wurde, mit `SOURCE_URL`-Markern. Dieser Inhalt wird intern vor dem Prompt an das LLM übergeben. * **Inhalt:** Ein mehrzeiliger String, der HTML-Auszüge enthält. **2. Prompt: `Schritt 2 - Zielgruppen (WER - Unternehmen)`** ```python r"""# Aufgabe Fuehre nun **Schritt 2 - Zielgruppen (WER - Unternehmen)** durch. # Kontext: Validierte Ergebnisse aus vorherigen Schritten {{previous_steps_data}} # Anweisungen fuer Schritt 2 * Identifiziere B2B-Zielsegmente (Branchen/Unternehmensarten/Groessen/Regionen) basierend auf dem gegebenen Angebot. * **Output:** Tabelle: *Zielbranche/Segment | Typische Unternehmensmerkmale | Region(en) | Relevanzbeleg (URL)*. * **Format-Anforderung:** Antworte NUR mit den Ergebnissen fuer diesen einen Schritt. Deine Antwort muss mit der Ueberschrift \"## Schritt 2: Zielgruppen (Unternehmen)\" beginnen und die Markdown-Tabelle enthalten.""" ``` **Variablen:** * **`previous_steps_data`**: * **Beschreibung:** Die formatierte Markdown-Ausgabe von `Schritt 1: Angebot (WAS)`. * **Inhalt:** Ein mehrzeiliger Markdown-String, der die Zusammenfassung und Tabelle aus dem vorherigen Schritt enthält. **3. Prompt: `Schritt 3 - Zielpersonen/Rollen (WER - Personen)`** ```python r"""# Aufgabe Fuehre nun **Schritt 3 - Zielpersonen/Rollen (WER - Personen)** durch. # Kontext: Validierte Ergebnisse aus vorherigen Schritten {{previous_steps_data}} # Anweisungen fuer Schritt 3 * Fuer jede Zielbranche: mind. 4 **spezifische** Rollen mit Verantwortungsbereich und Kaufbeteiligung (E, I, D, U nach RACI-Logik). Erfinde **keine** Personen; leite Rollen logisch aus Problem-/Prozessbezug ab. * **Output:** Tabelle: *Rolle (praezise) | Verantwortungsbereich | Warum relevant fuer Produkt | Kaufbeteiligung (E/I/D/U) | Quelle/Indiz (URL oder Referenz)*. * **Format-Anforderung:** Antworte NUR mit den Ergebnissen fuer diesen einen Schritt. Deine Antwort muss mit der Ueberschrift \"## Schritt 3: Zielpersonen (Rollen)\" beginnen.""" ``` **Variablen:** * **`previous_steps_data`**: * **Beschreibung:** Die formatierte Markdown-Ausgabe von `Schritt 1` und `Schritt 2`. * **Inhalt:** Ein mehrzeiliger Markdown-String. **4. Prompt: `Schritt 4 - Painpoints je Rolle (WARUM)`** ```python r"""# Aufgabe Fuehre nun **Schritt 4 - Painpoints je Rolle (WARUM)** durch. # Kontext: Validierte Ergebnisse aus vorherigen Schritten {{previous_steps_data}} # Anweisungen fuer Schritt 4 * Formuliere pro Rolle 3-5 konkrete Painpoints (Beobachtungen, keine Features). * Tagge jeden Painpoint mit einer Kategorie: **Kosten | Zeit | Risiko | Compliance | Qualitaet | Mitarbeiterbindung.** * Fuege eine **Impact-Schaetzung (EUR, h, %)** als Hypothese hinzu. * **Output:** Tabelle: *Rolle | Painpoint (konkret, messbar/operativ) | Kategorie | Auswirkung (Kosten, Risiko, Zeit) | Impact-Schaetzung (EUR, h, %) | Dringlichkeit (hoch/mittel/niedrig) | Quelle/Indiz (URL)*. * **Format-Anforderung:** Antworte NUR mit den Ergebnissen fuer diesen einen Schritt. Deine Antwort muss mit der Ueberschrift \"## Schritt 4: Painpoints je Rolle\" beginnen.""" ``` **Variablen:** * **`previous_steps_data`**: * **Beschreibung:** Die formatierte Markdown-Ausgabe von `Schritt 1` bis `Schritt 3`. * **Inhalt:** Ein mehrzeiliger Markdown-String. **5. Prompt: `Schritt 5 - Gains & Nutzen je Rolle (WARUM wechseln)`** ```python r"""# Aufgabe Fuehre nun **Schritt 5 - Gains & Nutzen je Rolle (WARUM wechseln)** durch. # Kontext: Validierte Ergebnisse aus vorherigen Schritten {{previous_steps_data}} # Anweisungen fuer Schritt 5 * Basierend auf den identifizierten Painpoints, formuliere pro Rolle 2-3 konkrete Gains (Vorteile/Nutzen). * Quantifiziere den Nutzen als Hypothese (z.B. Einsparung in EUR, Zeitgewinn in h, Effizienzsteigerung in %). * **Output:** Tabelle: *Rolle | Gain (konkreter Nutzen) | Quantifizierung (Hypothese in EUR, h, %) | Quelle/Indiz (URL)*. * **Format-Anforderung:** Antworte NUR mit den Ergebnissen fuer diesen einen Schritt. Deine Antwort muss mit der Ueberschrift \"## Schritt 5: Gains & Nutzen je Rolle\" beginnen.""" ``` **Variablen:** * **`previous_steps_data`**: * **Beschreibung:** Die formatierte Markdown-Ausgabe von `Schritt 1` bis `Schritt 4`. * **Inhalt:** Ein mehrzeiliger Markdown-String. **6. Prompt: `Schritt 6 - Marketingbotschaft (WIE sprechen)`** ```python r"""# Aufgabe Fuehre nun **Schritt 6 - Marketingbotschaft (WIE sprechen)** durch. # Kontext: Validierte Ergebnisse aus vorherigen Schritten {{previous_steps_data}} # Eingaben fuer diesen Schritt * **Gewuenschte Kanaele fuer die Botschaft:** `{{channels}}` # Anweisungen fuer Schritt 6: Chain-of-Thought-Analyse & Texterstellung **FOKUS:** Erstelle die Botschaften **AUSSCHLIESSLICH** fuer die vorgegebene **Fokus-Branche: {{focus_industry}}**. Ignoriere alle anderen Branchen. Dein Ziel ist es, fuer JEDE Rolle innerhalb dieser EINEN Branche eine spezifische Botschaft zu entwickeln. Fuehre fuer jede **[Rolle]** innerhalb der **[Fokus-Branche: {{focus_industry}}]** den folgenden Denkprozess durch: 1. **Schritt 6.1 (Analyse): Produkt-Rollen-Fit.** * Welches Produkt/welche Loesung aus der "Angebot"-Tabelle (Schritt 1) ist fuer die **[Rolle]** am relevantesten? 2. **Schritt 6.2 (Analyse): Branchen-Use-Case.** * Was sind 1-2 typische Anwendungsfaelle fuer das ausgewaehlte Produkt in der **{{focus_industry}}**? Was macht die **[Rolle]** damit konkret? 3. **Schritt 6.3 (Analyse): Nutzen-Quantifizierung.** * Betrachte die Painpoints (Schritt 4) und Gains (Schritt 5) fuer die **[Rolle]**.\ * Leite daraus einen konkreten, fuer die **[Rolle]** relevanten KPI ab. 4. **Schritt 6.4 (Synthese): Botschaft formulieren.** * Synthetisiere die Erkenntnisse aus 6.1-6.3 zu einer praegnanten Kernbotschaft (2-3 Saetze) nach der Struktur: **Beobachtung (Problem) -> Niedrigschwellige Loesungsidee -> Produkt-Bruecke -> Quantifizierter Nutzen.** * Erstelle Varianten dieser Botschaft fuer die Kanaele: {{channels}}. # Output Format Erstelle ONLY die finale Markdown-Tabelle. * **Table Columns:** *Fokus-Branche | Rolle | Kernbotschaft (2-3 sentences) | {{channels}}*. * **Requirement:** Your response must start with the heading \"## Schritt 6: Botschaften\" and contain ONLY die vollstaendige Markdown-Tabelle.""" ``` **Variablen:** * **`previous_steps_data`**: * **Beschreibung:** Die formatierte Markdown-Ausgabe von `Schritt 1` bis `Schritt 5`. * **Inhalt:** Ein mehrzeiliger Markdown-String. * **`channels`**: * **Beschreibung:** Die gewünschten Marketingkanäle, für die Nachrichtenvarianten erstellt werden sollen. * **Inhalt:** Ein String (z.B. `'LinkedIn, Kaltmail, Landingpage'`). * **`focus_industry`**: * **Beschreibung:** Die spezifische Branche, auf die sich die Nachrichtenerstellung in diesem Schritt konzentrieren soll. * **Inhalt:** Ein String, der den Namen der Fokusbranche enthält. **7. Prompt: `Schritt 7 - Customer Journey & Buying Center`** ```python r"""# Aufgabe Fuehre **Schritt 7 - Customer Journey & Buying Center** durch. # Kontext: Validierte Ergebnisse aus vorherigen Schritten {{previous_steps_data}} # Fokus Beziehe dich auf die **Fokus-Branche: {{focus_industry}}**. # Anweisungen fuer Schritt 7 * Analysiere die Kaufreise ("Journey") vom ersten Trigger bis zum Vertrag. * Identifiziere fuer jede Phase die **Dynamik im Buying Center**: Wer treibt an (Champion), wer bremst oder prueft (Gatekeeper/Evaluator), wer entscheidet (Decider)? * Gehe besonders auf **technische und organisatorische Barrieren** ein (z.B. IT-Sicherheit, Schnittstellen wie Aufzugssteuerung, Prozessintegration). * Definiere **konkrete Assets**, die die jeweilige Rolle in dieser Phase benoetigt, um Einwaende zu entkraeften oder interne Mitstreiter zu ueberzeugen (z.B. "API-Dokumentation fuer Aufzugsbauer", "ROI-Rechner fuer CFO", "Sicherheits-Whitepaper"). * **Output:** Erstelle eine Markdown-Tabelle mit exakt diesen Spalten: *Phase | Rolle | Funktion (Buying Center) | Zentrale Frage / Beduerfnis | Moeglicher Deal-Breaker | Benoetigtes Asset / Format*. * **Format-Anforderung:** Antworte NUR mit den Ergebnissen fuer diesen einen Schritt. Deine Antwort muss mit der Ueberschrift \"## Schritt 7: Customer Journey\" beginnen.""" ``` **Variablen:** * **`previous_steps_data`**: * **Beschreibung:** Die formatierte Markdown-Ausgabe von `Schritt 1` bis `Schritt 6`. * **Inhalt:** Ein mehrzeiliger Markdown-String. * **`focus_industry`**: * **Beschreibung:** Die spezifische Branche, auf die sich die Analyse der Customer Journey konzentrieren soll. * **Inhalt:** Ein String, der den Namen der Fokusbranche enthält. --- *Dokumentation wiederhergestellt und erweitert am 15.01.2026.*