chore: update 1 file(s)
This commit is contained in:
69
chatv2.js
69
chatv2.js
@@ -89,7 +89,10 @@ function updateBackendModelDisplay() {
|
||||
const displayText = IS_PRODUCTION
|
||||
? `${backend.prod} - ${backend.name}`
|
||||
: backend.dev;
|
||||
document.getElementById('backendDisplay').textContent = `${displayText} - Model: ${model || 'None'}`;
|
||||
const displayElement = document.getElementById('backendDisplay');
|
||||
if (displayElement) {
|
||||
displayElement.textContent = `${displayText} - Model: ${model || 'None'}`;
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchBackendModels() {
|
||||
@@ -103,6 +106,7 @@ async function fetchBackendModels() {
|
||||
console.log(`Fetching models from: ${apiUrl}`);
|
||||
|
||||
const response = await fetch(`${apiUrl}/models`);
|
||||
const selector = document.getElementById('backendModelSelector');
|
||||
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
@@ -119,24 +123,31 @@ async function fetchBackendModels() {
|
||||
|
||||
// ✅ FIX: Only auto-select if no model is set
|
||||
const hasModel = currentBackendModel && currentBackendModel.includes(':') && currentBackendModel.split(':')[1];
|
||||
if (!hasModel && availableBackendModels.length > 0) {
|
||||
if (!hasModel && availableBackendModels.length > 0 && selector) {
|
||||
currentBackendModel = `${availableBackendModels[0].backend}:${availableBackendModels[0].model}`;
|
||||
document.getElementById('backendModelSelector').value = currentBackendModel;
|
||||
selector.value = currentBackendModel;
|
||||
}
|
||||
|
||||
updateBackendModelDisplay();
|
||||
} else {
|
||||
console.error('Failed to fetch models:', response.statusText);
|
||||
document.getElementById('backendModelSelector').innerHTML = '<option value="">Error loading models</option>';
|
||||
if (selector) {
|
||||
selector.innerHTML = '<option value="">Error loading models</option>';
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching models:', error);
|
||||
document.getElementById('backendModelSelector').innerHTML = '<option value="">Error loading models</option>';
|
||||
const selector = document.getElementById('backendModelSelector');
|
||||
if (selector) {
|
||||
selector.innerHTML = '<option value="">Error loading models</option>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function populateBackendModelSelector() {
|
||||
const selector = document.getElementById('backendModelSelector');
|
||||
if (!selector) return;
|
||||
|
||||
if (availableBackendModels.length === 0) {
|
||||
selector.innerHTML = '<option value="">No models available</option>';
|
||||
return;
|
||||
@@ -168,13 +179,13 @@ function trimChatHistory() {
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const backendModelSelector = document.getElementById('backendModelSelector');
|
||||
|
||||
if (backendModelSelector) {
|
||||
backendModelSelector.addEventListener('change', (e) => {
|
||||
currentBackendModel = e.target.value;
|
||||
updateBackendModelDisplay();
|
||||
fetchBackendModels();
|
||||
});
|
||||
|
||||
fetchBackendModels();
|
||||
}
|
||||
});
|
||||
|
||||
const chatLog = document.getElementById('chatLog');
|
||||
@@ -201,7 +212,7 @@ function autoResize(textarea) {
|
||||
textarea.style.height = Math.min(textarea.scrollHeight, 300) + 'px';
|
||||
}
|
||||
|
||||
function addMessage(role, content, markdown = false, messageId = null) {
|
||||
function addMessage(role, content, markdown = false, messageId = null, saveToHistory = true) {
|
||||
const messageDiv = document.createElement('div');
|
||||
messageDiv.className = `message message-${role}`;
|
||||
if (messageId) {
|
||||
@@ -213,7 +224,7 @@ function addMessage(role, content, markdown = false, messageId = null) {
|
||||
|
||||
const avatar = document.createElement('div');
|
||||
avatar.className = `avatar ${role}-avatar`;
|
||||
avatar.textContent = role === 'user' ? '?' : '?';
|
||||
avatar.textContent = role === 'user' ? '👤' : '🤖';
|
||||
|
||||
const name = document.createElement('span');
|
||||
name.textContent = role === 'user' ? 'You' : 'Assistant';
|
||||
@@ -239,17 +250,21 @@ function addMessage(role, content, markdown = false, messageId = null) {
|
||||
contentDiv.innerHTML = processedContent;
|
||||
contentDiv.style.whiteSpace = 'pre-wrap';
|
||||
contentDiv.style.padding = '8px 0';
|
||||
contentDiv.style.color = '#2d3339';
|
||||
contentDiv.style.color = '#e0e0e0';
|
||||
}
|
||||
|
||||
messageDiv.appendChild(headerDiv);
|
||||
messageDiv.appendChild(contentDiv);
|
||||
if (chatLog) {
|
||||
chatLog.appendChild(messageDiv);
|
||||
chatLog.scrollTop = chatLog.scrollHeight;
|
||||
}
|
||||
|
||||
if (saveToHistory) {
|
||||
chatHistory.push({ role, content, markdown, messageId });
|
||||
trimChatHistory();
|
||||
localStorage.setItem('chatHistory', JSON.stringify(chatHistory));
|
||||
}
|
||||
|
||||
return contentDiv;
|
||||
}
|
||||
@@ -300,7 +315,7 @@ window.toggleThinking = function(id) {
|
||||
function updateMessageContent(contentDiv, newContent, markdown = false, role) {
|
||||
const processedContent = parseThinkingTags(newContent);
|
||||
|
||||
if (markdown && role === 'assistant' && markdownToggle.checked) {
|
||||
if (markdown && role === 'assistant' && markdownToggle && markdownToggle.checked) {
|
||||
contentDiv.innerHTML = marked.parse(processedContent);
|
||||
if (window.hljs) {
|
||||
setTimeout(() => {
|
||||
@@ -311,6 +326,12 @@ function updateMessageContent(contentDiv, newContent, markdown = false, role) {
|
||||
}
|
||||
} else {
|
||||
contentDiv.innerHTML = processedContent;
|
||||
contentDiv.style.whiteSpace = 'pre-wrap';
|
||||
contentDiv.style.padding = '8px 0';
|
||||
contentDiv.style.color = '#e0e0e0';
|
||||
}
|
||||
if (chatLog) {
|
||||
chatLog.scrollTop = chatLog.scrollHeight;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -324,12 +345,12 @@ function showTypingIndicator() {
|
||||
|
||||
const avatar = document.createElement('div');
|
||||
avatar.className = 'avatar assistant-avatar';
|
||||
avatar.textContent = '?';
|
||||
avatar.textContent = '🤖';
|
||||
|
||||
const name = document.createElement('span');
|
||||
name.textContent = 'Assistant';
|
||||
|
||||
headerDiv.appendChild(avatar); // ✅ FIX: Typo "abatar"
|
||||
headerDiv.appendChild(avatar);
|
||||
headerDiv.appendChild(name);
|
||||
|
||||
const dotsDiv = document.createElement('div');
|
||||
@@ -343,8 +364,10 @@ function showTypingIndicator() {
|
||||
|
||||
typingDiv.appendChild(headerDiv);
|
||||
typingDiv.appendChild(dotsDiv);
|
||||
if (chatLog) {
|
||||
chatLog.appendChild(typingDiv);
|
||||
chatLog.scrollTop = chatLog.scrollHeight;
|
||||
}
|
||||
|
||||
return typingDiv;
|
||||
}
|
||||
@@ -369,7 +392,7 @@ async function handleStreamingResponse(userMessage) {
|
||||
|
||||
const avatar = document.createElement('div');
|
||||
avatar.className = 'avatar assistant-avatar';
|
||||
avatar.textContent = '?';
|
||||
avatar.textContent = '🤖';
|
||||
|
||||
const name = document.createElement('span');
|
||||
name.textContent = 'Assistant';
|
||||
@@ -382,7 +405,9 @@ async function handleStreamingResponse(userMessage) {
|
||||
|
||||
messageDiv.appendChild(headerDiv);
|
||||
messageDiv.appendChild(contentDiv);
|
||||
if (chatLog) {
|
||||
chatLog.appendChild(messageDiv);
|
||||
}
|
||||
|
||||
const cursorSpan = document.createElement('span');
|
||||
cursorSpan.className = 'streaming-cursor';
|
||||
@@ -434,11 +459,13 @@ async function handleStreamingResponse(userMessage) {
|
||||
if (timeSinceLastUpdate >= MIN_UPDATE_INTERVAL) {
|
||||
updateScheduled = true;
|
||||
requestAnimationFrame(() => {
|
||||
updateMessageContent(contentDiv, accumulatedContent, markdownToggle.checked, 'assistant');
|
||||
updateMessageContent(contentDiv, accumulatedContent, markdownToggle && markdownToggle.checked, 'assistant');
|
||||
if (cursorSpan.parentNode) {
|
||||
contentDiv.appendChild(cursorSpan);
|
||||
}
|
||||
if (chatLog) {
|
||||
chatLog.scrollTop = chatLog.scrollHeight;
|
||||
}
|
||||
lastUpdate = Date.now();
|
||||
updateScheduled = false;
|
||||
});
|
||||
@@ -446,11 +473,13 @@ async function handleStreamingResponse(userMessage) {
|
||||
updateScheduled = true;
|
||||
setTimeout(() => {
|
||||
requestAnimationFrame(() => {
|
||||
updateMessageContent(contentDiv, accumulatedContent, markdownToggle.checked, 'assistant');
|
||||
updateMessageContent(contentDiv, accumulatedContent, markdownToggle && markdownToggle.checked, 'assistant');
|
||||
if (cursorSpan.parentNode) {
|
||||
contentDiv.appendChild(cursorSpan);
|
||||
}
|
||||
if (chatLog) {
|
||||
chatLog.scrollTop = chatLog.scrollHeight;
|
||||
}
|
||||
lastUpdate = Date.now();
|
||||
updateScheduled = false;
|
||||
});
|
||||
@@ -618,7 +647,7 @@ userInput.addEventListener('keydown', (e) => {
|
||||
|
||||
// ✅ Updated window.onload with better initialization
|
||||
window.onload = () => {
|
||||
userInput.focus();
|
||||
if (userInput) userInput.focus();
|
||||
|
||||
// Set default backend BEFORE fetching
|
||||
if (!currentBackendModel) {
|
||||
@@ -629,11 +658,11 @@ window.onload = () => {
|
||||
// Load chat history after models are fetched
|
||||
if (chatLog) {
|
||||
if (chatHistory.length === 0) {
|
||||
//addMessage('assistant', welcomeMessage, true);
|
||||
//addMessage('assistant', welcomeMessage, true, null, false);
|
||||
} else {
|
||||
chatHistory.forEach(msg => {
|
||||
if (typeof msg.content === 'string' && msg.content.trim()) {
|
||||
addMessage(msg.role, msg.content, msg.markdown, msg.messageId);
|
||||
addMessage(msg.role, msg.content, msg.markdown, msg.messageId, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -649,6 +678,6 @@ function resetChat() {
|
||||
|
||||
if (chatLog) {
|
||||
chatLog.innerHTML = '';
|
||||
addMessage('assistant', welcomeMessage, true);
|
||||
addMessage('assistant', welcomeMessage, true, null, false);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user