tilakoneen fiksailuja
This commit is contained in:
@@ -1417,6 +1417,9 @@
|
|||||||
document.querySelector(`.main-tab[onclick*="${tab}"]`).classList.add('active');
|
document.querySelector(`.main-tab[onclick*="${tab}"]`).classList.add('active');
|
||||||
window.location.hash = tab;
|
window.location.hash = tab;
|
||||||
|
|
||||||
|
// Siivotaan streaming-kortit näkymistä tab-vaihdon yhteydessä
|
||||||
|
document.querySelectorAll('.streaming-card').forEach(el => el.remove());
|
||||||
|
|
||||||
// Päivitetään admin-sessio vastaamaan nykyistä välilehteä
|
// Päivitetään admin-sessio vastaamaan nykyistä välilehteä
|
||||||
if (window._uiSocket && window._uiSocket.readyState === 1) {
|
if (window._uiSocket && window._uiSocket.readyState === 1) {
|
||||||
const viewTask = tab === 'codelab' ? 'codelab-viewer' : 'viewer';
|
const viewTask = tab === 'codelab' ? 'codelab-viewer' : 'viewer';
|
||||||
@@ -2034,6 +2037,12 @@
|
|||||||
if (chatBox.children.length > 5) chatBox.removeChild(chatBox.firstChild);
|
if (chatBox.children.length > 5) chatBox.removeChild(chatBox.firstChild);
|
||||||
chatBox.scrollTop = chatBox.scrollHeight;
|
chatBox.scrollTop = chatBox.scrollHeight;
|
||||||
} else if (data.type === "llm_done") {
|
} else if (data.type === "llm_done") {
|
||||||
|
// Reititetäänkö agents-näkymään vai codelab-näkymään?
|
||||||
|
const isAgentsTask = data.task_id && activeStreams[data.task_id];
|
||||||
|
const isCoder = (data.model || '').includes('Coder');
|
||||||
|
|
||||||
|
if (isAgentsTask) {
|
||||||
|
// Agents-pipeline: päivitetään terminaali
|
||||||
const term = document.getElementById('agent-terminal');
|
const term = document.getElementById('agent-terminal');
|
||||||
if (term) {
|
if (term) {
|
||||||
const model = data.model || 'llm';
|
const model = data.model || 'llm';
|
||||||
@@ -2051,8 +2060,12 @@
|
|||||||
document.querySelectorAll('.avatar-card').forEach(c => c.classList.remove('active'));
|
document.querySelectorAll('.avatar-card').forEach(c => c.classList.remove('active'));
|
||||||
document.getElementById('avatar-kpn').classList.add('active');
|
document.getElementById('avatar-kpn').classList.add('active');
|
||||||
}
|
}
|
||||||
|
} else if (isCoder) {
|
||||||
// Poistetaan streaming-kortti
|
// Codelab: erillinen addCodeResult-handler käsittelee (rivi 2364)
|
||||||
|
// Poistetaan vain streaming-kortti codelabista
|
||||||
|
if (codeResults) codeResults.querySelector('.streaming-card')?.remove();
|
||||||
|
} else {
|
||||||
|
// Muu malli (network-näkymä): näytetään chatBoxissa
|
||||||
chatBox.querySelector('.streaming-card')?.remove();
|
chatBox.querySelector('.streaming-card')?.remove();
|
||||||
chatBox.classList.remove('hidden');
|
chatBox.classList.remove('hidden');
|
||||||
const nodeId = data.node_id || "?";
|
const nodeId = data.node_id || "?";
|
||||||
@@ -2082,16 +2095,37 @@
|
|||||||
chatBox.appendChild(msgDiv);
|
chatBox.appendChild(msgDiv);
|
||||||
if (chatBox.children.length > 5) chatBox.removeChild(chatBox.firstChild);
|
if (chatBox.children.length > 5) chatBox.removeChild(chatBox.firstChild);
|
||||||
chatBox.scrollTop = chatBox.scrollHeight;
|
chatBox.scrollTop = chatBox.scrollHeight;
|
||||||
|
}
|
||||||
|
|
||||||
metrics.tasks++;
|
metrics.tasks++;
|
||||||
metrics.totalTokens += tokGen;
|
metrics.totalTokens += (data.tokens_generated || 0);
|
||||||
metrics.totalTimeMs += durMs;
|
metrics.totalTimeMs += (data.duration_ms || 0);
|
||||||
flashComputing();
|
flashComputing();
|
||||||
updateMetrics();
|
updateMetrics();
|
||||||
|
|
||||||
console.log(`[${model}] ${tokGen} tokenia | ${typeof durMs === 'number' ? durMs.toFixed(0) : durMs}ms | ${tokS} tok/s | "${(data.response || '').substring(0, 60)}..."`);
|
console.log(`[${data.model || 'LLM'}] ${data.tokens_generated || 0} tokenia | ${typeof data.duration_ms === 'number' ? data.duration_ms.toFixed(0) : data.duration_ms || '?'}ms | ${data.tokens_per_sec || '?'} tok/s | "${(data.response || '').substring(0, 60)}..."`);
|
||||||
|
} else if (data.type === "llm_error") {
|
||||||
|
// Virheenkäsittely: siivotaan streaming-tila
|
||||||
|
const errMsg = data.error || 'Tuntematon virhe';
|
||||||
|
if (data.task_id && activeStreams[data.task_id]) {
|
||||||
|
// Agents-pipeline: näytetään virhe terminaalissa
|
||||||
|
activeStreams[data.task_id].remove();
|
||||||
|
delete activeStreams[data.task_id];
|
||||||
|
}
|
||||||
|
chatBox.querySelector('.streaming-card')?.remove();
|
||||||
|
if (codeResults) codeResults.querySelector('.streaming-card')?.remove();
|
||||||
|
const term = document.getElementById('agent-terminal');
|
||||||
|
if (term) {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.className = 'terminal-line';
|
||||||
|
div.style.color = '#f85149';
|
||||||
|
div.innerHTML = ` ✗ LLM-virhe: ${errMsg}`;
|
||||||
|
term.appendChild(div);
|
||||||
|
term.scrollTop = term.scrollHeight;
|
||||||
|
}
|
||||||
|
console.warn('[LLM Error]', errMsg);
|
||||||
} else if (data.type === "llm_chunk") {
|
} else if (data.type === "llm_chunk") {
|
||||||
// Terminaalin streaming: päivitetään aktiivinen rivi
|
// Agents-terminaalin streaming: päivitetään aktiivinen rivi task_id:n perusteella
|
||||||
if (data.task_id && activeStreams[data.task_id]) {
|
if (data.task_id && activeStreams[data.task_id]) {
|
||||||
const streamDiv = activeStreams[data.task_id];
|
const streamDiv = activeStreams[data.task_id];
|
||||||
const contentEl = streamDiv.querySelector('.stream-content');
|
const contentEl = streamDiv.querySelector('.stream-content');
|
||||||
@@ -2099,9 +2133,9 @@
|
|||||||
contentEl.textContent += data.token || '';
|
contentEl.textContent += data.token || '';
|
||||||
termPanel.scrollTop = termPanel.scrollHeight;
|
termPanel.scrollTop = termPanel.scrollHeight;
|
||||||
}
|
}
|
||||||
}
|
// Agents-pipeline omistaa tämän chunkin, ei näytetä muualla
|
||||||
|
} else {
|
||||||
// Streaming: näytetään generointi reaaliaikaisesti
|
// Ei agents-task → näytetään streaming-kortti oikeassa näkymässä
|
||||||
const model = data.model || '';
|
const model = data.model || '';
|
||||||
const isCoder = model.includes('Coder');
|
const isCoder = model.includes('Coder');
|
||||||
const targetBox = isCoder ? codeResults : chatBox;
|
const targetBox = isCoder ? codeResults : chatBox;
|
||||||
@@ -2135,6 +2169,7 @@
|
|||||||
if (counterEl) counterEl.textContent = tokCount + ' tok';
|
if (counterEl) counterEl.textContent = tokCount + ' tok';
|
||||||
targetBox.scrollTop = targetBox.scrollHeight;
|
targetBox.scrollTop = targetBox.scrollHeight;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (data.type === "llm_prompt") {
|
} else if (data.type === "llm_prompt") {
|
||||||
if (data.task_id) {
|
if (data.task_id) {
|
||||||
const term = document.getElementById('agent-terminal');
|
const term = document.getElementById('agent-terminal');
|
||||||
@@ -2360,11 +2395,13 @@
|
|||||||
if (codeResults.children.length > 10) codeResults.removeChild(codeResults.lastChild);
|
if (codeResults.children.length > 10) codeResults.removeChild(codeResults.lastChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kuuntele coder-tuloksia UI WebSocketista
|
// Kuuntele coder-tuloksia UI WebSocketista (vain ei-agents-tehtävät)
|
||||||
uiSocket.addEventListener('message', (event) => {
|
uiSocket.addEventListener('message', (event) => {
|
||||||
try {
|
try {
|
||||||
const data = JSON.parse(event.data);
|
const data = JSON.parse(event.data);
|
||||||
if (data.type === 'llm_done' && (data.model || '').includes('Coder')) {
|
if (data.type === 'llm_done' && (data.model || '').includes('Coder')) {
|
||||||
|
// Ohita agents-pipelinen tehtävät — ne käsitellään kpnRun:issa
|
||||||
|
if (data.task_id && activeStreams[data.task_id]) return;
|
||||||
addCodeResult(data);
|
addCodeResult(data);
|
||||||
}
|
}
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user