feat: Quelleneinordnung (Bias) in Lageberichten fuer kritische Quellen

Parteiische Quellen (pro-russisch, pro-iranisch, rechtsextrem etc.)
werden jetzt im Lagebericht-Fliesstext als solche gekennzeichnet,
damit der Leser die Informationen einordnen kann.

Aenderungen:
- Orchestrator reichert Artikel mit source_bias aus der sources-Tabelle an
- Analyzer zeigt Einordnung im Artikel-Kontext fuer den Claude-Prompt
- Alle 4 Prompt-Templates enthalten neue Regel zur Quellenkennzeichnung

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Claude Dev
2026-03-16 10:53:36 +01:00
Ursprung bf21bc4e2c
Commit aad473a568
2 geänderte Dateien mit 46 neuen und 0 gelöschten Zeilen

Datei anzeigen

@@ -35,6 +35,7 @@ REGELN:
- KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze - KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze
- Nur gesicherte Informationen in die Zusammenfassung - Nur gesicherte Informationen in die Zusammenfassung
- Bei widersprüchlichen Angaben beide Seiten erwähnen - Bei widersprüchlichen Angaben beide Seiten erwähnen
- 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 - Quellen immer mit [Nr] referenzieren
- Jede verwendete Quelle MUSS im sources-Array aufgelistet sein - Jede verwendete Quelle MUSS im sources-Array aufgelistet sein
- Nummeriere die Quellen fortlaufend ab [1] - Nummeriere die Quellen fortlaufend ab [1]
@@ -87,6 +88,7 @@ REGELN:
- KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze - KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze
- Nur gesicherte Informationen verwenden - Nur gesicherte Informationen verwenden
- Bei widersprüchlichen Angaben beide Seiten erwähnen - Bei widersprüchlichen Angaben beide Seiten erwähnen
- 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 - Quellen immer mit [Nr] referenzieren
- Jede verwendete Quelle MUSS im sources-Array aufgelistet sein - Jede verwendete Quelle MUSS im sources-Array aufgelistet sein
- Nummeriere die Quellen fortlaufend ab [1] - Nummeriere die Quellen fortlaufend ab [1]
@@ -134,6 +136,7 @@ REGELN:
- Neutral und sachlich - keine Wertungen oder Spekulationen - Neutral und sachlich - keine Wertungen oder Spekulationen
- KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze - KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze
- Bei widersprüchlichen Angaben beide Seiten erwähnen - Bei widersprüchlichen Angaben beide Seiten erwähnen
- 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 - Quellen immer mit [Nr] referenzieren
- Ältere Quellen zeitlich einordnen - Ältere Quellen zeitlich einordnen
@@ -178,6 +181,7 @@ REGELN:
- KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze - KEINE Gedankenstriche (—, –) verwenden — stattdessen Kommas, Doppelpunkte oder neue Saetze
- Neue Erkenntnisse einarbeiten - Neue Erkenntnisse einarbeiten
- Veraltete Informationen aktualisieren - Veraltete Informationen aktualisieren
- 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 - Quellen immer mit [Nr] referenzieren
- Markdown-Überschriften (##) für die Abschnitte verwenden - Markdown-Überschriften (##) für die Abschnitte verwenden
@@ -203,6 +207,9 @@ class AnalyzerAgent:
if url: if url:
articles_text += f"URL: {url}\n" articles_text += f"URL: {url}\n"
articles_text += f"Sprache: {article.get('language', 'de')}\n" articles_text += f"Sprache: {article.get('language', 'de')}\n"
bias = article.get('source_bias', '')
if bias:
articles_text += f"Einordnung: {bias}\n"
published = article.get('published_at', '') published = article.get('published_at', '')
if published: if published:
articles_text += f"Veröffentlicht: {published}\n" articles_text += f"Veröffentlicht: {published}\n"

Datei anzeigen

@@ -884,6 +884,45 @@ class AgentOrchestrator:
"data": {"status": "analyzing", "detail": "Analyse und Faktencheck laufen parallel...", "started_at": now_utc}, "data": {"status": "analyzing", "detail": "Analyse und Faktencheck laufen parallel...", "started_at": now_utc},
}, visibility, created_by, tenant_id) }, visibility, created_by, tenant_id)
# Quelleneinordnung (Bias) an Artikel anhaengen
try:
cursor = await db.execute(
"SELECT name, domain, bias FROM sources WHERE bias IS NOT NULL"
)
_bias_rows = await cursor.fetchall()
_bias_by_domain = {}
_bias_by_name = {}
for br in _bias_rows:
brd = dict(br)
if brd.get("domain"):
_bias_by_domain[brd["domain"].lower()] = brd["bias"]
if brd.get("name"):
_bias_by_name[brd["name"].lower()] = brd["bias"]
def _enrich_bias(articles_list):
if not articles_list:
return
for art in articles_list:
if art.get("source_bias"):
continue
src = (art.get("source") or "").lower()
url = (art.get("source_url") or "").lower()
# Match by name
bias = _bias_by_name.get(src)
if not bias:
# Match by domain in URL
for dom, b in _bias_by_domain.items():
if dom and dom in url:
bias = b
break
if bias:
art["source_bias"] = bias
_enrich_bias(new_articles_for_analysis)
_enrich_bias(all_articles_preloaded)
except Exception as e:
logger.warning("Bias-Anreicherung fehlgeschlagen (Pipeline laeuft weiter): %s", e)
# --- Analyse-Task --- # --- Analyse-Task ---
async def _do_analysis(): async def _do_analysis():
analyzer = AnalyzerAgent() analyzer = AnalyzerAgent()