Skip to content

Interactive Messages

Interactive Messages sind WhatsApp Buttons und Listen, die der Bot im Gesprächsablauf senden kann. Jeder Block wird in bot_interactive_blocks gespeichert und kann über das Flow-System einem Step zugeordnet werden.

Block-Typen

block_typeBeschreibungItemsWhatsApp-Darstellung
buttonsReply Buttons1–3Buttons unter der Nachricht
listInteraktive Liste1–10Aufklappbare Liste mit Einträgen

Trigger-Modi

Der trigger_mode bestimmt, wann und wie der Bot den Block sendet:

trigger_modeBeschreibung
checkpointBlock wird an einem definierten Checkpoint im Gespräch ausgelöst
mandatoryBot MUSS den Block senden wenn der Flow-Step erreicht wird
optionalBot ENTSCHEIDET selbst ob der Block zum Kontext passt

Endpoints

Alle Endpoints erfordern Auth + Tenant-Check. Basis-Pfad: /api/bots/:botId/blocks

MethodePfadBeschreibung
GET/Alle Blöcke eines Bots laden (sortiert nach sort_order, mit Checkpoint-Info)
GET/:blockIdEinzelnen Block laden
POST/Neuen Block erstellen
PUT/reorderReihenfolge ändern
GET/hybrid-promptHybrid-Flow Prompt generieren
PUT/:blockIdBlock aktualisieren
DELETE/:blockIdBlock löschen

Route-Reihenfolge

/reorder und /hybrid-prompt sind VOR /:blockId definiert (spezifisch vor generisch).

Validierungslimits

Felder

FeldMax. ZeichenPflichtBeschreibung
block_name50JaTechnischer Name (nur [a-z0-9_])
display_name100JaAnzeigename
body1024JaNachrichtentext
header60NeinKopfzeile
footer60NeinFußzeile
button_text20Nein (Listen)Button-Text zum Öffnen der Liste
ai_hint255NeinHinweis für die KI, wann der Block passt (nur bei trigger_mode='optional')

Items (Buttons)

EigenschaftLimit
Mindestanzahl1
Maximalanzahl3
Titel max. Zeichen20

Items (Liste)

EigenschaftLimit
Mindestanzahl1
Maximalanzahl10
Titel max. Zeichen24
Beschreibung max. Zeichen72

Item-Struktur

Jedes Item benötigt mindestens id (String) und title (String). Bei Listen optional description.

WhatsApp API Limits

Diese Limits kommen direkt von der WhatsApp Business API und werden durch DB-Check-Constraints erzwungen:

ConstraintRegel
valid_block_typeNur buttons oder list
valid_items_buttons1–3 Items bei block_type='buttons'
valid_items_list1–10 Items bei block_type='list'
valid_trigger_modeNur checkpoint, optional oder mandatory
valid_block_nameRegex ^[a-z0-9_]+$

Datenbank-Schema

bot_interactive_blocks

SpalteTypNullableDefaultBeschreibung
iduuidNOT NULLgen_random_uuid()Primary Key
tenant_iduuidNOT NULLFK auf tenants
bot_iduuidNOT NULLFK auf bots (CASCADE DELETE)
block_namevarchar(50)NOT NULLTechnischer Name (lowercase, unique pro Bot)
display_namevarchar(100)NOT NULLAnzeigename
block_typevarchar(10)NOT NULLbuttons oder list
headervarchar(60)NULLKopfzeile
bodyvarchar(1024)NOT NULLNachrichtentext
footervarchar(60)NULLFußzeile
button_textvarchar(20)NULLButton-Text (nur Listen)
itemsjsonbNOT NULL'[]'Array von Items mit id, title, optional description
trigger_modevarchar(15)NOT NULL'optional'checkpoint, mandatory oder optional
checkpoint_iduuidNULLFK auf bot_checkpoints
checkpoint_conditionjsonbNULL'{}'Bedingung für Checkpoint-Auslösung
ai_hintvarchar(255)NULLKI-Hinweis (nur bei optional)
sort_orderintegerNULL0Sortierreihenfolge
is_activebooleanNULLtrueAktiv/Inaktiv
created_attimestamptzNULLCURRENT_TIMESTAMPErstelldatum
updated_attimestamptzNULLCURRENT_TIMESTAMPÄnderungsdatum
trigger_conditiontextNULLZusätzliche Auslösebedingung

Unique Constraint: (bot_id, block_name) — ein Block-Name pro Bot.

Indizes:

  • idx_interactive_blocks_bot — btree auf (bot_id, is_active)
  • idx_interactive_blocks_checkpoint — btree auf (checkpoint_id)
  • idx_interactive_blocks_tenant — btree auf (tenant_id)

Fehlerbehandlung

HTTP StatusSituation
400Validierungsfehler (Felder, Items, Limits)
404Block oder Checkpoint nicht gefunden
409Block-Name existiert bereits für diesen Bot (Unique Constraint)
500Interner Fehler