feat(stt): active les actions via Hermes (STT_ACTIONS_ENABLED=true) (#43)

* 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>
This commit is contained in:
ALI YESILKAYA 2026-06-21 04:09:35 +02:00 committed by GitHub
parent 0802d81160
commit f0e33c1121
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 164 additions and 59 deletions

101
progress/2026-06-21.md Normal file
View file

@ -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 &lt;service&gt; » (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
"<prompt>" --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.