← back to Model Arena
model-arena: HOT arena sampling temperature (ARENA_TEMP, default 1.0)
9f431e6eee179eb104aa1629941c1e80e8ad54d4 · 2026-09-18 14:46:34 -0700 · Steve Abrams
Raise local-generation sampling to temperature 1.0 + top_p 0.95 across
generateLocal, generateOpenAILocal, and generateLocalTools, tunable via one
env knob (ARENA_TEMP / ARENA_TOP_P). The arena is a creative bench, not a
determinism test. Reversible $0-local.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HTnyDUiR2At9Aj5f6RGRav
Files touched
Diff
commit 9f431e6eee179eb104aa1629941c1e80e8ad54d4
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Sep 18 14:46:34 2026 -0700
model-arena: HOT arena sampling temperature (ARENA_TEMP, default 1.0)
Raise local-generation sampling to temperature 1.0 + top_p 0.95 across
generateLocal, generateOpenAILocal, and generateLocalTools, tunable via one
env knob (ARENA_TEMP / ARENA_TOP_P). The arena is a creative bench, not a
determinism test. Reversible $0-local.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HTnyDUiR2At9Aj5f6RGRav
---
server.js | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/server.js b/server.js
index 06be600..b023560 100644
--- a/server.js
+++ b/server.js
@@ -356,6 +356,10 @@ function onKey(key, fn) {
// runModel() call from double-enqueuing the same run (the metered double-spend race)
const inFlight = new Set();
+// Arena sampling is HOT by default — creative bench, not a determinism test. Tunable
+// 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);
async function generateLocal(m, prompt) {
const r = await httpJson(m.host + '/api/chat', {}, {
model: m.model,
@@ -364,7 +368,7 @@ async function generateLocal(m, prompt) {
// qwen3 is a thinking model — its <think> block can eat the whole token budget
// and return 0 chars of HTML; turn thinking off and give headroom
...(m.model.startsWith('qwen3') ? { think: false } : {}),
- options: { temperature: 0.7, num_predict: m.model.startsWith('qwen3') ? 10240 : 6144 },
+ options: { temperature: ARENA_TEMP, top_p: ARENA_TOP_P, num_predict: m.model.startsWith('qwen3') ? 10240 : 6144 },
}, 600000);
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 } };
@@ -377,7 +381,8 @@ async function generateOpenAILocal(m, prompt) {
const r = await httpJson(m.host + '/v1/chat/completions', {}, {
model: m.model,
messages: [{ role: 'user', content: prompt }],
- temperature: 0.7,
+ temperature: ARENA_TEMP,
+ top_p: ARENA_TOP_P,
max_tokens: 10240,
stream: false,
}, 600000);
@@ -491,7 +496,7 @@ async function generateLocalTools(m, prompt) {
const r = await httpJson(m.host + '/api/chat', {}, {
model: m.model, stream: false, messages, tools: TOOL_SCHEMAS,
...(m.model.startsWith('qwen3') ? { think: false } : {}),
- options: { temperature: 0.7, num_predict: m.model.startsWith('qwen3') ? 10240 : 6144 },
+ options: { temperature: ARENA_TEMP, top_p: ARENA_TOP_P, num_predict: m.model.startsWith('qwen3') ? 10240 : 6144 },
}, 600000);
if (!r.json || !r.json.message) throw new Error('ollama bad response: ' + (r.raw || r.status));
outTok += r.json.eval_count || 0;
← 0fc4204 model-arena: continuous themed arena loop (art/culture/news/
·
back to Model Arena
·
model-arena loop: 16-category creative COMPETITION bank + we 272a37d →