From e1a54e34857d42416d7fe203d038a4e051eb302f Mon Sep 17 00:00:00 2001
From: Mikei386 <44135113+Mikei386@users.noreply.github.com>
Date: Mon, 28 Sep 2026 15:24:55 +0200
Subject: [PATCH] Add visual model catalog, editable profile drafts and
llama.cpp build settings
---
README.md | 14 ++++++---
STUDIO.md | 64 +++++++++++++++++++++++++++++++++++++++
app.js | 1 +
index.html | 2 +-
network/install_remote.py | 2 +-
server.py | 4 +--
studio.js | 58 +++++++++++++++++++++++++++++++++++
style.css | 4 +++
8 files changed, 141 insertions(+), 8 deletions(-)
create mode 100644 STUDIO.md
create mode 100644 studio.js
diff --git a/README.md b/README.md
index bae05f6..532bc7e 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,15 @@
-# Athena Deck · Prototyp 0.3
+# Athena Deck · Prototyp 0.4
Eigenständige neue Oberfläche, Python-Standardbibliothek und HTML/CSS/JavaScript.
Keine Installation von Python-Paketen oder Frontend-Builds nötig. Python >= 3.10.
-## Neu: Zugang und API-Token
+## Neu: Modellverwaltung und llama.cpp-Einstellungen
+
+Katalog, Bibliothek, Profilentwürfe und eine Laufzeit-/Update-Ansicht sind als
+bedienbarer GUI-Prototyp vorhanden. Entwürfe bleiben im Browser; Modellstarts,
+Downloads und Builds sind deaktiviert. Details: [GUI-Prototyp](STUDIO.md).
+
+## Zugang und API-Token
Beim ersten Öffnen werden Oberflächenkennwort und separater API-Token eingerichtet.
Beide sind unter **Zugang & API** änderbar. Die lokale Vorschau ist jetzt ebenfalls
@@ -83,8 +89,8 @@ Keine Historie und kein Hintergrund-Collector bei geschlossener Hardware-Seite.
- `index.html`, `app.js`, `style.css`: neue responsive Oberfläche.
- `test_server.py`: Prozess-Lebenszyklus, Kontrollgrenzen, Hardware-Ausfall.
-Sprachmodelle/Chat, Bildgenerierung, Audio und Weitere Dienste sind ausdrücklich
-Platzhalter. Keine Downloads, Installation, Presets, Chats oder Modellwechsel.
+Sprachmodelle/Chat, Bildgenerierung, Audio und Video besitzen jetzt eine
+GUI-Vorschau; Weitere Dienste bleibt Platzhalter. Keine Downloads, Installation, Presets, Chats oder Modellwechsel.
Spätere Modellprofile und native llama.cpp-Worker sollten eigene Service-Adapter
mit derselben Status-/Start-/Stopp-Trennung erhalten. Noch kein Worker-Registry,
Scheduler oder produktionsreifer Worker-Supervisor. Die optionale Server-Instanz
diff --git a/STUDIO.md b/STUDIO.md
new file mode 100644
index 0000000..0c87ed6
--- /dev/null
+++ b/STUDIO.md
@@ -0,0 +1,64 @@
+# Modellverwaltung und llama.cpp · GUI-Prototyp 0.4
+
+Diese Erweiterung ist ausdrücklich rein optisch und lokal bedienbar. Keine
+Modelldateien, Laufzeiten, Downloads, Builds oder produktiven Dienste werden verändert.
+
+## Ansichten
+
+- Sprachmodelle/Chat, Bild, Audio und Video: Entdecken, Bibliothek, Profile, Laufend.
+- Katalog: Suche/Quellenfilter über gekennzeichnete Beispiele, Detailansicht mit
+ getrennter Prüfung von Unterstützung, grundsätzlicher Eignung und aktueller
+ Startmöglichkeit. Keine Online-Suche und keine berechneten Speicherwerte.
+- Bibliothek: Beispiel einer einmaligen Modelldatei mit mehreren Profilen;
+ ausdrücklich keine bestätigte Installation.
+- LLM-Profile: drei vorbelegte Beispiele, Anlegen, Bearbeiten, Duplizieren und
+ Entfernen lokaler Entwürfe. Name, Modellvariante, Kontextbudget, Slots,
+ GPU-Zuordnung, KV-Cache, gemeinsamer Pool, GPU-Gewichtung, Batch/Microbatch,
+ CPU-Threads, Flash Attention und vorgesehener Vision-Projektor.
+- Einzigartige API-Profilnamen, gültige Zahlenbereiche, Microbatch <= Batch und
+ nicht ausschließlich nullwertige GPU-Gewichtung werden im Formular geprüft.
+- API-Vorschau zeigt die vorgesehenen Profilnamen. `/v1/models` wird dadurch
+ **nicht** als funktionsfähiger Endpunkt implementiert.
+- Laufend: leerer Zustand sowie geplanter Ablauf des Profilwechsels, ohne
+ simulierte laufende Modelle oder Warteschlangen.
+- Bild/Audio/Video-Profile: vorbereitete, deaktivierte aufgabenspezifische Felder.
+
+## Einstellungen → llama.cpp & Updates
+
+Build-Entwurf mit Backend (CUDA/CPU/Vulkan), gewünschtem Release oder Commit,
+automatischer bzw. expliziter GPU-Architekturauswahl, Toolkit-Prüfung, parallelen
+Build-Jobs und vorgesehener VRAM-Reserve. Für Athena sind RTX 5080 und RTX 3060 als
+bekanntes Zielsystem benannt; eine Live-Build-Kompatibilitätsprüfung erfolgt nicht.
+
+Die Update-Ansicht lässt sich aufklappen. Sie zeigt Platz für aktuellen Build,
+verfügbares Release, echte Release-Notes mit Quelle und Datum sowie Neubau und
+spätere Wiederherstellung. Alle zustandsändernden Laufzeit-Aktionen und die
+Live-Update-Suche sind deaktiviert. Keine erfundenen Versionsnummern oder Fixes.
+Ein Link führt zu den offiziellen llama.cpp-Releases.
+
+## Speicherung und spätere Anbindung
+
+Entwürfe liegen ausschließlich im localStorage dieses Browsers und Origins unter
+`athena-deck-studio-v1`. Sie bleiben nach Neuladen erhalten, enthalten keine
+Zugangsdaten und werden nicht zum Server übertragen. Andere Browser oder die
+Server-Instanz teilen diesen Stand nicht. Bei gesperrtem Browser-Speicher weist die
+Oberfläche darauf hin, dass der Entwurf nur im aktuellen Speicher bleibt.
+
+Die neuen Ansichten in `studio.js` rufen keine API auf. Vorhandene Anmeldung,
+Hardwareanzeige, Demo-Service und Netzwerkverwaltung behalten ihre bisherigen
+Funktionen. `server.py` liefert zusätzlich nur die neue JavaScript-Datei aus.
+
+Vor echter Nutzung erforderlich: Modellkatalog-Adapter, Metadaten-/GGUF-Auswertung,
+Downloadverwaltung, persistente Profil-API, GPU-/KV-Planung, Build-Manager und
+Prozess-Supervisor mit Warteschlange. Gespeicherte Entwürfe dürfen nicht ungeprüft
+als Shell-Befehle interpretiert werden. Die genaue Kontext-/Slot-Semantik muss an
+die eingesetzte llama.cpp-Version gekoppelt und überprüft werden.
+
+## Prüfung
+
+JavaScript-Syntax geprüft. In einer isolierten statischen Browservorschau:
+Profil bearbeitet (Kontext geändert), gespeichert und nach Reload wiedergefunden;
+Build-Einstellungen und Update-Ansicht geöffnet, deaktivierte Aktionsknöpfe sowie
+Layout kontrolliert. Die Testvorschau verwendet einen eigenen Origin, sodass keine
+Entwürfe der eigentlichen Anwendung überschrieben wurden. Keine SSH-/Modell- oder
+Build-Aktion für diese GUI-Erweiterung ausgeführt.
diff --git a/app.js b/app.js
index 0a3248c..4598c60 100644
--- a/app.js
+++ b/app.js
@@ -8,6 +8,7 @@ const metric=(title,value)=>`
${title}${value}v==null?'':``;
const placeholders={chat:['Sprachmodelle / Chat','Modellprofile, Laufzeit und Chat','Hier werden später Modellprofile und native llama.cpp-Prozesse verwaltet.'],image:['Bildgenerierung','Worker und Aufträge','Hier entsteht später die Übersicht für Bild-Worker und deren Zustand.'],audio:['Audio','Spracheingabe und Sprachausgabe','Hier werden später getrennte Worker für Erkennung und Ausgabe eingebunden.'],services:['Weitere Dienste','Erweiterbare Dienste','Hier finden später zusätzliche Worker und ihre Schnittstellen Platz.']};
async function refresh(){if(refreshing)return;refreshing=true;const page=location.hash.slice(1)||'home';document.querySelectorAll('nav a').forEach(a=>a.classList.toggle('active',a.hash==='#'+page));try{error.textContent='';let html;
+if(['chat','image','audio','video','runtime'].includes(page)){Studio.render(page);return;}
if(page==='access'){await accessPage();return;}
if(page==='network'){await networkPage();return;}
if(page==='home'){const s=await api('status'),d=s.demo;html=heading('DEIN KONTROLLZENTRUM','Alles beginnt mit einer klaren Basis.','Eine kleine Oberfläche für Status, Hardware und den ersten steuerbaren Dienst.')+`
Anwendung
Bereit
Athena Deck läuft auf ${esc(s.location)}.
Laufzeit ${fmt(s.uptime_seconds,' s')} · API v1
Betriebsmodus
Isoliert
Ein eigenständiger Prototyp mit lesendem Hardware-Zugriff auf Athena.
Keine Modell- oder Router-Steuerung angebunden
Demo-Dienst
LOKAL / CPU
Ein minimaler HTTP-Prozess zum Testen von Start, Stopp und Erreichbarkeit.
`;
+ bind(page);
+ }
+ function workspace(page){
+ return header(labels[page], 'Modelle entdecken, als Bibliothek organisieren und über Profile bereitstellen.')+`
Später wählt der Client den Profilnamen im Feld model. Deck verwaltet den passenden llama-server-Prozess.
`;
+ }
+ function running(page){return `○
Keine von Deck verwaltete Modelllaufzeit
${page==='chat'?'llama.cpp ist in dieser Vorschau nicht angebunden. Gespeicherte Profile starten keinen Prozess.':'Für diesen Bereich ist noch kein Worker angebunden.'}
Anfrage zuordnenProfil anhand des API-Namens auswählen.
Arbeit abschließenLaufende Anfragen beenden lassen; neue einreihen.
Prozess wechselnllama-server beenden und mit dem Zielprofil starten.
Bereitschaft prüfenErst danach wartende Anfragen weiterleiten.
Mehrere angebotene Profile sind nicht automatisch mehrere geladene Modelle. Produktive Athena-Prozesse werden in dieser Vorschau nicht gesteuert.
`;}
+ function detail(id){const m=models.find(m=>m.id===id);document.querySelector('#model-detail').innerHTML=`
${e(m.name)} · Eignungsprüfung
NOCH NICHT BERECHNET
Unterstützt?
Format und Laufzeit-Kompatibilität noch nicht geprüft.
Passt grundsätzlich?
Gewichte, Zusatzkomponenten und Arbeitsspeicherbedarf noch nicht ermittelt.
Kann jetzt starten?
Keine Ressourcenreservierung oder Prozesssteuerung angebunden.
${m.kind==='chat'?'Kontextlänge, KV-Cache, Slots und GPU-Aufteilung beeinflussen den Speicherbedarf. Die beiden GPUs werden nicht pauschal als ein gemeinsamer VRAM-Pool gerechnet.':'Die spätere Einschätzung berücksichtigt die zur Aufgabe passenden Parameter und den jeweiligen Worker.'} Es gibt in dieser Vorschau keine erfundenen Speicherwerte.
`;document.querySelector('#model-detail').scrollIntoView({behavior:'smooth',block:'nearest'});}
+ function field(label,name,value,type='number',attrs=''){return ``;}
+ function editor(id,model){editing=id||null;const p=id?state.profiles.find(p=>p.id===id):{...seed.profiles[0],name:'qwen-neues-profil',model:model||'qwen-iq4'};if(!p)return;
+ document.querySelector('#profile-editor').innerHTML=`
${id?'Profil bearbeiten':'Neues Profil'}
NUR ENTWURF
`;
+ document.querySelector('#profile-form').onsubmit=event=>{event.preventDefault();const data=new FormData(event.target),value=Object.fromEntries(data);for(const n of ['context','slots','batch','ubatch','threads'])value[n]=Number(value[n]);for(const n of ['unified','flash','vision'])value[n]=data.has(n);const out=document.querySelector('#profile-error');if(state.profiles.some(q=>q.id!==editing&&q.name===value.name)){out.textContent='Dieser API-Profilname ist bereits vergeben.';return;}if(value.ubatch>value.batch){out.textContent='Microbatch darf nicht größer als Batch sein.';return;}if(value.gpu==='both'&&!value.split.split(',').some(v=>Number(v)>0)){out.textContent='Mindestens eine GPU-Gewichtung muss größer als null sein.';return;}value.id=editing||crypto.randomUUID();const idx=state.profiles.findIndex(q=>q.id===editing);if(idx<0)state.profiles.push(value);else state.profiles[idx]=value;const stored=save();render(category,true);notice(stored?'Profilentwurf in diesem Browser gespeichert. Kein Modell gestartet.':'Entwurf nur im Speicher gehalten; Browser-Speicher nicht verfügbar.');};
+ document.querySelector('#cancel-edit').onclick=()=>document.querySelector('#profile-editor').replaceChildren();
+ if(id)document.querySelector('#delete-profile').onclick=()=>{state.profiles=state.profiles.filter(q=>q.id!==id);save();render(category,true);notice('Lokalen Profilentwurf entfernt. Modelldateien wurden nicht verändert.');};
+ document.querySelector('#profile-editor').scrollIntoView({behavior:'smooth',block:'start'});
+ }
+ function runtime(){const r=state.runtime;return header('llama.cpp-Laufzeit','Installation, GPU-Unterstützung und Versionen an einem Ort vorbereiten.')+`
INSTALLIERTE VERSION
Nicht angebunden
Kein Build erkannt oder ausgeführt.
UPDATE-STATUS
Noch nicht geprüft
Keine Live-Abfrage von Releases.
ZIELSYSTEM
Athena
Geplant: RTX 5080 + RTX 3060
Installation & Build
LOKALER ENTWURF
Updates & Änderungen
Vorgesehen: installierte Version mit verfügbaren Releases vergleichen, Fixes ansehen und einen neuen Build getrennt vorbereiten.
AKTUELL
Nicht ermittelt
→
VERFÜGBAR
Nicht abgefragt
Release-Notes & Fixes
Hier erscheinen später die tatsächlichen Änderungen mit Quelle und Veröffentlichungsdatum. Keine Beispieldaten werden als neue Version oder behobener Fehler ausgegeben.