Files
Brancheneinstufung2/BUILDER_APPS_MIGRATION.md

22 KiB

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.
    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:
    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.
    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.
    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.
    // 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:
      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

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

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)

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)

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)

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)

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)

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)

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

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.