feat(citations): Web-Such-Quellen unter der Antwort-Bubble anzeigen

Sonar liefert Citation-URLs; bisher verworfen, jetzt bis in die UI gereicht.

- ToolCallingLLM: _run_tool/_inject_forced_search geben Citations zurueck;
  stream() sammelt sie ueber einen on_citations-Callback.
- Orchestrator: chat_stream reicht on_citations durch (via _stream_supports)
  und legt die gesammelten URLs in PipelineTrace.citations.
- schemas: PipelineTrace.citations.
- ws.py: Citations im semantic-Event.
- Frontend (app.js): renderCitations() zeigt bis zu 4 Quellen-Links
  (Hostname, neuer Tab) unter der Antwort-Bubble.

Nur ueber den Streaming-Pfad (= Web-UI). Live verifiziert: "Wer ist
Bundeskanzler?" -> 15 Quellen gesammelt (Bundeskanzler.de, Wikipedia, ...).
Tests: 312 gruen; JS-Syntax geprueft. Doc §8.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-30 00:11:24 +02:00
commit e753788a23
6 changed files with 65 additions and 15 deletions

View file

@ -171,8 +171,11 @@ wird zur Tool-Rangordnung).
Tool-Client) + Koreferenz-Vorstufe + Registry-Eintrag + `web_search_enabled`
(global an, Opt-out) + Filler für **Server-TTS** + Tool/Sonar-Metriken.
schedule_hours-honest-punt akzeptiert.
- **Fast-follow:** Filler für **Gerät-TTS** (Event-Protokoll) → Citations in die
UI-Bubble → ggf. deterministischer Logistik-Nudge.
- **Erledigt (nach v1):** Backstop für heikle Kategorien (§5.7), Filler für
**Gerät-TTS** (§5.4), **Citations in die UI-Bubble** (`PipelineTrace.citations`
`on_citations` → WS `semantic`-Event → Quellen-Links unter der Antwort).
- **Fast-follow (offen):** „no-tool-endpoints"-404-Härtung (tool-unfähiges Modell
bewusst plain statt still stale), ggf. deterministischer Logistik-Nudge.
- **Später (Multitool):** weitere Tools in dieselbe `ToolCallingLLM`-Schleife
(Kalender, Erinnerungen, Medizin-Safety) mit Tool-Rangordnung.