feat(trading-twins): Finalize Booking Engine & Infrastructure [31988f42]
- Implemented 'Direct Calendar Booking' logic replacing MS Bookings API. - Integrated Dual-App architecture for Graph API (Sender vs. Reader permissions). - Added FastAPI feedback server for Teams and Email interactions. - Configured Nginx proxy for public feedback URL access. - Updated Docker configuration (ports, env vars, dependencies). - Finalized documentation in lead-engine/README.md.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Lead Engine: Multi-Source Automation v1.2 [31988f42]
|
||||
# Lead Engine: Multi-Source Automation v1.3 [31988f42]
|
||||
|
||||
## 🚀 Übersicht
|
||||
Die **Lead Engine** ist ein spezialisiertes Modul zur autonomen Verarbeitung von B2B-Anfragen aus verschiedenen Quellen. Sie fungiert als Brücke zwischen dem E-Mail-Postfach und dem **Company Explorer**, um innerhalb von Minuten hochgradig personalisierte Antwort-Entwürfe auf "Human Expert Level" zu generieren.
|
||||
@@ -29,18 +29,21 @@ Die **Lead Engine** ist ein spezialisiertes Modul zur autonomen Verarbeitung von
|
||||
* **Status-Tracking:** Visueller Indikator (🆕/✅) für den Synchronisations-Status mit dem Company Explorer.
|
||||
* **Low-Quality-Warnung:** Visuelle Kennzeichnung (⚠️) von Leads mit Free-Mail-Adressen oder ohne Firmennamen direkt in der Übersicht.
|
||||
|
||||
### 6. Trading Twins Autopilot (NEU v2.0)
|
||||
### 6. Trading Twins Autopilot (PRODUKTIV v2.0)
|
||||
Der vollautomatische "Zero Touch" Workflow für Trading Twins Anfragen.
|
||||
|
||||
* **Human-in-the-Loop:** Vor Versand erhält Elizabeta Melcer eine Teams-Nachricht ("Approve/Deny").
|
||||
* **5-Minuten-Timeout:** Erfolgt keine Reaktion, wird die E-Mail automatisch versendet.
|
||||
* **Smart Calendar:**
|
||||
* **Faktor-3-Überbuchung:** Termine werden bis zu 3x parallel angeboten, um den Kalender dicht zu füllen.
|
||||
* **Soft-Blocking:** Interne Datenbank verhindert Doppelbuchungen über den Faktor 3 hinaus.
|
||||
* **Human-in-the-Loop:** Vor Versand erhält Elizabeta Melcer eine Teams-Nachricht ("Approve/Deny") via Adaptive Card.
|
||||
* **Feedback-Server:** Ein integrierter FastAPI-Server (Port 8004) verarbeitet die Klicks aus Teams und gibt sofortiges visuelles Feedback.
|
||||
* **Direct Calendar Booking (Eigener Service):**
|
||||
* **Problem:** MS Bookings API lässt sich nicht per Application Permission steuern (Erstellung verboten).
|
||||
* **Lösung:** Wir haben einen eigenen Micro-Booking-Service gebaut.
|
||||
* **Ablauf:** Das System prüft echte freie Slots im Kalender von `e.melcer` (via Graph API).
|
||||
* **E-Mail:** Der Kunde erhält eine E-Mail mit zwei konkreten Terminvorschlägen (Links).
|
||||
* **Buchung:** Klick auf einen Link -> Server bestätigt -> **Echte Outlook-Kalendereinladung** wird automatisch von `info@` versendet.
|
||||
* **Technologie:**
|
||||
* **Teams Webhook:** Für interaktive "Adaptive Cards".
|
||||
* **Graph API:** Für sicheren E-Mail-Versand (statt SMTP).
|
||||
* **Orchestrator:** Steuert den Ablauf (Lead -> CE -> Teams -> Timer -> Mail).
|
||||
* **Graph API:** Für E-Mail-Versand (`info@`) und Kalender-Check (`e.melcer`).
|
||||
* **Orchestrator (`manager.py`):** Steuert den Ablauf (Lead -> CE -> Teams -> Timer -> Mail -> Booking).
|
||||
|
||||
## 🏗 Architektur
|
||||
|
||||
@@ -50,44 +53,65 @@ Der vollautomatische "Zero Touch" Workflow für Trading Twins Anfragen.
|
||||
├── trading_twins_ingest.py # E-Mail Importer (Graph API)
|
||||
├── monitor.py # Monitor + Trigger für Orchestrator
|
||||
├── trading_twins/ # [NEU] Autopilot Modul
|
||||
│ ├── orchestrator.py # Prozess-Steuerung (Timer, Logic)
|
||||
│ ├── manager.py # Slot-Logik & DB-Zugriff
|
||||
│ ├── teams_notification.py# Teams Webhook Integration
|
||||
│ ├── email_sender.py # Graph API Mailer
|
||||
│ ├── api_server.py # Feedback-Endpunkt (Port 8004)
|
||||
│ └── models.py # SQLite DB für Jobs/Slots
|
||||
│ ├── manager.py # Orchestrator, FastAPI Server, Graph API Logic
|
||||
│ ├── signature.html # HTML-Signatur für E-Mails
|
||||
│ └── debug_bookings_only.py # Diagnose-Tool (Legacy)
|
||||
├── db.py # Lokale Lead-Datenbank
|
||||
└── data/ # DB-Storage
|
||||
```
|
||||
|
||||
## 🚨 Lessons Learned & Troubleshooting (Critical)
|
||||
|
||||
### 1. Microsoft Bookings API Falle
|
||||
* **Problem:** Wir wollten `Bookings.Manage.All` nutzen, um eine Buchungsseite für `info@` zu erstellen.
|
||||
* **Fehler:** `403 Forbidden` ("Api Business.Create does not support the token type: App") und `500 Internal Server Error` (bei `GET`).
|
||||
* **Erkenntnis:** Eine App (Service Principal) kann zwar Bookings *verwalten*, aber **nicht initial erstellen**. Die erste Seite muss zwingend manuell oder per Delegated-User angelegt werden. Zudem erfordert der Zugriff oft eine User-Lizenz, die Service Principals nicht haben.
|
||||
* **Lösung:** Umstieg auf **Direct Calendar Booking** (Graph API `Calendar.ReadWrite`). Wir schreiben Termine direkt in den Outlook-Kalender, statt über die Bookings-Schicht zu gehen. Das ist robuster und voll automatisierbar.
|
||||
|
||||
### 2. Zwei Azure Apps für Sicherheit
|
||||
Wir nutzen zwei getrennte App-Registrierungen, um "Least Privilege" zu wahren:
|
||||
* **App 1 (`INFO_...`):** Hat Schreibrechte (`Mail.Send`, `Calendars.ReadWrite`) für das `info@robo-planet.de` Postfach. Sie sendet E-Mails und erstellt die Termine.
|
||||
* **App 2 (`CAL_...`):** Hat **nur** Leserechte (`Calendars.ReadBasic.All`) für den Kalender von `e.melcer@robo-planet.de`. Sie wird genutzt, um Konflikte zu prüfen, darf aber nichts ändern oder E-Mails lesen.
|
||||
|
||||
### 3. Docker Networking & Public URLs
|
||||
* **Problem:** Links in Teams-Nachrichten zeigten auf `http://lead-engine:8004` (interner Docker-Name) und waren von außen nicht erreichbar.
|
||||
* **Lösung:** Die URL muss immer die **öffentliche, vom Nginx-Proxy geroutete URL** sein (`https://floke-ai.duckdns.org/feedback`).
|
||||
* **Konfiguration:** Nginx leitet `/feedback/` an Port 8004 des `lead-engine` Containers weiter.
|
||||
|
||||
## 🚀 Inbetriebnahme (Docker)
|
||||
|
||||
Die Lead Engine ist als Service in der zentralen `docker-compose.yml` integriert.
|
||||
|
||||
```bash
|
||||
# Neustart des Dienstes nach Code-Änderungen
|
||||
docker-compose restart lead-engine
|
||||
docker-compose up -d --build --force-recreate lead-engine
|
||||
```
|
||||
|
||||
**Zugriff:** `https://floke-ai.duckdns.org/lead/` (Passwortgeschützt)
|
||||
**API Feedback Loop:** Port 8004 (intern).
|
||||
**Feedback API:** `https://floke-ai.duckdns.org/feedback/` (Öffentlich)
|
||||
|
||||
## 📝 ToDos & Integration (Status: Warten auf IT)
|
||||
## 📝 Credentials (.env)
|
||||
|
||||
Die Logik ist implementiert und getestet ("Dry Run"). Für den Go-Live fehlen folgende Credentials in der `.env`:
|
||||
Für den Betrieb sind folgende Variablen in der zentralen `.env` zwingend erforderlich:
|
||||
|
||||
1. **Teams Webhook:**
|
||||
* Benötigt: URL für den "Incoming Webhook" Connector.
|
||||
* Env-Var: `TEAMS_WEBHOOK_URL`
|
||||
```env
|
||||
# App 1: Info-Postfach (Schreiben)
|
||||
INFO_Application_ID=...
|
||||
INFO_Tenant_ID=...
|
||||
INFO_Secret=...
|
||||
|
||||
2. **Microsoft Graph API:**
|
||||
* Benötigt: App Registration mit `Mail.Send` und `Calendars.Read`.
|
||||
* Env-Vars: `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_TENANT_ID`.
|
||||
# App 2: E.Melcer Kalender (Lesen)
|
||||
CAL_APPID=...
|
||||
CAL_TENNANT_ID=...
|
||||
CAL_SECRET=...
|
||||
|
||||
3. **Assets:**
|
||||
* [ ] Banner-Bild `RoboPlanetBannerWebinarEinladung.png` nach `/app/lead-engine/trading_twins/` hochladen.
|
||||
* [ ] HTML-Signatur in `/app/lead-engine/trading_twins/signature.html` finalisieren.
|
||||
# Teams
|
||||
TEAMS_WEBHOOK_URL=...
|
||||
|
||||
# Public URL
|
||||
FEEDBACK_SERVER_BASE_URL=https://floke-ai.duckdns.org/feedback
|
||||
```
|
||||
|
||||
---
|
||||
*Dokumentationsstand: 4. März 2026*
|
||||
*Task: [31988f42]*
|
||||
*Dokumentationsstand: 5. März 2026*
|
||||
*Task: [31988f42]*
|
||||
|
||||
Reference in New Issue
Block a user