From 8260d0865f7e06a1060ff11feabf82b682816717 Mon Sep 17 00:00:00 2001 From: Floke Date: Sat, 20 Dec 2025 22:00:29 +0000 Subject: [PATCH] feat: Plan and define n8n hybrid migration - Add detailed plan for migrating market intelligence logic to n8n using a hybrid approach. - Define the first n8n workflow 'identifyCompetitors' as a JSON file for import. --- n8n_migration_plan.md | 93 +++++++++++++++++++++++++++ n8n_workflow_identifyCompetitors.json | 85 ++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 n8n_migration_plan.md create mode 100644 n8n_workflow_identifyCompetitors.json diff --git a/n8n_migration_plan.md b/n8n_migration_plan.md new file mode 100644 index 00000000..019006e3 --- /dev/null +++ b/n8n_migration_plan.md @@ -0,0 +1,93 @@ +# Plan zur Migration des "General Market Intelligence" Skripts nach n8n (Hybrid-Ansatz) + +Dieses Dokument beschreibt den Plan zur Nachbildung der Funktionalität der React-Anwendung unter `/general-market-intelligence` als Backend-Logik in der Automatisierungsplattform n8n. + +## 1. Zielsetzung (Hybrid-Ansatz) + +Das Ziel ist die **Auslagerung der Kernlogik** (insbesondere der Gemini API-Aufrufe) aus der React-Anwendung in n8n-Workflows. Dies erhöht die **Transparenz, Kontrolle und Stabilität** der Ergebnisse. + +- Die **bestehende React-Anwendung bleibt als interaktives Frontend** für die Benutzerführung und Datenvisualisierung erhalten. +- **n8n fungiert als reines Backend-API**, das von der React-Anwendung aufgerufen wird, um die rechenintensiven Aufgaben auszuführen. + +Dieser Ansatz kombiniert das Beste aus beiden Welten: eine reaktionsschnelle, benutzerfreundliche Oberfläche und ein robustes, leicht anpassbares Backend. + +## 2. Analyse der Kernfunktionalität + +Die bestehende Anwendung führt fünf Hauptschritte aus, die nun als separate, aufrufbare n8n-Workflows modelliert werden: + +1. **Strategie-Erstellung:** Generiert eine Suchstrategie aus einem Strategie-Dokument und einer Referenz-URL. +2. **Lead-Identifizierung:** Findet ähnliche Unternehmen basierend auf der Referenz-URL. +3. **Manuelle Überprüfung:** **Dieser Schritt verbleibt vollständig im React-Frontend.** Die App zeigt die Liste an und ermöglicht die Kuratierung. +4. **Tiefenanalyse:** Analysiert die vom Nutzer kuratierte Liste von Unternehmen. +5. **Kampagnen-Erstellung:** Generiert personalisierte E-Mail-Entwürfe. + +## 3. Hybrid-Architektur: Zusammenspiel von React & n8n + +Die Kommunikation zwischen Frontend und Backend erfolgt über Webhooks: + +1. **n8n-Workflows als API-Endpunkte:** Jeder Kernprozess wird als eigener n8n-Workflow mit einem **Webhook-Trigger** erstellt. Dieser Trigger stellt eine einzigartige URL bereit, die auf Anfragen wartet. +2. **React-App als Client:** Die Funktionen in der `geminiService.ts`-Datei der React-App werden so angepasst, dass sie nicht mehr direkt die Gemini-API, sondern die entsprechenden n8n-Webhook-URLs aufrufen (mittels `fetch` oder `axios`). +3. **Datenfluss (Beispiel):** + - Der Nutzer lädt in der React-App eine Strategie-Datei hoch und klickt auf "Strategie erstellen". + - Die React-App sendet den Dateiinhalt und die Referenz-URL per `POST`-Request an den n8n-Webhook für die Strategie-Erstellung. + - Der n8n-Workflow wird ausgelöst, führt den Gemini-Call aus und sendet das Ergebnis (das `SearchStrategy`-JSON) als Antwort auf den Webhook-Request zurück. + - Die React-App empfängt die JSON-Antwort und zeigt dem Nutzer den nächsten Schritt an. + +## 4. Benötigte n8n-Workflows (API-Endpunkte) + +Die folgenden Workflows müssen in n8n erstellt werden, um die Logik aus `geminiService.ts` abzubilden. + +--- + +### Workflow 1: `generateSearchStrategy` + +- **Trigger:** `Webhook` (erwartet `POST`-Request) +- **Input (JSON Body):** `{ "referenceUrl": "...", "contextContent": "..." }` +- **Aktion:** + 1. Nimmt die Eingabedaten entgegen. + 2. Baut den Prompt für die Strategie-Generierung. + 3. Ruft den `Gemini`-Knoten auf. +- **Output:** `Respond to Webhook`-Knoten, der das `SearchStrategy` JSON-Objekt zurückgibt. + +--- + +### Workflow 2: `identifyCompetitors` + +- **Trigger:** `Webhook` (erwartet `POST`-Request) +- **Input (JSON Body):** `{ "referenceUrl": "...", "targetMarket": "..." }` +- **Aktion:** + 1. Baut den Prompt zur Identifizierung von Wettbewerbern. + 2. Ruft den `Gemini`-Knoten auf. +- **Output:** `Respond to Webhook`-Knoten, der die Liste der gefundenen Unternehmen als JSON-Array zurückgibt. + +--- + +### Workflow 3: `runFullAnalysis` + +Dieser Workflow führt die Tiefenanalyse für eine ganze Liste von Unternehmen durch. + +- **Trigger:** `Webhook` (erwartet `POST`-Request) +- **Input (JSON Body):** `{ "strategy": { ... }, "companies": [ { "name": "..." }, ... ] }` +- **Aktion:** + 1. Nutzt den `Loop Over Items`-Knoten, um über die `companies`-Liste zu iterieren. + 2. **Innerhalb des Loops:** Ruft für jedes Unternehmen den `Gemini`-Knoten mit dem Prompt für die Tiefenanalyse (`analyzeCompanyWithStrategy`) auf. + 3. Sammelt die Ergebnisse aller Iterationen. +- **Output:** `Respond to Webhook`-Knoten, der eine vollständige Liste von `AnalysisResult`-Objekten als JSON zurückgibt. + +--- + +### Workflow 4: `generateOutreachCampaign` + +- **Trigger:** `Webhook` (erwartet `POST`-Request) +- **Input (JSON Body):** `{ "companyData": { ... }, "knowledgeBase": "...", "referenceUrl": "..." }` +- **Aktion:** + 1. Baut den Prompt für die Erstellung der E-Mail-Kampagne. + 2. Ruft den `Gemini`-Knoten auf. +- **Output:** `Respond to Webhook`-Knoten, der die `EmailDraft`-Objekte als JSON-Array zurückgibt. + +## 5. Nächste Schritte + +1. **Umsetzung in n8n:** Erstellen der vier beschriebenen Workflows, beginnend mit `generateSearchStrategy`. +2. **Anpassung der React-App:** Modifizieren der `geminiService.ts`, um die `fetch`-Aufrufe auf die neuen n8n-Webhook-URLs umzuleiten. +3. **Konfiguration:** Die URLs der n8n-Webhooks müssen in der React-Anwendung als Umgebungsvariablen (`.env.local`) konfiguriert werden, um Flexibilität zwischen Entwicklungs- und Produktionsumgebungen zu gewährleisten. +4. **Sicherheit:** Absicherung der n8n-Webhooks, z.B. durch einen geheimen Header-Parameter, um unbefugte Aufrufe zu verhindern. diff --git a/n8n_workflow_identifyCompetitors.json b/n8n_workflow_identifyCompetitors.json new file mode 100644 index 00000000..2668b24a --- /dev/null +++ b/n8n_workflow_identifyCompetitors.json @@ -0,0 +1,85 @@ +{ + "name": "Market Intelligence: Identify Competitors", + "nodes": [ + { + "parameters": { + "path": "identify-competitors", + "options": {} + }, + "name": "Start", + "type": "n8n-nodes-base.webhook", + "typeVersion": 1, + "position": [ + 800, + 300 + ], + "webhookId": "identify-competitors" + }, + { + "parameters": { + "model": "gemini-pro", + "prompt": "Goal: Identify 10 DIRECT COMPETITORS or LOOKALIKES for the company found at URL: \"{{$json.body.referenceUrl}}\" in \"{{$json.body.targetMarket}}\".\n\nOUTPUT LANGUAGE: {{$json.body.language === 'de' ? 'German' : 'English'}}.\n\nRules:\n1. Focus on the same business model (e.g. Retailer vs Retailer, Brand vs Brand).\n2. Exclude the reference company itself.\n\nReturn ONLY a valid JSON array of objects, where each object has the keys \"name\", \"url\", and \"description\". Example: [{ \"name\": \"...\", \"url\": \"...\", \"description\": \"...\" }]", + "options": { + "responseFormat": "json" + } + }, + "name": "Identify Competitors", + "type": "n8n-nodes-base.googleGemini", + "typeVersion": 1, + "position": [ + 1020, + 300 + ], + "credentials": { + "googleGeminiApi": { + "id": "YOUR_GEMINI_CREDENTIAL_ID", + "name": "Google Gemini API" + } + } + }, + { + "parameters": { + "options": {} + }, + "name": "Respond to Webhook", + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1, + "position": [ + 1240, + 300 + ] + } + ], + "connections": { + "Start": { + "main": [ + [ + { + "node": "Identify Competitors", + "type": "main", + "index": 0 + } + ] + ] + }, + "Identify Competitors": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": true, + "settings": {}, + "tags": [ + { + "id": "1", + "name": "Market Intelligence" + } + ] +} \ No newline at end of file