feat(quick-wins): HF-Link-Suche, Download-ETA, Job-Verlauf loeschbar

- Cookbook-Profisuche: ganze HF-URL oder "owner/repo" direkt einfuegbar
  (parseHfRepo) -> exakter Treffer statt unscharfer Suche; limit 12->40,
  damit auch grosse/seltenere Modelle (z.B. Llama-4-Scout) erscheinen.
- jobengine.attach_download_progress: geglaettete Rate (EMA) + Restzeit
  (eta_s) je Download; Aktivitaet zeigt "noch ~X min · Y MB/s".
- Jobs: erledigte/abgebrochene Eintraege einzeln loeschbar (DELETE
  /api/jobs/{id}) + "Verlauf leeren" (POST /api/jobs/clear); laufende
  bleiben geschuetzt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-22 16:35:40 +02:00
parent 81f6861df8
commit 7c7fcf87d1
4 changed files with 108 additions and 13 deletions
+14 -1
View File
@@ -6,7 +6,7 @@ Liefert die Daten fuer das Aktivitaets-Panel mit Live-Log.
from fastapi import APIRouter, Depends, HTTPException
from auth import auth
from jobengine import JOBS, cancel_job
from jobengine import JOBS, cancel_job, clear_finished, delete_job
router = APIRouter(prefix="/api", dependencies=[Depends(auth)])
@@ -26,6 +26,19 @@ def job_cancel(job_id: str):
return {"ok": True}
@router.post("/jobs/clear")
def jobs_clear():
"""Alle abgeschlossenen Jobs aus dem Verlauf entfernen (laufende bleiben)."""
return {"ok": True, "removed": clear_finished()}
@router.delete("/jobs/{job_id}")
def job_delete(job_id: str):
if not delete_job(job_id):
raise HTTPException(409, "Job laeuft noch oder ist unbekannt — laufende erst abbrechen.")
return {"ok": True}
@router.get("/jobs")
def jobs_list():
return sorted(JOBS.values(), key=lambda j: j["started_at"], reverse=True)[:20]