🤖 Wie Robert funktioniert

Robert ist der WhatsApp-Bot von Blockbuster. Diese Seite erklärt im Detail, aus welchen Teilen das System besteht, wie Daten fließen und was wo verarbeitet wird.

1. Architektur: vier Container, ein Tunnel

WhatsAppGruppen & Direktnachrichten
⇄
Bot „Robert“Node.js + whatsapp-web.js
(headless Chromium)
⇄
BackendJava / Javalin
REST-API + Web-App
⇄
PostgreSQLalle Daten,
Flyway-Migrationen
Browser (Team)volley.moljaca.work
→
Cloudflare-Tunneleinziger Weg von auĂźen
→
Backendliefert die Web-App aus
Bot-Container Backend-Container Datenbank extern / AuĂźenwelt

Alle vier Container laufen per Docker Compose auf einem Raspberry Pi. Der Bot spricht mit dem Backend ausschlieĂźlich ĂĽber das interne Docker-Netz und authentifiziert sich bei jedem Request mit einem gemeinsamen Geheimnis (X-Bot-Secret-Header). Von auĂźen ist nur der Cloudflare-Tunnel erreichbar; der QR-Code zum Koppeln des WhatsApp-Kontos ist nur lokal auf dem Pi abrufbar.

2. Eingehende Nachrichten: Roberts Entscheidungs-Pipeline

Jede Nachricht in einer Gruppe oder per DM durchläuft dieselbe Kette von Prüfungen, bevor Robert antwortet:

Nachricht„Robert, wann ist Training?“
→
FilterBefehl (!hilfe, !absagen)?
Gruppe stummgeschaltet?
„Nur wenn getaggt“?
→
Kontext bauenWissen + Gedächtnis
zusammensetzen
→
OpenAIgpt-4o-mini
(Responses API)
→
AntwortText in den Chat,
Austausch merken

3. Roberts Wissen: was er weiĂź und woher

Robert „weiß“ nichts von sich aus — vor jeder Antwort bekommt er einen frischen Kontextblock mit Daten aus drei Quellen:

QuelleInhaltAktualisierung
Backend Gruppen & Trainingstage, anstehende Termine und Spiele (inkl. Zu-/Absagen), heutiges Datum Der Bot holt die Konfiguration alle 15–30 Sekunden vom Backend
Open-Meteo Wettervorhersage je Termin („🌧️ Schauer 8–23 Â°C, 30 % Regen“) Backend cached 3 h pro Ort; nur fĂĽr Termine in den nächsten 16 Tagen
mixedvolleyball.net Tabellenplatz, Punkte, Bilanz, letztes Ergebnis und nächstes Spiel von Blockbuster Backend cached 6 h (SportsPress-API der Liga)

Für alles, was darüber hinausgeht (aktuelle Fragen, Ergebnisse, Allgemeinwissen), darf Robert eine Websuche über OpenAIs eingebautes Such-Werkzeug starten. Damit eine gesprächige Gruppe keine Kosten produziert, ist die Suche auf eine Tagesobergrenze pro Chat gedeckelt (Standard: 25). Schlägt die Suche fehl, antwortet er ohne sie, statt zu schweigen.

4. Gedächtnis: kurzfristig, langfristig, persistent

Gesprächletzte ≤ 12 Wortmeldungen
pro Chat (30 min gĂĽltig)
→
Verdichtungab 12 Einträgen fasst die KI
ältere zu einem Merkzettel zusammen
→
Backend-APIjede Änderung wird
sofort durchgeschrieben
→
bot_memoryMerkzettel + letzte Wortmeldungen
je Chat

5. Ausgehende Posts: die Outbox

Robert postet nie „von selbst“ — das Backend stellt Aufträge in Warteschlangen, die der Bot zyklisch abarbeitet und quittiert. Erst nach erfolgreicher Zustellung wird ein Auftrag als erledigt markiert; schlägt etwas fehl, bleibt er liegen und wird beim nächsten Durchlauf erneut versucht.

WarteschlangenTermine · Spiele · Nachrichten
(pending bis zur Quittung)
→
GET /api/bot/configBot fragt alle 15–30 s an
→
SendenTermin-Karten, Spiel-Posts,
DMs mit 4 s Abstand
→
Quittung„posted“ / „sent“
mit WhatsApp-Message-ID

6. Trainingsplanung mit KI: vom Wunsch zum Plan

1 · UmfrageAdmin startet Wunsch-Umfrage
mit Frist
→
2 · Link in die GruppeRobert postet den
Wunsch-Link
→
3 · Wünsche sammelnTeam trägt Wünsche ein
und upvotet (ohne Login)
→
4 · Plan bauenzur Frist: gpt-5 entwirft
den Trainingsplan
→
5 · Link postenRobert postet einen Link
zum fertigen Plan

7. Spiele & Aufstellung: die Abstimmung

1 · Spiel anlegenAdmin plant Spiel
mit Positionen
→
2 · Links verteilenpersönliche Abstimmungs-Links
per DM / in die Gruppe
→
3 · AbstimmenTeam wählt je Position;
Passwort schĂĽtzt den Link
→
4 · Aufstellungbeim Schließen wird die
Aufstellung berechnet
→
5 · VerkündenRobert postet die
Aufstellung in die Gruppe

8. Was an OpenAI geht — und was nicht

Geht an OpenAIBleibt im System
Der Nachrichtentext (max. 1000 Zeichen), Absender-Vorname in Gruppen, der Kontextblock (Termine, Trainingszeiten, Wetter, Liga), das Chat-Gedächtnis und — für Trainingspläne — die gesammelten Wünsche. Telefonnummern, Abstimmungs-Tokens und Passwörter, Gruppen-IDs, API-Schlüssel, sowie sämtliche Datenbank-Inhalte, die nicht ausdrücklich Teil des Kontextblocks sind.

Es gibt zwei getrennte API-Schlüssel: einen für Roberts Chat-Antworten (OPENAI_API_KEY, Modell gpt-4o-mini) und optional einen eigenen für die Trainingsplan-Generierung (OPENAI_PLAN_API_KEY, Modell gpt-5). Alle Schlüssel und Passwörter liegen ausschließlich in GitHub-Secrets bzw. der .env auf dem Pi — nie im Code.

Alle Aufrufe laufen mit store: false — OpenAI speichert die Anfragen und Antworten nicht auf seiner Plattform (keine Logs im OpenAI-Dashboard). Die Unterhaltungen liegen ausschließlich in Roberts eigenem Gedächtnis (bot_memory), das jede Person per !delete löschen kann.

9. Betrieb: Deploy, Gesundheit, Wiederanlauf

10. Deine Daten: was gespeichert wird – und wie du sie löschst

Robert speichert nur, was er zum Organisieren von Training und Spielen braucht. Alle Daten liegen in der PostgreSQL-Datenbank auf dem Raspberry Pi (siehe Abschnitt 1); von auĂźen ist nur der Cloudflare-Tunnel erreichbar.

DatenWozuAufbewahrung
Telefonnummer & WhatsApp-Name der Mitglieder seiner Gruppen Zuordnung zu Spielerprofilen, SchlĂĽssel- und Abstimmungs-Funktionen solange du mit Robert in einer Gruppe bist (laufend abgeglichen)
Gesprächsverlauf mit Robert (Gedächtnis pro Chat) damit er sich im Chat an den Verlauf erinnert Kurzzeit ~30 min, Merkzettel dauerhaft – per !delete löschbar
Spielerprofil (interner Name, Nummer, Positionen) Aufstellung & Voting bis ein Admin es löscht
Zu-/Absagen & abgegebene Stimmen Teilnahme & Aufstellung am Termin/Spiel; Stimmen werden nur anonym aggregiert gespeichert
Interessenten-Anfragen (Onboarding neuer Spieler:innen) Vorab-Einschätzung, ob jemand ins Team passt bis ein Admin annimmt/ablehnt – per !delete löschbar

🗑️ Deine Daten löschen: !delete

Schreib Robert im Privatchat die Nachricht !delete. Er löscht dann sofort alles, was er über dich gespeichert hat:

Die Bestätigung kommt noch, bevor der Chat verschwindet. Den Chat auf deinem Handy kann Robert nicht löschen – das geht nur bei dir selbst. Im Kader hinterlegte Spielerdaten (Name, Nummer, Positionen) verwaltet ein Admin – sag einem Admin Bescheid, wenn auch diese gelöscht werden sollen. In einer Gruppe führt !delete nichts aus, sondern verweist auf den Privatchat.

An OpenAI gehen nur die in Abschnitt 8 genannten Inhalte; Telefonnummern, Tokens und Passwörter bleiben im System. Weitergehende Auskunfts- oder LöschwĂĽnsche richtest du an die im Impressum genannte Kontaktadresse.

Impressum

Angaben gemäß § 5 DDG (Digitale-Dienste-Gesetz):

Marko Oljaca
Blaue-Lilien-Gasse 3
93047 Regensburg
Deutschland

Kontakt:
E-Mail: [email protected]

Verantwortlich fĂĽr den Inhalt nach § 18 Abs. 2 MStV: Marko Oljaca (Anschrift wie oben).

Privates, nicht-kommerzielles Projekt fĂĽr Blockbuster.