kpn load: laitteiston VRAM/RAM tarkistus, liian isot mallit merkitään
Hub: uusi GET /api/v1/hardware palauttaa natiivisolmun GPU/RAM-tiedot. Frontend: kpn load hakee laitteistotiedon ja näyttää mallit joihin laite riittää. Liian isot mallit näkyvät yliviivattuina + varoitus. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2373,19 +2373,41 @@ Files: ${Object.keys(generatedFiles).join(', ')}`;
|
||||
if (sub === 'load') {
|
||||
const arg = parts[2];
|
||||
const ollamaModels = [
|
||||
{ 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', default: true },
|
||||
{ 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' },
|
||||
{ id: '1', name: 'qwen2.5-coder:0.5b', size: '~400 MB', vram_mb: 0, type: 'selain + Ollama' },
|
||||
{ id: '2', name: 'qwen2.5-coder:1.5b', size: '~1 GB', vram_mb: 1500, type: 'Ollama GPU' },
|
||||
{ id: '3', name: 'qwen2.5-coder:7b', size: '~4.7 GB', vram_mb: 5500, type: 'Ollama GPU', default: true },
|
||||
{ id: '4', name: 'qwen2.5-coder:14b', size: '~9 GB', vram_mb: 10000, type: 'Ollama GPU' },
|
||||
{ id: '5', name: 'qwen2.5-coder:32b', size: '~20 GB', vram_mb: 21000, type: 'Ollama GPU' },
|
||||
];
|
||||
if (!arg) {
|
||||
termLog(' Mallit:', '#c9d1d9');
|
||||
for (const m of ollamaModels) {
|
||||
const active = m.default ? ' <span style="color:#3fb950">← aktiivinen</span>' : '';
|
||||
termLog(` <span style="color:#58a6ff">${m.id}</span> ${m.name} <span style="color:#8b949e">${m.size} | ${m.type}</span>${active}`);
|
||||
}
|
||||
termLog(' Käyttö: kpn load <numero>', '#8b949e');
|
||||
// Haetaan laitteistotiedot ja näytetään sopivat mallit
|
||||
fetch('/api/v1/hardware').then(r => r.json()).then(hw => {
|
||||
const vram = hw.vram_mb || 0;
|
||||
const ram = hw.ram_mb || 0;
|
||||
const gpu = hw.gpu_name || '?';
|
||||
const available = vram || ram; // CPU-fallback käyttää RAM:ia
|
||||
if (vram > 0) {
|
||||
termLog(` <span style="color:#8b949e">GPU: ${gpu} | VRAM: ${Math.round(vram/1024)} GB | RAM: ${Math.round(ram/1024)} GB</span>`);
|
||||
} else if (ram > 0) {
|
||||
termLog(` <span style="color:#8b949e">Ei GPU:ta | RAM: ${Math.round(ram/1024)} GB (CPU-moodi)</span>`);
|
||||
}
|
||||
termLog(' Mallit:', '#c9d1d9');
|
||||
for (const m of ollamaModels) {
|
||||
const fits = m.vram_mb === 0 || m.vram_mb < available;
|
||||
const active = m.default ? ' <span style="color:#3fb950">← aktiivinen</span>' : '';
|
||||
const icon = fits ? `<span style="color:#58a6ff">${m.id}</span>` : `<span style="color:#8b949e;text-decoration:line-through">${m.id}</span>`;
|
||||
const warn = !fits ? ' <span style="color:#f85149">⚠ ei mahdu</span>' : '';
|
||||
termLog(` ${icon} ${fits ? '' : '<span style="color:#8b949e">'}${m.name} ${m.size} | ${m.type}${fits ? '' : '</span>'}${active}${warn}`);
|
||||
}
|
||||
termLog(' Käyttö: kpn load <numero>', '#8b949e');
|
||||
}).catch(() => {
|
||||
termLog(' Mallit:', '#c9d1d9');
|
||||
for (const m of ollamaModels) {
|
||||
const active = m.default ? ' <span style="color:#3fb950">← aktiivinen</span>' : '';
|
||||
termLog(` <span style="color:#58a6ff">${m.id}</span> ${m.name} <span style="color:#8b949e">${m.size} | ${m.type}</span>${active}`);
|
||||
}
|
||||
termLog(' Käyttö: kpn load <numero>', '#8b949e');
|
||||
});
|
||||
return;
|
||||
}
|
||||
const selected = ollamaModels.find(m => m.id === arg || m.name === arg);
|
||||
|
||||
Reference in New Issue
Block a user