v0.17.19: fix token count badge — use client-side tokenCount instead of server completion_tokens; add tok badge to search responses

This commit is contained in:
gramps
2026-07-13 09:59:11 -07:00
parent 79b684e0cd
commit 645d7e9d91
2 changed files with 11 additions and 4 deletions
+10 -3
View File
@@ -1133,6 +1133,7 @@ async function sendSearch() {
setStreamingState(true);
const ttrStart = performance.now();
let ttr = 0;
let tokenCount = 0;
try {
abortController = new AbortController();
const resp = await authFetch('/api/search', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ conversation_id: currentConvId, query, model }), signal: abortController.signal });
@@ -1154,7 +1155,7 @@ async function sendSearch() {
if (data.error) { textEl.textContent = 'Error: ' + data.error; setStreamingState(false); return; }
if (data.conversation_id && !currentConvId) { currentConvId = data.conversation_id; await loadConversations(); }
if (data.search_results) { textEl.innerHTML = '<div class="search-indicator">🔍 Found ' + data.search_results + ' results, summarizing...</div>'; }
if (data.token) { if (firstToken) { textEl.innerHTML = ''; firstToken = false; ttr = performance.now() - ttrStart; } fullText += data.token; textEl.innerHTML = renderMarkdown(fullText); scrollToTop(); }
if (data.token) { if (firstToken) { textEl.innerHTML = ''; firstToken = false; ttr = performance.now() - ttrStart; tokenCount = 0; } fullText += data.token; tokenCount++; textEl.innerHTML = renderMarkdown(fullText); scrollToTop(); }
if (data.raw_results) {
let rawHtml = '<details class="raw-results"><summary>🔍 View raw search results (' + data.raw_results.length + ')</summary><ul>';
data.raw_results.forEach(r => {
@@ -1179,6 +1180,13 @@ async function sendSearch() {
const ttrSec = ttr / 1000;
roleLabel.innerHTML += `<span class="ttr-badge search">ttr: ${ttrSec.toFixed(1)}s</span>`;
}
if (tokenCount > 0) {
const pt = data.prompt_tokens || 0;
const totalTokens = pt + tokenCount;
const ctxLen = data.context_length || 4096;
const usedPct = Math.round((totalTokens / ctxLen) * 100);
roleLabel.innerHTML += `<span class="tok-badge">tok: ${totalTokens}/${ctxLen} ${usedPct}%</span>`;
}
}
conversationHistory.push({ role: 'assistant', content: fullText });
addCopyButtons(assistantDiv);
@@ -1362,8 +1370,7 @@ async function sendMessage() {
}
if (tokenCount > 0 && roleLabel) {
const pt = data.prompt_tokens || 0;
const ct = data.completion_tokens || 0;
const totalTokens = pt + ct;
const totalTokens = pt + tokenCount;
const ctxLen = data.context_length || 4096;
const usedPct = Math.round((totalTokens / ctxLen) * 100);
roleLabel.innerHTML += `<span class="tok-badge">tok: ${totalTokens}/${ctxLen} ${usedPct}%</span>`;