From 7777b77abd92c043eb53859e13248e2d72a272aa Mon Sep 17 00:00:00 2001 From: Claude Code Date: Tue, 26 May 2026 00:22:34 +0000 Subject: [PATCH 1/2] feat(pipeline): Translator als Pipeline-Step + Watchdog-Limits erhoehen Folgefix zu 952df87. Der Translator-Block laeuft post-summary bei jp_demo 40+ Min und war bisher fuer das Frontend unsichtbar und fuer den Watchdog ein blinder Fleck (kein Pipeline-Step-Eintrag). Aenderungen: - pipeline_tracker.py: neuer Step 'translate' zwischen 'summary' und 'qc' (DE+EN Label/Tooltip). Bewusst conditional sichtbar: erscheint nur, wenn fremdsprachige Artikel ohne DE-Uebersetzung vorliegen UND translator_enabled fuer die Org an ist. - orchestrator.py: Translator-Block umrandet mit _pipe_start('translate') und _pipe_done('translate', count_value=uebersetzt, count_secondary= pending). Translator-Fehler schliesst Step trotzdem sauber ab. Bedingung 'pending_translations and translator_enabled' ersetzt das alte 'pending_translations' - skipped den Block sauber wenn Org-Override deaktiviert (war vorher redundant in translate_articles selbst). - main.py: ORPHAN_IDLE_LIMIT 30->60 Min, ORPHAN_HARD_LIMIT 90->120 Min. Deckt jp_demo Translator-Phase (beobachtet bis 41 Min) mit Puffer ab, ohne echte Haenger durchzulassen. Resultierend: Frontend zeigt den Uebersetzungs-Schritt mit Fortschritt (uebersetzt/gesamt). Watchdog killt nicht mehr vorzeitig. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/agents/orchestrator.py | 9 ++++++++- src/main.py | 4 ++-- src/services/pipeline_tracker.py | 4 ++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/agents/orchestrator.py b/src/agents/orchestrator.py index 7a9760f..86bf7e8 100644 --- a/src/agents/orchestrator.py +++ b/src/agents/orchestrator.py @@ -1753,6 +1753,7 @@ class AgentOrchestrator: # Idempotent: nur Artikel ohne headline_de/content_de werden geholt. # Lauft nach der Analyse (Lagebild ist schon committed) und vor QC # (damit normalize_umlaut_articles auch die frischen DE-Texte fasst). + _translate_step_started = False try: tr_cursor = await db.execute( """SELECT id, headline, content_original, language @@ -1764,7 +1765,10 @@ class AgentOrchestrator: (incident_id,), ) pending_translations = [dict(r) for r in await tr_cursor.fetchall()] - if pending_translations: + if pending_translations and translator_enabled: + # Pipeline-Schritt 9: Artikel uebersetzen (nur sichtbar wenn was zu uebersetzen) + await _pipe_start("translate") + _translate_step_started = True logger.info( "Translator fuer Incident %d: %d Artikel ohne DE-Uebersetzung", incident_id, len(pending_translations), @@ -1795,8 +1799,11 @@ class AgentOrchestrator: "Translator fuer Incident %d: %d/%d Artikel uebersetzt", incident_id, len(translations), len(pending_translations), ) + await _pipe_done("translate", count_value=len(translations), count_secondary=len(pending_translations)) except Exception as e: logger.error("Translator-Fehler fuer Incident %d: %s", incident_id, e, exc_info=True) + if _translate_step_started: + await _pipe_done("translate", count_value=0, count_secondary=0) # Refresh trotz Translator-Fehler weiterlaufen lassen # --- Neueste Entwicklungen (nur Live-Monitoring / adhoc) --- diff --git a/src/main.py b/src/main.py index 3aaa28c..9bec45c 100644 --- a/src/main.py +++ b/src/main.py @@ -252,8 +252,8 @@ async def cleanup_expired(): # vorzeitig gekillt werden. Ein Refresh gilt als verwaist, wenn entweder # (a) seit ORPHAN_IDLE_LIMIT Min kein Pipeline-Step Fortschritt zeigte, # oder (b) das harte Limit ORPHAN_HARD_LIMIT Min ueberschritten wurde. - ORPHAN_IDLE_LIMIT = 30 - ORPHAN_HARD_LIMIT = 90 + ORPHAN_IDLE_LIMIT = 60 + ORPHAN_HARD_LIMIT = 120 cursor = await db.execute( "SELECT id, incident_id, started_at FROM refresh_log WHERE status = 'running'" ) diff --git a/src/services/pipeline_tracker.py b/src/services/pipeline_tracker.py index 86cc43a..da47ced 100644 --- a/src/services/pipeline_tracker.py +++ b/src/services/pipeline_tracker.py @@ -36,6 +36,8 @@ _PIPELINE_STEPS_DE = [ "tooltip": "Aus Foren-Quellen (z.B. 5ch, Hatena, Note) wird ein Stimmungsbild der öffentlichen Diskussion extrahiert. Keine Faktenlage, sondern dominante Themen und Bruchlinien."}, {"key": "summary", "label": "Lagebild verfassen", "icon": "file-text", "tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text."}, + {"key": "translate", "label": "Artikel uebersetzen", "icon": "languages", + "tooltip": "Fremdsprachige Meldungen (z.B. japanisch) werden ins Lagebild-Output uebersetzt. Laeuft nur fuer Quellen-Pools mit nicht-deutschen Sprachen und kann bei vielen neuen Artikeln einige Minuten dauern."}, {"key": "qc", "label": "Qualitätscheck", "icon": "check-circle", "tooltip": "Eine letzte Kontrollprüfung am Ergebnis: Doppelte Fakten zusammenführen, Karten-Verortung prüfen, bevor du benachrichtigt wirst."}, {"key": "notify", "label": "Benachrichtigen", "icon": "bell", @@ -59,6 +61,8 @@ _PIPELINE_STEPS_EN = [ "tooltip": "Forum sources (5ch, Hatena, Note, etc.) are summarised into a public-mood overview. Not factual, but dominant themes and fault lines."}, {"key": "summary", "label": "Writing the briefing", "icon": "file-text", "tooltip": "All verified articles are combined into a coherent briefing with inline citations."}, + {"key": "translate", "label": "Translating articles", "icon": "languages", + "tooltip": "Foreign-language articles (e.g. Japanese) are translated into the briefing output language. Runs only when the source pool contains non-target-language items and can take several minutes for large incoming batches."}, {"key": "qc", "label": "Quality check", "icon": "check-circle", "tooltip": "A final review: consolidate duplicate facts, verify map locations, before you get notified."}, {"key": "notify", "label": "Notifying", "icon": "bell", -- 2.49.1 From d570e13dc6c583189fbcec16168330352e841b3d Mon Sep 17 00:00:00 2001 From: Claude Code Date: Tue, 2 Jun 2026 15:52:59 +0000 Subject: [PATCH 2/2] Lagebild: keine datierten Neu-am-Verlaufsbloecke mehr Der inkrementelle Analyse-Prompt liess das LLM neue Erkenntnisse als datierte Changelog-Bloecke (Neu am DD.MM.) anhaengen, die nie eingefaltet wurden. Beim Iran-Lagebild summierten sich so 151 solcher Bloecke. Punkt 3 fordert jetzt das Einarbeiten in den thematischen Abschnitt; zusaetzliche STRUKTUR-Regel loest bestehende Neu-am-Bloecke auf. Die chronologische Sicht bleibt der separaten Kachel Neueste Entwicklungen vorbehalten. --- src/agents/analyzer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/agents/analyzer.py b/src/agents/analyzer.py index ee92bc1..3809439 100644 --- a/src/agents/analyzer.py +++ b/src/agents/analyzer.py @@ -124,7 +124,7 @@ BISHERIGE QUELLEN: AUFTRAG: 1. Aktualisiere das Lagebild basierend auf den neuen Meldungen. Das Lagebild soll so ausführlich wie nötig sein, um alle wesentlichen Themenstränge abzudecken 2. Behalte bestätigte Fakten aus dem bisherigen Lagebild bei -3. Ergänze neue Erkenntnisse und markiere wichtige neue Entwicklungen +3. Arbeite neue Erkenntnisse direkt in den thematisch passenden Abschnitt ein. Erzeuge KEINE datierten Verlaufsblöcke wie "Neu am DD.MM." oder "Neu seit ...". Das Lagebild ist eine zusammenhängende thematische Darstellung des AKTUELLEN Stands, kein chronologisches Änderungsprotokoll. Die zeitliche Abfolge der jüngsten Ereignisse wird separat in der Kachel "Neueste Entwicklungen" gepflegt und darf hier NICHT als Datums-Changelog dupliziert werden 4. Aktualisiere die Quellenverweise — neue Quellen bekommen fortlaufende Nummern nach den bisherigen 5. Entferne nur nachweislich widerlegte Informationen. Behalte alle thematischen Abschnitte bei, auch wenn sie nicht durch neue Meldungen aktualisiert werden @@ -133,6 +133,7 @@ STRUKTUR: - Wenn sich Daten strukturiert vergleichen lassen (z.B. Produkte, Unternehmen, Kennzahlen, Modelle), verwende eine Markdown-Tabelle (| Spalte1 | Spalte2 | ... mit Trennzeile |---|---|) - KEIN Fettdruck (**) verwenden - ERZEUGE KEINE Sektion "## ZUSAMMENFASSUNG", "## ÜBERBLICK" oder "## KERNPUNKTE". Falls das BISHERIGE LAGEBILD eine solche Sektion enthält, ENTFERNE sie vollständig beim Aktualisieren. Die neuesten Entwicklungen werden separat als eigene Kachel gepflegt und dürfen im Lagebild NICHT dupliziert werden. +- KEINE datierten Verlaufsmarker im Lagebild. Einleitungen wie "Neu am 31.05./01.06.:", "Neu seit gestern:" oder vergleichbare Datums-Changelog-Phrasen sind nicht erlaubt. Falls das BISHERIGE LAGEBILD solche Blöcke enthält, LÖSE SIE AUF: integriere ihren Inhalt in den thematisch passenden Abschnitt und ENTFERNE die "Neu am"-Einleitung samt reiner Datumsgruppierung restlos. Innerhalb eines Abschnitts steht der aktuelle Stand vorne, ältere Belege werden im Fließtext zeitlich eingeordnet (z.B. "Ende Mai berichtete ..."). REGELN: - Neutral und sachlich - keine Wertungen oder Spekulationen -- 2.49.1