${e(b.revision)} · ${e(b.backend)} ${s.active===b.id?'· STANDARD':''}
Commit ${e(b.commit)} · GPU-Ziele ${e(b.architectures.join(', ')||'CPU')} · Auto-Fit ${b.fit_supported?'unterstützt':'nicht unterstützt'}
From c3db35dada236c439b99c753babee5df08963d44 Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:34:17 +0200 Subject: [PATCH] Add runtime catalogue with live status and llama.cpp release selection --- README.md | 7 ++++++- runtime-ui.js | 6 ++++-- studio.js | 29 +++++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bc2c77b..6eebb7d 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,12 @@ Sprachausgabe, Spracherkennung, Stimmwerkzeuge und Videogenerierung. Zusätzliche Oberflächen stehen unter **Anwendungen → Weitere Dienste**. Unter **Einstellungen → Laufzeiten** führt eine aufklappbare Liste zu den -Installations-, Versions- und Statusseiten. Die einzelnen Laufzeiten stehen +Installations-, Versions- und Statusseiten. Der Laufzeiten-Katalog zeigt den +aktuellen Installationsstatus, lässt sich nach Name und Bereich filtern und +bietet eine direkte llama.cpp-Releaseprüfung mit Änderungsnotizen. „Build +vorbereiten“ übernimmt das Release in das Buildformular; erst dessen +Bestätigung startet den Build. Audio Separator ist als noch nicht angebundene +Laufzeit sichtbar und kann derzeit nicht über Deck installiert werden. Die einzelnen Laufzeiten stehen nicht mehr separat in der Seitenleiste. Bibliothek und Profile verwenden kompakte, aufklappbare Zeilen: Details, API-Freigabe, Komponenten und Aktionen stehen in der geöffneten Zeile. Downloads behalten Fortschritt, Geschwindigkeit, diff --git a/runtime-ui.js b/runtime-ui.js index a0939c2..988d2a0 100644 --- a/runtime-ui.js +++ b/runtime-ui.js @@ -1,8 +1,10 @@ const RuntimeUI=(()=>{ + let preparedRevision=''; + function prepareBuild(revision){preparedRevision=revision;} const e=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); async function api(path='',data){const r=await fetch('/api/v1/runtime'+path,data?{method:'POST',headers:{'Content-Type':'application/json','X-Athena-Deck':'1'},body:JSON.stringify(data)}:{});const v=await r.json();if(!r.ok)throw Error(v.error||'Anfrage fehlgeschlagen');return v;} function html(){return `
Offizielle Versionen getrennt bauen und prüfen. Ein Build lädt kein Modell und ändert keine produktiven Laufzeiten.
Das aktuelle reguläre Release steht zuerst. Nightlies enthalten neuere Änderungen, sind aber keine pauschale Empfehlung. Modell-, MTP- und Projektor-Kompatibilität vor einem Standardwechsel testen.
Als Standard auswählen startet keinen Prozess. Bestehende Router bleiben unverändert.
Kein pauschales Reservefeld: Die Laufzeit soll Modell, gewünschten Kontext, Slots und den aktuell freien Speicher gemeinsam berücksichtigen. Unterstützte Builds verwenden llama.cpp --fit on; der Kontext wird ausdrücklich vorgegeben. Keine absichtlichen OOM-Tests auf den produktiv genutzten GPUs.
Ein Build allein kann keine Modell-Layerzahl bestimmen. Die Berechnung verwendet llama-fit-params ohne Gewichtsallokation. Sie ist eine Prognose für das Textmodell und kein Lasttest. Vision-Projektor und MTP sind noch nicht eingerechnet. Ein Modellstart erfolgt nicht. Die Prognose verwendet aktuell freien VRAM; falls das gewählte Modell bereits läuft, belegt es diesen Speicher weiterhin. Vor einer realistischen Neuplanung das Deck-Modell bei Bedarf bewusst entladen.
Commit ${e(b.commit)} · GPU-Ziele ${e(b.architectures.join(', ')||'CPU')} · Auto-Fit ${b.fit_supported?'unterstützt':'nicht unterstützt'}
Noch kein geprüfter Build vorhanden.
';root.querySelectorAll('[data-build]').forEach(b=>b.onclick=()=>action('/activate',{build_id:b.dataset.build}));if(s.job){const log=await api('/log');if(root.isConnected)root.querySelector('#rt-log').textContent=log.text;}if(running)setTimeout(()=>{if(root.isConnected)status();},3000);}catch(err){msg(err.message);}} async function action(path,data){try{await api(path,data);msg('Aktion angenommen.');await status();}catch(err){msg(err.message);}} @@ -15,5 +17,5 @@ const RuntimeUI=(()=>{ root.querySelector('#rt-fit').onsubmit=async event=>{event.preventDefault();const b=event.target.querySelector('button');b.disabled=true;msg('Modellmetadaten und Speicherbedarf werden berechnet …');const d=Object.fromEntries(new FormData(event.target));d.context=Number(d.context);d.slots=Number(d.slots);try{const v=await api('/fit',d);if(root.isConnected)root.querySelector('#rt-fit-result').textContent=(v.success?'Prognose erfolgreich. Kein Modell geladen.':'Aktuell keine passende Einpassung ermittelt.')+(v.within_ram_limit===false?'\nNICHT STARTBAR in der Testinstanz: berechneter Host-RAM überschreitet deren Limit von '+v.ram_limit_mib+' MiB.':'')+'\nGPU-Layer (Prognose): '+(v.fitted?.gpu_layers??'nicht ermittelt')+'\nGPU-Verteilung: '+(v.fitted?.tensor_split??'ein Gerät / nicht ermittelt')+'\nAusgelassene belegte GPUs: '+v.excluded_gpus.join(', ')+'\nAutomatische Reserve (MiB): '+v.reserve_mib.join(', ')+'\n'+v.memory.map(m=>`${m.device}: Modell ${m.model_mib} MiB · Kontext ${m.context_mib} MiB · Rechenspeicher ${m.compute_mib} MiB`).join('\n')+'\n'+v.arguments+'\n'+v.details;msg('Berechnung abgeschlossen. Freier Speicher kann sich durch andere Dienste ändern.');}catch(err){msg(err.message);}finally{b.disabled=false;}}; prerequisites();status(); } - return {html,bind}; + return {html,bind,prepareBuild}; })(); diff --git a/studio.js b/studio.js index 0f26ef8..2828072 100644 --- a/studio.js +++ b/studio.js @@ -15,7 +15,7 @@ const Studio=(()=>{ if(page==='tts-runtime'){TTSUI.bind(true);return;} if(page==='runtime'){RuntimeUI.bind();return;} if(page==='image-runtime'){ImageTestUI.bind(true);ImageTestUI.bindInstaller();return;} - if(page==='runtimes')return; + if(page==='runtimes'){bindRuntimeOverview();return;} else if(section==='setup'){if(page==='stt')STTUI.bind(true);else TTSUI.bind(true);} else if(['test','running'].includes(section)&&page==='music')MusicUI.bind(); else if(['test','running'].includes(section)&&page==='stt')STTUI.bind(); @@ -28,9 +28,30 @@ const Studio=(()=>{ else if(section!=='running')CatalogUI.bind(page,section==='library',section==='downloads'); document.querySelectorAll('[data-section]').forEach(b=>b.onclick=()=>{section=b.dataset.section;render(page,true);}); } - function runtimeOverview(){ - const rows=[['llama.cpp','Chat & Sprachmodelle','CPU / CUDA · Versionen herunterladen, bauen und verwalten.','runtime'],['Bildlaufzeit','Bildgenerierung','Vorhandene Laufzeiten für kompatible Modelle wiederverwenden.','image-runtime'],['Sprachausgabe','TTS','Qwen3-TTS mit CUDA und eingebauten Stimmen.','tts-runtime'],['Spracherkennung','STT','Qwen3-ASR mit llama.cpp und Audio-Projektor.','stt-runtime'],['audio.cpp','Musik & Audio','Gemeinsame Audio-Laufzeit und modellabhängige Worker.','audio-cpp-runtime'],['LTX Original','Video','Originales LTX-Backend mit nativer API für LTX DeskWEB.','ltx-original-runtime'],['Docker','Weitere Dienste','Optionale Container-Umgebung für zusätzliche Oberflächen.','docker-runtime']]; - return `Einmal einrichten, für passende Modelle wiederverwenden. Öffne eine Laufzeit, um ihren Installationsstatus, Versionen und Optionen zu sehen. Zusatzdateien verwaltest du beim Profil unter Einrichtung & Komponenten.
${description}
Status und Einrichtung öffnen →Einmal einrichten, für passende Modelle wiederverwenden. Dieser Katalog zeigt die in Deck unterstützten und vorgesehenen Laufzeiten. Zusatzdateien findest du beim Modell unter Einrichtung & Komponenten.
Installationsstatus wird geprüft …
${description}
${route?`${i===0?'Installation, Build & Updates öffnen': 'Einrichtung öffnen'} →`:''}${i===0?'':''}${esc(release.published)}
${esc(release.notes)}Eigene Bildlaufzeit für Qwen-Image-2.1 GGUF und das unterstützte FLUX.2-Klein-9B-Modell. Die Umgebung kann über den Deck-Installer mitgeliefert oder hier separat installiert werden. Modelle laden erst bei einem Testauftrag.
Textencoder läuft auf der RTX 3060, Diffusionsmodell und VAE auf der RTX 5080. Bei großen FLUX-Gewichten wird zusätzlich System-RAM genutzt. Beide GPUs müssen frei sein. Pro Test wird ein eigener Prozess gestartet und anschließend beendet.
Installationsstatus wird geprüft …