chore(ui): reduce dotbar intervals ~30% for max_tokens/frequency/presence

This commit is contained in:
EP
2025-08-23 12:50:10 -07:00
parent 99f6322000
commit 1aec35d0a3
3 changed files with 86 additions and 66 deletions

View File

@@ -264,10 +264,10 @@ document.addEventListener('DOMContentLoaded', () => {
initDotbar('tempDots', 0.0, 1.5, 0.1, parseFloat, 'temperatures');
initDotbar('topDots', 0.0, 1.0, 0.1, parseFloat, 'tops');
// Reduce noise: wider steps for max_tokens
initDotbar('maxTokDots', 128, 8192, 384, x=>parseInt(x,10), 'maxTokens');
initDotbar('freqDots', 0.0, 2.0, 0.1, parseFloat, 'freqPen');
initDotbar('presDots', 0.0, 2.0, 0.1, parseFloat, 'presPen');
// Reduce noise: ~30% fewer dots
initDotbar('maxTokDots', 128, 8192, 512, x=>parseInt(x,10), 'maxTokens');
initDotbar('freqDots', 0.0, 2.0, 0.15, parseFloat, 'freqPen');
initDotbar('presDots', 0.0, 2.0, 0.15, parseFloat, 'presPen');
getEl('runBtn').addEventListener('click', async () => {
if (running) { appendLog('Run already in progress. Please wait or press Stop.'); return; }

View File

@@ -30,8 +30,8 @@
<input id="model" value="gpt-5-chat-latest" />
</div>
<div class="field">
<label for="judges">Judges: <span id="judgesVal">3</span></label>
<input type="range" id="judges" min="1" max="7" step="1" value="3" />
<label for="judges">Judges: <span id="judgesVal">1</span></label>
<input type="range" id="judges" min="1" max="7" step="1" value="1" />
</div>
<div class="field">
<label class="inline"><input type="checkbox" id="autoSelect" checked /> Auto Select Best</label>
@@ -43,63 +43,71 @@
<input id="temperatures" value="0.4,0.6,0.8,1.0" />
<div class="dotbar" id="tempDots"></div>
</div>
<div class="field">
<label for="tops">top_p list</label>
<input id="tops" value="1.0" />
<div class="dotbar" id="topDots"></div>
</div>
<div class="field">
<label for="maxTokens">max_tokens list</label>
<input id="maxTokens" value="512" />
<div class="dotbar" id="maxTokDots"></div>
</div>
<div class="field"></div>
<div class="field"></div>
</div>
<div class="grid-3">
<div class="field">
<label for="freqPen">frequency_penalty list</label>
<input id="freqPen" value="0" />
<div class="dotbar" id="freqDots"></div>
<details class="advanced">
<summary>Advanced settings</summary>
<div class="grid-3">
<div class="field">
<label for="tops">top_p list</label>
<input id="tops" value="1.0" />
<div class="dotbar" id="topDots"></div>
</div>
<div class="field">
<label for="maxTokens">max_tokens list</label>
<input id="maxTokens" value="512" />
<div class="dotbar" id="maxTokDots"></div>
</div>
<div class="field">
<label for="stopSeqs">stop tokens (comma-separated)</label>
<input id="stopSeqs" placeholder="e.g. \nEND,###" />
</div>
</div>
<div class="grid-3">
<div class="field">
<label for="freqPen">frequency_penalty list</label>
<input id="freqPen" value="0" />
<div class="dotbar" id="freqDots"></div>
</div>
<div class="field">
<label for="presPen">presence_penalty list</label>
<input id="presPen" value="0" />
<div class="dotbar" id="presDots"></div>
</div>
<div class="field">
<label for="judgeWeight">Judge weight: <span id="judgeWeightVal">0.70</span></label>
<input type="range" id="judgeWeight" min="0" max="1" step="0.05" value="0.7" />
</div>
</div>
<div class="grid-3">
<div class="field">
<label for="lengthTarget">Length target (% of max_tokens): <span id="lengthTargetVal">60%</span></label>
<input type="range" id="lengthTarget" min="10" max="100" step="5" value="60" />
</div>
<div class="field">
<label class="inline"><input type="checkbox" id="useHeuristics" checked /> Use heuristic signals</label>
</div>
<div class="field">
<label class="inline"><input type="checkbox" id="advancedMode" /> Advanced Mode (UCB over arms)</label>
</div>
</div>
<div class="grid-3">
<div class="field">
<label for="rounds">Rounds (advanced): <span id="roundsVal">8</span></label>
<input type="range" id="rounds" min="1" max="50" step="1" value="8" />
</div>
<div class="field">
<label for="explorationC">Exploration c (UCB): <span id="cVal">1.0</span></label>
<input type="range" id="explorationC" min="0" max="3" step="0.1" value="1.0" />
</div>
<div class="field"></div>
</div>
<div class="field">
<label for="presPen">presence_penalty list</label>
<input id="presPen" value="0" />
<div class="dotbar" id="presDots"></div>
<label for="judgeSystemPrompt">Judge System Prompt (used for evaluation)</label>
<textarea id="judgeSystemPrompt" rows="6" placeholder="Define the system instructions for judge evaluations..."></textarea>
</div>
<div class="field">
<label for="stopSeqs">stop tokens (comma-separated)</label>
<input id="stopSeqs" placeholder="e.g. \nEND,###" />
</div>
</div>
<div class="grid-3">
<div class="field">
<label for="judgeWeight">Judge weight: <span id="judgeWeightVal">0.70</span></label>
<input type="range" id="judgeWeight" min="0" max="1" step="0.05" value="0.7" />
</div>
<div class="field">
<label for="lengthTarget">Length target (% of max_tokens): <span id="lengthTargetVal">60%</span></label>
<input type="range" id="lengthTarget" min="10" max="100" step="5" value="60" />
</div>
<div class="field">
<label class="inline"><input type="checkbox" id="useHeuristics" checked /> Use heuristic signals</label>
</div>
</div>
<div class="grid-3">
<div class="field">
<label class="inline"><input type="checkbox" id="advancedMode" /> Advanced Mode (UCB over arms)</label>
</div>
<div class="field">
<label for="rounds">Rounds (advanced): <span id="roundsVal">8</span></label>
<input type="range" id="rounds" min="1" max="50" step="1" value="8" />
</div>
<div class="field">
<label for="explorationC">Exploration c (UCB): <span id="cVal">1.0</span></label>
<input type="range" id="explorationC" min="0" max="3" step="0.1" value="1.0" />
</div>
</div>
<div class="field">
<label for="judgeSystemPrompt">Judge System Prompt (used for evaluation)</label>
<textarea id="judgeSystemPrompt" rows="6" placeholder="Define the system instructions for judge evaluations..."></textarea>
</div>
</details>
<div class="note">Provide comma-separated values to sweep. The app will form the Cartesian product across lists and evaluate each hyperparameter arm.</div>
</section>

View File

@@ -1,22 +1,25 @@
:root { --bg:#020b05; --panel:#03150e; --text:#d8f5e7; --mutedText:#a4d7c1; --accent:#00ff9c; --accent2:#13f1ff; --muted:#0a2a1f; }
*{ box-sizing:border-box }
body{ margin:0; font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; background: radial-gradient(1200px 800px at 20% 0%, #03150e, #020b05), #020b05; color:var(--text); line-height:1.5 }
.container{ max-width:1100px; margin:0 auto; padding:24px }
.container{ max-width:1100px; margin:0 auto; padding:28px }
.header{ display:flex; align-items:center; justify-content:space-between; margin-bottom:16px }
.logo{ font-weight:800; color:var(--accent); letter-spacing:1px }
.subtitle{ color:var(--accent2); opacity:.9 }
section{ background:linear-gradient(180deg, rgba(3,21,14,.9), rgba(2,11,5,.9)); padding:16px; border-radius:10px; margin-bottom:16px; border:1px solid #0b442f; box-shadow:0 0 30px rgba(0,255,156,.05) inset }
.field{ margin-bottom:12px }
section{ background:linear-gradient(180deg, rgba(3,21,14,.9), rgba(2,11,5,.9)); padding:20px; border-radius:12px; margin-bottom:20px; border:1px solid #0b442f; box-shadow:0 0 30px rgba(0,255,156,.05) inset }
.field{ margin-bottom:14px }
.field label{ display:block; font-weight:700; margin-bottom:6px; color:#a5ffd6 }
.field input[type="text"], .field input[type="password"], .field input[type="number"], .field textarea { width:100%; padding:12px 12px; border-radius:10px; border:1px solid #0b442f; background:#03150e; color:var(--text); outline:none; box-shadow:0 0 0 1px rgba(0,255,156,.05) inset }
.field input[type="text"]:focus, .field input[type="password"]:focus, .field textarea:focus { box-shadow:0 0 0 2px rgba(19,241,255,.25) inset }
.field input[type="text"], .field input[type="password"], .field input[type="number"], .field textarea { width:100%; padding:14px 16px; border-radius:14px; border:1px solid #0e3c2b; background:linear-gradient(180deg,#061f16,#03150e); color:var(--text); outline:none; box-shadow:0 2px 0 0 rgba(0,0,0,.25), inset 0 0 0 1px rgba(0,255,156,.05); transition: box-shadow .15s ease, border-color .15s ease, background .15s ease }
.field input[type="text"]:hover, .field input[type="password"]:hover, .field input[type="number"]:hover, .field textarea:hover { border-color:#13664b }
.field input[type="text"]:focus, .field input[type="password"]:focus, .field input[type="number"]:focus, .field textarea:focus { box-shadow:0 0 0 2px rgba(19,241,255,.25) inset, 0 0 0 1px rgba(19,241,255,.25); border-color:#13f1ff; background:linear-gradient(180deg,#07261b,#041b13) }
.field input::placeholder, .field textarea::placeholder{ color:#9bdcc6; opacity:.6 }
.field input[type="range"]{ width:100% }
.inline{ display:inline-flex; align-items:center; gap:8px }
.grid-2{ display:grid; grid-template-columns:1fr 1fr; gap:12px }
.grid-3{ display:grid; grid-template-columns:1fr 1fr 1fr; gap:12px }
.grid-2{ display:grid; grid-template-columns:1fr 1fr; gap:16px }
.grid-3{ display:grid; grid-template-columns:1fr 1fr 1fr; gap:16px }
.actions{ display:flex; align-items:center; gap:12px }
button{ background:linear-gradient(90deg, var(--accent), var(--accent2)); color:#00170e; font-weight:800; border:none; padding:12px 16px; border-radius:10px; cursor:pointer; box-shadow:0 0 15px rgba(0,255,156,.2) }
button:hover{ filter:brightness(1.05) }
button:focus{ outline:none; box-shadow:0 0 0 3px rgba(19,241,255,.25) }
button[disabled]{ opacity:.5; cursor:not-allowed }
.terminal{ border:1px solid #0b442f; background:#010a06; box-shadow:0 0 40px rgba(0,255,156,.06) inset }
pre{ white-space:pre-wrap; background:#010a06; padding:14px; border-radius:10px; border:1px dashed #0b442f; font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size:13px }
@@ -30,11 +33,20 @@ pre{ white-space:pre-wrap; background:#010a06; padding:14px; border-radius:10px;
.status-wait{ color:#a5ffd6 }
.log{ max-height:260px; overflow:auto }
.chart-wrap{ background:#010a06; border:1px dashed #0b442f; border-radius:8px; padding:8px; margin-bottom:12px }
.advanced{ margin-top:6px }
.advanced > summary{ cursor:pointer; padding:10px 12px; border:1px solid #0b442f; border-radius:10px; background:#02140d; color:#a5ffd6 }
.advanced[open] > summary{ background:#032015 }
.dotbar{ position:relative; height:28px; border:1px dashed #0b442f; border-radius:999px; margin-top:8px; background:linear-gradient(90deg, rgba(0,255,156,.05), rgba(19,241,255,.05)) }
.dotbar .range{ position:absolute; top:50%; left:8px; right:8px; height:2px; background:#0b442f; transform:translateY(-50%); }
.dotbar .dot{ position:absolute; top:50%; width:14px; height:14px; background:#00ff9c; border-radius:50%; transform:translate(-50%,-50%); cursor:pointer; box-shadow:0 0 8px rgba(0,255,156,.4) }
.dotbar .dot.inactive{ background:#063a2a; box-shadow:none }
.dotbar .labels{ position:absolute; top:100%; left:0; right:0; display:flex; justify-content:space-between; font-size:11px; color:#a5ffd6; margin-top:4px }
.field input[type="range"]{ -webkit-appearance:none; height:26px; background:transparent; margin:6px 0 }
.field input[type="range"]::-webkit-slider-runnable-track{ height:4px; background:#0b442f; border-radius:999px }
.field input[type="range"]::-webkit-slider-thumb{ -webkit-appearance:none; width:18px; height:18px; border-radius:50%; background:linear-gradient(180deg,#00ff9c,#13f1ff); margin-top:-7px; box-shadow:0 0 8px rgba(0,255,156,.35) }
.field input[type="range"]::-moz-range-track{ height:4px; background:#0b442f; border-radius:999px }
.field input[type="range"]::-moz-range-thumb{ width:18px; height:18px; border:none; border-radius:50%; background:linear-gradient(180deg,#00ff9c,#13f1ff); box-shadow:0 0 8px rgba(0,255,156,.35) }
.field input[type="checkbox"]{ accent-color:#00ff9c }
.arm-params{ font-size:12px; color:var(--mutedText); margin:0 0 10px 0 }
.arm-params .label{ font-weight:700; color:#a5ffd6; margin-right:6px }
.arm-params pre{ margin:6px 0 0 0; background:#03150e; border:1px solid #0b442f; border-radius:8px; padding:10px }