Add runtime catalogue with live status and llama.cpp release selection
This commit is contained in:
@@ -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 `<div class="kicker">EINSTELLUNGEN</div><h1>Laufzeiten</h1><p>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.</p><div class="detail-list">${rows.map(([name,category,description,route])=>`<details class="detail-row"><summary class="detail-summary"><strong>${name}</strong><span>${category}</span><span>Einrichtung & Versionen</span></summary><div class="detail-body"><p>${description}</p><a class="link" href="#${route}">Status und Einrichtung öffnen →</a></div></details>`).join('')}</div>`;
|
||||
const runtimeRows=[
|
||||
['llama.cpp','Chat & Sprachmodelle','runtime','/api/v1/runtime','Offizielle Releases prüfen, Änderungen lesen, CPU-/CUDA-Build erstellen und geprüften Standard auswählen.'],
|
||||
['ComfyUI + GGUF','Bilder & Video','image-runtime','/api/v1/image-runtime','Einmal installieren und für unterstützte Bild- und Videomodelle wiederverwenden. Gepinnte Versionen werden mit Deck gepflegt.'],
|
||||
['Qwen3-TTS','Sprachausgabe','tts-runtime','/api/v1/tts','CUDA-Laufzeit für unterstützte Qwen3-TTS-Modelle. Die Einrichtung lädt auch das vorgesehene Stimmenmodell.'],
|
||||
['Qwen3-ASR','Spracherkennung','stt-runtime','/api/v1/stt','Verwendet llama.cpp. Modell und Audio-Projektor werden in der Einrichtung zugeordnet.'],
|
||||
['audio.cpp','Musik & Audio','audio-cpp-runtime','/api/v1/audio-cpp-runtime','CUDA-Build einmal erstellen. YuE2 ist angebunden; andere Modellfamilien brauchen eine geprüfte Worker-Anbindung.'],
|
||||
['LTX Original','Video','ltx-original-runtime','/api/v1/ltx-original-runtime','Originales LTX-Backend für LTX DeskWEB. Modelle und Zusatzdateien bleiben in der Bibliothek.'],
|
||||
['Docker Engine','Weitere Dienste','docker-runtime','/api/v1/docker','Optionale Container-Umgebung. Erstinstallation über den Systemhelfer; vorhandenes Docker wird nicht automatisch aktualisiert.'],
|
||||
['Audio Separator','Audiotrennung',null,null,'Für BS-RoFormer, MelBand RoFormer und weitere Trennmodelle vorgesehen. Installer und Deck-Worker sind noch nicht angebunden; ein Download der Gewichte genügt hier noch nicht.']
|
||||
];
|
||||
const runtimeEscape=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
|
||||
function runtimeOverview(){return `<div class="kicker">EINSTELLUNGEN</div><h1>Laufzeiten</h1><p>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.</p><label>Laufzeit suchen<input id="runtime-search" type="search" placeholder="Name oder Bereich"></label><p id="runtime-catalog-message" role="status">Installationsstatus wird geprüft …</p><div class="detail-list">${runtimeRows.map(([name,category,route,path,description],i)=>`<details class="detail-row" data-runtime-row="${i}"><summary class="detail-summary"><strong>${name}</strong><span>${category}</span><span data-runtime-status>${path?'Wird geprüft …':'Noch nicht angebunden'}</span></summary><div class="detail-body"><p>${description}</p><p data-runtime-version></p>${route?`<a class="link" href="#${route}">${i===0?'Installation, Build & Updates öffnen': 'Einrichtung öffnen'} →</a>`:''}${i===0?'<p><button id="catalog-llama-updates">llama.cpp-Updates prüfen</button></p><div id="catalog-llama-releases"></div>':''}</div></details>`).join('')}</div>`;}
|
||||
function bindRuntimeOverview(){
|
||||
const root=document.querySelector('#studio[data-page="runtimes"]');if(!root)return;
|
||||
const esc=runtimeEscape,message=root.querySelector('#runtime-catalog-message');
|
||||
root.querySelector('#runtime-search').oninput=event=>{const query=event.target.value.trim().toLocaleLowerCase();root.querySelectorAll('[data-runtime-row]').forEach(row=>{const data=runtimeRows[Number(row.dataset.runtimeRow)];row.hidden=!data.slice(0,2).join(' ').toLocaleLowerCase().includes(query);});};
|
||||
async function read(path){const response=await fetch(path);const data=await response.json();if(!response.ok)throw Error(data.error||'Status nicht erreichbar');return data;}
|
||||
async function refresh(){const results=await Promise.allSettled(runtimeRows.map(async(row,i)=>{if(!row[3])return;const response=await read(row[3]),data=i===2?response.runtime:response;if(!root.isConnected)return;const el=root.querySelector(`[data-runtime-row="${i}"]`),active=i===0?data.builds?.find(b=>b.id===data.active):null;
|
||||
const installed=i===0?Boolean(active):data.installed;
|
||||
el.querySelector('[data-runtime-status]').textContent=data.job?.state==='running'?'Einrichtung läuft':installed===true?'Installiert':installed===false?'Einrichtung erforderlich':'Nicht ermittelbar';
|
||||
el.querySelector('[data-runtime-version]').textContent=[active?`${active.revision} · ${active.backend}`:data.version||data.comfy_revision||data.desktop_revision||data.revision||'',data.job?`${data.job.state} · ${data.job.phase||''}`:'',i===0?'Neue Versionen werden nur auf Knopfdruck geprüft.':''].filter(Boolean).join(' · ');
|
||||
}));if(!root.isConnected)return;results.forEach((result,i)=>{if(result.status==='rejected')root.querySelector(`[data-runtime-row="${i}"] [data-runtime-status]`).textContent='Status nicht erreichbar';});message.textContent=results.some(r=>r.status==='rejected')?'Einige Statusabfragen sind fehlgeschlagen. Einrichtung öffnen oder später erneut prüfen.':'Installationsstatus geprüft. Eine installierte Laufzeit benötigt weiterhin ein kompatibles Modell und vollständige Komponenten.';setTimeout(()=>{if(root.isConnected)refresh();},10000);}
|
||||
root.querySelector('#catalog-llama-updates').onclick=async event=>{const button=event.currentTarget;button.disabled=true;message.textContent='Offizielle llama.cpp-Releases werden geprüft …';try{const data=await read('/api/v1/runtime/releases');if(!root.isConnected)return;root.querySelector('#catalog-llama-releases').innerHTML=data.releases.map(release=>`<article><h3>${esc(release.tag)} · ${release.prerelease?'Vorabversion':'Reguläres Release'}</h3><p>${esc(release.published)}</p><details><summary>Änderungen anzeigen</summary><pre style="white-space:pre-wrap">${esc(release.notes)}</pre></details><button data-catalog-release="${esc(release.tag)}">Build vorbereiten</button></article>`).join('');root.querySelectorAll('[data-catalog-release]').forEach(b=>b.onclick=()=>{RuntimeUI.prepareBuild(b.dataset.catalogRelease);location.hash='runtime';});message.textContent='Releases geprüft. Build vorbereiten übernimmt die Version; der Build startet erst auf deinen Klick.';}catch(error){if(root.isConnected)message.textContent=error.message;}finally{button.disabled=false;}};
|
||||
refresh();
|
||||
}
|
||||
|
||||
function imageRuntime(){return `<div class="kicker">EINSTELLUNGEN / LAUFZEITEN</div><h1>Bildgenerierung</h1><section class="card"><h2>ComfyUI + ComfyUI-GGUF</h2><p>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.</p><p>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.</p><div id="image-runtime-install"><p>Installationsstatus wird geprüft …</p></div><a class="link" href="#image">Bildgenerierung → Testen öffnen</a></section>${ImageTestUI.html(true)}`;}
|
||||
|
||||
Reference in New Issue
Block a user