diff --git a/.dev_session/SESSION_INFO b/.dev_session/SESSION_INFO index a25fed5c..db60109a 100644 --- a/.dev_session/SESSION_INFO +++ b/.dev_session/SESSION_INFO @@ -1 +1 @@ -{"task_id": "31988f42-8544-80fc-8bc1-dcc57acdfd4f", "token": "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", "readme_path": null, "session_start_time": "2026-03-09T06:47:23.911130"} \ No newline at end of file +{"task_id": "31e88f42-8544-8024-ad7c-da1733e94f9a", "token": "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", "readme_path": "connector-superoffice/README.md", "session_start_time": "2026-03-09T08:46:32.104282"} \ No newline at end of file diff --git a/lead-engine/README.md b/lead-engine/README.md index 0a4f2dfd..6b30c1fb 100644 --- a/lead-engine/README.md +++ b/lead-engine/README.md @@ -1,4 +1,4 @@ -# Lead Engine: Multi-Source Automation v1.4 [31988f42] +# Lead Engine: Multi-Source Automation v2.2 [31988f42] ## 🚀 Übersicht Die **Lead Engine** ist ein spezialisiertes Modul zur autonomen Verarbeitung von B2B-Anfragen. 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. @@ -23,7 +23,7 @@ Die **Lead Engine** ist ein spezialisiertes Modul zur autonomen Verarbeitung von * **KI-Engine:** Gemini 2.0 Flash erstellt E-Mail-Entwürfe. * **Kontext:** Kombiniert Lead-Daten + CE-Daten + Matrix-Argumente (Pains/Gains). -### 5. Trading Twins Autopilot (PRODUKTIV v2.1) +### 5. Trading Twins Autopilot (PRODUKTIV v2.2) Der vollautomatische "Zero Touch" Workflow für Trading Twins Anfragen. * **Human-in-the-Loop:** Elizabeta Melcer erhält eine Teams-Nachricht ("Approve/Deny"). @@ -44,36 +44,41 @@ Der vollautomatische "Zero Touch" Workflow für Trading Twins Anfragen. ├── trading_twins/ # Autopilot Modul │ ├── manager.py # Orchestrator, FastAPI, Graph API Logic │ ├── test_calendar_logic.py # Interner Test für Kalender-Zugriff -│ └── signature.html # HTML-Signatur +│ └── signature.html # HTML-Signatur (mit Bildern im selben Ordner) └── db.py # Lokale SQLite Lead-Datenbank ``` ## 🚨 Lessons Learned & Critical Fixes ### 1. Microsoft Graph API: Kalender-Zugriff -* **Problem:** `debug_calendar.py` scheiterte oft mit `Invalid parameter`. -* **Ursache:** URL-Encoding von Zeitstempeln (`+` wurde zu Leerzeichen) und Mikrosekunden (7 Stellen statt 6). -* **Lösung:** Nutzung von `requests(params=...)` und Abschneiden der Mikrosekunden. -* **Endpoint:** `/users/{email}/calendar/getSchedule` (POST) ist robuster als `/calendarView` (GET). +* **Problem:** `debug_calendar.py` scheiterte oft mit `TimeZoneNotSupportedException`. +* **Ursache:** Der API-Aufruf zur Abfrage der Verfügbarkeit (`getSchedule`) hat keine explizite Zeitzoneninformation erhalten. +* **Lösung:** Die Zeitzone ("Europe/Berlin") wird nun explizit im `payload` des API-Aufrufs mitgegeben. ### 2. Exchange AppOnly AccessPolicy (Buchungs-Workaround) * **Problem:** `Calendars.ReadWrite` erlaubt einer App oft nicht, Termine in *fremden* Kalendern (`e.melcer@`) zu erstellen (`403 Forbidden`). * **Lösung:** Der Termin wird im **eigenen Kalender** des Service-Accounts (`info@`) erstellt. Der Mitarbeiter (`e.melcer@`) wird als **Teilnehmer** hinzugefügt. Das umgeht die Policy. -### 3. Docker Environment Variables -* **Problem:** Skripte im Container fanden Credentials nicht, obwohl sie in `.env` standen. -* **Lösung:** Explizites `load_dotenv` ist in Standalone-Skripten (`test_*.py`) nötig. Im Hauptprozess (`manager.py`) reicht `os.getenv`, solange Docker Compose die Vars korrekt durchreicht. +### 3. Dynamische HTML-Signatur mit Inline-Bildern +* **Problem:** Eine statische Signatur in der Konfiguration war unflexibel und konnte keine Bilder enthalten. +* **Lösung:** Ein Skript (`scripts/extract_signature_assets.py`) extrahiert die vollständige HTML-Signatur und alle eingebetteten Bilder aus einer `.eml`-Datei. Die `send_email`-Funktion wurde überarbeitet, um alle Bilder dynamisch als Inline-Anhänge zu versenden, was eine professionelle Darstellung sicherstellt. -## 🚀 Inbetriebnahme +### 4. Advanced Debugging & Fehlerbehebung +* **Problem:** Hintergrund-Tasks schlugen ohne klare Fehlermeldung fehl, was die Diagnose erschwerte. +* **Lösung:** Umfassendes Logging wurde in allen kritischen Funktionen implementiert. Dadurch konnten Fehler wie ein `NameError` bei der Datumsformatierung und die `TimeZoneNotSupportedException` schnell identifiziert und behoben werden. +## 🚀 Inbetriebnahme & Test + +### Inbetriebnahme ```bash # Neustart des Dienstes docker-compose up -d --build --force-recreate lead-engine - -# Manueller Test (intern) -docker exec lead-engine python /app/trading_twins/test_calendar_logic.py ``` +### Test & Debugging +* **Allgemeiner Test:** Die URL `https://floke-ai.duckdns.org/feedback/test_lead` löst einen generischen Test-Lead aus. +* **Spezifischer Test pro Lead:** Im Lead-Tool (`/lead/`) kann für jeden Lead mit einem generierten E-Mail-Entwurf der Button "🧪 Test-Versand (an floke.com@gmail.com)" geklickt werden. Dies startet den gesamten End-to-End-Prozess (Teams-Nachricht & E-Mail-Versand) für den ausgewählten Lead, sendet die E-Mail aber sicher an die Test-Adresse. + **Zugriff:** `https://floke-ai.duckdns.org/lead/` (Passwortgeschützt) ## 📝 Zukünftige Erweiterungen & Todos diff --git a/lead-engine/generate_reply.py b/lead-engine/generate_reply.py index 855b7902..df82a0e8 100644 --- a/lead-engine/generate_reply.py +++ b/lead-engine/generate_reply.py @@ -190,12 +190,12 @@ def generate_email_draft(lead_data, company_data, booking_link="[IHR BUCHUNGSLIN - Strategischer Aufhänger (CE-Opener): {ce_opener} AUFGABE: - 1. ANREDE: Persönlich. + 1. ANREDE: Erzeuge KEINE Anrede (wie "Sehr geehrter..."). Starte direkt mit dem ersten Satz. 2. EINSTIEG: Nutze den inhaltlichen Kern von: "{ce_opener}". 3. DER ÜBERGANG: Verknüpfe dies mit der Anfrage zu {purpose}. Erkläre, dass manuelle Prozesse bei {qualitative_area} angesichts der Dokumentationspflichten und des Fachkräftemangels zum Risiko werden. 4. DIE LÖSUNG: Schlage die Kombination aus {solution['solution_text']} als integriertes Konzept vor, um das Team in Reinigung, Service und Patientenansprache spürbar zu entlasten. - - ROI: Sprich kurz die Amortisation (18-24 Monate) an – als Argument für den wirtschaftlichen Entscheider. - 6. CTA: Schließe die E-Mail ab und leite zu den nächsten Schritten über, ohne direkt Termine vorzuschlagen oder nach Links zu fragen. + 5. ROI: Sprich kurz die Amortisation (18-24 Monate) an – als Argument für den wirtschaftlichen Entscheider. + 6. CTA: Schließe die E-Mail ab und leite zu den nächsten Schritten über, ohne direkt Termine vorzuschlagen oder nach Links zu fragen. Erzeuge KEINE Schlussformel (wie "Mit freundlichen Grüßen"). STIL: Senior, lösungsorientiert, direkt. Keine unnötigen Füllwörter. diff --git a/lead-engine/trading_twins/manager.py b/lead-engine/trading_twins/manager.py index 541d3986..f824a3ae 100644 --- a/lead-engine/trading_twins/manager.py +++ b/lead-engine/trading_twins/manager.py @@ -310,9 +310,12 @@ def process_lead(request_id, company, opener, receiver, name): except: sig = "" + # Format the opener text into proper HTML paragraphs + opener_html = "".join([f"
{line}
" for line in opener.split('\n') if line.strip()]) + email_body = f"""Hallo {name},
-{opener} +{opener_html}Ich freue mich auf den Austausch und schlage Ihnen hierfĂĽr konkrete Termine vor:
|
- Freundliche GrĂĽĂźe |