From bbd48210118652ac64b55fe8a9d1246c2274a7c6 Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Mon, 16 Mar 2026 11:34:55 +0100 Subject: [PATCH] fix: Quellenlinks mit Buchstaben-Suffix ([389a] etc.) korrekt verlinken Probleme: - Frontend-Regex matchte nur reine Zahlen, nicht [389a]-Style Refs - 17 alphanumerische Quellen im Irankonflikt blieben unverlinkt - Orchestrator-Validierung erkannte diese Refs nicht als fehlend Fixes: - Frontend: Regex erweitert auf [\d+a-z?], Vergleich mit String und Number - Orchestrator: Validierung erkennt jetzt auch alphanumerische Refs - Analyzer-Prompts: Explizite Anweisung, nur ganze Zahlen als Nr zu verwenden - 822a und 859a in Irankonflikt sources_json nachgetragen - Cache-Buster aktualisiert Co-Authored-By: Claude Opus 4.6 (1M context) --- src/agents/analyzer.py | 8 ++++---- src/agents/orchestrator.py | 21 ++++++++++++++++----- src/static/dashboard.html | 2 +- src/static/js/components.js | 4 ++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/agents/analyzer.py b/src/agents/analyzer.py index 02613f0..7223fa3 100644 --- a/src/agents/analyzer.py +++ b/src/agents/analyzer.py @@ -38,7 +38,7 @@ REGELN: - Wenn eine Quelle eine erkennbare Ausrichtung hat (z.B. pro-russisch, pro-iranisch, staatsnah, rechtsextrem), muss dies im Fliesstext erwaehnt werden, damit der Leser die Information einordnen kann. Beispiel: "Laut dem pro-russischen Telegram-Kanal Rybar..." oder "Die iranische Nachrichtenagentur Fars meldete..." oder "Der rechtsextreme Kanal Compact behauptete..." - Quellen immer mit [Nr] referenzieren - Jede verwendete Quelle MUSS im sources-Array aufgelistet sein -- Nummeriere die Quellen fortlaufend ab [1] +- Nummeriere die Quellen fortlaufend ab [1]. Verwende NUR ganze Zahlen als Quellennummern (z.B. [389], [390]), KEINE Buchstaben-Suffixe wie [389a] - Ältere Quellen zeitlich einordnen (z.B. "laut einem Bericht vom Januar", "Anfang Februar berichtete...") Antworte AUSSCHLIESSLICH als JSON-Objekt mit diesen Feldern: @@ -91,7 +91,7 @@ REGELN: - Wenn eine Quelle eine erkennbare Ausrichtung hat (z.B. pro-russisch, pro-iranisch, staatsnah, rechtsextrem), muss dies im Fliesstext erwaehnt werden, damit der Leser die Information einordnen kann. Beispiel: "Laut dem pro-russischen Telegram-Kanal Rybar..." oder "Die iranische Nachrichtenagentur Fars meldete..." oder "Der rechtsextreme Kanal Compact behauptete..." - Quellen immer mit [Nr] referenzieren - Jede verwendete Quelle MUSS im sources-Array aufgelistet sein -- Nummeriere die Quellen fortlaufend ab [1] +- Nummeriere die Quellen fortlaufend ab [1]. Verwende NUR ganze Zahlen als Quellennummern (z.B. [389], [390]), KEINE Buchstaben-Suffixe wie [389a] - Ältere Quellen zeitlich einordnen (z.B. "laut einem Bericht vom Januar", "Anfang Februar berichtete...") - Markdown-Überschriften (##) für die Abschnitte verwenden - KEIN Fettdruck (**) verwenden @@ -142,7 +142,7 @@ REGELN: Antworte AUSSCHLIESSLICH als JSON-Objekt mit diesen Feldern: - "summary": Aktualisierte Zusammenfassung mit Quellenverweisen [1], [2] etc. -- "sources": Array mit NUR den NEUEN Quellen aus den neuen Meldungen, je: {{"nr": , "name": "Quellenname", "url": "https://..."}}. Alte Quellen werden automatisch gemerged. +- "sources": Array mit NUR den NEUEN Quellen aus den neuen Meldungen, je: {{"nr": , "name": "Quellenname", "url": "https://..."}}. Alte Quellen werden automatisch gemerged. - "key_facts": Array aller aktuellen Kernfakten (in Ausgabesprache) - "translations": Array von Objekten mit "article_id", "headline_de", "content_de" (nur für neue fremdsprachige Artikel) @@ -187,7 +187,7 @@ REGELN: Antworte AUSSCHLIESSLICH als JSON-Objekt mit diesen Feldern: - "summary": Das aktualisierte Briefing als Markdown-Text mit Quellenverweisen -- "sources": Array mit NUR den NEUEN Quellen aus den neuen Meldungen, je: {{"nr": , "name": "Quellenname", "url": "https://..."}}. Alte Quellen werden automatisch gemerged. +- "sources": Array mit NUR den NEUEN Quellen aus den neuen Meldungen, je: {{"nr": , "name": "Quellenname", "url": "https://..."}}. Alte Quellen werden automatisch gemerged. - "key_facts": Array aller gesicherten Kernfakten (in Ausgabesprache) - "translations": Array von Objekten mit "article_id", "headline_de", "content_de" (nur für neue fremdsprachige Artikel) diff --git a/src/agents/orchestrator.py b/src/agents/orchestrator.py index 7470cad..7dd7648 100644 --- a/src/agents/orchestrator.py +++ b/src/agents/orchestrator.py @@ -980,13 +980,24 @@ class AgentOrchestrator: # Validierung: Fehlende Quellennummern im Summary erkennen und reparieren if sources and new_summary: import re as _re - referenced_nrs = set(int(m) for m in _re.findall(r'\[(\d+)\]', new_summary)) + # Auch alphanumerische Refs wie [389a] erkennen + referenced_raw = set(_re.findall(r'\[(\d+[a-z]?)\]', new_summary)) + referenced_nrs = set() + for r in referenced_raw: + try: + referenced_nrs.add(int(r)) + except ValueError: + referenced_nrs.add(r) # Keep alphanumeric as string defined_nrs = set() for s in sources: - try: - defined_nrs.add(int(s.get("nr", 0))) - except (ValueError, TypeError): - pass + nr = s.get("nr", 0) + if isinstance(nr, int): + defined_nrs.add(nr) + elif isinstance(nr, str): + try: + defined_nrs.add(int(nr)) + except ValueError: + defined_nrs.add(nr) # Keep alphanumeric like '389a' missing_nrs = sorted(referenced_nrs - defined_nrs) if missing_nrs: logger.warning( diff --git a/src/static/dashboard.html b/src/static/dashboard.html index e51cbe9..19ecc3c 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -751,7 +751,7 @@ - + diff --git a/src/static/js/components.js b/src/static/js/components.js index b17851b..b5aa93e 100644 --- a/src/static/js/components.js +++ b/src/static/js/components.js @@ -446,8 +446,8 @@ const UI = { // Inline-Zitate [1], [2] etc. als klickbare Links rendern if (sources.length > 0) { - html = html.replace(/\[(\d+)\]/g, (match, num) => { - const src = sources.find(s => Number(s.nr) === Number(num)); + html = html.replace(/\[(\d+[a-z]?)\]/g, (match, num) => { + const src = sources.find(s => String(s.nr) === num || Number(s.nr) === Number(num)); if (src && src.url) { return `[${num}]`; }