Funk-lab/progress/2026-06-21.md
ALI YESILKAYA f0e33c1121
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>
2026-06-21 04:09:35 +02:00

101 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.