Sender-Info erfassen (captureSender)
Name/Email/Phone aus Chats persistieren — fuer Lead-Tracking, Support-Tickets, Reklamationen.
Wenn ein Chat mit einem anonymen Besucher (Bloomify-Widget, Public-Chat, Lead-Form) Kontaktdaten erfasst, willst du die später wiederfinden — in der Manage-Chat-Liste, in Reports, im CRM. Dafür gibt es das interne Tool captureSender unter _shared/tools/contacts/.
Wann benutzen
captureSender ist kein Tool fürs LLM. Direkt aufrufen wäre unzuverlässig — das Modell vergisst es oder ruft's mit Mist-Daten auf. Stattdessen ruft jedes Domain-Tool das einen Vorgang abschließt es intern auf, mit den Werten die der User für genau diesen Vorgang angegeben hat:
createLead({name, email, ...})→ kennt Name + Email zwingendcreateSupportTicket({email, message})→ kennt EmailcreateReclamation({orderNumber, email, name})→ kennt Email + ggf. NamesubscribeToNewsletter({email})→ kennt Email
Jedes dieser Tools macht am Ende:
$ctx['tool']('captureSender', [
'name' => $args['name'] ?? null,
'email' => $args['email'] ?? null,
'phone' => $args['phone'] ?? null,
'company' => $args['company'] ?? null,
]);
Verhalten
- Pro
(tenant, chat_id)ein Eintrag in der Tabellechat_senders. - Partial-Update: leere/null Felder überschreiben nichts. So reichern sich Daten über mehrere Tool-Calls an. Beispiel:
createSupportTicketcapturetemail, später setztcreateLeadauchname + company— am Ende hat der Chat alle vier. - Email-Validierung per
FILTER_VALIDATE_EMAIL. Ungültige Werte → Tool gibterrorzurück, kein Speichern. - Mindestens ein Feld muss non-null sein, sonst ist der Caller kaputt.
Speicher-Layout
Tabelle chat_senders:
| Spalte | Typ | Bemerkung |
|---|---|---|
id |
uuid PK | |
tenant |
varchar(100) | + chat_id unique |
chat_id |
varchar(255) | + tenant unique |
name, email, phone, company |
nullable strings | |
created, modified |
datetime |
Index: idx_chat_senders_email für „welche Chats kommen von diesem Kontakt?" (z.B. wiederkehrende Support-Anfragen).
Sichtbarkeit
Manage-Chat-Liste (/manage/chat-messages) zeigt Sender-Info als Fallback in der User-Spalte. Reihenfolge:
- User-UUID aus chat_id (eingeloggter Nutzer der App)
- Sender-Info (Name, Email darunter klein)
- UUID-Stub (8 Zeichen, wenn vorhanden aber kein User-Match)
- „–"
Anti-Patterns
- Kein direkter LLM-Aufruf.
captureSenderistinternal: trueund nicht inassistants.<slug>.toolsgelistet. Wer das LLM zum Capturen ruft, bekommt halb-saubere Daten. - Keine UI-State-Erfassung. Wenn der User beim Eintippen Email tippt aber nie
submitmacht, soll nichts gespeichert werden — nur was über ein Domain-Tool tatsächlich „eingereicht" wurde. - Kein Stand-In für CRM.
chat_sendersist Audit-Trail-Schicht, kein Customer-Master. Echte Lead-Pipelines (Shopify, Pipedrive) bleiben separat.