groove-dev 0.27.128 → 0.27.130
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/daemon/src/api.js +21 -0
- package/node_modules/@groove-dev/daemon/src/model-lab.js +46 -0
- package/node_modules/@groove-dev/gui/dist/assets/{index-DXIaW0aK.js → index-6zTBb9ik.js} +1749 -1749
- package/node_modules/@groove-dev/gui/dist/assets/index-Ch9Mlf9w.css +1 -0
- package/node_modules/@groove-dev/gui/dist/index.html +2 -2
- package/node_modules/@groove-dev/gui/package.json +1 -1
- package/node_modules/@groove-dev/gui/src/components/lab/runtime-config.jsx +193 -3
- package/node_modules/@groove-dev/gui/src/components/ui/combobox.jsx +118 -0
- package/node_modules/@groove-dev/gui/src/stores/groove.js +54 -1
- package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +25 -21
- package/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/api.js +21 -0
- package/packages/daemon/src/model-lab.js +46 -0
- package/packages/gui/dist/assets/{index-DXIaW0aK.js → index-6zTBb9ik.js} +1749 -1749
- package/packages/gui/dist/assets/index-Ch9Mlf9w.css +1 -0
- package/packages/gui/dist/index.html +2 -2
- package/packages/gui/package.json +1 -1
- package/packages/gui/src/components/lab/runtime-config.jsx +193 -3
- package/packages/gui/src/components/ui/combobox.jsx +118 -0
- package/packages/gui/src/stores/groove.js +54 -1
- package/packages/gui/src/views/model-lab.jsx +25 -21
- package/node_modules/@groove-dev/gui/dist/assets/index-CY-CITov.css +0 -1
- package/packages/gui/dist/assets/index-CY-CITov.css +0 -1
|
@@ -6669,6 +6669,27 @@ Keep responses concise. Help them think, don't lecture them about the system the
|
|
|
6669
6669
|
}
|
|
6670
6670
|
});
|
|
6671
6671
|
|
|
6672
|
+
app.get('/api/lab/local-models', (req, res) => {
|
|
6673
|
+
try {
|
|
6674
|
+
res.json(daemon.modelLab.listLocalModels());
|
|
6675
|
+
} catch (err) {
|
|
6676
|
+
res.status(500).json({ error: err.message });
|
|
6677
|
+
}
|
|
6678
|
+
});
|
|
6679
|
+
|
|
6680
|
+
app.post('/api/lab/launch-local', async (req, res) => {
|
|
6681
|
+
try {
|
|
6682
|
+
const { modelId } = req.body;
|
|
6683
|
+
if (!modelId || typeof modelId !== 'string') {
|
|
6684
|
+
return res.status(400).json({ error: 'modelId is required' });
|
|
6685
|
+
}
|
|
6686
|
+
const result = await daemon.modelLab.launchLocalModel(modelId);
|
|
6687
|
+
res.json(result);
|
|
6688
|
+
} catch (err) {
|
|
6689
|
+
res.status(400).json({ error: err.message });
|
|
6690
|
+
}
|
|
6691
|
+
});
|
|
6692
|
+
|
|
6672
6693
|
app.post('/api/lab/inference', async (req, res) => {
|
|
6673
6694
|
try {
|
|
6674
6695
|
const params = validateLabInferenceParams(req.body);
|
|
@@ -442,6 +442,52 @@ export class ModelLab {
|
|
|
442
442
|
this._saveSession(session);
|
|
443
443
|
}
|
|
444
444
|
|
|
445
|
+
// ─── Launch Local GGUF ───────────────────────────────────────
|
|
446
|
+
|
|
447
|
+
async launchLocalModel(modelId) {
|
|
448
|
+
const mm = this.daemon.modelManager;
|
|
449
|
+
const ls = this.daemon.llamaServer;
|
|
450
|
+
if (!mm || !ls) throw new Error('Local model serving not available');
|
|
451
|
+
|
|
452
|
+
const model = mm.getModel(modelId);
|
|
453
|
+
if (!model) throw new Error('Model not found in local store');
|
|
454
|
+
|
|
455
|
+
const modelPath = mm.getModelPath(modelId);
|
|
456
|
+
if (!modelPath) throw new Error('Model file not found on disk');
|
|
457
|
+
|
|
458
|
+
const endpoint = await ls.ensureServer(modelPath);
|
|
459
|
+
if (!endpoint) throw new Error('Failed to start inference server');
|
|
460
|
+
|
|
461
|
+
const existing = [...this.runtimes.values()].find(
|
|
462
|
+
(r) => r._localModelId === modelId,
|
|
463
|
+
);
|
|
464
|
+
if (existing) {
|
|
465
|
+
existing.endpoint = endpoint;
|
|
466
|
+
existing.models = [{ id: model.filename, name: model.filename, size: model.sizeBytes }];
|
|
467
|
+
this._saveRuntimes();
|
|
468
|
+
this.daemon.broadcast({ type: 'lab:runtime:updated', data: existing });
|
|
469
|
+
return { runtime: existing, model: model.filename };
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const label = model.filename.replace(/\.gguf$/i, '');
|
|
473
|
+
const runtime = await this.addRuntime({
|
|
474
|
+
name: `${label} (local)`,
|
|
475
|
+
type: 'llama-cpp',
|
|
476
|
+
endpoint,
|
|
477
|
+
models: [{ id: model.filename, name: model.filename, size: model.sizeBytes }],
|
|
478
|
+
});
|
|
479
|
+
runtime._localModelId = modelId;
|
|
480
|
+
this._saveRuntimes();
|
|
481
|
+
|
|
482
|
+
return { runtime, model: model.filename };
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
listLocalModels() {
|
|
486
|
+
const mm = this.daemon.modelManager;
|
|
487
|
+
if (!mm) return [];
|
|
488
|
+
return mm.getInstalled().filter((m) => m.exists);
|
|
489
|
+
}
|
|
490
|
+
|
|
445
491
|
// ─── Auto-detect Ollama ─────────────────────────────────────
|
|
446
492
|
|
|
447
493
|
async autoDetectOllama() {
|