22 KiB
Migration Guide: Google AI Builder Apps -> Local Docker Stack
CRITICAL WARNINGS & BEST PRACTICES (READ BEFORE MIGRATION):
- DIE GOLDENE REGEL DER STRINGS: Nutze NIEMALS
f"""..."""für komplexe Prompts oder Listen-Operationen mit verschachtelten Keys. Es führt unweigerlich zuSyntaxError: unterminated string literal. Nutze AUSSCHLIESSLICH Triple Raw Quotes (r"""...""") und die.format()Methode.- SDK WAHL (DUAL SDK): Das moderne
google-genaiist gut, aber das Legacygoogle-generativeaiist oft stabiler für reinen Text (gemini-2.0-flash). Nutze die "Dual SDK Strategy", um beide je nach Bedarf zu verwenden.- 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.
- 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)
- SDKs: Stehen
google-genaiUNDgoogle-generativeaiin derrequirements.txt? - Prompts: Sind alle Prompts als
r"""...""".format()angelegt? - Grounding: Wird vor dem KI-Call die Webseite der Firma gescrapt?
- Package.json: Sind Build-Tools (
vite,typescript) independencies(NICHTdevDependencies)? - Vite Config: Ist
base: './'gesetzt? - DB-Datei: Wurde die leere
.db-Datei auf dem Host viatoucherstellt?
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.pyimportiert, aber nicht alle darin verwendeten Bibliotheken (z.B.gspread,pandas) in ihrer eigenenrequirements.txthat. - 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.txtder App): Nur die direkt für die App benötigten Pakete auflisten. Nicht blind die globalerequirements.txtkopieren. 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):
- Entferne die direkten Importe für
SchemaundContent. - Übergebe Konfigurationen wie
generation_configals einfaches Python-Dictionary. Das alte SDK ist damit zufrieden.
- Entferne die direkten Importe für
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,typescriptetc.) stehen fälschlicherweise indevDependenciesin derpackage.json. Der Docker-Build installiert diese standardmäßig nicht. - Lösung: Alle
devDependenciesin diedependenciesverschieben.
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 mittoucherstellt, ist aber leer. Die Tabellen wurden nie initialisiert. - Lösung: Die Datenbank-Initialisierung (z.B.
python3 db_manager.py init) MUSS beim Start desserver.cjsautomatisch 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, wennserver.cjsan die falsche Stelle gemountet wird. - Lösung:
- Immer
git pullauf dem Host ausführen, bevordocker-compose buildaufgerufen wird. - Mount-Pfade präzise setzen. Wenn das Dockerfile
server.cjsin/app/server.cjskopiert, muss der Mount genau dorthin zeigen:volumes: - ./my-app-folder/server.cjs:/app/server.cjs # Korrekt - ./my-app-folder/:/app/my-app-folder/ # Falsch
- Immer
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:
-
company_name:- Beschreibung: Der Name des zu analysierenden Zielunternehmens.
- Inhalt: Ein String mit dem Firmennamen.
-
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.
-
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.jsongeladen oder auf["Sonstige"]zurückgesetzt.
-
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_promptsabgerufen. - 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. ...
- 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 (
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.
- Beschreibung: Der vereinfachte HTML-Inhalt, der von der Hauptseite und relevanten Unterseiten des Unternehmens gescrapt wurde, mit
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.
- Beschreibung: Die formatierte Markdown-Ausgabe von
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 1undSchritt 2. - Inhalt: Ein mehrzeiliger Markdown-String.
- Beschreibung: Die formatierte Markdown-Ausgabe von
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 1bisSchritt 3. - Inhalt: Ein mehrzeiliger Markdown-String.
- Beschreibung: Die formatierte Markdown-Ausgabe von
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 1bisSchritt 4. - Inhalt: Ein mehrzeiliger Markdown-String.
- Beschreibung: Die formatierte Markdown-Ausgabe von
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 1bisSchritt 5. - Inhalt: Ein mehrzeiliger Markdown-String.
- Beschreibung: Die formatierte Markdown-Ausgabe von
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 1bisSchritt 6. - Inhalt: Ein mehrzeiliger Markdown-String.
- Beschreibung: Die formatierte Markdown-Ausgabe von
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.