[object Object]

← back to Model Arena

Shorten arena local-run timeout 600s→300s so starved runs fall back faster

1be068a7d4918e5c71e9bb75c0080887430762e7 · 2026-09-23 09:49:42 -0700 · Steve Abrams

A run starved on a shared Ollama host (Mac1, MAX_LOADED_MODELS=1) sits socket-idle
waiting for a GPU slot. At 600s it blocked a battle for 10 min before erroring; at
300s it times out sooner → findFallbackHost reroutes it to a live equivalent. 300s is
~1.6x the slowest observed completing run (qwen3-14b @183s), so legit slow generations
aren't killed. Env-tunable via ARENA_LOCAL_TIMEOUT_MS. Applies to generateLocal,
generateOpenAILocal, generateLocalTools; CLAUDE_TIMEOUT_MS (build CLI) unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ga6sbbeoz4LSw4ekBW27wm

Files touched

Diff

commit 1be068a7d4918e5c71e9bb75c0080887430762e7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Sep 23 09:49:42 2026 -0700

    Shorten arena local-run timeout 600s→300s so starved runs fall back faster
    
    A run starved on a shared Ollama host (Mac1, MAX_LOADED_MODELS=1) sits socket-idle
    waiting for a GPU slot. At 600s it blocked a battle for 10 min before erroring; at
    300s it times out sooner → findFallbackHost reroutes it to a live equivalent. 300s is
    ~1.6x the slowest observed completing run (qwen3-14b @183s), so legit slow generations
    aren't killed. Env-tunable via ARENA_LOCAL_TIMEOUT_MS. Applies to generateLocal,
    generateOpenAILocal, generateLocalTools; CLAUDE_TIMEOUT_MS (build CLI) unchanged.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ga6sbbeoz4LSw4ekBW27wm
---
 server.js | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/server.js b/server.js
index f4436cc..a931d2e 100644
--- a/server.js
+++ b/server.js
@@ -383,6 +383,12 @@ const inFlight = new Set();
 // via one env knob so it's easy to dial back. Applies to every local generation path.
 const ARENA_TEMP = Number(process.env.ARENA_TEMP || 1.0);
 const ARENA_TOP_P = Number(process.env.ARENA_TOP_P || 0.95);
+// Per-run local generate timeout. Shortened from 600s → 300s (2026-09-23): a run starved on a
+// shared Ollama host (Mac1, MAX_LOADED_MODELS=1) sits socket-idle waiting for a GPU slot, so a
+// tighter timeout lets findFallbackHost reroute it to a live equivalent instead of blocking a
+// battle for 10 min. Still ~1.6× the slowest observed COMPLETING run (qwen3-14b @183s), so a
+// legit slow generation isn't killed. Tune via ARENA_LOCAL_TIMEOUT_MS if a bigger model needs more.
+const ARENA_LOCAL_TIMEOUT_MS = parseInt(process.env.ARENA_LOCAL_TIMEOUT_MS || '300000', 10);
 async function generateLocal(m, prompt) {
   const r = await httpJson(m.host + '/api/chat', {}, {
     model: m.model,
@@ -392,7 +398,7 @@ async function generateLocal(m, prompt) {
     // and return 0 chars of HTML; turn thinking off and give headroom
     ...(m.model.startsWith('qwen3') ? { think: false } : {}),
     options: { temperature: ARENA_TEMP, top_p: ARENA_TOP_P, num_predict: m.model.startsWith('qwen3') ? 10240 : 6144 },
-  }, 600000);
+  }, ARENA_LOCAL_TIMEOUT_MS);
   if (!r.json || !r.json.message) throw new Error('ollama bad response: ' + (r.raw || r.status));
   return { text: r.json.message.content, cost: 0, tokens: { out: r.json.eval_count || 0 } };
 }
@@ -408,7 +414,7 @@ async function generateOpenAILocal(m, prompt) {
     top_p: ARENA_TOP_P,
     max_tokens: 10240,
     stream: false,
-  }, 600000);
+  }, ARENA_LOCAL_TIMEOUT_MS);
   const ch = r.json && r.json.choices && r.json.choices[0];
   if (!ch || !ch.message) throw new Error('openai-local bad response: ' + (r.raw || r.status));
   const raw = ch.message.content || ch.message.reasoning_content || '';
@@ -556,7 +562,7 @@ async function generateLocalTools(m, prompt) {
         model: m.model, stream: false, messages, tools: TOOL_SCHEMAS,
         ...(m.model.startsWith('qwen3') ? { think: false } : {}),
         options: { temperature: ARENA_TEMP, top_p: ARENA_TOP_P, num_predict: m.model.startsWith('qwen3') ? 10240 : 6144 },
-      }, 600000);
+      }, ARENA_LOCAL_TIMEOUT_MS);
       if (!r.json || !r.json.message) throw new Error('ollama bad response: ' + (r.raw || r.status));
       outTok += r.json.eval_count || 0;
       const msg = r.json.message, tc = msg.tool_calls;

← e06321d Show held runs in UI: banner + release button, wired to Stev  ·  back to Model Arena  ·  Derive STUCK_RUNNING_MS from ARENA_LOCAL_TIMEOUT_MS so the w c8aae6e →