
OTRS CRM Wizard — KI-gestütztes Kundendienst-Cockpit
Wie ich mit einem lokalen 26B-LLM, fünf Microservices und einem Wort-Diff ein komplettes Agent-Cockpit gebaut habe
PROJEKT
OTRS CRM Wizard — KI-gestütztes Kundendienst-Cockpit
TECHNOLOGIEN
Herausforderung
Im Kundendienst eines großen E-Commerce-Unternehmens laufen täglich hunderte Tickets über OTRS ein — Versandprobleme, Retouren, Zahlungsfragen, Rückrufwünsche. Jedes Ticket muss gelesen, eingeordnet und beantwortet werden. Dieser Prozess ist repetitiv, zeitintensiv und fehleranfällig, besonders bei hohem Volumen.
Mein Auftrag: ein KI-gestütztes Cockpit für die Kundendienst-Agents, das jedes eingehende Ticket automatisch analysiert, klassifiziert, eine Stimmungs- und Dringlichkeitseinschätzung liefert und einen Antwort-Entwurf vorschlägt — alles in Echtzeit, alles lokal gehostet, kein Cloud-LLM, keine Kundendaten verlassen das Netzwerk.
Zusätzliche Anforderungen machten das Projekt komplex:
- Kundendaten aus der Shop-Datenbank (Bestellhistorie, Bonuspunkte, Adressen) mussten in die KI-Analyse einfließen
- Die KI durfte keine Fakten erfinden — jede unsichere Aussage musste als Warnung markiert werden
- Mehrere Shops mit unterschiedlichen Sprachen (Deutsch, Polnisch) und eigenen Grußformeln mussten unterstützt werden
- Alle Agent-Aktionen (wer hat was geändert, welchen KI-Entwurf wie editiert) mussten nachvollziehbar protokolliert werden
- Das System musste auf Apple Silicon lokal laufen — reine Inferenz, kein GPU-Cluster
Lösung
Ich entwarf und implementierte eine Toolchain aus fünf Komponenten, die über Bearer-Token und SSE miteinander kommunizieren. Jede Komponente hat eine klare Verantwortung — von der Webhook-Verarbeitung bis zur Antwortgenerierung.
1. Webhook Sink — die zentrale Datenhaltung
Ein Next.js 16 Service empfängt ArticleCreate-Webhooks vom Ticketsystem, speichert Tickets und Artikel in PostgreSQL via Prisma 7 und streamt Änderungen in Echtzeit via Server-Sent Events (pg_notify). Der Sink ist die Single Source of Truth: hier landen KI-Insights, Drafts, Kundendaten und Audit-Logs. Eine Public API mit 22 Filter-Parametern macht die Daten für alle anderen Services zugänglich.
2. LLM Tools — der KI-Orchestrator
Ein eigener Service baut die Prompts, injiziert Shop-Wissen aus 19 internen Wissensartikeln (rule-basiert gematcht, max. 2 Artikel, 3000-Char-Budget) und streamt die Ergebnisse als strukturiertes JSON. Insights liefern ein 11-Feld-Schema: Sentiment, Dringlichkeit, Zusammenfassung, empfohlene Aktionen, Klassifikation (10 Kategorien) und ein draftNeeded-Gate, das bei Spam oder irrelevanten Nachrichten den Entwurf unterdrückt. Drafts werden mit Anti-Halluzinations-Prompt, Gender-Erkennung aus dem Vornamen und shopspezifischen Grußformeln generiert.
3. CRM Helper — das Agent-Frontend
Das Herzstück: ein Next.js 16 Frontend mit Tailwind v4, Framer Motion und einer eigenen User-Datenbank (JWT, drei Rollen). Agents sehen eine Ticket-Liste mit farbigen Brain-Indikatoren (5 Zustände), klicken ein Ticket an und bekommen sofort die KI-Einschätzung plus einen editierbaren Antwort-Entwurf. Ein dreistufiger Auto-Worker (SSE-getriggert, 10s Fallback-Poll) analysiert neue Tickets automatisch im Hintergrund: Prio 1 Insights, Prio 2 Kundendaten aus der Shop-API, Prio 3 Antwort-Entwurf.
4. Shop CRM API — Kundendaten aus der Quelle
Um dem LLM und den Agents Kontext zu geben, baute ich eine REST-API in das bestehende PHP/Slim 3 Shop-Backend ein. Sie liefert per verschlüsseltem Email-Lookup das vollständige Kundenprofil: Bestellhistorie mit Produkten und Tracking, Bonuspunkte, Adressen. Die Daten fließen automatisch in den Insight-Prompt ein und werden als Kundenprofil-Karte mit Tier-Badge (Bronze/Silver/Gold basierend auf Umsatz/Monat) in der Sidebar angezeigt.
5. Lokale Inferenz mit MLX
Alle KI-Operationen laufen lokal auf Apple Silicon über mlx_lm.server mit Gemma 4 26B-A4B (Mixture of Experts, 4-bit). Kein Token verlässt das Netzwerk. Das Modell liefert ~15 tok/s Output bei Streaming. Token-Verbrauch wird pro Request getrackt und im Dashboard aggregiert (tok/s, tok/h). Ein entdecktes Prompt-Cache-Problem nach tagelangem Betrieb löste ich durch den --prompt-cache-size 1 Parameter.
6. Audit-Log mit Wort-Diff
Wenn ein Agent einen KI-Entwurf editiert und abschickt, berechnet das System einen wortbasierten Diff (Longest Common Subsequence) zwischen Original und editierter Version. Administratoren sehen im Audit-Log genau was die KI vorgeschlagen hat und was der Agent geändert hat — grün für hinzugefügt, rot für entfernt. Ticket-Zuweisungen werden mit assign/reassign/unassign differenziert.
Code-Beispiele
Ergebnisse
Innerhalb von zehn Tagen entstand ein produktionsreifes System mit 53 API-Endpoints über fünf Komponenten:
- 53 dokumentierte API-Endpoints (15 Sink, 5 LLM Tools, 32 CRM Helper, 1 Shop API)
- 11-Feld KI-Analyse pro Ticket: Sentiment, Dringlichkeit, Zusammenfassung, Klassifikation, empfohlene Aktionen, draftNeeded-Gate
- Automatische Antwort-Entwürfe in Deutsch und Polnisch mit shopspezifischen Grußformeln und Gender-Erkennung
- ~15 tok/s Inference-Geschwindigkeit mit Gemma 4 26B lokal auf Apple Silicon — keine Cloud, keine Kundendaten verlassen das Netzwerk
- Dreistufiger Auto-Worker: neue Tickets werden ohne manuelle Aktion analysiert, mit Kundendaten angereichert und mit Entwurf versehen
- Vollständiges Audit-Log mit Wort-Diff — nachvollziehbar was die KI vorgeschlagen hat und was der Agent geändert hat
- Kundenprofil-Integration mit Tier-Klassifizierung direkt aus der Shop-Datenbank
- KI-Tagesbriefing: automatisch generierte Zusammenfassung der Ticket-Lage (stündlich aktualisiert)
Das System läuft auf Coolify (Docker) im internen Netzwerk und wird über Webhooks mit Tickets versorgt. Die Agents arbeiten ausschließlich im Browser — Login, Analyse, Entwurf, Versand, alles in einer Oberfläche. Die KI entscheidet nie alleine: jede Antwort wird vor dem Versand vom Agent geprüft und ggf. angepasst.
Visuelle Eindrücke

Fünf Komponenten, verbunden über Bearer-Token und SSE: Webhook Sink (Datenhaltung), LLM Tools (KI-Orchestrator), CRM Helper (Agent-UI), Shop CRM API (Kundendaten), MLX Server (lokale Inferenz).

