Funk-lab/progress/2026-06-21.md
ALI YESILKAYA af98b47018
docs(cluster): aligne la doc sur l'état réel + re-ingest RAG + fix ubatch embed (#44)
* fix(rag): ubatch=2048 pour llama-embed + retry rag-ingest + nettoie defaults rag

L'instance llama-embed (:1238) tournait avec l'ubatch llama.cpp par défaut (512).
En mode --embeddings + pooling, toute l'entrée doit tenir dans un seul ubatch →
tout chunk > 512 tokens échouait en HTTP 500 « input too large to process.
increase the physical batch size ». ~46 chunks du RAG (CHUNK_MAX=2000 chars ≈
700 tokens) n'étaient pas indexés.

- llama_server : ajoute llama_embed_ubatch_size (2048 = ctx) + flags
  --batch-size/--ubatch-size dans le template llama-embed.service.
- rag-ingest : retry (5×, backoff) sur erreurs transitoires 5xx/réseau de l'embed.
- rag/defaults : aligne embed_url/embed_model sur nomic :1238 (étaient des vars
  mortes pointant encore qwen3-8b :1234 — trompeuses).

Résultat : ré-ingestion 436/436 chunks, 0 erreur.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(cluster): aligne la doc sur l'état réel (relevé 2026-06-21) + snapshot

Passe de vérification terrain (SSH s01/g01 + kubectl) pour corriger les écarts
doc↔réalité, et ajout d'un document de référence vérifié.

- admin/ops/etat-cluster.md (nouveau) : snapshot daté — machines, services+ports
  par hôte, workloads k8s, namespaces, IngressRoute, bases PG, modèles LiteLLM,
  RAG/Qdrant, + procédure pour régénérer le relevé.
- OS AlmaLinux 9.7 → 9.8 (s01/g01) ; précise k8s v1.33.1 (CLAUDE/README/install/talos).
- RAG funk-docs : retire le warning périmé « supprimée 2026-06-17 / à re-ingérer » →
  reconstruite (436 chunks, nomic-embed-text :1238 dim 768, CPU). Maj rag.md,
  incidents.md, stt.md.
- Namespace sacrifice (hors-repo, hors ArgoCD) + bases PG grafana/sacrifice +
  services ai via IngressRoute + registry in-cluster (CLAUDE.md, k9s.md).
- Services de résilience (llm-heartbeat, llama-watchdog/embed) et instances CPU
  manuelles :1236/:1237 (souvent éteintes) documentés.
- Journal progress/2026-06-21.md : section relevé + RAG.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:29:05 +02:00

127 lines
7.3 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.
---
## Relevé d'état réel + RAG re-ingéré (soir)
Passe de **vérification terrain** (SSH s01/g01 + `kubectl`) pour aligner la doc sur la réalité, et
**re-ingestion du RAG**. Nouveau doc de référence : **`admin/ops/etat-cluster.md`** (snapshot daté).
Écarts doc↔réalité corrigés (CLAUDE.md, README, install, k8s, incidents, rag, stt) :
- OS **AlmaLinux 9.8** (et non 9.7) sur s01/g01 ; **k8s v1.33.1** sur les compute nodes.
- RAG `funk-docs` **n'était pas vide** : le warning « supprimée 2026-06-17, re-ingest requis » était
périmé. Embeddings basculés sur **nomic-embed-text** (`:1238`, dim 768, **CPU**) — plus qwen3-8b.
- Namespace **`sacrifice`** (jeu FPS, hors-repo & hors ArgoCD) + base PG `sacrifice` + `grafana`
non documentés ; services `ai` exposés via **IngressRoute** Traefik ; registry in-cluster.
- Services de résilience non mentionnés : `llm-heartbeat` (s01), `llama-watchdog`/`llama-embed(-heartbeat)` (g01).
- Instances llama CPU `:1236`/`:1237` (profils `system`/`monitor`) **manuelles et éteintes** au relevé.
🐛 **Bug RAG trouvé & corrigé** : ~46 chunks rataient l'embedding (HTTP 500 *input too large… increase
physical batch size: 512*). `llama-embed` tournait avec l'**ubatch llama.cpp par défaut (512)** ; en
mode `--embeddings`+pooling l'entrée doit tenir dans un seul ubatch → chunks > 512 tokens KO. **Fix** :
`--batch-size`/`--ubatch-size = 2048` (rôle `llama_server`, var `llama_embed_ubatch_size` ; appliqué
en live via drop-in systemd g01). `rag-ingest` gagne un retry 5xx. Drift IaC nettoyé (`rag/defaults`
pointait encore qwen3-8b `:1234`). **Résultat : ré-ingestion 436/436, 0 erreur, collection 🟢.**
---
## 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
-**#43 mergé** (actions activées) et **RAG re-ingéré** (436 chunks) — faits.
- **Appliquer `make apply-gpu`** pour réconcilier le drop-in `llama-embed` (ubatch) dans l'IaC, puis
supprimer `/etc/systemd/system/llama-embed.service.d/batch.conf` sur g01.
- 1er test vocal d'action 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.