[31e88f42] Keine neuen Commits in dieser Session.
Keine neuen Commits in dieser Session.
This commit is contained in:
@@ -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"}
|
||||
{"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"}
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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"<p>{line}</p>" for line in opener.split('\n') if line.strip()])
|
||||
|
||||
email_body = f"""
|
||||
<p>Hallo {name},</p>
|
||||
{opener}
|
||||
{opener_html}
|
||||
<p>Ich freue mich auf den Austausch und schlage Ihnen hierfür konkrete Termine vor:</p>
|
||||
<ul>
|
||||
{booking_html}
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="460" style="width:345.0pt">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width="380" style="width:285.0pt;padding:0cm 0cm .75pt 0cm">
|
||||
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Verdana",sans-serif;color:#3D3C3F">Freundliche Grüße</span><span style="font-size:10.0pt;font-family:"Verdana",sans-serif;color:#3D3C3F"><br>
|
||||
<br>
|
||||
</span><span style="font-size:10.0pt;font-family:"Verdana",sans-serif;color:#3D3C3F">Elizabeta Melcer</span><span style="font-size:10.0pt;font-family:"Verdana",sans-serif;color:#3D3C3F"><br>
|
||||
</span><span style="font-size:10.0pt;font-family:"Verdana",sans-serif;color:#3D3C3F">Inside Sales Managerin</span><span style="font-size:9.0pt;font-family:"Verdana",sans-serif;color:#3D3C3F;mso-ligatures:none"><o:p></o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
Reference in New Issue
Block a user