mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-09 01:54:42 +02:00
* 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>
127 lines
7.3 KiB
Markdown
127 lines
7.3 KiB
Markdown
# 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 <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.
|