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

@@ -884,6 +884,45 @@ class AgentOrchestrator:
"data": {"status": "analyzing", "detail": "Analyse und Faktencheck laufen parallel...", "started_at": now_utc},
}, 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 ---
async def _do_analysis():
analyzer = AnalyzerAgent()