* feat(stt): active les actions via Hermes (STT_ACTIONS_ENABLED=true)
hermes-exec déployé sur storage-01 (:9096) + secret k8s stt-server-secrets/hermes-exec-token
en place → on active le contexte « agent ». Après déploiement ArgoCD, le contexte
🤖 Agent apparaît dans le sélecteur et les actions (avec confirmation) sont opérationnelles.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs: journal 2026-06-21 + état STT (portail, contextes, intents, actions Hermes)
- progress/2026-06-21.md : récap complet de la journée (portail + santé live, contextes
visualiseur + presets live, intents vocaux, jeton Ghostfolio unifié, actions via Hermes,
ASR Parakeet) + l'incident de merge des PR empilées et sa leçon.
- PROGRESS.md : ligne du jour.
- CLAUDE.md : « État actuel » daté 2026-06-21, ligne STT enrichie.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore(vault): ajoute vault_hermes_exec_token (jeton actions hermes-exec, chiffré)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
5.4 KiB
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 + Prometheusup{}/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/askacceptecontextet 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 fusionnantengine._respond(intent_router + context_provider). Leçon : merger les PR empilées dans l'ordre base→sommet, ou rebaser surmainavant 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 "<prompt>" --yolo (profil défaut, tous outils).
- storage-01 — rôle Ansible
hermes_exec: service HTTP:9096(en userhermes) qui lancehermes -z --yoloderriè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,
--yoloseulement jeton+confirmation en main (la confirmation protège des erreurs de transcription), audit. Client : aucun changement. - Secret k8s
stt-server-secrets/hermes-exec-tokencréé. #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.