v0.17.23: TOK metric reformatted to #/% with context-pct color coding
This commit is contained in:
@@ -9,7 +9,7 @@ import logging
|
|||||||
|
|
||||||
log = logging.getLogger("caic")
|
log = logging.getLogger("caic")
|
||||||
|
|
||||||
VERSION = "v0.17.22"
|
VERSION = "v0.17.23"
|
||||||
OLLAMA_BASE = os.environ.get("OLLAMA_BASE", "http://localhost:11434")
|
OLLAMA_BASE = os.environ.get("OLLAMA_BASE", "http://localhost:11434")
|
||||||
LLAMA_SERVER_BASE = os.environ.get("LLAMA_SERVER_BASE", "http://192.168.50.108:8081")
|
LLAMA_SERVER_BASE = os.environ.get("LLAMA_SERVER_BASE", "http://192.168.50.108:8081")
|
||||||
SEARXNG_BASE = "http://localhost:8888"
|
SEARXNG_BASE = "http://localhost:8888"
|
||||||
|
|||||||
+19
-11
@@ -393,7 +393,7 @@ body { font-family: var(--font-body); background: var(--bg-primary); color: var(
|
|||||||
<span class="tc-item"><span class="tc-label">MEM</span> <span id="memValue" class="tc-val">--%</span></span>
|
<span class="tc-item"><span class="tc-label">MEM</span> <span id="memValue" class="tc-val">--%</span></span>
|
||||||
<span class="tc-item"><span class="tc-label">GPU</span> <span id="gpuValue" class="tc-val">--%</span></span>
|
<span class="tc-item"><span class="tc-label">GPU</span> <span id="gpuValue" class="tc-val">--%</span></span>
|
||||||
<span class="tc-item"><span class="tc-label">VRAM</span> <span id="vramValue" class="tc-val">--%</span></span>
|
<span class="tc-item"><span class="tc-label">VRAM</span> <span id="vramValue" class="tc-val">--%</span></span>
|
||||||
<span class="tc-item"><span class="tc-label">TOK</span> <span id="tokValue" class="tc-val green">0</span></span>
|
<span class="tc-item"><span class="tc-label">TOK</span> <span id="tokValue">0</span> / <span id="tokPct" class="tc-val green">0%</span></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="topbar-right">
|
<div class="topbar-right">
|
||||||
<button class="badge on" id="memoryBadge" onclick="toggleMemory()" title="Toggle memory injection">MEM</button>
|
<button class="badge on" id="memoryBadge" onclick="toggleMemory()" title="Toggle memory injection">MEM</button>
|
||||||
@@ -1185,11 +1185,12 @@ async function sendSearch() {
|
|||||||
const ttrSec = ttr / 1000;
|
const ttrSec = ttr / 1000;
|
||||||
roleLabel.innerHTML += `<span class="ttr-badge search">ttr: ${ttrSec.toFixed(1)}s</span>`;
|
roleLabel.innerHTML += `<span class="ttr-badge search">ttr: ${ttrSec.toFixed(1)}s</span>`;
|
||||||
}
|
}
|
||||||
|
let usedPct = 0;
|
||||||
if (tokenCount > 0) {
|
if (tokenCount > 0) {
|
||||||
const pt = data.prompt_tokens || 0;
|
const pt = data.prompt_tokens || 0;
|
||||||
const totalTokens = pt + tokenCount;
|
const totalTokens = pt + tokenCount;
|
||||||
const ctxLen = data.context_length || 4096;
|
const ctxLen = data.context_length || 4096;
|
||||||
const usedPct = Math.round((totalTokens / ctxLen) * 100);
|
usedPct = Math.round((totalTokens / ctxLen) * 100);
|
||||||
roleLabel.innerHTML += `<span class="tok-badge">tok: ${totalTokens}/${ctxLen} ${usedPct}%</span>`;
|
roleLabel.innerHTML += `<span class="tok-badge">tok: ${totalTokens}/${ctxLen} ${usedPct}%</span>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1197,7 +1198,7 @@ async function sendSearch() {
|
|||||||
addCopyButtons(assistantDiv);
|
addCopyButtons(assistantDiv);
|
||||||
addMessageToolbar(assistantDiv);
|
addMessageToolbar(assistantDiv);
|
||||||
setStreamingState(false);
|
setStreamingState(false);
|
||||||
cumulativeTokens += tokenCount; localStorage.setItem('caicCumulativeTokens', cumulativeTokens.toString()); updateCumulativeTokens();
|
cumulativeTokens += tokenCount; localStorage.setItem('caicCumulativeTokens', cumulativeTokens.toString()); sessionTokens += tokenCount; updateTopbarTokens(usedPct);
|
||||||
await loadConversations();
|
await loadConversations();
|
||||||
}
|
}
|
||||||
} catch(e) { console.log('Parse error:', e); }
|
} catch(e) { console.log('Parse error:', e); }
|
||||||
@@ -1374,18 +1375,19 @@ async function sendMessage() {
|
|||||||
const ttrClass = data.searched ? 'search' : (ttrSec <= 2 ? 'low' : ttrSec < 11 ? 'medium' : 'high');
|
const ttrClass = data.searched ? 'search' : (ttrSec <= 2 ? 'low' : ttrSec < 11 ? 'medium' : 'high');
|
||||||
roleLabel.innerHTML += `<span class="ttr-badge ${ttrClass}">ttr: ${ttrSec.toFixed(1)}s</span>`;
|
roleLabel.innerHTML += `<span class="ttr-badge ${ttrClass}">ttr: ${ttrSec.toFixed(1)}s</span>`;
|
||||||
}
|
}
|
||||||
|
let usedPct = 0;
|
||||||
if (tokenCount > 0 && roleLabel) {
|
if (tokenCount > 0 && roleLabel) {
|
||||||
const pt = data.prompt_tokens || 0;
|
const pt = data.prompt_tokens || 0;
|
||||||
const totalTokens = pt + tokenCount;
|
const totalTokens = pt + tokenCount;
|
||||||
const ctxLen = data.context_length || 4096;
|
const ctxLen = data.context_length || 4096;
|
||||||
const usedPct = Math.round((totalTokens / ctxLen) * 100);
|
usedPct = Math.round((totalTokens / ctxLen) * 100);
|
||||||
roleLabel.innerHTML += `<span class="tok-badge">tok: ${totalTokens}/${ctxLen} ${usedPct}%</span>`;
|
roleLabel.innerHTML += `<span class="tok-badge">tok: ${totalTokens}/${ctxLen} ${usedPct}%</span>`;
|
||||||
}
|
}
|
||||||
conversationHistory.push({ role: 'assistant', content: fullText });
|
conversationHistory.push({ role: 'assistant', content: fullText });
|
||||||
addCopyButtons(assistantDiv);
|
addCopyButtons(assistantDiv);
|
||||||
addMessageToolbar(assistantDiv);
|
addMessageToolbar(assistantDiv);
|
||||||
setStreamingState(false);
|
setStreamingState(false);
|
||||||
cumulativeTokens += tokenCount; localStorage.setItem('caicCumulativeTokens', cumulativeTokens.toString()); updateCumulativeTokens();
|
cumulativeTokens += tokenCount; localStorage.setItem('caicCumulativeTokens', cumulativeTokens.toString()); sessionTokens += tokenCount; updateTopbarTokens(usedPct);
|
||||||
if (data.rag_update_suggestion && data.rag_update_suggestion.conflicts) {
|
if (data.rag_update_suggestion && data.rag_update_suggestion.conflicts) {
|
||||||
showFactConflictBanner(data.rag_update_suggestion.conflicts, data.conversation_id);
|
showFactConflictBanner(data.rag_update_suggestion.conflicts, data.conversation_id);
|
||||||
}
|
}
|
||||||
@@ -1572,15 +1574,21 @@ const messageHistory = [];
|
|||||||
let historyIndex = -1;
|
let historyIndex = -1;
|
||||||
let historyDraft = '';
|
let historyDraft = '';
|
||||||
let cumulativeTokens = parseInt(localStorage.getItem('caicCumulativeTokens') || '0', 10);
|
let cumulativeTokens = parseInt(localStorage.getItem('caicCumulativeTokens') || '0', 10);
|
||||||
|
let sessionTokens = 0;
|
||||||
|
let lastContextPct = 0;
|
||||||
|
|
||||||
function updateCumulativeTokens() {
|
function updateTopbarTokens(pct) {
|
||||||
const el = document.getElementById('tokValue');
|
if (typeof pct === 'number') lastContextPct = pct;
|
||||||
if (el) {
|
const countEl = document.getElementById('tokValue');
|
||||||
el.textContent = cumulativeTokens.toLocaleString();
|
const pctEl = document.getElementById('tokPct');
|
||||||
el.className = 'tc-val green';
|
if (countEl) countEl.textContent = cumulativeTokens.toLocaleString();
|
||||||
|
if (pctEl) {
|
||||||
|
const cls = lastContextPct >= 95 ? 'red' : lastContextPct >= 80 ? 'orange' : 'green';
|
||||||
|
pctEl.textContent = lastContextPct + '%';
|
||||||
|
pctEl.className = 'tc-val ' + cls;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateCumulativeTokens();
|
updateTopbarTokens(0);
|
||||||
userInput.addEventListener('input', function() { this.style.height = 'auto'; this.style.height = Math.min(this.scrollHeight, 200) + 'px'; });
|
userInput.addEventListener('input', function() { this.style.height = 'auto'; this.style.height = Math.min(this.scrollHeight, 200) + 'px'; });
|
||||||
userInput.addEventListener('keydown', e => {
|
userInput.addEventListener('keydown', e => {
|
||||||
if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(); return; }
|
if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(); return; }
|
||||||
|
|||||||
Reference in New Issue
Block a user