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.
This commit is contained in:
93
n8n_migration_plan.md
Normal file
93
n8n_migration_plan.md
Normal file
@@ -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.
|
||||||
85
n8n_workflow_identifyCompetitors.json
Normal file
85
n8n_workflow_identifyCompetitors.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user