GuardedChatBundle
Schutzschicht für öffentliche KI-Chats in Symfony: Filter gegen Prompt-Injection, Rate-Limits, Budget-Stopp und Löschfristen.
Release v1.1.0 · zuletzt aktiv am 22.10.2026
Quelle: GitHub-API, Stand 24.10.2026, 14:15
Was das Bundle löst
GuardedChatBundle ist eine Schutzschicht für öffentliche KI-Chats in Symfony-Anwendungen. Es baut auf Symfony AI auf und ergänzt es, statt es zu ersetzen: Symfony AI spricht mit dem Modell, alles rund um den öffentlichen, anonymen Chat-Endpunkt bleibt dort Sache der Anwendung.
Ein Vorfilter erkennt offensichtliche Prompt-Injection-Formulierungen, bevor das Modell aufgerufen wird. Rate-Limits pro Client, ein Nachrichtenlimit je Session und ein Budget-Stopp verhindern, dass ein Bot das Token-Budget leert. Signierte Session-Tokens mit Lebensdauer und Leerlauf-Timeout regeln, wer eine Unterhaltung fortsetzen darf.
Prompts liegen versioniert in der Datenbank und lassen sich ohne Deploy ändern. Ein zweistufiger Kill-Switch schaltet den Chat bei einem Vorfall ab, und Löschfristen entfernen alte Gesprächsverläufe zeitgesteuert. Ein einsatzbereites Chat-Widget mit Hinweis auf die KI gehört dazu.
Im Einsatz auf jacomeit.de
Das Bundle schützt den öffentlichen Chat auf jacomeit.de. Die Routen des Bundles sind unter dem Präfix /chat eingebunden, die Plattform ist ein LiteLLM-Gateway über die Generic-Bridge von Symfony AI.
Die Rate-Limits liegen bei 5 Sessions pro Stunde sowie 8 Nachrichten pro Minute und 50 pro Tag. Gesprächsverläufe werden nach 90 Tagen gelöscht, der Prune läuft täglich um 03:30 Uhr. Der Chat nutzt eine Wissensbasis mit PostgreSQL-Volltextsuche.
Die Erweiterungspunkte des Bundles sind mit eigenen Klassen belegt: ein Laufzeitschalter über die Seiteneinstellungen, eine Prüfung per Cloudflare Turnstile, die Client-Erkennung hinter Cloudflare und die Erkennung eines erschöpften LiteLLM-Budgets. Die Anrede „Sie“ und die Ausgabe als reiner Text sind als feste Anweisungen hinterlegt.
Installation
Installieren Sie das Bundle mit composer require stejac/guarded-chat-bundle. Mit Symfony Flex legt das Recipe die Konfigurationsdateien und die Variable GUARDED_CHAT_ENABLED an.
Tragen Sie in config/packages/guarded_chat.yaml die Schlüssel platform und model ein, dazu unter prompt.default den Prompt als Rückfallwert. Die Plattform selbst konfigurieren Sie wie in der Dokumentation von Symfony AI beschrieben. Binden Sie die Routen in config/routes/guarded_chat.yaml mit der Ressource @GuardedChatBundle/config/routes.php und einem Präfix wie /chat ein.
Binden Sie das Widget mit {{ include('@GuardedChat/widget.html.twig') }} in Ihr Basis-Template ein. Es braucht AssetMapper und das StimulusBundle. Das Bundle liefert keine Migrationen: Erzeugen Sie diese mit bin/console doctrine:migrations:diff und prüfen Sie das Ergebnis.