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

7.3 KiB
Raw Permalink Blame History

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.
  • #36pages 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 <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 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.