# KDE Strata Dashboard Plasmoid Plasmoide per **KDE Plasma 6** che mostra lo stato del servizio di inferenza **Strata** (Qwen3.8-Flash-Next IQ2_XS servito su NVIDIA L40S) leggendo il control plane HTTP del servizio. Non parla mai direttamente con il motore: lo `8082` di Strata ascolta solo su `127.0.0.1` della macchina che lo ospita, quindi tutte le letture passano dal control plane. ## Cosa mostra - **fase** del servizio con badge colorato: caricato / generazione / caricamento / scaricato / fermo / non raggiungibile; - **VRAM** usata e totale (barra indaco, informativa: il modello occupa quasi tutta la GPU); - **utilizzo, temperatura e potenza** della GPU come **barre progressive** che si riempiono in proporzione al valore e cambiano colore alle soglie; - **velocità del motore**: `DEC` (generazione, tok/s) e `PRE` (prefill, tok/s), live durante la generazione e riferite all'ultima richiesta quando il motore è fermo (badge `LIVE` / `ULTIMA`); - **modello**: alias, tipo di KV, contesto, concorrenza, disponibilità vision; - **switch carica/scarica** nativo (`POST /load`, `POST /unload?wait=0`) con stato `PENDING` che si chiude sulla fase osservata, non su un timer. ## Requisiti - KDE Plasma 6; - `curl` e `bash`; - chiave del control plane in `~/.config/strata-control/control.key` (0600); - control plane raggiungibile su `STRATACTL_API` (default `http://172.30.150.224:18090`). ## Installazione ```bash kpackagetool6 -t Plasma/Applet -i . ``` Per aggiornare un'installazione esistente: ```bash kpackagetool6 -t Plasma/Applet -u . ``` Aggiungi poi **Strata** al desktop o a un pannello dalle impostazioni dei widget Plasma. ## Backend - `contents/scripts/status.sh`: `GET $STRATACTL_API/status` con header `X-API-Key`, stampa il JSON su stdout (il widget lo legge con `P5Support.DataSource`, intervallo 4 s). - `contents/scripts/action.sh load|unload`: `POST` in background con `setsid` ed exit immediato, così il polling del widget non resta bloccato durante le operazioni lunghe. Campi usati dal widget: | Campo di `/status` | Uso | | --- | --- | | `phase`, `service.*` | badge di fase, tooltip | | `model.live.tok_s`, `model.live.prefill_tok_s_mean` | barre DEC/PRE live | | `model.last_timings.predicted_per_second`, `.prompt_per_second` | DEC/PRE dell'ultima richiesta | | `model.alias`, `kv`, `ctx`, `concurrency`, `vision` | card servizio | | `gpu.mem_used_mib/mem_total_mib/mem_pct`, `util_pct`, `temp_c`, `power_w`, `name` | card GPU | Il control plane deve inoltrare `model.live` e `model.last_timings`: la versione del 2026-10-25 legge `live` da `/metrics` (cache 3 s) e passa `last_timings` da `/v1/status`. Senza quei campi le barre DEC/PRE restano grigie. ## Soglie e scale Tutte in testa a `contents/ui/main.qml`, facili da ritoccare: | Grandezza | Fondo scala | Ambra | Rosso | | --- | --- | --- | --- | | Utilizzo GPU | 100 % | 60 % | 85 % | | Temperatura GPU | 100 °C | 75 °C | 85 °C | | Potenza GPU | 350 W (TDP L40S) | 70 % del budget | 90 % del budget | | Decode (generazione) | 120 tok/s | < 40 tok/s (nominale) | < 20 tok/s | | Prefill | 5000 tok/s | < 3000 tok/s (nominale) | < 1500 tok/s | Per le due velocità la semantica è **inversa** rispetto ai carichi: alto è bene, quindi verde sopra la nominale, ambra fra il 50 % e la nominale, rosso sotto. Grigio = valore non disponibile (motore scarico, sensore assente). ## Note - Avatar del repository in `assets/repository-avatar.png`, immagine pixel-art generata con Antigravity (modello immagine Gemini). - Il widget occupa un box desktop da 324x308 pixel logici: card e spaziature sono tarate su quella altezza. Se il containment lo rimpicciolisce il footer `SYNC` viene tagliato. ## Licenza MIT. Vedi [LICENSE](LICENSE).