feat(stt-client): intentions vocales lecture seule — ouvrir, état du cluster, valeur Ghostfolio (#37)

Asa répond/agit en local (sans LLM) sur trois intentions déterministes, interceptées
dans engine._respond avant l'appel au STT-server :

  • « ouvre <service> »                 → ouvre la page dans le navigateur
  • « état du cluster / des services »  → résumé de santé parlé (depuis le poller)
  • « combien sur mon ghostfolio »      → valeur du portefeuille (API Ghostfolio)

- portal/intents.py : route_intent (ordre ghostfolio > statut > ouvrir) + summarize_status.
- portal/ghostfolio.py : client API config-driven (auth/anonymous → JWT → portfolio/details),
  lecture seule, dégradation propre si pas de token.
- voice/engine.py : attribut intent_router branché dans _respond (mode « portail »,
  court-circuite le LLM).
- ui/app.py : construit le routeur (services, ouverture, dernière santé, Ghostfolio).
- config : section [ghostfolio] (url, access_token vide par défaut, timeout).
- bump 0.10.0 → 0.11.0.

Stacked sur #36 (le résumé d'état utilise le StatusPoller). Validé : routage des
intents (ouvrir via alias, ghostfolio avec qualificatif, statut, hors-sujet → LLM),
résumé d'état, et interception moteur de bout en bout (LLM non appelé sur intent).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-20 23:31:39 +02:00 committed by GitHub
parent 704d212e15
commit 6e30f9535c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 259 additions and 10 deletions

View file

@ -148,7 +148,8 @@ au prompt système (`STT_DISABLE_THINKING`, défaut `true` ; inoffensif hors Qwe
| — ASR | `stt/client/stt/voice/asr/` | backend enfichable : `whisper` (faster-whisper CPU, défaut) \| `onnx` (Parakeet/Canary/Nemotron via onnx-asr, multilingue, streaming-ready). Choisi par `[voice] asr_engine` |
| — api | `stt/client/stt/api.py` | `ServerClient``POST /v1/ask` |
| — UI/HUD | `stt/client/stt/ui/` + `hud/` | HTTP statique + websocket bidirectionnel (états → HUD ; réglages **et messages texte** → backend) ; HUD embarqué dans le package |
| — portail | `stt/client/stt/portal/` | `registry.py` (services config-driven `[[services]]`) + `health.py` (StatusPoller). Panneau « Services » du HUD : tuiles + **pages détail** (description, **santé live**, composants, alertes, bouton Ouvrir). Santé = probe HTTP + **Prometheus** `up{}`/kube-state-metrics + **Alertmanager**. Ouvre l'URL dans le navigateur normal. Aussi : commande vocale « ouvre &lt;service&gt; » |
| — portail | `stt/client/stt/portal/` | `registry.py` (services config-driven `[[services]]`) + `health.py` (StatusPoller) + `intents.py` (intentions vocales) + `ghostfolio.py`. Panneau « Services » du HUD : tuiles + **pages détail** (description, **santé live**, composants, alertes, bouton Ouvrir). Santé = probe HTTP + **Prometheus** `up{}`/kube-state-metrics + **Alertmanager** |
| — intentions vocales | `stt/client/stt/portal/intents.py` | lecture seule, court-circuitent le LLM (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, `[ghostfolio] access_token`) |
| STT-server | `stt/server/` (conteneur) | FastAPI : `/healthz`, `/v1/ask` ; `brain.py` → LiteLLM |
| Image | `ghcr.io/alkatrazz24/funk-stt-server` | construite par `.github/workflows/build-stt-server.yml` |
| Manifests | `k8s/apps/stt/` | Deployment, Service, IngressRoute (`stt.lab.local`) |