|
7 | 7 | <script src="https://cdn.tailwindcss.com"></script> |
8 | 8 | </head> |
9 | 9 | <body class="bg-black text-white w-[747px] h-[267px] flex items-center"> |
10 | | - <div id="overlay" class="w-full h-full flex flex-col justify-center pl-16"> |
11 | | - <div id="model" class="font-mono text-3xl mb-6"> |
12 | | - <span class="text-gray-500">Loading...</span> |
| 10 | + <div id="overlay" class="w-full h-full flex flex-col justify-center pl-12 pr-8"> |
| 11 | + <!-- Current Section --> |
| 12 | + <div class="font-mono text-xs text-gray-500 text-right mb-1 uppercase">Current</div> |
| 13 | + <div id="current-line1" class="font-mono text-xs text-gray-400 mb-1"> |
| 14 | + <span>Model: <span id="current-model" class="text-white">Loading...</span></span> |
| 15 | + <span class="mx-2">|</span> |
| 16 | + <span>Tok: <span id="current-tokens" class="text-white">0</span></span> |
| 17 | + <span class="mx-2">|</span> |
| 18 | + <span>Cost: <span id="current-cost" class="text-white">$0.00</span></span> |
13 | 19 | </div> |
14 | | - <div class="space-y-3"> |
15 | | - <div class="font-mono text-2xl"><span class="text-gray-500">seed </span><span id="seed" class="text-white"></span></div> |
16 | | - <div class="font-mono text-2xl"><span class="text-gray-500">deck </span><span id="deck" class="text-white"></span></div> |
17 | | - <div class="font-mono text-2xl"><span class="text-gray-500">stake </span><span id="stake" class="text-white"></span></div> |
| 20 | + <div class="font-mono text-xs text-gray-400 mb-3"> |
| 21 | + <span>Seed: <span id="current-seed" class="text-white">--</span></span> |
| 22 | + <span class="mx-2">|</span> |
| 23 | + <span>Deck: <span id="current-deck" class="text-white">--</span></span> |
| 24 | + <span class="mx-2">|</span> |
| 25 | + <span>Stake: <span id="current-stake" class="text-white">--</span></span> |
| 26 | + </div> |
| 27 | + |
| 28 | + <!-- Divider --> |
| 29 | + <div class="border-b border-gray-700 mb-3"></div> |
| 30 | + |
| 31 | + <!-- Previous Section --> |
| 32 | + <div id="previous-section" class="hidden mb-3"> |
| 33 | + <div class="font-mono text-xs text-gray-500 text-right mb-1 uppercase">Previous</div> |
| 34 | + <div class="font-mono text-xs text-gray-400 mb-1"> |
| 35 | + <span>Model: <span id="previous-model" class="text-white">--</span></span> |
| 36 | + <span class="mx-2">|</span> |
| 37 | + <span>Tok: <span id="previous-tokens" class="text-white">0</span></span> |
| 38 | + <span class="mx-2">|</span> |
| 39 | + <span>Cost: <span id="previous-cost" class="text-white">$0.00</span></span> |
| 40 | + </div> |
| 41 | + <div class="font-mono text-xs text-gray-400 mb-1"> |
| 42 | + <span>Seed: <span id="previous-seed" class="text-white">--</span></span> |
| 43 | + <span class="mx-2">|</span> |
| 44 | + <span>Deck: <span id="previous-deck" class="text-white">--</span></span> |
| 45 | + <span class="mx-2">|</span> |
| 46 | + <span>Stake: <span id="previous-stake" class="text-white">--</span></span> |
| 47 | + <span class="mx-2">|</span> |
| 48 | + <span>Ante: <span id="previous-ante" class="text-white">--</span></span> |
| 49 | + <span class="mx-2">|</span> |
| 50 | + <span>Round: <span id="previous-round" class="text-white">--</span></span> |
| 51 | + </div> |
| 52 | + <div class="font-mono text-xs text-gray-400"> |
| 53 | + <span>Finish Reason: <span id="previous-end" class="text-white">--</span></span> |
| 54 | + </div> |
| 55 | + </div> |
| 56 | + |
| 57 | + <!-- Divider (only shown if previous exists) --> |
| 58 | + <div id="previous-divider" class="hidden border-b border-gray-700 mb-3"></div> |
| 59 | + |
| 60 | + <!-- Best of the Batch Section --> |
| 61 | + <div id="batch-section" class="hidden"> |
| 62 | + <div class="font-mono text-xs text-gray-500 text-right mb-1 uppercase">Best of the Batch</div> |
| 63 | + <div class="font-mono text-xs text-gray-400 mb-1"> |
| 64 | + <span>Model: <span id="best-model" class="text-white">--</span></span> |
| 65 | + <span class="mx-2">|</span> |
| 66 | + <span>Tok: <span id="best-tokens" class="text-white">0</span></span> |
| 67 | + <span class="mx-2">|</span> |
| 68 | + <span>Cost: <span id="best-cost" class="text-white">$0.00</span></span> |
| 69 | + </div> |
| 70 | + <div class="font-mono text-xs text-gray-400 mb-1"> |
| 71 | + <span>Seed: <span id="best-seed" class="text-white">--</span></span> |
| 72 | + <span class="mx-2">|</span> |
| 73 | + <span>Deck: <span id="best-deck" class="text-white">--</span></span> |
| 74 | + <span class="mx-2">|</span> |
| 75 | + <span>Stake: <span id="best-stake" class="text-white">--</span></span> |
| 76 | + <span class="mx-2">|</span> |
| 77 | + <span>Ante: <span id="best-ante" class="text-white">--</span></span> |
| 78 | + <span class="mx-2">|</span> |
| 79 | + <span>Round: <span id="best-round" class="text-white">--</span></span> |
| 80 | + </div> |
| 81 | + <div class="font-mono text-xs text-gray-400"> |
| 82 | + <span>Finish Reason: <span id="best-end" class="text-white">--</span></span> |
| 83 | + </div> |
18 | 84 | </div> |
19 | 85 | </div> |
20 | 86 |
|
21 | 87 | <script> |
22 | 88 | let lastTask = null; |
23 | 89 |
|
| 90 | + function formatTokens(n) { |
| 91 | + if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M'; |
| 92 | + if (n >= 1000) return (n / 1000).toFixed(1) + 'k'; |
| 93 | + return n.toString(); |
| 94 | + } |
| 95 | + |
| 96 | + function formatCost(n) { |
| 97 | + return '$' + n.toFixed(2); |
| 98 | + } |
| 99 | + |
| 100 | + function formatModel(vendor, model) { |
| 101 | + return `<span class="text-white">${vendor}</span><span class="text-gray-500"> / </span><span class="text-white">${model}</span>`; |
| 102 | + } |
| 103 | + |
24 | 104 | async function fetchTask() { |
25 | 105 | try { |
26 | 106 | const latestRes = await fetch('../../runs/latest.json?' + Date.now()); |
|
33 | 113 |
|
34 | 114 | const taskKey = task.model.vendor + task.model.name + task.seed + task.deck + task.stake; |
35 | 115 | if (taskKey !== lastTask) { |
36 | | - document.getElementById('model').innerHTML = |
37 | | - `<span class="text-white">${task.model.vendor}</span>` + |
38 | | - `<span class="text-gray-500"> / </span>` + |
39 | | - `<span class="text-white">${task.model.name}</span>`; |
40 | | - document.getElementById('seed').textContent = task.seed; |
41 | | - document.getElementById('deck').textContent = task.deck; |
42 | | - document.getElementById('stake').textContent = task.stake; |
| 116 | + document.getElementById('current-model').innerHTML = formatModel(task.model.vendor, task.model.name); |
| 117 | + document.getElementById('current-seed').textContent = task.seed; |
| 118 | + document.getElementById('current-deck').textContent = task.deck; |
| 119 | + document.getElementById('current-stake').textContent = task.stake; |
43 | 120 | lastTask = taskKey; |
44 | 121 | } |
| 122 | + |
| 123 | + // Fetch responses for tokens/cost |
| 124 | + if (latest.responses) { |
| 125 | + const responsesRes = await fetch('../../runs/' + latest.responses + '?' + Date.now()); |
| 126 | + if (responsesRes.ok) { |
| 127 | + const text = await responsesRes.text(); |
| 128 | + const lines = text.trim().split('\n').filter(l => l); |
| 129 | + let totalIn = 0, totalOut = 0, totalCost = 0; |
| 130 | + for (const line of lines) { |
| 131 | + try { |
| 132 | + const entry = JSON.parse(line); |
| 133 | + const usage = entry.response?.body?.usage || {}; |
| 134 | + totalIn += usage.prompt_tokens || 0; |
| 135 | + totalOut += usage.completion_tokens || 0; |
| 136 | + totalCost += usage.cost || 0; |
| 137 | + } catch (e) {} |
| 138 | + } |
| 139 | + document.getElementById('current-tokens').textContent = formatTokens(totalIn + totalOut); |
| 140 | + document.getElementById('current-cost').textContent = formatCost(totalCost); |
| 141 | + } |
| 142 | + } |
| 143 | + |
| 144 | + // Fetch previous.json for the previous run |
| 145 | + const previousRes = await fetch('../../runs/previous.json?' + Date.now()); |
| 146 | + if (previousRes.ok) { |
| 147 | + const previous = await previousRes.json(); |
| 148 | + document.getElementById('previous-section').classList.remove('hidden'); |
| 149 | + document.getElementById('previous-divider').classList.remove('hidden'); |
| 150 | + document.getElementById('previous-model').innerHTML = formatModel(previous.vendor, previous.model); |
| 151 | + document.getElementById('previous-seed').textContent = previous.seed; |
| 152 | + document.getElementById('previous-deck').textContent = previous.deck; |
| 153 | + document.getElementById('previous-stake').textContent = previous.stake; |
| 154 | + document.getElementById('previous-ante').textContent = previous.ante; |
| 155 | + document.getElementById('previous-round').textContent = previous.round; |
| 156 | + document.getElementById('previous-tokens').textContent = formatTokens(previous.tokens); |
| 157 | + document.getElementById('previous-cost').textContent = formatCost(previous.cost); |
| 158 | + document.getElementById('previous-end').textContent = previous.finish_reason; |
| 159 | + } |
| 160 | + |
| 161 | + // Fetch batch.json for best run |
| 162 | + const batchRes = await fetch('../../runs/batch.json?' + Date.now()); |
| 163 | + if (batchRes.ok) { |
| 164 | + const batch = await batchRes.json(); |
| 165 | + if (batch.runs_completed > 0 && batch.best_ante > 0) { |
| 166 | + document.getElementById('batch-section').classList.remove('hidden'); |
| 167 | + document.getElementById('best-model').innerHTML = formatModel(batch.best_vendor || '', batch.best_model || ''); |
| 168 | + document.getElementById('best-seed').textContent = batch.best_seed || '--'; |
| 169 | + document.getElementById('best-deck').textContent = batch.best_deck || '--'; |
| 170 | + document.getElementById('best-stake').textContent = batch.best_stake || '--'; |
| 171 | + document.getElementById('best-ante').textContent = batch.best_ante || '--'; |
| 172 | + document.getElementById('best-round').textContent = batch.best_round || '--'; |
| 173 | + document.getElementById('best-tokens').textContent = formatTokens(batch.best_tokens || 0); |
| 174 | + document.getElementById('best-cost').textContent = formatCost(batch.best_cost || 0); |
| 175 | + document.getElementById('best-end').textContent = batch.best_finish_reason || '--'; |
| 176 | + } |
| 177 | + } |
45 | 178 | } catch (e) { |
46 | 179 | // Ignore fetch errors |
47 | 180 | } |
|
0 commit comments