persist perplexity per assistant message; display on loaded convos

This commit is contained in:
gramps
2026-07-14 14:13:24 -07:00
parent 65baeba1f1
commit 7d50d07249
5 changed files with 37 additions and 21 deletions
+13 -3
View File
@@ -1154,7 +1154,7 @@ async function loadConversation(convId) {
const container = document.getElementById('chatContainer');
container.innerHTML = '';
conversationHistory = [];
data.messages.forEach(msg => { appendMessage(msg.role, msg.content, false); conversationHistory.push({ role: msg.role, content: msg.content }); });
data.messages.forEach(msg => { appendMessage(msg.role, msg.content, false, false, null, msg.perplexity); conversationHistory.push({ role: msg.role, content: msg.content }); });
scrollToLatest();
await loadConversations();
} catch(e) {}
@@ -1500,7 +1500,7 @@ function setStreamingState(streaming) {
}
}
function appendMessage(role, content, animate, isSearch = false, afterEl = null) {
function appendMessage(role, content, animate, isSearch = false, afterEl = null, perplexity = null) {
const container = document.getElementById('chatContainer');
const div = document.createElement('div');
div.className = 'message ' + role + (isSearch && role === 'assistant' ? ' search-result' : '');
@@ -1511,7 +1511,17 @@ function appendMessage(role, content, animate, isSearch = false, afterEl = null)
const timeStr = months[now.getMonth()] + ' ' + String(now.getDate()).padStart(2,'0') + ', ' + now.getFullYear() + ' ' + String(now.getHours()).padStart(2,'0') + ':' + String(now.getMinutes()).padStart(2,'0') + ':' + String(now.getSeconds()).padStart(2,'0') + '.' + String(Math.floor(ms / 10)).padStart(2,'0');
const textHtml = content ? renderMarkdown(content) : '';
const copyIcon = role === 'user' && content ? `<span class="user-copy-btn" data-content="${escapeHtml(content).replace(/"/g,'&quot;')}" onclick="var el=this;event.stopPropagation();var t=el.getAttribute('data-content');function d(){el.textContent='✓';setTimeout(function(){el.innerHTML='📋'},1500);showToast('Copied')}if(navigator.clipboard){navigator.clipboard.writeText(t).then(d).catch(function(){execCopy(t);d()})}else{execCopy(t);d()}">📋</span>` : '';
div.innerHTML = `<div class="avatar">${role === 'user' ? 'YOU' : 'cAIc'}</div><div class="content"><div class="role-label">${role === 'assistant' ? modelLabel() : role}${role === 'user' ? ' <span class="msg-time">' + timeStr + '</span>' : ''}</div><div class="text">${textHtml}${copyIcon}</div>${role === 'assistant' ? '<div class="msg-toolbar"></div>' : ''}</div>`;
let roleLabelHtml = role === 'assistant' ? modelLabel() : role;
roleLabelHtml += role === 'user' ? ' <span class="msg-time">' + timeStr + '</span>' : '';
if (role === 'assistant' && perplexity != null) {
const ppl = parseFloat(perplexity);
if (!isNaN(ppl)) {
const conf = Math.round(Math.max(0, Math.min(100, (1 - (ppl - 1) / 10) * 100)));
const cls = conf >= 80 ? 'high' : conf >= 15 ? 'medium' : 'low';
roleLabelHtml += `<span class="conf-badge ${cls}">${conf}%</span>`;
}
}
div.innerHTML = `<div class="avatar">${role === 'user' ? 'YOU' : 'cAIc'}</div><div class="content"><div class="role-label">${roleLabelHtml}</div><div class="text">${textHtml}${copyIcon}</div>${role === 'assistant' ? '<div class="msg-toolbar"></div>' : ''}</div>`;
if (role === 'user') {
const pair = document.createElement('div');
pair.className = 'msg-pair' + (isSearch ? ' search-pair' : '');