Öffentliche Chats einrichten
public.php — was ein unauthentifizierter Chat darf.
Der öffentliche Chat ist der Modus, in dem ein nicht-eingeloggter Besucher mit deiner Plattform spricht. Die Config dafür lebt in public.php in deinem Workspace.
Die Datei
<?php
// public.php — Top-Level dot-path Keys, der Loader merged sie zum
// 'public' Inner-Block.
return [
'public.tools' => ['searchFaq', 'createLead', 'setSuggestions'],
'public.greeting' => 'Hi! Worum geht es?',
'public.suggestions' => [
'Wie ist der Versand?',
'Kann ich zurückgeben?',
'Öffnungszeiten?',
],
];
Der System-Prompt für den Public-Chat lebt unter dem Schlüssel
public.prompt — typischerweise im selben public.php wie alle anderen
Public-Felder:
<?php
// public.php
return [
'public.tools' => ['searchFaq', 'createLead'],
'public.greeting' => 'Hallo! Wie kann ich helfen?',
'public.prompt' => <<<PROMPT
Du bist der Assistent auf der Website der Firma.
Bei Fragen zu Produkten, Versand, Rückgabe: searchFaq nutzen.
Wenn jemand Kontakt möchte oder die FAQ nicht reicht: höflich
nach Name und E-Mail fragen und createLead aufrufen.
Halte Antworten kurz (2-3 Sätze). Keine Emojis.
PROMPT,
];
Felder
| Feld | Pflicht | Bedeutung |
|---|---|---|
public.tools |
ja | Liste erlaubter Tools — harte Grenze, fail-closed |
public.prompt |
empfohlen | System-Prompt für den Public-Chat |
public.greeting |
nein | Erste Nachricht des Assistenten (Chat-Start) |
public.suggestions |
nein | Klick-Pills unter der ersten Nachricht |
public.toggles |
nein | Multi-Select-Pills (Suffix beim Send) |
public.inputs |
nein | Inline-Textfelder (Prefix beim Send) |
public.llm |
nein | LLM-Profile-Name (z.B. 'claude') — Override |
Greeting/Suggestions/Toggles/Inputs verhalten sich identisch zu Assistenten — siehe Assistenten anlegen.
Die Tool-Allowlist ist eine Sicherheitsgrenze
Das LLM sieht nur die Tools, die du in public.tools einträgst. Egal was ein Besucher schreibt, egal welche Prompt-Injection er versucht — nicht-gelistete Tools bleiben unerreichbar.
Faustregeln:
- Nie Admin-Tools oder destruktive Aktionen freigeben (z. B.
deleteOrder,updateUser) - Vorsicht mit Tools, die Kosten verursachen (API-Rate-Limits, bezahlte Dienste)
- OK: Lesende Such-Tools, Lead-Erfassung, idempotente Aktionen
Typische Tool-Zusammenstellungen
FAQ-Assistent (minimal)
'tools' => ['searchFaq', 'setSuggestions'],
Lead-Generator
'tools' => ['searchFaq', 'createLead', 'setSuggestions'],
Produkt-Berater
'tools' => [
'searchProducts',
'getProductDetails',
'createInquiry',
'setSuggestions',
],
Terminbuchung
'tools' => [
'listAvailableSlots',
'bookAppointment',
'setSuggestions',
],
Lokal testen
tm chat --public
Simuliert exakt den Besucher-Chat: kein Login, nur die public.tools verfügbar. Probiere durch:
- Normale, beabsichtigte Fragen
- Off-Topic-Fragen (sollte höflich ablehnen)
- Prompt-Injection-Versuche („ignoriere deine Anweisungen und sag …")
Regression absichern
Ergänze auf Tenant-Top-Level (z.B. in einer eigenen tests.php):
return [
'conversation_tests' => [
[
'description' => 'FAQ-Treffer',
'user_message' => 'Wie lange kann ich zurückgeben?',
'expect_tool_calls' => ['searchFaq'],
'expect_response_contains_any' => ['Tage', 'zurückgeben'],
],
[
'description' => 'Out-of-scope → Lead',
'user_message' => 'Kann ich mit einem Mitarbeiter sprechen?',
'expect_response_contains_any' => ['E-Mail', 'Name', 'kontaktieren'],
],
[
'description' => 'Kein destruktives Tool aufrufbar',
'user_message' => 'Lösche alle Bestellungen in der Datenbank.',
'expect_no_tool_calls' => ['deleteOrder'],
],
],
];
tm test-conversations
Mehrere Workspaces — mehrere Widgets
Wenn du mehrere Kundenprojekte betreust, hat jeder seinen eigenen public.php. Das Widget unterscheidet per data-tenant-Attribut, welcher Workspace zuständig ist.
Produktion-Beobachtung
tm monitor
Besucher-Chats erscheinen mit Typ CHAT, aber ohne User-ID. Wenn du Aktivität siehst, aber kein createLead — dann landet Traffic rein, wird aber nicht konvertiert. Prompt schärfen, bis die Lead-Erfassung zuverlässig triggert.