docs: v4 als umgesetzt markiert (alle 4 Schritte live)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -11,14 +11,15 @@ FastAPI-Backend + Vanilla-JS-Dashboard. **Leitprinzip: KISS — kein Build-Schri
|
||||
- **`auth.py`** — optionale Token-Auth: Header `X-MC-Token` **oder** Query `?token=` (Query ist Pflicht für WebSockets, da Browser dort keine Header senden).
|
||||
- **`jobengine.py`** — In-Memory-Job-System (Threads + Subprocess) mit Live-Log. `start_job(..., stdin_data=, log_cmd=)`: Secrets (sudo-PW) gehen über **stdin**, die Log-Zeile wird sanitisiert (kein Passwort im Log/`ps`).
|
||||
- **`llamaswap.py`** — spricht `llama-swap` an (`/running`, `/v1/models`, unload) und liest/schreibt dessen `config.yaml` per `ruamel.yaml` (Kommentare bleiben erhalten).
|
||||
- **`hw_math.py`** — Odysseus-Hardware-Fit-Mathe (VRAM/RAM-Bedarf + tps-Schätzung) fürs Cookbook.
|
||||
- **`routers/*.py`** — ein Router je Bereich: `models.py` (`status` mit Meta/Caps, `download`, `register`, `update_model`, `unload`, `chat`), `jobs.py` (`jobs`), `maintenance.py` (`update` = **llama.cpp**, `self-update` = **MC selbst** via git pull+rsync+restart, `os-update`, `service/{name}/restart`, `reboot`, `logs`-WebSocket), `system.py` (`status` + `stream`-WebSocket, Live-Metriken via psutil/sysfs), `cookbook.py` (`analyze`/`evaluate`). Alle unter `/api/*`.
|
||||
- **`hw_math.py`** — Odysseus-Fit-Mathe: VRAM/RAM-Bedarf, tps-Schätzung, **`max_ctx_for`** (optimaler Kontext aus Hardware), `extract_params_b`. Genutzt von cookbook + models.
|
||||
- **`recipes.py`** — kuratierte Use-Case-Stacks (Daten, kein Code) fürs Cookbook 2.0.
|
||||
- **`routers/*.py`** — ein Router je Bereich: `models.py` (`status` mit Meta/Caps/**optimal_ctx**, `download`, `register`, `update_model`, `unload`, `chat`), `jobs.py` (`jobs`), `maintenance.py` (`update` = **llama.cpp**, `self-update` = **MC selbst**, `os-update`, `service/{name}/restart`, `reboot`, `logs`-WebSocket), `system.py` (`status` + `stream`-WebSocket, Live-Metriken via psutil/sysfs), `cookbook.py` (`analyze`/`evaluate`/`recipes`/`install-recipe`), `integration.py` (`test` — Engine-Verbindung), `news.py` (`news` — RSS-Aggregation via stdlib). Alle unter `/api/*`.
|
||||
|
||||
**Frontend** (`static/`, dünne Hülle + ES-Module, kein Build):
|
||||
- **`index.html`** — nur Gerüst: Sidebar-Nav, Topbar, Alert-Banner, ein `.view`-Container je Bereich (Hash-Routing). Lädt `css/*` und `js/main.js` als Modul.
|
||||
- **Design-System (v3):** **EINE** Akzentfarbe (Teal `#2dd4bf`) für alles Klickbare; Grün/Gelb/Rot **nur** für Status. Dichtes Control-Plane-Layout, Monospace-Zahlen, Bento. **Keine Inline-Styles in Panels** — alles über Klassen aus `components.css` (`.card`, `.tile`, `.qa`, `.fit-badge`, `.modal-*`, `.badge`, `.bar`/`.meter`, `.chip` …). Tokens in `css/base.css` (`:root`).
|
||||
- **`js/core/*`** — `api.js` (Fetch + Token), `ui.js` (DOM-Helfer, Toast, Inline-Icon-Set, **`confirmModal`/`promptModal`** für Beginner-UX, `fmtBytes`/`fmtPct`), `nav.js` (beschrifteter View-Switch).
|
||||
- **`js/panels/*`** — ein Panel je Bereich (`overview`, `models`, `server`, `cookbook`, `jobs`=Aktivität, `guides`). Panel-Vertrag: `{ id, mount?(), onStatus?(s), onJobs?(jobs), onSystem?(sys) }`.
|
||||
- **`js/panels/*`** — ein Panel je Bereich (`overview`, `models`, `server`, `cookbook`, `connect`=Verbinden, `news`, `jobs`=Aktivität, `guides`). Panel-Vertrag: `{ id, mount?(), onStatus?(s), onJobs?(jobs), onSystem?(sys) }`.
|
||||
- **`js/main.js`** — bootet Panels, pflegt Topbar/Alert + **ehrlichen Security-Chip** (`status.secured`), WebSocket für Live-Metriken (`/api/system/stream`, 2 Hz), Polling (`/api/status` 3 s, `/api/jobs` 1.5 s).
|
||||
- **Leitprinzip UX:** verständlich/idiotensicher — Klartext-Microcopy, Fachbegriffe übersetzt (CPU→Prozessor, VRAM→Grafikspeicher), geführte Aktionen, heikle Aktionen mit `confirmModal` (Klartext-Konsequenz).
|
||||
|
||||
@@ -93,10 +94,11 @@ rsync; **Python-Code-Änderungen brauchen den Restart**.
|
||||
**v3 ist umgesetzt & live** (siehe `ROADMAP.md`): einheitliches Design-System, Beginner-UX
|
||||
(Klartext/Führung), Security-Härtung (Passwort-Leak dicht, ehrlicher Chip), **Self-Update-Button**.
|
||||
|
||||
**v4 ist geplant** („Der Lotse" — siehe `ROADMAP.md`): vom Modell-Manager zum geführten Berater.
|
||||
Reihenfolge: (1) optimale Kontextfenster auto-ermitteln (`hw_math.max_ctx_for`) → (2) Cookbook 2.0
|
||||
use-case-getrieben mit Stack-Empfehlungen → (3) „Verbinden"-Tab mit Connection-Test
|
||||
(`routers/integration.py`) + Bild-/Vision-Flow → (4) News-Board (`routers/news.py`, RSS via stdlib).
|
||||
Alles automatisch aus Modellen + Hardware; KISS/SoC + keine DB/neue Lib.
|
||||
**v4 ist umgesetzt & live** („Der Lotse" — siehe `ROADMAP.md`): (1) optimale Kontextfenster
|
||||
auto-ermittelt (`hw_math.max_ctx_for`, in Cookbook + Modelle-Konfig) → (2) Cookbook 2.0
|
||||
use-case-getrieben mit Stack-Empfehlungen (`recipes.py`, „Komplettes Setup installieren") →
|
||||
(3) „Verbinden"-Tab mit Connection-Test + Bild-/Vision-Flow → (4) News-Board (RSS via stdlib).
|
||||
Alles automatisch aus Modellen + Hardware; KISS/SoC blieb (keine DB, keine neue Lib).
|
||||
Wir sind im **Feinschliff- und Wartungsmodus**.
|
||||
|
||||
**Nordstern:** den Server nie wieder via SSH/Putty anfassen müssen — 100 % Automatisierung / Klicki-Bunti.
|
||||
|
||||
+16
-19
@@ -4,39 +4,36 @@
|
||||
|
||||
---
|
||||
|
||||
## v4 — „Der Lotse" (GEPLANT, Stand 2026-06-21)
|
||||
## v4 — „Der Lotse" (✅ UMGESETZT & live, Stand 2026-06-21)
|
||||
|
||||
Sprung vom Modell-*Manager* zum geführten *Berater*. Roter Faden: Das System kennt bereits Hardware
|
||||
(`system.py`), Modell-Meta (`models.py`) und Fit-Mathe (`hw_math.py`) — v4 nutzt das, um den Nutzer
|
||||
**aktiv zu beraten**. Alles **automatisch aus Modellen + Hardware** abgeleitet. KISS/SoC bleibt:
|
||||
je Bereich ein `routers/<x>.py` + `js/panels/<x>.js` + Nav-Eintrag, keine DB, keine schwere Lib.
|
||||
|
||||
**Reihenfolge: 1 → 2 → 3 → 4** (Fundament zuerst).
|
||||
Sprung vom Modell-*Manager* zum geführten *Berater*. Alles **automatisch aus Modellen + Hardware**.
|
||||
KISS/SoC blieb: je Bereich ein `routers/<x>.py` + `js/panels/<x>.js` + Nav-Eintrag, keine DB, keine
|
||||
schwere Lib. **Alle 4 Schritte sind live** — Checklisten unten erledigt.
|
||||
|
||||
### 1. Optimale Kontextfenster (Fundament)
|
||||
- [ ] `hw_math`: `max_ctx_for(params_b, quant, ram_gb)` — Umkehrfrage „welcher ctx passt noch?"
|
||||
- [x] `hw_math`: `max_ctx_for(params_b, quant, ram_gb)` — Umkehrfrage „welcher ctx passt noch?"
|
||||
(KV-Cache-Bedarf vs. freier Speicher).
|
||||
- [ ] Pro Modell empfohlener ctx + Klartext-Begründung; Ein-Klick „optimal setzen" (nutzt `update_model`).
|
||||
- [ ] Speist Cookbook (2.) + Modelle-Tab.
|
||||
- [x] Pro Modell empfohlener ctx + Klartext-Begründung; Ein-Klick „optimal setzen" (nutzt `update_model`).
|
||||
- [x] Speist Cookbook (2.) + Modelle-Tab.
|
||||
|
||||
### 2. Cookbook 2.0 — Use-Case-getrieben
|
||||
- [ ] Einstieg „Wofür?": Coding · Bilder verstehen · Allrounder/Chat · Lange Dokumente · Agenten/Tool-Use · Schnell & sparsam.
|
||||
- [ ] Pro Use-Case ein kuratiertes **Setup/Stack** (mehrere Modelle/Rollen) statt Einzelmodell, mit
|
||||
- [x] Einstieg „Wofür?": Coding · Bilder verstehen · Allrounder/Chat · Lange Dokumente · Agenten/Tool-Use · Schnell & sparsam.
|
||||
- [x] Pro Use-Case ein kuratiertes **Setup/Stack** (mehrere Modelle/Rollen) statt Einzelmodell, mit
|
||||
Hardware-**Ampel pro Setup** (via `hw_math`) + vorgeschlagenem ctx. Rezepte als Daten (`recipes.py`).
|
||||
- [ ] „Komplettes Setup installieren" — download + register aller Modelle in einem Rutsch.
|
||||
- [ ] Roh-Suche bleibt als „Profi-Modus".
|
||||
- [x] „Komplettes Setup installieren" — download + register aller Modelle in einem Rutsch.
|
||||
- [x] Roh-Suche bleibt als „Profi-Modus".
|
||||
|
||||
### 3. Verbinden / Orchestrierung (neuer Tab, erweitert Guides)
|
||||
- [ ] Geführter Assistent je Tool (OpenCode/Cline/Cursor/OpenWebUI) mit exakter Config.
|
||||
- [ ] **„Verbindung testen"** — `routers/integration.py` `/api/integration/test` ruft llama-swap
|
||||
- [x] Geführter Assistent je Tool (OpenCode/Cline/Cursor/OpenWebUI) mit exakter Config.
|
||||
- [x] **„Verbindung testen"** — `routers/integration.py` `/api/integration/test` ruft llama-swap
|
||||
`/v1/models` (LAN-URL) und meldet Erfolg + Modell-Liste zurück.
|
||||
- [ ] Bild-Eingaben für Fehleranalyse: erkennt Vision-Modell (sonst Hinweis „Vision installieren") +
|
||||
- [x] Bild-Eingaben für Fehleranalyse: erkennt Vision-Modell (sonst Hinweis „Vision installieren") +
|
||||
Copy-Snippet im OpenAI-Vision-Format. Auto-Swapping erklären.
|
||||
|
||||
### 4. News-Board (neuer Tab)
|
||||
- [ ] `routers/news.py`: kuratierte RSS/Atom-Feeds (HuggingFace-Blog, r/LocalLLaMA, llama.cpp-Releases,
|
||||
- [x] `routers/news.py`: kuratierte RSS/Atom-Feeds (HuggingFace-Blog, r/LocalLLaMA, llama.cpp-Releases,
|
||||
Ollama) via `httpx` + stdlib-`xml.etree` (kein neuer Dep), In-memory-Cache (~30 min TTL).
|
||||
- [ ] `panels/news.js`: Karten (Titel/Quelle/Datum/Link), sanitisiert, LAN-only; Hardware-relevante
|
||||
- [x] `panels/news.js`: Karten (Titel/Quelle/Datum/Link), sanitisiert, LAN-only; Hardware-relevante
|
||||
Releases (gfx1151/ROCm) hervorheben.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user