# Datenmodell (Phase 1 — Definition, keine Migration) An Vento (`Customer`/`Case`/`Message`, SQLAlchemy) und Case Intake (`cases.db`) angelehnt, damit spätere Zusammenführung ohne Umbau möglich ist. Speicherung in Phase 1: eigene SQLite-Datei im Projektverzeichnis (nur Text). | Entität | Kernfelder | |---|---| | **CallSession** | id, caller_id→Caller, started_at, ended_at, duration_s, channel (`phone`/`test`), state (CallState), language, escalation_status, consent_status | | **Caller** | id, phone_number (E.164, unique), name, salutation, location, known_customer (bool), created_at, last_contact | | **Intent** | id, session_id, label (`neue_anfrage`, `feuchte_schimmel`, `lueftung`, `klima`, `wartung`, `rueckruf`, `bestandskunde`, `reklamation`, `spam`, `unklar`), confidence, classified_at | | **Language** | code (`de`/`es`/`en`), source (`dtmf`/`detected`), confidence | | **CapturedInfo** | session_id, slot (`name`/`callback_number`/`ort`/`thema`/`dauer`/`zeitfenster`), value, confirmed (bool) | | **RiskFlag** | session_id, type (RiskFlagType, s. src/telefon_agent/states.py), raised_at, agent_response (`standardsatz`/`handoff`) | | **CallbackRequest** | session_id, preferred_time_window, urgency (`akut`/`normal`/`unklar`), status (`offen`/`erledigt`) | | **HumanSummary** | session_id, text (3–6 Sätze für den Rückrufer), created_at, delivered_to (`case_intake`/`queue`/`test`) | | **Transcript** | session_id, turn_no, speaker (`caller`/`agent`), text, timestamp — **nur Text, kein Audio** | | **ConsentStatus** | session_id, announced (bool), objected (bool), timestamp | | **EscalationStatus** | session_id, level (`none`/`callback`/`sofort_handoff`), reason | ## Mapping für spätere Integration | Telefon-Agent | Vento | Case Intake | |---|---|---| | Caller | Customer (phone_number, consent_given) | — | | CallbackRequest + HumanSummary | Case (category, urgency, report) | cases.db (Fall) | | Transcript | Message | — | | ConsentStatus | Customer.consent_given/-timestamp | — | ## Aufbewahrung (Vorschlag) Transcript: 30 Tage, danach nur HumanSummary. RiskFlags/Statistik: aggregiert. Kein Audio in keiner Phase.