gastro-saas / ki-assistent · live
aktualisiert
WhatsApp-KI-Assistent auf der Festnetznummer des Restaurants.
Viele Gäste schreiben lieber, als anzurufen. Restaurants verbinden ihre bestehende Nummer mit WhatsApp Business, und ein KI-Assistent nimmt Reservierungen an und beantwortet Fragen zu Speisekarte und Lokal, zu jeder Uhrzeit und in der Sprache des Gastes.
- Rolle
- Architektur und Entwicklung
- Stack
- NestJS, Postgres, AWS Bedrock
- Modelle
- Claude Sonnet, Claude Haiku
- Kanal
- WhatsApp Cloud API
- Tools, die der Agent nutzen kann, pro Restaurant schaltbar
- 37
- Modelle, pro Durchlauf gewählt
- 2
- automatisierte Tests, inklusive End-to-End-Gesprächen
- ~880
- Hallo! Habt ihr morgen um 19 Uhr einen Tisch für 4?
- Morgen um 19 Uhr für 4 Personen passt. Soll ich reservieren? Bestätigen Ändern
- Bestätigen
- Reserviert! Bis morgen um 19 Uhr.
- Webhook Die Nachricht kommt über die WhatsApp Cloud API an. Signatur geprüft, Duplikate aussortiert.
- Queue Postgres-Queue mit einem Lock pro Unterhaltung. Schnell hintereinander gesendete Nachrichten werden ein Durchlauf.
- Modell-Router Regeln wählen pro Durchlauf das Modell. Hier geht es um eine Reservierung: diese Nachricht Claude Sonnet Reservierungen und alles, was eine fortsetzt Claude Haiku einfache Fragen, für etwa ein Drittel der Kosten
- Agent · 37 Tools Eine Tool-Calling-Schleife. Hier prüft sie freie Plätze und bereitet die Reservierung vor. Reservierungen · 11 Speisekarte & Allergene · 5 Infos & FAQ · 4 Buttons & Listen · 4 Gäste-Gedächtnis Events Gutscheine
- Bestätigung Die Reservierung wird nur vorgeschlagen. Ausgeführt wird sie, wenn der Gast auf Bestätigen tippt.
- Reservierungssystem Die Buchung geht ans System des Restaurants, die Antwort über die Sende-Queue zurück.
Die Idee
Das Telefon im Restaurant klingelt im ungünstigsten Moment: mitten im Service. Mit diesem Assistenten verbindet jedes Restaurant die Nummer, die seine Gäste schon kennen, mit WhatsApp Business. Gäste schreiben dorthin, und der Assistent prüft freie Plätze, nimmt Reservierungen an und beantwortet Fragen zu Speisekarte, Allergenen, Öffnungszeiten und Events. Auch Sprachnachrichten funktionieren: Sie werden transkribiert, bevor der Assistent sie liest.
Ein Agent, viele Tools
Technisch ist es ein einzelner Tool-Calling-Agent in einem NestJS-Backend. Er kann 37 Tools nutzen, gruppiert in Reservierungen, Speisekarte, Restaurant-Infos, Gäste-Gedächtnis, Events, Gutscheine und interaktive WhatsApp-Elemente wie Buttons und Listen. Jedes Restaurant schaltet die Gruppen an, die es braucht, und bekommt eigene Anweisungen, eine eigene Ansprache (Sie oder Du) und eigene Kostenlimits. Ein Deployment bedient alle Restaurants.
Fragen zum Restaurant beantwortet der Assistent aus dessen eigenen FAQ, gefunden per Vektorsuche in Postgres und neu gerankt, bevor das Modell sie sieht. Außerdem merkt er sich Gäste: Ernährungswünsche und Vorlieben gelten auch im nächsten Gespräch.
Das passende Modell für jeden Schritt
Nicht jede Nachricht braucht das stärkste Modell. Ein regelbasierter Router wählt pro Durchlauf:
- Claude Sonnet übernimmt Reservierungen und alles, was eine Reservierung fortsetzt. Hier kostet ein Fehler einen Tisch, deshalb bekommt dieser Ablauf das stärkere Modell, das weniger Fehler macht.
- Claude Haiku übernimmt einfache Fragen. Es ist schneller und kostet etwa ein Drittel.
Beide laufen über AWS Bedrock mit EU-Inferenzprofilen.
Leitplanken für Buchungen
Ein Sprachmodell soll nicht eigenmächtig einen Tisch buchen können. Jede Reservierung, Änderung oder Stornierung wird zuerst nur vorgeschlagen. Ausgeführt wird sie erst, wenn der Gast auf Bestätigen tippt oder mit Ja antwortet. Das begrenzt auch, was eine Prompt-Injection anrichten kann. Dazu kommen geprüfte Eingaben (keine Buchungen in der Vergangenheit, plausible Personenzahlen), Timeouts, ein tägliches Kostenlimit pro Gast, Wiederholungen mit Dead-Letter-Queue und eine feste Ersatznachricht, falls etwas schiefgeht.
Gebaut für den Produktivbetrieb
Nachrichten kommen über den Webhook der WhatsApp Cloud API an, werden geprüft, Duplikate aussortiert, und laufen durch eine Postgres-Queue. Ein Lock pro Unterhaltung hält die Antworten in der richtigen Reihenfolge, und schnell hintereinander gesendete Nachrichten werden gemeinsam beantwortet. Tracing läuft über Langfuse, Fehler-Tracking über Sentry, mit entfernten personenbezogenen Daten. Rund 880 automatisierte Tests, darunter End-to-End-Gespräche mit den echten Modellen, laufen in der CI.
Ergebnis
Der Assistent ist live. Restaurants bekommen einen Buchungskanal, der funktioniert, wenn gerade niemand ans Telefon gehen kann, und Gäste bekommen zu jeder Uhrzeit eine Antwort, in ihrer eigenen Sprache.
Für denselben Anbieter habe ich außerdem die Reservierungs-App und einen White-Label-App-Generator gebaut.
- NestJS
- AWS Bedrock
- Claude
- KI-Agenten
- Postgres