# EOZ — End of Zusammenarbeit
**Projekt:** Lead Engine — B2B Lead-Enrichment-Engine
**Datum:** 2026-05-08

---

## PROJEKTZIEL

Automatisierte B2B-Lead-Enrichment-Engine. Liest rohe Kontaktdaten (Name, Website, Email), recherchiert via Multi-Source-Discovery und reichert mit LLM-Router an.

**Kein Email-Versand. Kein Agent. Nur Datenanreicherung.**

**Erste Zielkampagne:** 88 Portier EU Kiosk Leads (Mario's Liste, source_id 1–132)

---

## TECHNIK-STACK

| Komponente | Technologie |
|-----------|------------|
| Sprache | Python 3.13 (keine venv, direkt installiert) |
| LLM Router | OpenAI: gpt-5-nano (L1) → gpt-5-mini (L2) → gpt-5.2 (L3) |
| Discovery | DuckDuckGo HTML + BeautifulSoup (7 Queries/Kontakt) |
| Datenbank | SQLite (`email_agent.db` — Umbenennung zu `leads.db` steht aus!) |
| Dashboard | Streamlit (`dashboard.py`, Port 8501) |
| Excel Export | `excel_exporter.py` mit Farbkodierung |

---

## DATEISTRUKTUR

```
lead_engine/
├── contact_enricher.py         ← Haupt-Enricher (2-Phase Prompt)
├── multi_source_enricher.py    ← Mit Discovery Layer
├── icp_classifier.py           ← ICP-Klassifikation (Portier vs. LP)
├── cold_outreach_db.py         ← SQLite Wrapper
├── excel_exporter.py           ← Excel mit Farbkodierung
├── excel_importer.py           ← Import aus Mario's Excel-Liste
├── dashboard.py                ← Streamlit UI
├── outreach_generator.py       ← Email-Text Generierung
├── outreach_orchestrator.py    ← Outreach-Ablauf
├── review_cli.py               ← CLI Review vor dem Senden
├── email_agent.db              ← ⚠️ NICHT LÖSCHEN — aktive Datenbank
├── .env                        ← ⚠️ NICHT COMMITTEN — API Keys
├── llm/
│   ├── router.py               ← 3-Level Router + Cost Guard (25k Token-Budget/Kontakt)
│   ├── validator.py            ← Staged Validation (CRITICAL/IMPORTANT/OPTIONAL)
│   ├── logger.py               ← Audit Log
│   ├── openai_provider.py      ← OpenAI API
│   └── base.py                 ← Abstract Provider
└── discovery/
    ├── orchestrator.py         ← Discovery koordinieren
    ├── query_builder.py        ← 7 Search-Queries pro Firma
    ├── search.py               ← DuckDuckGo HTML Suche
    ├── scraper.py              ← URL-Scraping
    └── parser.py               ← Text-Extraktion + Location-Parsing
```

---

## KAMPAGNEN-STATUS (Kampagne 6 — Portier EU Kiosk)

| Status | Anzahl |
|--------|--------|
| enriched | 54 |
| raw (noch anreichern) | 27 |
| low_data_lead | 6 |
| needs_manual | 1 |
| **Gesamt** | **88** |

**Enrichment gestoppt** — manuell neu starten wenn nötig.

---

## KRITISCHE REGELN

1. **DB heißt noch `email_agent.db`** — Umbenennung zu `leads.db` steht aus, erst nach Pfad-Fix
2. **dotenv-Pfad immer absolut:** `load_dotenv(Path(__file__).parent / '.env', override=True)`
3. **gpt-5-nano/mini sind Reasoning Models** → `max_completion_tokens` statt `max_tokens`, kein `temperature`, kein `response_format`
4. **source_id = Mario's original list_index (1–132)** — NIEMALS verändern (Traceability)
5. **email_agent.db NIEMALS löschen** ohne laufenden Beweis des Nachfolgesystems
6. **.env NIEMALS lesen oder ausgeben** — API Keys bleiben privat

---

## STARTEN

```bash
cd lead_engine

# Dashboard:
streamlit run dashboard.py

# Enrichment (alle raw Kontakte):
python multi_source_enricher.py --campaign 6

# Excel-Export:
python excel_exporter.py
```

---

## OFFENE AUFGABEN

1. Hardcoded Pfade fixen — alle `email_agent.db` Referenzen → `leads.db`
2. 27 raw Kontakte enrichen
3. 6 low_data_lead — Handelsregister.de / Northdata.de als Quelle prüfen
4. Dashboard UI — kompaktes Kartenlayout (Spec vorhanden, noch nicht umgesetzt)
5. Auto-Refresh Fix — `streamlit-autorefresh` statt meta-http-refresh

---

## VERBINDUNGEN

- **Portier:** `K:\Projekte-AG\portier\` — Lead-Quelldaten (Excel-Exports dort)
- **Email-Agent:** `K:\Projekte-AG\agents\email_agent\` — Outreach nach Enrichment
- **Mario:** Liefert Lead-Listen als Excel
