From 71fc90fcb8c04f1404e86a0764be61bd588b5e5b Mon Sep 17 00:00:00 2001 From: duffyduck Date: Fri, 15 May 2026 08:40:26 +0200 Subject: [PATCH] =?UTF-8?q?fix(brain):=20Timeouts=205min=20=E2=86=92=2020m?= =?UTF-8?q?in=20=E2=80=94=20verkettete=20Timeouts=20haben=20lange=20Multi-?= =?UTF-8?q?Tool-Sessions=20chronisch=20gekappt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live-Diagnose auf der VM: drei verkettete 5-Min-Timeouts feuern bei jedem laengeren Brain-Call exakt gleichzeitig: 06:16:02 Brain → Proxy /v1/chat/completions 06:20:53 Bridge kappt (4m51s, urlopen timeout=300) 06:21:02 Brain bekommt HTTP 500 vom Proxy ('timed out after 300000ms') Stefan's Karten-Rekonstruktion (curl gegen Nominatim/OSRM + viele Bash- Tool-Calls + DB-Inserts) braucht locker 8–15 Min — alle Brain-Calls ueber 5 Min sind reihenweise mit 'Brain-Fehler: timed out' verreckt, auch wenn die Arbeit zu 80% durch war. Drei Stellen patchen: - bridge/aria_bridge.py: urlopen 300 → 1200 (20 Min) - aria-brain/proxy_client.py: PROXY_TIMEOUT_SEC default 300 → 1200 - docker-compose.yml: dritter sed-Patch im proxy-Service setzt DEFAULT_TIMEOUT im claude-max-api-proxy von 300000 auf 1200000 Plus App-Watchdog: 180s → 1260s (21 Min, knapp ueber Brain-Timeout) damit der lokale Stuck-Watchdog nicht waehrend legitimer langer Sessions feuert. Echte Verbindungsabbrueche kappen vorher per WS- Disconnect. UX-Tradeoff bewusst akzeptiert: User sieht jetzt bis zu 20 Min nur 'ARIA denkt...' ohne Zwischen-Updates. Echte Loesung waere Streaming oder async-Job-API (siehe Etappe B/C im Vorschlag) — das ist groesseres Refactoring, hier reicht erst mal der Quick-Fix. Co-Authored-By: Claude Opus 4.7 (1M context) --- android/src/screens/ChatScreen.tsx | 9 ++++++--- aria-brain/proxy_client.py | 2 +- bridge/aria_bridge.py | 6 ++++-- docker-compose.yml | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index b227484..aea6b5c 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -1036,7 +1036,10 @@ const ChatScreen: React.FC = () => { // Spotify darf waehrend "ARIA denkt/schreibt" weiterspielen — pausiert // nur wenn TTS startet (dann acquired _firePlaybackStarted den Focus). // Watchdog: solange Brain noch Lebenszeichen sendet (jedes neue - // activity-Event), Timer neu starten. 180s ohne Update → Hang. + // activity-Event), Timer neu starten. 21 Min ohne Update → Hang. + // Knapp ueber Brain-Timeout (20 Min) damit nur bei echten + // Verbindungsabbruechen / Brain-Crashes gefeuert wird, nicht waehrend + // legitimer langer Multi-Tool-Sessions die das Brain selbst kappt. clearStuckWatchdog(); if (activity !== 'idle') { stuckWatchdog.current = setTimeout(() => { @@ -1045,10 +1048,10 @@ const ChatScreen: React.FC = () => { setMessages(prev => capMessages([...prev, { id: nextId(), sender: 'aria', - text: '⚠️ Habe gerade keine Verbindung zurueck bekommen (Timeout nach 3 Min). Deine letzte Nachricht ist evtl. nicht durchgekommen — schick sie nochmal.', + text: '⚠️ Habe gerade keine Verbindung zurueck bekommen (Timeout nach 21 Min). Deine letzte Nachricht ist evtl. nicht durchgekommen — schick sie nochmal.', timestamp: Date.now(), }])); - }, 180_000); + }, 1_260_000); } } diff --git a/aria-brain/proxy_client.py b/aria-brain/proxy_client.py index c86cb7a..f1af976 100644 --- a/aria-brain/proxy_client.py +++ b/aria-brain/proxy_client.py @@ -25,7 +25,7 @@ logger = logging.getLogger(__name__) RUNTIME_CONFIG_FILE = Path("/shared/config/runtime.json") ENV_MODEL = os.environ.get("BRAIN_MODEL", "claude-sonnet-4") PROXY_URL = os.environ.get("PROXY_URL", "http://proxy:3456") -PROXY_TIMEOUT_SEC = float(os.environ.get("PROXY_TIMEOUT_SEC", "300")) +PROXY_TIMEOUT_SEC = float(os.environ.get("PROXY_TIMEOUT_SEC", "1200")) def _read_model_from_runtime() -> str: diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py index ead3e79..5843911 100644 --- a/bridge/aria_bridge.py +++ b/bridge/aria_bridge.py @@ -1351,8 +1351,10 @@ class ARIABridge: url, data=payload, method="POST", headers={"Content-Type": "application/json"}, ) - # Cold-Start kann lange dauern, 5min Timeout - with urllib.request.urlopen(req, timeout=300) as resp: + # 20 Min Timeout — lange Multi-Tool-Workflows (Karten, + # PDFs, viele curl-Calls) brauchen das. 5 Min waren chronisch + # zu knapp und haben ARIA mitten in der Arbeit gekappt. + with urllib.request.urlopen(req, timeout=1200) as resp: return resp.status, resp.read().decode("utf-8", errors="ignore") except Exception as exc: return None, str(exc) diff --git a/docker-compose.yml b/docker-compose.yml index 740ffeb..2f955c0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,7 @@ services: DIST=$$(find /usr/local/lib -path '*/claude-max-api-proxy/dist' -type d | head -1) && sed -i 's/startServer({ port })/startServer({ port, host: process.env.HOST || \"127.0.0.1\" })/' $$DIST/server/standalone.js && sed -i 's/\"--no-session-persistence\",/\"--no-session-persistence\",\"--dangerously-skip-permissions\",/' $$DIST/subprocess/manager.js && + sed -i 's/const DEFAULT_TIMEOUT = 300000;/const DEFAULT_TIMEOUT = 1200000;/' $$DIST/subprocess/manager.js && cp /proxy-patches/openai-to-cli.js $$DIST/adapter/openai-to-cli.js && cp /proxy-patches/cli-to-openai.js $$DIST/adapter/cli-to-openai.js && claude-max-api"