5. Implementierungsphase

Aktueller Status

05.05.2026

  • Die Einreichung des Antrages ist erfolgt.

5.1 Datenbank-Migration und Persistenz

Die Umsetzung startete mit der Erweiterung des Prisma-Schemas um das sources-Feld. Die Migration wurde mittels Prisma Migrate durchgeführt, um eine konsistente Datenbankstruktur über alle Entwicklungsumgebungen hinweg sicherzustellen. Durch die Wahl des Datentyps jsonb konnte die Persistierung der Quellen ohne komplexe Tabellen-Joins realisiert werden. Der zugehörige SQL-Auszug befindet sich in Anhang E.1.

5.2 Backend: Modulare Quellenextraktion

Um den Chat-Service übersichtlich zu halten und die Testbarkeit zu erhöhen, wurde die Logik zur Quellenverarbeitung in das dedizierte Modul chat.sources.ts ausgelagert (Single-Responsibility-Prinzip).
Das Kernstück bildet eine dreistufige Verarbeitungspipeline:

  • Coercion: Überführung verschiedenster Eingabestrukturen (Objekte, Strings, Arrays) in ein Standard-Array.
  • Normalisierung: Mapping auf den Zieltyp SourceReference.
  • Validierung & Schutz: Kürzung von Texten und Begrenzung der Quellenanzahl zum Schutz der Datenbankressourcen.
    Die Details der Verarbeitungslogik sind in Anhang E.2 dargestellt.

5.3 Integration in den Streaming-Prozess

Die größte technische Hürde war die Integration in den bestehenden SSE-Stream. Da das Sprachmodell Quellen erst nach Abschluss der Texterzeugung liefert, wurde der Backend-Generator so angepasst, dass er die Quellen akkumuliert und erst nach dem done-Signal als finales SSE-Ereignis vom Typ sources emittiert. Ein Flag stellt sicher, dass dieses Ereignis auch bei instabilen Netzwerkverbindungen nur einmalig gesendet wird.

5.4 Frontend: Dynamisches Rendering und Sicherheit

Der SSE-Parser wurde um den Ereignistyp sources erweitert. Da diese Daten erst nach dem Stream eintreffen, erfolgt eine Pufferung mittels ref und die anschließende gemeinsame Persistierung mit der Nachricht. Eine Sicherheitslogik rendert ausschließlich valide HTTPS-Links klickbar; lokale Adressen (z. B. localhost) verbleiben als Reintext. Die Benutzeroberfläche ist vollständig internationalisiert (siehe Anhang E.3).