diff --git a/CLAUDE.md b/CLAUDE.md index 5069bad..bb55679 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co **Funk** — homelab IA composé d'un cluster Kubernetes (Talos) pour les services applicatifs, d'un hôte d'inférence LLM dédié (gpu-01 / llama-server ROCm), et d'un agent autonome (Hermes Agent) sur storage-01. Stack IaC complète : Ansible + talhelper + ArgoCD. -**État actuel (2026-06-21)** : +**État actuel (2026-06-23)** : - ✅ Hermes Agent opérationnel — multi-profils (funk-ai/system/monitor/brain) - ✅ Qdrant réparé (2026-06-17) — fin du crash-loop (segment `funk-docs` corrompu, voir `admin/incidents.md`). La collection RAG `funk-docs` a depuis été **reconstruite** (436 chunks, 🟢 green, embeddings nomic-embed-text dim 768) — `rag-query` opérationnel - ✅ Monitoring complet — Prometheus + Grafana + AlertManager → webhook Hermes + n8n @@ -17,7 +17,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co - ✅ postfix_relay — SMTP sortant via Gmail SMTP + App Password (aliyesilkaya93@gmail.com) - ✅ Open WebUI opérationnel — `openwebui.lab.local`, namespace `ai`, backend LiteLLM - ✅ n8n opérationnel — `n8n.lab.local`, namespace `ai`, 3 workflows actifs (alertes, rapport horaire, Hermes Doc Worker) -- ✅ STT (assistant vocal « Jarvis ») — STT-server in-cluster (`stt.lab.local`, namespace `ai`) + client `stt` (pipx) : HUD avancé (design Claude Design), auto-start systemd `--user`, app de bureau + auto-update ; mémoire long-terme Qdrant `stt-memory`. **Nouveau (2026-06-21)** : **portail de services** dans le HUD (tuiles + pages détail + santé live Prometheus/Alertmanager), **contextes** présélectionnables (funk/ghostfolio/grafana/alerting/cluster) avec **données live injectées** + **visualiseur** (« voir ce qu'on envoie à Asa »), **intents vocaux** (« ouvre X », « état du cluster », « combien sur mon ghostfolio »), ASR enfichable **Parakeet (onnx)**, et **actions via Hermes** (contexte « agent » → `hermes-exec` → `hermes -z --yolo`, opt-in + confirmation + jeton). Voir `admin/ia/stt.md` et `progress/2026-06-21.md` +- ✅ STT / **Asa** (assistant vocal « Jarvis ») — STT-server in-cluster (`stt.lab.local`, namespace `ai`) + client `stt` (pipx) : HUD avancé, transcription partielle live, **veille/réveil vocal** (« Asa » / « Asa stop »), auto-start systemd `--user`, mémoire long-terme Qdrant `stt-memory`. **Asa est agentique (2026-06-22)** : contexte **`asa` par défaut** = **boucle d'outils (function calling, Qwen3-8B local)** où le modèle choisit ses outils — `search_docs` (RAG), `host_health`/`cluster_status`/`prometheus_query` (état **live** enrichi : CPU/RAM/disque/temp/uptime + **GPU** via rocm_scraper), **`web_search`** (SearXNG), et **`admin_action`** (agir via `hermes-exec`, **confirmation vocale** obligatoire + jeton). Contextes présélectionnables conservés (funk/ghostfolio/grafana/alerting/cluster) + visualiseur + intents vocaux. **TTS enfichable** (`piper`|`kokoro`) : `stt --voices` / `--install-voice` / `--install-kokoro`. Voir `admin/ia/stt.md` et `docs/stt-presentation.md` +- ✅ SearXNG opérationnel — `searxng.lab.local`, namespace `ai`, **méta-moteur de recherche web self-host** (privé, in-cluster) consommé par l'outil `web_search` d'Asa (API JSON). Manifests `k8s/apps/searxng/` - ✅ Ghostfolio opérationnel — `ghostfolio.lab.local`, namespace `ai`, suivi de portefeuille (PostgreSQL s01 + Redis in-cluster) - ✅ hermes-auto-improve — analyse quotidienne de `admin/` par Hermes à 22h (n8n → trigger :9095), PR sur `hermes/daily-work` - ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis @@ -159,13 +160,15 @@ k8s/ │ ├── n8n.yaml │ ├── open-webui.yaml │ ├── stt.yaml +│ ├── searxng.yaml │ ├── ghostfolio.yaml │ ├── monitoring.yaml │ └── nfs-provisioner.yaml ├── apps/ # Manifests raw k8s par application │ ├── n8n/ # namespace: ai │ ├── open-webui/ # namespace: ai -│ ├── stt/ # namespace: ai — STT-server (assistant vocal, stt.lab.local) +│ ├── stt/ # namespace: ai — STT-server (assistant vocal Asa, stt.lab.local) +│ ├── searxng/ # namespace: ai — méta-moteur recherche web (outil web_search d'Asa) │ ├── ghostfolio/ # namespace: ai — suivi de portefeuille (ghostfolio.lab.local) │ └── {external-services}/ # ExternalName/Endpoints pointant vers storage-01 ou gpu-01 └── infra/ # Helm releases (HelmRelease + values.yaml) @@ -181,7 +184,7 @@ k8s/ 2. Créer `k8s/apps-of-apps/apps/.yaml` (ArgoCD Application CRD) — copier `n8n.yaml` comme modèle 3. `git commit` + `git push` → ArgoCD prend en charge automatiquement -Namespaces actifs : `argocd`, `infra` (Traefik, MetalLB, NFS-provisioner, registry in-cluster), `monitoring` (Prometheus/Grafana), `ai` (n8n, open-webui, stt, ghostfolio), `sacrifice` (jeu FPS — déployé hors de ce repo et hors ArgoCD, cf. `admin/ops/etat-cluster.md`). +Namespaces actifs : `argocd`, `infra` (Traefik, MetalLB, NFS-provisioner, registry in-cluster), `monitoring` (Prometheus/Grafana), `ai` (n8n, open-webui, stt, searxng, ghostfolio), `sacrifice` (jeu FPS — déployé hors de ce repo et hors ArgoCD, cf. `admin/ops/etat-cluster.md`). > Les services du namespace `ai` sont exposés via des **IngressRoute Traefik** (CRD), pas des `Ingress` standards. diff --git a/admin/ia/stt.md b/admin/ia/stt.md index 794b2cb..71a2aec 100644 --- a/admin/ia/stt.md +++ b/admin/ia/stt.md @@ -3,7 +3,8 @@ **STT** est l'interface vocale et graphique de Funk : un assistant type *Jarvis / Iron Man* qui écoute, parle et affiche un HUD animé. **Architecture client-serveur** : un client `stt` sur le poste (voix + HUD) qui interroge un **STT-server in-cluster** (orchestration AI). -Objectif ultérieur : « agir sur le homelab » via les outils de Hermes (phase 7). +Asa est désormais **agentique** : le STT-server fait du **function calling** (contexte `asa`) — elle +sait (doc + état live), cherche (web SearXNG) et **agit** (Hermes via `hermes-exec`, avec confirmation). > **Nom de code** : `STT`. À l'origine « Speech-To-Text », mais le projet couvre toute la > chaîne voix → cerveau → voix + interface + mémoire. Renommable plus tard sans impact @@ -16,7 +17,12 @@ Objectif ultérieur : « agir sur le homelab » via les outils de Hermes (phase > portrait réactif, transcript à bulles, drawer Réglages **câblé au backend** : reset / mode > cerveau / mot de réveil à chaud). Auto-start : `stt --install-service` (systemd --user). > App de bureau : `stt --install-desktop` (fenêtre type Discord) ; auto-update : `stt --update`. -> Reste : test audio bout-en-bout (phase 1), portraits réels + test sur cible, outils Hermes (7). +> ✅ **2026-06-21** — transcription partielle live + **veille/réveil vocal** (« Asa » / « Asa stop »). +> ✅ **2026-06-22** — **Asa agentique** : contexte `asa` par défaut (function calling local), outils +> doc + **état live enrichi** + **web (SearXNG)** + **actions Hermes** (`admin_action`, confirmation). +> Vérifié en prod. Voir `docs/stt-presentation.md` (+ schémas) et `docs/asa-commandes.md`. +> ✅ **2026-06-23** — **TTS enfichable** (Piper|Kokoro) + `stt --voices` / `--install-voice` / `--install-kokoro`. +> Reste : portraits d'avatar réels (le HUD montre le repli « あ »). --- @@ -45,7 +51,7 @@ Maillon réellement manquant : **l'interface graphique HUD** + le packaging + la | Interface | **HUD web sur-mesure** côté client (canvas/WebGL) | | STT / TTS | **Local sur le poste** (faster-whisper CPU + Piper) — le serveur ne touche pas à l'audio | | Packaging | Client : **commande `stt` via pipx** (`#subdirectory=stt/client`). Serveur : **conteneur** (ghcr) déployé par ArgoCD | -| Cerveau | **Côté serveur** : route vers LiteLLM `:4000` (Qwen3 / Claude). Outils Hermes = phase ultérieure | +| Cerveau | **Côté serveur** : route vers LiteLLM `:4000` (Qwen3 / Claude) + **boucle d'outils** (function calling : doc, état live, web, actions Hermes) | | Client → serveur | Client **serveur-only** (pas de repli Claude). URL serveur **paramétrable** | | Mémoire | **Côté serveur** (futur) : Qdrant s01 + distillée GitHub. Client : cache local SQLite | @@ -77,9 +83,9 @@ Le STT-server appelle **LiteLLM `:4000`** (OpenAI-compatible), joint depuis le c **IP directe** `192.168.10.1:4000` (même pattern qu'open-webui). LiteLLM route lui-même vers Qwen3 (g01) ou Claude selon l'alias `hermes-default` / `hermes-switch`. -> **« Agir sur Funk »** (outils de l'agent Hermes via le gateway `:8080`) n'est **pas** dans le -> MVP : l'API `:8080` n'est pas spécifiée, et depuis un pod le SSH vers Hermes est impraticable. -> MVP = inférence/chat. L'intégration Hermes est une étape ultérieure. +> **« Agir sur Funk »** est désormais **en place** (2026-06-22) : pas via le gateway Hermes `:8080` +> (jamais spécifié) mais via **`hermes-exec`** (storage-01 `:9096`, jeton) appelé par l'outil +> `admin_action` du contexte `asa`, avec **confirmation vocale**. Détails plus bas. **Choix du modèle** : le client envoie un `model` (alias LiteLLM) **par requête** à `/v1/ask` ; le serveur le valide contre `STT_ALLOWED_MODELS` et le passe à LiteLLM. Pas de diff --git a/admin/ops/etat-cluster.md b/admin/ops/etat-cluster.md index 46a85e0..870f82e 100644 --- a/admin/ops/etat-cluster.md +++ b/admin/ops/etat-cluster.md @@ -1,8 +1,12 @@ # État réel du cluster Funk — snapshot vérifié -> Relevé **2026-06-21** directement sur les machines (SSH s01/g01 + `kubectl`). Ce document +> Relevé **2026-06-23** directement sur les machines (SSH s01/g01 + `kubectl`). Ce document > reflète l'état **observé**, pas l'état *souhaité* de l'IaC — en cas d'écart, les écarts connus > sont signalés (⚠️). Pour la procédure de relevé, voir la fin du fichier. +> +> 🔁 **Depuis le 21/06** : ajout de **SearXNG** (recherche web in-cluster, ns `ai`) ; le STT‑server +> est devenu **agentique** (contexte `asa` par défaut : function calling — doc, état live, web, +> actions Hermes). Détails : `admin/ia/stt.md`. --- @@ -82,7 +86,7 @@ | Namespace | Workloads | |---|---| -| `ai` | ghostfolio, ghostfolio-redis, n8n, open-webui, **stt-server** | +| `ai` | ghostfolio, ghostfolio-redis, n8n, open-webui, **stt-server**, **searxng** | | `argocd` | application-controller, applicationset, notifications, redis, repo-server, server | | `infra` | **traefik** (LB `192.168.10.200`), **registry** (registry Docker in-cluster) | | `monitoring` | kube-prometheus-stack (Prometheus, Alertmanager, Grafana **13.0.1**, kube-state-metrics, operator, node-exporters) | @@ -97,15 +101,15 @@ > Il possède aussi sa base PostgreSQL `sacrifice` sur storage-01. **ArgoCD Applications** (toutes `Synced` / `Healthy`) : -`root` · `ghostfolio` · `n8n` · `open-webui` · `stt` · `monitoring` · `kube-prometheus-stack` · -`nfs-provisioner` · `nfs-subdir-external-provisioner`. +`root` · `ghostfolio` · `n8n` · `open-webui` · `stt` · `searxng` · `monitoring` · +`kube-prometheus-stack` · `nfs-provisioner` · `nfs-subdir-external-provisioner`. **Exposition HTTP** : | Type | Hôtes | |---|---| | `Ingress` standard | `argocd.lab.local`, `grafana.lab.local`, `prometheus.lab.local`, `alertmanager.lab.local`, `sacrifice.lab.local` | -| `IngressRoute` (CRD Traefik) | `ai/open-webui`, `ai/n8n`, `ai/ghostfolio`, `ai/stt-server`, `infra/traefik-dashboard` | +| `IngressRoute` (CRD Traefik) | `ai/open-webui`, `ai/n8n`, `ai/ghostfolio`, `ai/stt-server`, `ai/searxng`, `infra/traefik-dashboard` | > Les services du namespace `ai` (openwebui, n8n, ghostfolio, stt) passent par des **IngressRoute > Traefik** (CRD), pas par des `Ingress` standards.