From 9078489d0a1ab8cf6cf29c31b8b0d79fc0e87234 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sun, 3 May 2026 19:30:04 +0000 Subject: [PATCH 1/2] fix(orchestrator): Auto-Refresh nicht direkt nach Cancel/Error neu einreihen - main.py: Auto-Refresh-Filter beruecksichtigt jetzt auch cancelled und error - orchestrator.py: Queue-Cancels schreiben jetzt einen cancelled-Eintrag ins refresh_log via _log_queued_cancellation Wirkung: Nach Cancel oder Error startet die Lage erst beim naechsten regulaeren Slot wieder. refresh_mode bleibt unveraendert. (Identisch zu Commit auf main, develop nachgezogen.) --- src/agents/orchestrator.py | 25 +++++++++++++++++++++++++ src/main.py | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/agents/orchestrator.py b/src/agents/orchestrator.py index 16fd3a5..ed85947 100644 --- a/src/agents/orchestrator.py +++ b/src/agents/orchestrator.py @@ -489,6 +489,9 @@ class AgentOrchestrator: logger.info(f"Lage {incident_id} aus Warteschlange entfernt (removed={removed})") + # refresh_log-Eintrag schreiben, damit Auto-Refresh nicht im naechsten Tick erneut einreiht + await self._log_queued_cancellation(incident_id) + # Send cancelled event if self._ws_manager: try: @@ -639,6 +642,28 @@ class AgentOrchestrator: finally: await db.close() + async def _log_queued_cancellation(self, incident_id: int): + """Schreibt einen cancelled-Eintrag fuer einen Queue-Abbruch (Lage war noch nicht laufend). + Verhindert, dass der Auto-Refresh-Scheduler im naechsten Tick sofort wieder einreiht.""" + from database import get_db + db = await get_db() + try: + cur = await db.execute("SELECT tenant_id FROM incidents WHERE id = ?", (incident_id,)) + row = await cur.fetchone() + tid = row["tenant_id"] if row else None + now_str = datetime.now(TIMEZONE).strftime("%Y-%m-%d %H:%M:%S") + await db.execute( + """INSERT INTO refresh_log (incident_id, started_at, completed_at, status, + trigger_type, error_message, tenant_id) + VALUES (?, ?, ?, 'cancelled', 'manual', 'Aus Warteschlange entfernt', ?)""", + (incident_id, now_str, now_str, tid), + ) + await db.commit() + except Exception as e: + logger.warning(f"Konnte Queue-Cancel nicht in refresh_log loggen: {e}") + finally: + await db.close() + async def _mark_refresh_failed(self, incident_id: int, error: str): """Markiert den laufenden Refresh-Log-Eintrag als error.""" from database import get_db diff --git a/src/main.py b/src/main.py index 1df4348..ff98a9e 100644 --- a/src/main.py +++ b/src/main.py @@ -124,7 +124,7 @@ async def check_auto_refresh(): # Letzten abgeschlossenen oder laufenden Refresh pruefen cursor = await db.execute( - "SELECT started_at, status FROM refresh_log WHERE incident_id = ? AND status IN ('completed', 'running') ORDER BY id DESC LIMIT 1", + "SELECT started_at, status FROM refresh_log WHERE incident_id = ? AND status IN ('completed', 'running', 'cancelled', 'error') ORDER BY id DESC LIMIT 1", (incident_id,), ) last_refresh = await cursor.fetchone() From f73c21235e089b7e2d2369c6fe0fdf97b061a1af Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sun, 3 May 2026 20:43:40 +0000 Subject: [PATCH 2/2] feat(translator): Feature-Flag TRANSLATOR_ENABLED zum Abschalten (siehe main) --- src/agents/translator.py | 9 ++++++++- src/config.py | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/agents/translator.py b/src/agents/translator.py index 511e523..6225d87 100644 --- a/src/agents/translator.py +++ b/src/agents/translator.py @@ -12,7 +12,7 @@ import logging import re from agents.claude_client import call_claude, ClaudeUsage, UsageAccumulator -from config import CLAUDE_MODEL_FAST +from config import CLAUDE_MODEL_FAST, TRANSLATOR_ENABLED logger = logging.getLogger("osint.translator") @@ -230,6 +230,13 @@ async def translate_articles( if not articles: return [] + if not TRANSLATOR_ENABLED: + logger.info( + "Translator deaktiviert (TRANSLATOR_ENABLED=false), %d Artikel uebersprungen", + len(articles), + ) + return [] + all_translations = [] for i in range(0, len(articles), batch_size): batch = articles[i : i + batch_size] diff --git a/src/config.py b/src/config.py index 6dfaa61..21a48f2 100644 --- a/src/config.py +++ b/src/config.py @@ -41,6 +41,10 @@ OUTPUT_LANGUAGE = "Deutsch" # In Kundenversion auf False setzen oder Env-Variable entfernen DEV_MODE = os.environ.get("DEV_MODE", "true").lower() == "true" +# Feature-Flag: Translator-Agent (Haiku) komplett deaktivieren. +# False = keine Uebersetzungen mehr, fremdsprachige Artikel bleiben unuebersetzt. +TRANSLATOR_ENABLED = os.environ.get("TRANSLATOR_ENABLED", "true").lower() == "true" + # RSS-Feeds (Fallback, primär aus DB geladen) RSS_FEEDS = { "deutsch": [