# Athena Deck · Router 0.7 Eigenständige neue Oberfläche, Python-Standardbibliothek und HTML/CSS/JavaScript. Keine Installation von Python-Paketen oder Frontend-Builds nötig. Python >= 3.10. ## Vorläufige Testinstallation auf Debian Zielprodukt: nativer systemd-Dienst auf Debian. Der derzeitige Docker-Installer dient ausschließlich der isolierten Testphase. Ein eigenständiger Testinstaller ohne WireGuard ist vorhanden: [Debian-Installation](INSTALL.md). Auf dem Zielserver: `sudo ./install.sh --check`, anschließend `sudo ./install.sh --install`. Vorhandenes Docker wird vorausgesetzt; produktive Dienste werden nicht verändert. ## Neu: Modellverwaltung und llama.cpp-Einstellungen Katalog, Datei-Downloads, Bibliothek, serverseitig gespeicherte Profile und llama.cpp-Buildverwaltung sind live. Der Download-Reiter erlaubt das Ausblenden abgeschlossener Einträge ohne Dateiverlust. Entdecken zeigt Größen und eine konservative Gewichts-Speicherprüfung; noch keine vollständige Laufzeitprognose. Bildprofile mit vollständigem Qwen-Image-2.1-GGUF-Rezept lassen sich unter „Testen“ ausführen. Textprofile sind am eigenen [OpenAI-kompatiblen Endpunkt](ENDPOINT.md) ausführbar. Qwen3-TTS CustomVoice ist über eine eigene CUDA-Laufzeit ausführbar; Qwen3-ASR bietet Spracherkennung; Musik, Voice und Video bleiben vorbereitet. Sprachmodelle besitzen außerdem einen internen Testchat mit Abbruch und Speicherdiagnose. Details: [Modellverwaltung](STUDIO.md). Der Bildtest und `/v1/images/edits` akzeptieren beim geprüften Qwen-Image-2.1-Rezept bis zu vier Referenzbilder. Die Zahl wird pro aktivem Modellrezept angezeigt; andere Bildmodelle erhalten keine ungeprüfte Edit-Fähigkeit. ## Zugang und API-Token Beim ersten Öffnen werden Oberflächenkennwort und separater API-Token eingerichtet. Beide sind unter **Zugang & API** änderbar. Der Debian-Installer richtet den Zugang vor dem Serverstart ein. Details und API-Rechte: [Zugangsverwaltung](ACCESS.md). ## WireGuard-Einstellungen Das separate [WireGuard-Modul](network/README.md) enthält Conf-Import und LAN-/Tunnel-Zugriff. In der aktuellen Debian-Entwicklungsinstanz ist es nicht angebunden; der Zugriff erfolgt über SSH-Tunnel. Der bestehende Gateway bleibt unverändert. ## Zielsystem und Entwicklung Athena Deck läuft vollständig auf einem Debian-Server mit RTX 5080 und RTX 3060. Oberfläche, API, Router und Hardware-Erfassung laufen dort. Der Arbeitsplatz benötigt nur Browser und SSH; er ist kein Anwendungsserver. Auch Builds und Integrationstests werden auf Athena ausgeführt. Chat- und Qwen-Image-Laufzeiten sind am eigenen Endpunkt angebunden. Die isolierte Entwicklungsinstallation ist in [DEVELOPMENT.md](DEVELOPMENT.md) beschrieben. Hardware wird direkt über `/proc`, hwmon und nvidia-smi gelesen; Deck benötigt dafür keinen SSH-Schlüssel. Der eigene Router ist in [ENDPOINT.md](ENDPOINT.md) dokumentiert. ## Interne API v1 Die GUI verwendet eine sitzungsgeschützte Verwaltungs-API. `GET /api/v1/status` und `GET /api/v1/hardware` sind auch mit dem separaten API-Token lesbar. Die Übersicht steuert den eigenen OpenAI-kompatiblen API-Listener; Demo-Dienst und Demo-Routen wurden entfernt. Port, Profilfreigaben, Inferenzrouten, Betriebsgrenzen und SSH-Tunnel: **[ENDPOINT.md](ENDPOINT.md)**. Hardware: `available` bezeichnet Erfolg der Hardware-Abfrage, einzelne Messwerte können trotzdem fehlen (`null`). Ein Ausfall der Erfassung liefert available=false, leere Daten und eine Fehlermeldung, keine alten Werte als vermeintliches Livebild. CPU-Auslastung: 250-ms-Differenz aus `/proc/stat` ohne doppelte Guest-Zählung. RAM: MemTotal minus MemAvailable aus `/proc/meminfo`, Einheit Bytes. CPU-Temperatur: k10temp/coretemp temp1_input, Grad Celsius. GPU: nvidia-smi CSV mit Index, UUID, Name, VRAM in MiB, GPU-Auslastung in Prozent, Temperatur in Grad Celsius. Keine Zuordnung nach vermuteter GPU-Reihenfolge. Die Anzeige rechnet Speicher in GiB um. Fehlende Werte heißen „Nicht verfügbar“. Abfrage bedarfsgesteuert mit fünf Sekunden Cache, GUI-Polling alle fünf Sekunden. Keine Historie und kein Hintergrund-Collector bei geschlossener Hardware-Seite. ## Struktur und Grenzen - `server.py`: Verwaltungs-API und lesende Hardware-Abfragen. - `endpoint.py`: separater authentifizierter Inferenz-Listener. - `inference.py`: native llama.cpp-Prozesse und gemeinsame GPU-Reservierung. - `image_test.py`: eigene ComfyUI-Aufträge, gemeinsam mit dem Router koordiniert. - `endpoint-ui.js`: Übersicht, Port und Profilfreigaben. Sprachmodelle und Qwen-Image-Profile sind ausführbar. Qwen3-TTS CustomVoice ist ebenfalls ausführbar; übrige Audio-/Video-Laufzeiten bleiben vorbereitet; weitere Docker-Dienste werden nur mit Deck-Labels angezeigt. Der native systemd-Installer ist noch nicht vollständig; aktuell gilt der isolierte Docker-Testinstaller. Keine Migration oder Steuerung des bisherigen Routers. ## Verifikation am 28.09.2026 `python3 -m unittest discover -s . -v`: drei Tests erfolgreich. Zusätzlich GUI-Start → Läuft/Erreichbar → Stopp → Gestoppt/Nicht erreichbar geprüft. Hardware im Browser mit Ryzen 5 5600, 46,9 GiB RAM, RTX 3060 und RTX 5080 geprüft; CPU-/GPU-Temperaturen, VRAM und Auslastung vorhanden. Hardware-Ausfall im Test simuliert, ohne Athena oder SSH zu unterbrechen. Produktive Router-/Modell-/Bild-/Audio-/Netzwerkdienste nicht verändert. Vorhandene ungesicherte Änderungen im übergeordneten Repository unangetastet. ### Bildlaufzeit installieren und Profile entfernen Unter **Einstellungen → Laufzeiten → Bildgenerierung** zeigt Deck die Herkunft und die festgelegten ComfyUI-/GGUF-Versionen. Fehlt die Umgebung, installiert **Bildlaufzeit installieren** sie ohne Rootrechte in `state/image-runtime`. Voraussetzungen: Linux, Python mit venv, Git, Internet und 25 GiB freier Speicher; ein kompatibler NVIDIA-Treiber muss vom Systeminstaller bereitgestellt sein. Die Installation ist abbrechbar, startet kein Modell und aktiviert die neue Umgebung erst nach Paketprüfung. Bereits mitgelieferte Umgebungen werden erkannt; ein Versionsupdate der Bildlaufzeit ist hier noch nicht vorgesehen. Profile lassen sich in allen Kategorien löschen. Modell- und Komponentendateien bleiben erhalten. Die API verhindert das Löschen des gerade ausgeführten Bildprofils und prüft die Profilrevision gegen zwischenzeitliche Änderungen. Neue sitzungsgeschützte API-Routen: `GET /api/v1/image-runtime`, `POST /api/v1/image-runtime/install` und `/cancel` mit `{}` sowie `POST /api/v1/profiles/delete` mit `{ "id": "…", "revision": 1 }`. POST benötigt wie die übrigen Verwaltungsaktionen `X-Athena-Deck: 1`. Die Hardware-Seite zeigt GPU-Rechenlast und VRAM-Belegung mit separaten Balken. Es sind Host-Gesamtwerte einschließlich anderer Dienste. Der Bild-Textencoder arbeitet auf der RTX 3060, Bildmodell und VAE auf der RTX 5080. CPU/System-RAM bleiben für Laden und Offload beteiligt. Beide GPUs müssen frei sein; es gibt keinen stillen CPU-Fallback. GPU-Last kann während Vorbereitung und Laden null sein. Nach Abschluss beendet Deck den eigenen Worker und gibt dessen VRAM frei. Unter **Entdecken** steht zusätzlich **Neu hinzugefügt** zur Verfügung. Die Abfrage sortiert bereits auf Hugging Face nach dem Erstellungsdatum des Repositories absteigend; sie sortiert nicht nur die beliebtesten 20 Treffer um. Name A–Z sortiert weiterhin die angezeigte Treffermenge. Prüfung vorhandener Studios: [Native Anwendungen und Docker](docs/NATIVE_APPLICATION_AUDIT.md). ### Optionale Docker-Anwendungen Einstellungen → Laufzeiten → Docker zeigt Verbindung, Version und gegebenenfalls Docker-Erstinstallation. Weitere Dienste zeigt ausschließlich Container mit `io.athena-deck.managed=true` **und** `io.athena-deck.role=application`. Bestehende Container werden nicht automatisch übernommen. Details zu Systemhelfer, Installer und Grenzen: [Docker-Dienste](docs/DOCKER_SERVICES.md). Unter Entdecken blendet **Nur Basismodelle** anhand von `base_model`, `base_model_relation` und Hub-Tags gekennzeichnete Ableitungen aus (Finetunes, Adapter/LoRAs, Merges und separate Quantisierungen). Es werden bis zu 100 nach der gewählten Sortierung gelieferte Kandidaten geprüft und maximal 20 angezeigt. Die Einstellung bleibt im Browser über Kategorien hinweg erhalten. Fehlende Herausgeber-Metadaten können dazu führen, dass Ableitungen sichtbar bleiben; es handelt sich nicht um eine verifizierte Liste offizieller Herausgeber. API-Parameter: `GET /api/v1/catalog/search?...&base_only=true`. Die Suche akzeptiert auch `owner/repository` und direkte Hugging-Face-Repository- URLs. Eine solche Direktauswahl umgeht Kategorie- und Basismodellfilter mit einem sichtbaren Hinweis. Bei GGUF-Dateinamen wird die Endung für die Repositorysuche entfernt. Findet die Chat-Suche nichts, werden zusätzlich als `conversational` gekennzeichnete GGUF-Repositories ohne `text-generation`-Tag geprüft. Das ist keine globale Suche nach beliebigen Dateinamen im Hub. ### Hugging-Face-Zugang Unter **Einstellungen → Zugang → Hugging Face** einen eigenen `hf_…`-Token mit Leserechten speichern, ersetzen oder entfernen. Bei freigabepflichtigen Modellen vorher auf der Modellkarte mit demselben HF-Konto Zugang beantragen. Deck akzeptiert keine Lizenzbedingungen automatisch. Siehe [HF-Zugangsrechte](https://huggingface.co/docs/hub/models-gated) und [Token](https://huggingface.co/docs/hub/security-tokens). Der Token wird ausschließlich serverseitig unter `models/huggingface.json` im Deck-Zustandsverzeichnis gespeichert (0600, unverschlüsselt); Zustandsbackups entsprechend schützen. Er gilt für Katalogabfragen, Modell- und Komponentendownloads aller Kategorien. HTTP-Weiterleitungen auf andere Hosts erhalten keinen Authorization-Header. Entfernen verhindert neue authentifizierte Anfragen, beendet aber keinen bereits autorisierten Download. Download abbrechen bei Bedarf separat nutzen. Interne API (nur angemeldete Administratorsitzung): `GET /api/v1/huggingface` liefert ausschließlich `{configured: boolean}`; `POST` mit `{token: "hf_…"}` speichert/ersetzt, mit `{token: null}` entfernt. POST benötigt `X-Athena-Deck: 1`. Kein API-Endpunkt liefert den gespeicherten Token zurück. HTTP 401/403 von HF ergeben Hinweise auf Token, Leserechte und Modellfreigabe; die tatsächliche Freigabe wird beim Download geprüft. ### Video: externe Dienste statt Deck-Profile Deck verwaltet für Video ausschließlich den aktiven Dienst, Start/Stopp und die GPU-Freigabe. Unter **Video → Aktiver Videodienst** einen administrativ eingerichteten Dienst wählen; unter **Übersicht → Video** starten. **LLM** beendet den Videodienst. Modellauswahl, Komponenten, Auflösung, Dauer, Prompts und Generierung erfolgen ausschließlich über dessen Original-API und Oberfläche. Heute ist LTX Desktop angebunden; weitere containerisierte Videodienste lassen sich mit derselben Dienststeuerung registrieren. Keine Übersetzung zwischen APIs. Der Video-Bereich ist wieder Teil der KI-Werkzeuge. Generierungsparameter bleiben ausschließlich in der Video-Anwendung. Das frühere Testformular, die eigene Video-Laufzeitinstallation und `/v1/videos`-Generierung sind entfernt. Alte Profil- und Modelldaten bleiben auf Platte erhalten, werden jedoch nicht mehr als aktive Videoprofile angeboten. `/v1/videos…` liefert HTTP 410 mit Verweis auf die Original-API. Der ursprüngliche Deck-Python-Video-Worker wird nicht mehr installiert oder gestartet. Die Steuerung erfolgt über den beschränkten Docker-Systemhelfer, ohne Docker-Socket in Deck. Root registriert Container-IDs, API-Adresse und Healthcheck in `/var/lib/athena-deck-docker/video-services.json`. Nur registrierte Dienste können gestartet/gestoppt werden; beliebige Docker-Aktionen sind ausgeschlossen. Siehe [Videodienste](docs/DOCKER_SERVICES.md#videodienste). Vor Videostart beendet Deck seine eigenen GPU-Aufträge, wartet auf Freigabe und verweigert den Start bei fremden GPU-Prozessen. Der alte Router bleibt unberührt. Im Videomodus wird der gemeinsame API-Port vollständig auf die Original-API des aktiven Videodienstes umgeschaltet. Chat/Bild/TTS/STT-Clients können diesen Port erst nach dem Rückwechsel auf LLM wieder verwenden. Beim Deck-Neustart wird ein laufender registrierter Videodienst erkannt und die GPU-Sperre wiederhergestellt; kein automatischer Dienststart und kein Abbruch externer Generierung beim bloßen Deck-Neustart. LTX auf Athena: originale API am Host `http://127.0.0.1:41955`, bestehender SSH-Zugang über LTX Athena. Alternativer Tunnel vom Mac: ```sh ssh -N -i /Users/mike_i386/.ssh/athena_key -o BatchMode=yes -o ExitOnForwardFailure=yes -L 41956:127.0.0.1:41955 root@192.168.1.212 ``` Dann API unter `http://127.0.0.1:41956`; Authentifizierung mit dem bestehenden LTX-Token, nicht dem Deck-Token. Keine Zugangsdaten in URLs. Der Port stellt eine API bereit, keine Browser-Studio-Oberfläche. ### Gemeinsamer API-Port: Protokollwechsel Im LLM-Modus bleibt der Deck-Endpunkt OpenAI-kompatibel. Im Videomodus werden HTTP-Pfad, Query, Methode, Inhalt, Antwortstatus und Antwortdaten unverändert an die registrierte Video-API weitergereicht. Es gibt keine Modell-/Parameterübersetzung. Beispiel auf Port 8120: `POST /api/generate`, `GET /api/generation/progress`, `POST /api/generate/cancel`. Kein `/v1`-Präfix für LTX. Während des Moduswechsels HTTP 503. Am gemeinsamen Port gilt weiterhin der Deck-Bearer-Token. Der root-eigene Helfer setzt intern den separaten LTX-Token; er gibt ihn niemals an Deck oder den Browser zurück. Der interne LTX-Port 41955 bleibt unverändert, sodass der bisherige LTX-Athena-Zugang weiter funktioniert. HTTP GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS und Range-Header werden transportiert. Request-Bodies benötigen Content-Length (maximal 256 MiB); kein WebSocket-Transport. Die geprüfte LTX-Desktop-API verwendet für Fortschritt HTTP-Polling. Ein separates LTX-Webfrontend gehört als Docker-Anwendung unter Weitere Dienste, nicht die Video-Laufzeit-Auswahl. Dieses Webfrontend ist noch nicht implementiert. Der vorhandene LTX-Athena-Client benötigt neben API-Zugriff weiterhin seine Dateiübertragung über SSH/SCP; ein Browser-Port muss Electron-Dateifunktionen separat ersetzen. Weiterleitung allein stellt keine neuen Datei-Upload-/Downloadrouten im LTX-Backend bereit.