[31e88f42] Keine neuen Commits in dieser Session.

Keine neuen Commits in dieser Session.
This commit is contained in:
2026-03-09 08:46:33 +00:00
parent de576e2a9a
commit 21b9d518fc
5 changed files with 27 additions and 24 deletions

View File

@@ -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"}

View File

@@ -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

View File

@@ -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.

View File

@@ -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}

View File

@@ -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:&quot;Verdana&quot;,sans-serif;color:#3D3C3F">Freundliche Grüße</span><span style="font-size:10.0pt;font-family:&quot;Verdana&quot;,sans-serif;color:#3D3C3F"><br>
<br>
</span><span style="font-size:10.0pt;font-family:&quot;Verdana&quot;,sans-serif;color:#3D3C3F">Elizabeta Melcer</span><span style="font-size:10.0pt;font-family:&quot;Verdana&quot;,sans-serif;color:#3D3C3F"><br>
</span><span style="font-size:10.0pt;font-family:&quot;Verdana&quot;,sans-serif;color:#3D3C3F">Inside Sales Managerin</span><span style="font-size:9.0pt;font-family:&quot;Verdana&quot;,sans-serif;color:#3D3C3F;mso-ligatures:none"><o:p></o:p></span></p>
</td>
</tr>
</tbody>