kpn models: numerot + ladattu-tila yhtenäisessä listassa

Sama lista kuin kpn load, mutta näyttää myös mitkä mallit
on ladattu Ollamaan (✓) ja WASM-tilan. Numerot toimivat
suoraan kpn load -komennolla.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 07:30:39 +03:00
parent 3139d1ac65
commit 3a1c5c723c

View File

@@ -2493,35 +2493,30 @@ Files: ${Object.keys(generatedFiles).join(', ')}`;
}
if (sub === 'models') {
termLog(' <span style="color:#d29922">Selain (kpn load 1):</span>', '#c9d1d9');
const btn = document.getElementById('agent-compute-btn');
const wasmLoaded = btn?.dataset.state === 'ready';
termLog(` qwen-coder:0.5b <span style="color:#8b949e">~990 MB | WASM ~0.4 tok/s</span>${wasmLoaded ? ' <span style="color:#3fb950">✓ ladattu</span>' : ''}`);
termLog(' <span style="color:#3fb950">Natiivi (Ollama + GPU):</span>', '#c9d1d9');
// Haetaan Ollamasta ladatut mallit
fetch('/api/v1/hardware').then(r => r.json()).then(hw => {
const allModels = [
{ id: '1', name: 'qwen2.5-coder:0.5b', size: '~400 MB', type: 'selain + Ollama' },
{ id: '2', name: 'qwen2.5-coder:1.5b', size: '~1 GB', type: 'Ollama GPU' },
{ id: '3', name: 'qwen2.5-coder:7b', size: '~4.7 GB', type: 'Ollama GPU' },
{ id: '4', name: 'qwen2.5-coder:14b', size: '~9 GB', type: 'Ollama GPU' },
{ id: '5', name: 'qwen2.5-coder:32b', size: '~20 GB', type: 'Ollama GPU' },
];
// Haetaan ladatut mallit Ollamasta
Promise.all([
fetch('/api/v1/hardware').then(r => r.json()).catch(() => ({})),
fetch('http://' + window.location.hostname + ':11434/api/tags').then(r => r.json()).catch(() => ({ models: [] })),
]).then(([hw, ollama]) => {
const loadedNames = (ollama.models || []).map(m => m.name.replace(':latest', ''));
const btn = document.getElementById('agent-compute-btn');
const wasmLoaded = btn?.dataset.state === 'ready';
if (hw.gpu_name && hw.gpu_name !== 'ei natiivisolmua') {
termLog(` <span style="color:#8b949e"> GPU: ${hw.gpu_name} | VRAM: ${Math.round((hw.vram_mb||0)/1024)} GB</span>`);
termLog(` <span style="color:#8b949e">GPU: ${hw.gpu_name} | VRAM: ${Math.round((hw.vram_mb||0)/1024)} GB</span>`);
}
}).catch(() => {});
fetch('http://' + window.location.hostname + ':11434/api/tags').then(r => r.json()).then(data => {
const models = data.models || [];
if (models.length === 0) {
termLog(' <span style="color:#8b949e">Ei ladattuja malleja — kpn load &lt;numero&gt;</span>');
} else {
for (const m of models) {
const sizeGB = (m.size / 1024 / 1024 / 1024).toFixed(1);
const params = m.details?.parameter_size || '?';
const quant = m.details?.quantization_level || '';
termLog(` <span style="color:#3fb950">✓</span> ${m.name} <span style="color:#8b949e">${sizeGB} GB | ${params} ${quant}</span>`);
}
termLog(' Mallit <span style="color:#8b949e">(kpn load &lt;numero&gt;)</span>:', '#c9d1d9');
for (const m of allModels) {
const loaded = (m.id === '1' && wasmLoaded) || loadedNames.some(n => m.name.includes(n) || n.includes(m.name.split(':')[1]));
const status = loaded ? ' <span style="color:#3fb950">✓ ladattu</span>' : '';
termLog(` <span style="color:#58a6ff">${m.id}</span> ${m.name} <span style="color:#8b949e">${m.size} | ${m.type}</span>${status}`);
}
termLog(' Vaihda: <span style="color:#58a6ff">kpn load &lt;numero&gt;</span>', '#8b949e');
}).catch(() => {
termLog(' qwen2.5-coder:7b <span style="color:#8b949e">~4.7 GB</span>');
termLog(' qwen2.5-coder:3b <span style="color:#8b949e">~1.9 GB</span>');
termLog(' qwen2.5-coder:1.5b <span style="color:#8b949e">~1 GB</span>');
termLog(' <span style="color:#8b949e">Ollama ei saatavilla — näytetään oletuslista</span>');
});
return;
}