← 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 →