diff --git a/CLAUDE.md b/CLAUDE.md index a86b73f..b707b83 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co **Funk** — homelab IA composé d'un cluster Kubernetes (Talos) pour les services applicatifs, d'un hôte d'inférence LLM dédié (gpu-01 / llama-server ROCm), et d'un agent autonome (Hermes Agent) sur storage-01. Stack IaC complète : Ansible + talhelper + ArgoCD. -**État actuel (2026-06-18)** : +**État actuel (2026-06-21)** : - ✅ Hermes Agent opérationnel — multi-profils (funk-ai/system/monitor/brain) - ✅ Qdrant réparé (2026-06-17) — fin du crash-loop (segment `funk-docs` corrompu, voir `admin/incidents.md`). ⚠️ La collection RAG `funk-docs` a été supprimée lors de la réparation → **re-`rag-ingest` requis** pour réactiver `rag-query` - ✅ Monitoring complet — Prometheus + Grafana + AlertManager → webhook Hermes + n8n @@ -17,7 +17,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co - ✅ postfix_relay — SMTP sortant via Gmail SMTP + App Password (aliyesilkaya93@gmail.com) - ✅ Open WebUI opérationnel — `openwebui.lab.local`, namespace `ai`, backend LiteLLM - ✅ n8n opérationnel — `n8n.lab.local`, namespace `ai`, 3 workflows actifs (alertes, rapport horaire, Hermes Doc Worker) -- ✅ STT (assistant vocal « Jarvis ») — STT-server in-cluster (`stt.lab.local`, namespace `ai`) + client `stt` (pipx) : HUD avancé (design Claude Design), auto-start systemd `--user`, app de bureau (`stt --install-desktop`, fenêtre type Discord) + auto-update (`stt --update`) ; mémoire long-terme Qdrant `stt-memory` validée 2026-06-17 (voir `admin/ia/stt.md`) +- ✅ STT (assistant vocal « Jarvis ») — STT-server in-cluster (`stt.lab.local`, namespace `ai`) + client `stt` (pipx) : HUD avancé (design Claude Design), auto-start systemd `--user`, app de bureau + auto-update ; mémoire long-terme Qdrant `stt-memory`. **Nouveau (2026-06-21)** : **portail de services** dans le HUD (tuiles + pages détail + santé live Prometheus/Alertmanager), **contextes** présélectionnables (funk/ghostfolio/grafana/alerting/cluster) avec **données live injectées** + **visualiseur** (« voir ce qu'on envoie à Asa »), **intents vocaux** (« ouvre X », « état du cluster », « combien sur mon ghostfolio »), ASR enfichable **Parakeet (onnx)**, et **actions via Hermes** (contexte « agent » → `hermes-exec` → `hermes -z --yolo`, opt-in + confirmation + jeton). Voir `admin/ia/stt.md` et `progress/2026-06-21.md` - ✅ Ghostfolio opérationnel — `ghostfolio.lab.local`, namespace `ai`, suivi de portefeuille (PostgreSQL s01 + Redis in-cluster) - ✅ hermes-auto-improve — analyse quotidienne de `admin/` par Hermes à 22h (n8n → trigger :9095), PR sur `hermes/daily-work` - ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis diff --git a/PROGRESS.md b/PROGRESS.md index c9f4a82..1207510 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -11,3 +11,4 @@ | [2026-05-14](progress/2026-05-14.md) | Monitoring complet + fix webhook AlertManager→Hermes (BrokenPipeError). RAG opérationnel : Qdrant 284 chunks, rag-ingest/rag-query, skill funk-ai. Souls révisés (4 profils). Docs : alertmanager-webhook, rag, hermes-souls | | [2026-05-29](progress/2026-05-29.md) | Migration `/srv/data` RAID5 dégradé → NVMe (sdb ATA errors). Tous les services sur NVMe, bind-mount `/home/data` | | [2026-06-18](progress/2026-06-18.md) | STT : HUD avancé (design Claude Design, #17), auto-start systemd, app de bureau (`.desktop` + mode fenêtre), auto-update (`stt --update`), compat AlmaLinux/Debian. Passe de cohérence doc (#15, #16) | +| [2026-06-21](progress/2026-06-21.md) | STT : portail de services + santé live (#34-36), contextes (visualiseur + presets live, #38/#39), intents vocaux (#40), jeton Ghostfolio unifié (#41), **actions via Hermes** (`hermes -z --yolo`, rôle hermes_exec + contexte agent, #42/#43), ASR Parakeet activé | diff --git a/ansible/group_vars/all/vault.yml b/ansible/group_vars/all/vault.yml index b6f9693..37dde75 100644 --- a/ansible/group_vars/all/vault.yml +++ b/ansible/group_vars/all/vault.yml @@ -1,57 +1,60 @@ $ANSIBLE_VAULT;1.1;AES256 -32653862643366616262386263376562353838323765646264376536636364383136643736303964 -6464393530333332333965353764356133323737653734620a643762373836666538333366386165 -36316433313361626238303838333039633036666239376666313762363862313139386364613832 -6134623365613839300a356563663766383965306530326331653731313132336438663438303062 -38633639306436326431376566383361356532616239303430373632343263646137393636343236 -36633232663766663933653263366633613930343066643334376462306564333935336538323364 -35356333626165623366346662353066613736666466306439363434633233633463646533386132 -35666263653462323539653762653037646239373637313465663639626361633931633336346437 -39303933636134653461393463333637633638343163383333316636393832373462643438326338 -33303765656235396164323935343231363032396164633036656538663266373535353938353437 -35383838353734393237373930316463323230383435383636623835316164353661356232663962 -37383764383563393365353364373335356330336363316636633737383130343333663735313233 -31373739373265366136613438393433326532316165653462616435386234653635333566646166 -64346330356465366464363734383734626132633462386261643133616236616564353935656138 -33386636643131326561353663663738626137343935323934306335383530363337373130636130 -65333961393564636264376437376439303165366464343465383064343630326637313162393034 -63656534626264343265663536646437306334333438396331623931323236646361333137613965 -62343033336232656533636138396430613935386130646662346435363838623235396665376539 -62646237643538306636653637303633626162633330356138623835653466616538613162643164 -36636364323661623531616262646362643864343837633633343133343964653336363232346163 -36373235373735633462646138643234626530653638623661313538303063393138636262626137 -37356638303331393766663730396637306335633766353932636333383863316535633339336138 -39626634623637653832343633363038663437663435643966326436313639633363383761366430 -64386664376435366433373862663963363166346664373031363034373162386166366439633439 -38303562376536393161616236306235303762393234386234616232646661373035326234666564 -35386432396263363539353263376439613933396435343261356137353838386163363362636361 -36653139393361396461623031643634316336363065623433646237623965306466336338343338 -33353331383462333066666238613932613433383261653331643239393862343431323265326138 -36356333323965626433383361383964313730386266643739306134663564313333363038386633 -61613935306165626361613564636138626533353666383034363336353031393062316337616135 -61353236386130313964323638653535316365373632333638313736353536343935666661383538 -35363535336566343431326232626438646530303862303033316335343066396661623830616231 -39383739643062663963643630626430393563366237356232376261323131666339386463383038 -36663038623831336164343866626664326332306634383662653366373061626139383032623063 -38643466336562353766393764333265356232353837346466366165353635663866643564386134 -39313433313465636161353261613039363865386634656637323063636263383339396631623638 -63356232623139323961383966346232643632386635393565333834626635653234633932343866 -66383539396537353466313166313735343936386463386261306466643234636239306263633366 -39616630376536613633663466323366303233653263353236396436643034353562653965346431 -36623638396431373761663363653239626635663335326637323031323761343037623634326531 -38383836383231356633313331313539346437356464666464306537663039316661356363653532 -36663734353066373364326166613064353763336461393463303239616564656165666139643432 -63303239343261353036353539363838633238613132326466326437333133643330383334636164 -36366436663133643365383330333639663730363662613165613033663533396438343161646332 -39633166326431333234633039613733656131643634663265396465323465373635653364653739 -34636533663461323439663930663937333663356230343061623339646130666434343361363233 -63613366663037613832653835663363626134653835633835323837626565663835616430643332 -35386236646465333836313338353439666338646130363064656632623433326632316437663238 -31613330653837313463303435366265396337626563343833613361633836663061646538613630 -61666330376130663337333937303134346163376561313138333163646463323131626330626462 -31653436666666363661393333353366396339643235663162613231626236356662376661613162 -64396535336634643661393830326630663964343036363566336533626565393763633238653935 -34356561393838636565336139386265316537616138353566393762373832626637356562633739 -34363461306662396365333331373339323537653365646539346338353066356235623435373662 -34313431346230663133306339323561333463393064383036363637656561333536623462616436 -36653730616536313265 +62336439366562363937663535393663306632313861393832323863633936383638633031386539 +3936393362663037373862616335346461343464663031310a373137373561323838663561313632 +34653562386463633037313136636165343937396437663237353339363935306437663930663135 +3036373732633030380a323562383239356335343366623338373335323937653638386439343032 +32663236363262666434666462643236376439393635336637373261323033353530346331633565 +61343664333064653831646562363837306230353038656666663139333538313738633137303238 +37303862636261336662363733333234393130656661303663323530613736383233656639363837 +32313262383464363030333833633863376332616434336564613265383738316464333261616533 +61653763346633313830346130303137306164366664346132306363373164653063396237333837 +61306533663435313666333461323662636237393164323136353936393266343338666266653066 +61333761383335306164323830383139323736336332343931646365646565396666643337333932 +31363131306339353837396261316632303839303737353831636237383033633431386662306539 +38623565316162323437333838636163323134643634613231336432373331336666663032643438 +32373130356564666339386535613330393936323561346361366534346163313461363662303636 +39393664333330373238353332373061626166376662656336613735646139326563346634306637 +66633264393966383563376265356239383265333065396564653931386462646161633932646262 +39663464633739363738376638396236303338396461306466333636306532646463383265356661 +31326665336663653832663433653932313464363334356365343466376165613331333863386236 +62383065636636333432623564616235313739643265616137316461346162613638376131333931 +39333863366166643831663839303832643331636639346639646234643738636361303737653937 +35353731626438663836343264343661393632353437316266313435666665663065663565333937 +33396163383534646533373335623365386661353065313865643533663637636237626465393964 +35326663313164623835386439383131386531373339643864646136303532626561373661396365 +34326261333430663261663263306131336331386538623739376437333862386531623531366332 +63643033363263623736636636343830313063326161326466323965366663333436626530623830 +36306665373531636236656130333063643934333037303636386538363835653332363932663839 +34663363333766353635316236373034656333616162613338633338396261323339346439643836 +38346264653838336561383631363132333235383733326363663837633934656162633031363734 +61393432393662663063666236666135633331646465373163316238633233643734323265346466 +35643937386534626161613131343131323037636261333863316437643463643363336333323636 +65353932643830343636663734326637353365353430313830323535313538663834623335666662 +63313532303839326261636561333937656364333339313236613139663761356166613935396435 +37346139323533336131656266376437356536626131313366383433353834633533616634376361 +63633334313230323566646461356234393538626230646161326638656231313961336435336537 +39653836643436396661626334616630633231333165336438313265393537303162313134356633 +63396139663562333437353861653432636236613864323839366231373930353132666534656337 +34376235373365316533653533316331326162396563313262373835663861323664383765613934 +37663730393363656661633338363330663964353864626365636263303036346566343430666435 +34663966323532313661326638396265306338616361326561313361353236393962656334666366 +36613466626234303730333539316265306264663766616565366635363931653166646263666365 +37396636303930623636353238386465643739643537303937663437386465663036663862646537 +66386536316137316234636565633639663765633563323766366536373430373534326233346232 +65323361613263663834613337386438663531303535613533336665336539666363383262643338 +38333363373332633430313038636530643731366433353832346535363562313632613230656235 +62666231306465333730663263303533333836646533373339653961616639363738363366643032 +63653766383663636566303833306464393135306535313565373364646164333339343031353561 +62363062613165306233623962396463316230633561643262323030636430373835653837326166 +62626430643037333865326333346464363662323361306539313162306639393133646334326233 +34306264323962393763633965653838353733646236313061356236366630373934363261666665 +39393632623664333138393738353363343039376166343437666236313762326231316337376439 +37386539303064363665613662346561623230353535386565393866623961343564316230663066 +37313034396630613031366365343064313333373365343832306238663930326361613534653436 +33383036623633656435356133623965616566623333303862633431326538366536656333306232 +66646562343034653235373936633537383932333732623938393964326530366532663438643330 +34323062336434626361333662363335316366333837353734376438373834633735633530376131 +61636363613531366230346163383563316134666335373433333930646330633030613435373339 +63656333353436323262303364396264303330316263373661653533643165343238393464663338 +39343537376438353235306536316465356464313030373236323331353538353030323039623937 +626661643166633933323038363237633665 diff --git a/k8s/apps/stt/deployment.yaml b/k8s/apps/stt/deployment.yaml index 70709ae..422a679 100644 --- a/k8s/apps/stt/deployment.yaml +++ b/k8s/apps/stt/deployment.yaml @@ -72,7 +72,7 @@ spec: # Actions via Hermes (contexte « agent ») — OPT-IN. Mettre "true" + le jeton # pour activer. hermes-exec écoute sur storage-01:9096 (IP directe). - name: STT_ACTIONS_ENABLED - value: "false" + value: "true" - name: STT_HERMES_EXEC_URL value: "http://192.168.10.1:9096" # Même jeton que vault_hermes_exec_token (Ansible) : diff --git a/progress/2026-06-21.md b/progress/2026-06-21.md new file mode 100644 index 0000000..5fb4d4a --- /dev/null +++ b/progress/2026-06-21.md @@ -0,0 +1,101 @@ +# 2026-06-21 — STT : portail de services, contextes (visualiseur + presets live), intents vocaux & actions via Hermes + +## Résumé + +Très grosse itération sur **STT** (client + serveur). Le client gagne un **portail de services** +(tuiles + pages détail avec santé live), un **sélecteur de contexte** et un **visualiseur** ; le +serveur gagne des **contextes présélectionnables** qui injectent des **données live** (Ghostfolio, +Prometheus, Alertmanager) et renvoient le contexte assemblé. Côté voix, des **intentions locales** +(« ouvre X », « état du cluster », « combien sur mon ghostfolio »). Enfin, **Asa peut agir** sur le +homelab via le **vrai agent Hermes** (`hermes -z --yolo`), derrière confirmation + jeton. + +Bascule aussi : **ASR Parakeet (onnx)** activé sur le poste, **jeton Ghostfolio unifié** (source +client unique, appel côté serveur). + +--- + +## Portail de services dans le HUD (#34, #35, #36) + +- **#34** — registre config-driven (`stt/portal/registry.py`, `[[services]]`) → panneau « Services » + (tuiles cliquables) + ouverture dans le navigateur normal. Ajouter un service = quelques lignes. +- **#35** — contrôles du service dans le HUD (Redémarrer / Mettre à jour / Arrêter) + commandes + `stt --start` / `--restart`. Process détaché : systemd possède le job, le restart va à son terme. +- **#36** — **pages détail** par service (description, **santé live**, composants, alertes, bouton + Ouvrir) + pastilles live + badge d'alertes. Santé = `health.py` (StatusPoller) : probe HTTP + + **Prometheus** `up{}`/kube-state-metrics + **Alertmanager** (hors Watchdog), parallélisé. + +--- + +## Contextes d'Asa — visualiseur + presets live (#38 serveur, #39 client) + +Asa n'est plus bloqué sur le seul contexte « doc grounding-strict » (d'où les « la doc ne le précise +pas » incompris). **5 contextes** : `funk` (RAG doc), `ghostfolio`, `grafana`, `alerting`, `cluster` — +chacun change le system prompt **et injecte les données live** du domaine (`contexts.py` + `sources.py`). + +- `/v1/ask` accepte `context` et renvoie le **contexte assemblé** → **visualiseur** du HUD (« voir + exactement ce qu'on envoie à Asa » : consigne + données live + RAG + mémoire). +- Client : **sélecteur** (Réglages) + **drawer visualiseur** (icône ▤) + affichage de la version. + +--- + +## Intentions vocales locales (#40, lecture seule) + +Reconnues avant le LLM (`portal/intents.py`, interceptées dans `engine._respond`) : +« ouvre <service> » (ouvre la page), « état du cluster/services » (résumé santé parlé), +« combien sur mon ghostfolio » (API Ghostfolio). Court-circuitent le LLM (mode « portail »). + +> ⚠️ Incident de merge : #37 (intents) avait été mergé dans sa **branche de base** (PR empilée, +> branche supprimée) → jamais propagé à `main`. Idem l'affichage de version. **Récupérés** (#40) en +> fusionnant `engine._respond` (intent_router + context_provider). Leçon : merger les PR empilées +> dans l'ordre base→sommet, ou rebaser sur `main` avant merge. + +--- + +## Jeton Ghostfolio unifié (#41) + +Avant : jeton en double (config client pour l'intent + secret k8s pour le contexte). Désormais +**une source unique** — la config client — **transmise au serveur**, qui fait tous les appels +Ghostfolio (`/v1/portfolio` + `secrets` dans `/v1/ask`). `portal/ghostfolio.py` (client) supprimé. + +--- + +## Actions cluster via Hermes (#42, activé #43) + +**L'autre moitié de la vision : Asa peut AGIR.** Découverte clé : **Hermes n'a pas d'API HTTP** +(appli TUI ; le « gateway :8080 » de la doc n'écoute pas) — mais un **mode one-shot** `hermes -z +"" --yolo` (profil défaut, tous outils). + +- **storage-01** — rôle Ansible `hermes_exec` : service HTTP `:9096` (en user `hermes`) qui lance + `hermes -z --yolo` derrière un **jeton Bearer** (`vault_hermes_exec_token`), avec timeout + audit + (`/var/log/hermes-exec.log`). **Déployé et vérifié** (actif, 401 sans jeton). +- **STT-server** — contexte **« agent »** (court-circuite le LLM) : **handshake de confirmation + 2 temps** par session (« tu veux que… ? » → « confirme »/« annule ») → appelle hermes-exec. + **Opt-in** (`STT_ACTIONS_ENABLED`, défaut false) ; le contexte n'apparaît que si activé + jeton. +- **Sécurité** : désactivé par défaut, jeton obligatoire, `--yolo` seulement jeton+confirmation en + main (la confirmation protège des erreurs de transcription), audit. **Client : aucun changement**. +- Secret k8s `stt-server-secrets/hermes-exec-token` créé. **#43** bascule le flag → après merge, + le contexte 🤖 Agent est opérationnel. + +--- + +## ASR Parakeet activé (poste) + +Bascule du client sur `asr_engine = "onnx"` (NVIDIA Parakeet `nemo-parakeet-tdt-0.6b-v3`, CPU) : +~11× temps réel (0,31 s pour 3,6 s), « Hermès » bien transcrit. Whisper conservé en repli. + +--- + +## Versions + +- Client `stt` : `0.7.0 → 0.13.0` (portail, contrôles, santé, contextes, intents, version, unification). +- STT-server : `0.3.1 → 0.6.0` (grounding strict, contextes + sources live, /v1/portfolio, contexte agent). + +--- + +## Prochaines étapes + +- **Merger #43** → activer les actions ; faire le 1er test vocal avec confirmation (HUD → 🤖 Agent). +- Optionnel : ajouter le jeton Ghostfolio en config client si l'intent « combien » est souhaité hors contexte. +- Streaming ASR (transcription partielle live dans le HUD). +- Corriger le wake word (« Asa » vs « Hermès ») si désiré. +- Nettoyer les branches locales `claude/stt-*` devenues inutiles.