feat: Modelle loeschen (Config austragen + Dateien entfernen)
- POST /api/delete_model: entlaedt das Modell, traegt es aus der config.yaml aus und loescht optional die GGUF-Dateien, um Speicher freizugeben - Sicherheit: Loeschen STRENG auf MODELS_DIR begrenzt (Pfad-Resolve-Check); loescht den ganzen Repo-Unterordner inkl. .cache nur, wenn er ein direktes Kind von MODELS_DIR ist und kein anderes Modell eine Datei darin nutzt, sonst nur die einzelne GGUF-Datei. Meldet freigegebene GB zurueck. - Modelle-Tab: roter "Loeschen"-Button je Zeile mit Klartext-Sicherheitsabfrage (unwiderruflich) via confirmModal(danger) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -91,6 +91,7 @@ function onStatus(s) {
|
||||
<td style="text-align:right;white-space:nowrap">
|
||||
<button class="ghost" data-cfg="${esc(m.name)}">Konfigurieren</button>
|
||||
<button class="ghost" data-unload="${esc(m.name)}">Entladen</button>
|
||||
<button class="ghost del" data-del="${esc(m.name)}">Löschen</button>
|
||||
</td></tr>`;
|
||||
}).join("");
|
||||
for (const m of ALL) sel.insertAdjacentHTML("beforeend", `<option>${esc(m.name)}</option>`);
|
||||
@@ -98,6 +99,20 @@ function onStatus(s) {
|
||||
|
||||
tb.querySelectorAll("[data-unload]").forEach(b => b.addEventListener("click", () => unloadOne(b.getAttribute("data-unload"))));
|
||||
tb.querySelectorAll("[data-cfg]").forEach(b => b.addEventListener("click", () => openConfig(b.getAttribute("data-cfg"))));
|
||||
tb.querySelectorAll("[data-del]").forEach(b => b.addEventListener("click", () => deleteModel(b.getAttribute("data-del"))));
|
||||
}
|
||||
|
||||
async function deleteModel(m) {
|
||||
const ok = await confirmModal({
|
||||
title: `„${m}" wirklich löschen?`,
|
||||
body: "Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. <b>Das lässt sich nicht rückgängig machen</b> — später brauchst du dafür einen neuen Download.",
|
||||
confirmLabel: "Endgültig löschen", danger: true });
|
||||
if (!ok) return;
|
||||
try {
|
||||
const r = await api("/api/delete_model", { method: "POST", body: JSON.stringify({ alias: m }) });
|
||||
toast(r.note || ("Gelöscht: " + m));
|
||||
setTimeout(refreshSoon, 600);
|
||||
} catch (e) { toast(e.message, true); }
|
||||
}
|
||||
|
||||
function openConfig(alias) {
|
||||
|
||||
Reference in New Issue
Block a user