From 3fcad79f8dbac82a485cad44934a506bb5237123 Mon Sep 17 00:00:00 2001 From: AdrianoDev Date: Tue, 12 May 2026 22:15:31 +0200 Subject: [PATCH] =?UTF-8?q?fix(llm):=20timeout=20esplicito=2060s=20sul=20c?= =?UTF-8?q?lient=20OpenAI=20(no=20pi=C3=B9=20hang=20infinito)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run phase2-6-flat-wfa-001 è andato in hang per 4h+ a gen 3/10 su una chiamata OpenRouter (process stuck in do_poll syscall, 0% CPU). Il SDK OpenAI ha default timeout 600s ma evidentemente il TLS/socket handshake può bloccarsi senza interrompere; senza timeout esplicito i retry tenacity non scattano mai e il run resta pending. Fix: OpenAI(timeout=60.0). Se una chiamata supera 60s, raise APITimeoutError (già in _RETRYABLE_EXCEPTIONS) e tenacity ritenta fino a 5 volte con backoff esponenziale fino a 30s. Worst case totale: ~5×60s = 5min per call (vs 4h+ hang precedente). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/multi_swarm/llm/client.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/multi_swarm/llm/client.py b/src/multi_swarm/llm/client.py index f7c58cb..2d39bd6 100644 --- a/src/multi_swarm/llm/client.py +++ b/src/multi_swarm/llm/client.py @@ -79,7 +79,13 @@ class LLMClient: ModelTier.C: model_tier_c, ModelTier.D: model_tier_d, } - self._client = OpenAI(api_key=openrouter_api_key, base_url=openrouter_base_url) + # Timeout esplicito (60s) per prevenire hang infinito su connessioni + # stallate. Tenacity retry su APITimeoutError gestisce il recovery. + self._client = OpenAI( + api_key=openrouter_api_key, + base_url=openrouter_base_url, + timeout=60.0, + ) @retry( stop=stop_after_attempt(5),