@@ -1129,10 +1129,6 @@ function openRunViewer({
11291129 <pre id="run-reasoning" class="flex-1 min-h-0 bg-zinc-50 dark:bg-zinc-900 rounded-md p-3 text-xs text-zinc-800 dark:text-zinc-200 font-mono italic whitespace-pre-wrap overflow-auto"></pre>
11301130 <div id="run-tool-call" class="flex-shrink-0 bg-zinc-50 dark:bg-zinc-900 rounded-md px-3 py-2 text-xs font-mono text-zinc-800 dark:text-zinc-200 overflow-x-auto whitespace-nowrap text-center"></div>
11311131 </div>
1132- <!-- Stats Column (narrower) -->
1133- <div class="flex flex-col" style="flex: 0 0 200px;">
1134- <div id="run-stats" class="p-3 text-xs text-zinc-800 dark:text-zinc-200 overflow-auto"></div>
1135- </div>
11361132 </div>
11371133 </div>
11381134 </div>` ;
@@ -1233,12 +1229,28 @@ async function loadAndRenderRequest(state) {
12331229 const runNumber = state . runs && state . runs . length > 0 ? state . runIndex + 1 : null ;
12341230 const totalRuns = state . runs ? state . runs . length : null ;
12351231
1232+ // Tokens icon from icons.svg
1233+ const tokensIcon =
1234+ `<svg class="w-3 h-3 inline-block"><use href="icons.svg#icon-tokens"></use></svg>` ;
1235+
12361236 let title = `${ vendor } /${ model } • ${ seed } ` ;
12371237 if ( runNumber !== null && totalRuns !== null ) {
12381238 title += ` • Run ${ runNumber } /${ totalRuns } ` ;
12391239 }
12401240 title += ` • Request ${ index } /${ totalRequests } ` ;
1241- overlay . querySelector ( '#run-title' ) . textContent = title ;
1241+
1242+ // Add tokens and cost if metadata exists
1243+ if ( metadata && metadata . tokens && metadata . cost ) {
1244+ const promptTokens = metadata . tokens . prompt || 0 ;
1245+ const completionTokens = metadata . tokens . completion || 0 ;
1246+ const promptCost = metadata . cost . prompt_usd || 0 ;
1247+ const completionCost = metadata . cost . completion_usd || 0 ;
1248+
1249+ title += ` • ${ tokensIcon } in/out ${ promptTokens } /${ completionTokens } ` ;
1250+ title += ` • $ in/out ${ promptCost . toFixed ( 4 ) } /${ completionCost . toFixed ( 4 ) } ` ;
1251+ }
1252+
1253+ overlay . querySelector ( '#run-title' ) . innerHTML = title ;
12421254
12431255 const imgEl = overlay . querySelector ( '#run-screenshot' ) ;
12441256 // Try formats in order: webp -> png -> avif
@@ -1306,118 +1318,6 @@ async function loadAndRenderRequest(state) {
13061318 toolCallDiv . textContent = `${ name } (${ argsString } )` ;
13071319 }
13081320
1309- // Render stats from metadata.json
1310- const statsDiv = overlay . querySelector ( '#run-stats' ) ;
1311- if ( metadata ) {
1312- // Database icon SVG
1313- const databaseIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" class="w-3 h-3">
1314- <path d="M8 7c3.314 0 6-1.343 6-3s-2.686-3-6-3-6 1.343-6 3 2.686 3 6 3Z" />
1315- <path d="M8 8.5c1.84 0 3.579-.37 4.914-1.037A6.33 6.33 0 0 0 14 6.78V8c0 1.657-2.686 3-6 3S2 9.657 2 8V6.78c.346.273.72.5 1.087.683C4.42 8.131 6.16 8.5 8 8.5Z" />
1316- <path d="M8 12.5c1.84 0 3.579-.37 4.914-1.037.366-.183.74-.41 1.086-.684V12c0 1.657-2.686 3-6 3s-6-1.343-6-3v-1.22c.346.273.72.5 1.087.683C4.42 12.131 6.16 12.5 8 12.5Z" />
1317- </svg>` ;
1318-
1319- // Dollar icon SVG
1320- const dollarIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" class="w-3 h-3">
1321- <path d="M6.375 5.5h.875v1.75h-.875a.875.875 0 1 1 0-1.75ZM8.75 10.5V8.75h.875a.875.875 0 0 1 0 1.75H8.75Z" />
1322- <path fill-rule="evenodd" d="M15 8A7 7 0 1 1 1 8a7 7 0 0 1 14 0ZM7.25 3.75a.75.75 0 0 1 1.5 0V4h2.5a.75.75 0 0 1 0 1.5h-2.5v1.75h.875a2.375 2.375 0 1 1 0 4.75H8.75v.25a.75.75 0 0 1-1.5 0V12h-2.5a.75.75 0 0 1 0-1.5h2.5V8.75h-.875a2.375 2.375 0 1 1 0-4.75h.875v-.25Z" clip-rule="evenodd" />
1323- </svg>` ;
1324-
1325- let statsHtml = '<div>' ;
1326- statsHtml += '<table class="w-full"><tbody>' ;
1327-
1328- // Tokens
1329- statsHtml += `<tr>
1330- <td class="py-1">
1331- <div class="flex items-center justify-left space-x-1 text-zinc-700 dark:text-zinc-300">
1332- ${ databaseIcon }
1333- <span>prompt</span>
1334- </div>
1335- </td>
1336- <td class="text-right py-1">
1337- <span class="text-xs font-mono text-zinc-700 dark:text-zinc-300">${ ( metadata . tokens . prompt / 1000 ) . toFixed ( 1 ) } K</span>
1338- </td>
1339- </tr>` ;
1340-
1341- statsHtml += `<tr>
1342- <td class="py-1">
1343- <div class="flex items-center justify-left space-x-1 text-zinc-700 dark:text-zinc-300">
1344- ${ databaseIcon }
1345- <span>completion</span>
1346- </div>
1347- </td>
1348- <td class="text-right py-1">
1349- <span class="text-xs font-mono text-zinc-700 dark:text-zinc-300">${ ( metadata . tokens . completion / 1000 ) . toFixed ( 1 ) } K</span>
1350- </td>
1351- </tr>` ;
1352-
1353- statsHtml += `<tr>
1354- <td class="py-1">
1355- <div class="flex items-center justify-left space-x-1 text-zinc-700 dark:text-zinc-300">
1356- ${ databaseIcon }
1357- <span>reasoning</span>
1358- </div>
1359- </td>
1360- <td class="text-right py-1">
1361- <span class="text-xs font-mono text-zinc-700 dark:text-zinc-300">${ ( metadata . tokens . reasoning / 1000 ) . toFixed ( 1 ) } K</span>
1362- </td>
1363- </tr>` ;
1364-
1365- statsHtml += `<tr>
1366- <td class="py-1">
1367- <div class="flex items-center justify-left space-x-1 text-zinc-700 dark:text-zinc-300">
1368- ${ databaseIcon }
1369- <span>total</span>
1370- </div>
1371- </td>
1372- <td class="text-right py-1">
1373- <span class="text-xs font-mono text-zinc-700 dark:text-zinc-300 font-semibold">${ ( metadata . tokens . total / 1000 ) . toFixed ( 1 ) } K</span>
1374- </td>
1375- </tr>` ;
1376-
1377- // Add vertical space between tokens and cost
1378- statsHtml += `<tr><td colspan="2" class="py-2"></td></tr>` ;
1379-
1380- // Cost
1381- statsHtml += `<tr>
1382- <td class="py-1">
1383- <div class="flex items-center justify-left space-x-1 text-zinc-700 dark:text-zinc-300">
1384- ${ dollarIcon }
1385- <span>prompt</span>
1386- </div>
1387- </td>
1388- <td class="text-right py-1">
1389- <span class="text-xs font-mono text-zinc-700 dark:text-zinc-300">$${ metadata . cost . prompt_usd . toFixed ( 4 ) } </span>
1390- </td>
1391- </tr>` ;
1392-
1393- statsHtml += `<tr>
1394- <td class="py-1">
1395- <div class="flex items-center justify-left space-x-1 text-zinc-700 dark:text-zinc-300">
1396- ${ dollarIcon }
1397- <span>completion</span>
1398- </div>
1399- </td>
1400- <td class="text-right py-1">
1401- <span class="text-xs font-mono text-zinc-700 dark:text-zinc-300">$${ metadata . cost . completion_usd . toFixed ( 4 ) } </span>
1402- </td>
1403- </tr>` ;
1404-
1405- statsHtml += `<tr>
1406- <td class="py-1">
1407- <div class="flex items-center justify-left space-x-1 text-zinc-700 dark:text-zinc-300">
1408- ${ dollarIcon }
1409- <span>total</span>
1410- </div>
1411- </td>
1412- <td class="text-right py-1">
1413- <span class="text-xs font-mono text-zinc-700 dark:text-zinc-300 font-semibold">$${ metadata . cost . total_usd . toFixed ( 4 ) } </span>
1414- </td>
1415- </tr>` ;
1416-
1417- statsHtml += '</tbody></table>' ;
1418- statsHtml += '</div>' ;
1419- statsDiv . innerHTML = statsHtml ;
1420- }
14211321}
14221322
14231323async function navigateRun ( state , delta ) {
0 commit comments