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:
@@ -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 <numero></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 <numero>)</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 <numero></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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user