Commit graph

307 commits

Author SHA1 Message Date
2658f92c2f
feat(stt): HUD avancé (phase 4) — design Claude Design câblé au backend (#17)
* feat(stt): HUD avancé — design Claude Design câblé au backend

Remplace le HUD minimal (cercle CSS) par le design Claude Design : avatar
portrait réactif (anneau + ping d'écoute + spinner de réflexion), transcript
à bulles (tag modèle), indicateur de connexion + reconnexion auto, et un
drawer Réglages.

- HUD (stt/hud/index.html) : HTML/CSS/JS sans dépendance externe, DEMO=false
  branché sur le websocket existant (états idle/listening/thinking/speaking,
  user/assistant/error). Portraits chargés depuis hud/avatars/ (repli « あ »
  si absent — voir avatars/README.md).
- Backend (ui/app.py) : le HUD renvoie {"type":"settings",...} ; le serveur
  applique à chaud reset / mode cerveau (modèle LiteLLM) / mot de réveil via
  _apply_settings (best-effort, non bloquant).
- engine/cli : tag du modèle courant ajouté aux réponses (events assistant).
- Docs : hud/README + avatars/README + admin/ia/stt.md (phase 4 ) + config.

Phase 4 de la roadmap STT. Reste : test sur poste + portraits réels.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

* fix(stt): HUD servi sans cache navigateur (anti ancienne version)

Le HUD est un dashboard live servi en statique : sans en-tête anti-cache, le
navigateur garde l'ancien index.html après mise à jour (« je vois encore la
version bleue »). Ajoute Cache-Control: no-store + Pragma: no-cache via un
handler dédié, et silence le log HTTP par requête.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

* chore(stt): bump client 0.1.0 → 0.2.0 (HUD avancé)

La version inchangée faisait que pipx/uv réutilisait l'ancien build en cache
lors d'un réinstall (HUD bleu persistant malgré le nouveau code). Le bump force
une résolution propre vers la nouvelle version (HUD design Claude Design).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

* fix(stt): cache-bust de l'URL HUD en kiosk + bump 0.2.1

Ouvre le HUD avec ?v=<timestamp> (URL unique par lancement) pour que le
navigateur ne puisse jamais servir une version cachée de l'ancien HUD.
Complète Cache-Control: no-store côté serveur.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 22:03:39 +02:00
7821651cce
docs(readme): ajouter le switch réseau (GS308EV4) à l'architecture (#16)
* docs(readme): ajouter le switch réseau (Netgear GS308EV4) à l'architecture

Le diagramme d'architecture du README ne représentait pas le commutateur
réseau qui relie physiquement les machines. Ajout du switch Netgear GS308EV4
(8 ports Gigabit, managé Plus, VLAN 802.1Q) entre storage-01 et les nœuds du
cluster, avec le détail du câblage (storage-01 : WAN enp4s0 → port 2/VLAN 1,
LAN enp6s0f3u2c2 → port 7/VLAN 10) déjà présent dans ansible/group_vars.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

* docs(readme): corriger la topologie du switch (Freebox + storage-01 ×2 VLAN)

Le switch GS308EV4 est le point central : y sont branchés la Freebox (VLAN 1)
et storage-01 par ses DEUX interfaces (enp4s0 port 2/VLAN 1 et enp6s0f3u2c2
port 7/VLAN 10). storage-01 fait passerelle/NAT entre VLAN 1 (domestique) et
VLAN 10 (cluster). Le diagramme précédent montrait à tort Freebox → storage-01
→ switch en série.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

* docs(readme): détailler le câblage du switch (ports, VLAN, mode Access)

Reprise du mapping noté à l'origine (archive/Funk/HOMELAB.md §5.4 +
progress/2026-05-09) : ajout des numéros de ports au diagramme (port 1 Freebox,
2/7 storage, 3-6 cluster) et d'un tableau de câblage complet des 8 ports
(destination, IP, VLAN). Précision : tous les ports en mode Access (pas de
trunk), storage-01 sur deux NIC physiques (une par VLAN).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 18:37:42 +02:00
c023ab0e58
docs: passe de cohérence documentaire (STT, Ghostfolio, embeddings, Qdrant) (#15)
Aligne la documentation sur l'état réel du cluster au 2026-06-18 :

- Qdrant : crash-loop résolu le 17/06 (statut « HS / EN COURS » corrigé dans
  CLAUDE.md, README, admin/ia/rag.md, admin/incidents.md, admin/ia/stt.md).
  Précision : collection funk-docs supprimée lors de la réparation → re-ingest
  RAG encore à faire (pas de surévaluation du statut).
- STT (assistant vocal « Jarvis ») : ajouté partout (était déployé mais non documenté).
- Ghostfolio : ajouté partout (était déployé mais non documenté).
- Embeddings dédiés nomic-embed-text :1238 : marqués opérationnels (roadmap
  README disait encore « TODO »).
- llama-server : ×3 → ×4 (instance embeddings) ; gap IaC précisé (embeddings géré
  par le rôle, seules les 2 instances CPU restent manuelles).
- Structure k8s/ corrigée dans CLAUDE.md : ajout stt/ + ghostfolio/, suppression
  des sous-dossiers traefik/ + metallb/ inexistants (installés via helm au bootstrap).
- Namespaces et liste des secrets Vault (vault_pg_ghostfolio_password) complétés.
- admin/README.md : index complété (~10 docs manquants : email, n8n, open-webui,
  ghostfolio, k9s, stt, rag, hermes-voice/souls/auto-improve, alertmanager-webhook).
- Funk/ (conception d'origine : LM Studio + agents Goose, obsolète) déplacé sous
  archive/ avec bandeau « obsolète » + archive/README.md (historique git préservé).


Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 11:16:34 +02:00
github-actions[bot]
e1ec26d546 ci(stt): image → sha-870c28b [skip ci] 2026-06-17 20:33:37 +00:00
870c28b43d
docs(stt): fix /no_think Qwen3 + instance embeddings :1238 (doc complète) (#14)
* feat(stt): mémoire long-terme sémantique via Qdrant (5b)

Serveur : longterm.py — collection Qdrant stt-memory (embeddings Qwen3 gpu-01, dim auto,
Cosine), recall top-k injecté au prompt, remember des tours user. Tout dégrade proprement
si Qdrant/embeddings injoignables (la mémoire court-terme tient). Env STT_MEMORY_LONGTERM,
STT_QDRANT_URL, STT_EMBED_URL, STT_MEMORY_TOPK.

Testé en process : dégradation OK (Qdrant down → mem=0, pas de crash, court-terme tient).
Qdrant réparé le 17/06 (5c). Recherche sémantique réelle à valider sur cluster.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): endpoint /v1/memory/health + upsert Qdrant synchrone

- /v1/memory/health sonde activement embeddings + Qdrant + collection et
  expose les erreurs (recall/remember dégradent en silence → indébogables).
  Permet de diagnostiquer la mémoire long-terme sans kubectl exec.
- remember() : upsert avec ?wait=true → le souvenir est immédiatement
  cherchable (sans wait, Qdrant met l'écriture en file → un recall
  cross-session immédiat pouvait le rater).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* docs(stt): 5b mémoire long-terme validée en prod + backlog nomic-embed-text

- Rappel cross-session confirmé (« Felix » retrouvé dans une nouvelle session),
  points_count vérifié via /v1/memory/health.
- Note du fix upsert ?wait=true et de l'endpoint de diagnostic.
- Roadmap : 5d (nomic-embed-text dim 768) en backlog qualité ; états haut/bas
  du doc mis à jour (déployé + validé sur cible).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): embeddings dédiés nomic-embed-text sur gpu-01 (:1238) + migration auto

Remplace Qwen3 (chat réutilisé, dim 4096, peu discriminant) par un modèle
d'embedding spécialisé nomic-embed-text (dim 768) pour la mémoire long-terme.

Ansible (rôle llama_server) :
- nouvelle instance optionnelle `llama-embed` (llama_embed_enabled) servant un
  modèle d'embedding dédié sur :1238, GPU ; télécharge le GGUF si absent.
- activée sur gpu-01 (host_vars) : nomic-embed-text-v1.5 f16.

STT-server :
- STT_EMBED_URL → :1238, STT_EMBED_MODEL → nomic-embed-text (deployment + config).
- _ensure_collection détecte le changement de dimension (4096→768) et recrée
  automatiquement la collection stt-memory (anciens vecteurs incomparables) —
  pas de drop manuel.

Docs : llama_server README, rag.md, stt.md (5d ), CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* fix(stt): désactiver le mode thinking de Qwen3 (/no_think) — content vide / 502

Qwen3 est un modèle « thinking » : il dépensait tout le budget max_tokens en
reasoning_content → content vide, ou partait en raisonnement long → timeout (502
"upstream LiteLLM : " avec message vide). Diagnostic : appel direct LiteLLM en
0.87s mais content="" et tout dans reasoning_content.

- brain.py : ajoute le token de contrôle `/no_think` au system prompt
  (configurable STT_DISABLE_THINKING, défaut true ; inoffensif pour non-Qwen).
- brain.py : filet de sécurité — si content vide, récupère reasoning_content
  au lieu de renvoyer "".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* docs(stt): documenter le fix /no_think Qwen3 + instance embeddings :1238

- admin/ia/stt.md : caveat « thinking » Qwen3 (content vide / timeout 502) +
  fix /no_think + fallback reasoning_content ; roadmap 5e ; bannière.
- stt/server/README.md : env STT_DISABLE_THINKING + section caveat Qwen3.
- admin/ia/llama_server.md : 4e instance llama-embed :1238 (nomic, dim 768),
  double source d'embeddings (1234 Qwen3 / 1238 nomic), caveat thinking,
  correction dim Qwen3 (3584 → 4096).
- admin/ia/litellm.md : cross-ref caveat thinking (concerne tous les
  consommateurs de hermes-default/qwen3).
- ci : exclure **/*.md du trigger build-stt-server (doc-only ne rebuild plus).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 22:32:43 +02:00
github-actions[bot]
703d6a9015 ci(stt): image → sha-a1dd9d7 [skip ci] 2026-06-17 20:22:01 +00:00
a1dd9d7c44
fix(stt): désactiver le thinking de Qwen3 (/no_think) — corrige content vide / 502 (#13)
* feat(stt): mémoire long-terme sémantique via Qdrant (5b)

Serveur : longterm.py — collection Qdrant stt-memory (embeddings Qwen3 gpu-01, dim auto,
Cosine), recall top-k injecté au prompt, remember des tours user. Tout dégrade proprement
si Qdrant/embeddings injoignables (la mémoire court-terme tient). Env STT_MEMORY_LONGTERM,
STT_QDRANT_URL, STT_EMBED_URL, STT_MEMORY_TOPK.

Testé en process : dégradation OK (Qdrant down → mem=0, pas de crash, court-terme tient).
Qdrant réparé le 17/06 (5c). Recherche sémantique réelle à valider sur cluster.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): endpoint /v1/memory/health + upsert Qdrant synchrone

- /v1/memory/health sonde activement embeddings + Qdrant + collection et
  expose les erreurs (recall/remember dégradent en silence → indébogables).
  Permet de diagnostiquer la mémoire long-terme sans kubectl exec.
- remember() : upsert avec ?wait=true → le souvenir est immédiatement
  cherchable (sans wait, Qdrant met l'écriture en file → un recall
  cross-session immédiat pouvait le rater).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* docs(stt): 5b mémoire long-terme validée en prod + backlog nomic-embed-text

- Rappel cross-session confirmé (« Felix » retrouvé dans une nouvelle session),
  points_count vérifié via /v1/memory/health.
- Note du fix upsert ?wait=true et de l'endpoint de diagnostic.
- Roadmap : 5d (nomic-embed-text dim 768) en backlog qualité ; états haut/bas
  du doc mis à jour (déployé + validé sur cible).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): embeddings dédiés nomic-embed-text sur gpu-01 (:1238) + migration auto

Remplace Qwen3 (chat réutilisé, dim 4096, peu discriminant) par un modèle
d'embedding spécialisé nomic-embed-text (dim 768) pour la mémoire long-terme.

Ansible (rôle llama_server) :
- nouvelle instance optionnelle `llama-embed` (llama_embed_enabled) servant un
  modèle d'embedding dédié sur :1238, GPU ; télécharge le GGUF si absent.
- activée sur gpu-01 (host_vars) : nomic-embed-text-v1.5 f16.

STT-server :
- STT_EMBED_URL → :1238, STT_EMBED_MODEL → nomic-embed-text (deployment + config).
- _ensure_collection détecte le changement de dimension (4096→768) et recrée
  automatiquement la collection stt-memory (anciens vecteurs incomparables) —
  pas de drop manuel.

Docs : llama_server README, rag.md, stt.md (5d ), CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* fix(stt): désactiver le mode thinking de Qwen3 (/no_think) — content vide / 502

Qwen3 est un modèle « thinking » : il dépensait tout le budget max_tokens en
reasoning_content → content vide, ou partait en raisonnement long → timeout (502
"upstream LiteLLM : " avec message vide). Diagnostic : appel direct LiteLLM en
0.87s mais content="" et tout dans reasoning_content.

- brain.py : ajoute le token de contrôle `/no_think` au system prompt
  (configurable STT_DISABLE_THINKING, défaut true ; inoffensif pour non-Qwen).
- brain.py : filet de sécurité — si content vide, récupère reasoning_content
  au lieu de renvoyer "".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 22:20:26 +02:00
github-actions[bot]
9f06bbb13d ci(stt): image → sha-9fef555 [skip ci] 2026-06-17 19:55:40 +00:00
9fef555cc3
feat(stt): embeddings dédiés nomic-embed-text sur gpu-01 (:1238) + migration auto (#12)
* feat(stt): mémoire long-terme sémantique via Qdrant (5b)

Serveur : longterm.py — collection Qdrant stt-memory (embeddings Qwen3 gpu-01, dim auto,
Cosine), recall top-k injecté au prompt, remember des tours user. Tout dégrade proprement
si Qdrant/embeddings injoignables (la mémoire court-terme tient). Env STT_MEMORY_LONGTERM,
STT_QDRANT_URL, STT_EMBED_URL, STT_MEMORY_TOPK.

Testé en process : dégradation OK (Qdrant down → mem=0, pas de crash, court-terme tient).
Qdrant réparé le 17/06 (5c). Recherche sémantique réelle à valider sur cluster.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): endpoint /v1/memory/health + upsert Qdrant synchrone

- /v1/memory/health sonde activement embeddings + Qdrant + collection et
  expose les erreurs (recall/remember dégradent en silence → indébogables).
  Permet de diagnostiquer la mémoire long-terme sans kubectl exec.
- remember() : upsert avec ?wait=true → le souvenir est immédiatement
  cherchable (sans wait, Qdrant met l'écriture en file → un recall
  cross-session immédiat pouvait le rater).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* docs(stt): 5b mémoire long-terme validée en prod + backlog nomic-embed-text

- Rappel cross-session confirmé (« Felix » retrouvé dans une nouvelle session),
  points_count vérifié via /v1/memory/health.
- Note du fix upsert ?wait=true et de l'endpoint de diagnostic.
- Roadmap : 5d (nomic-embed-text dim 768) en backlog qualité ; états haut/bas
  du doc mis à jour (déployé + validé sur cible).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): embeddings dédiés nomic-embed-text sur gpu-01 (:1238) + migration auto

Remplace Qwen3 (chat réutilisé, dim 4096, peu discriminant) par un modèle
d'embedding spécialisé nomic-embed-text (dim 768) pour la mémoire long-terme.

Ansible (rôle llama_server) :
- nouvelle instance optionnelle `llama-embed` (llama_embed_enabled) servant un
  modèle d'embedding dédié sur :1238, GPU ; télécharge le GGUF si absent.
- activée sur gpu-01 (host_vars) : nomic-embed-text-v1.5 f16.

STT-server :
- STT_EMBED_URL → :1238, STT_EMBED_MODEL → nomic-embed-text (deployment + config).
- _ensure_collection détecte le changement de dimension (4096→768) et recrée
  automatiquement la collection stt-memory (anciens vecteurs incomparables) —
  pas de drop manuel.

Docs : llama_server README, rag.md, stt.md (5d ), CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 21:54:41 +02:00
github-actions[bot]
30942f6478 ci(stt): image → sha-1c3128a [skip ci] 2026-06-17 18:32:52 +00:00
1c3128a319
feat(stt): /v1/memory/health + upsert Qdrant synchrone (debug 5b) (#11)
* feat(stt): mémoire long-terme sémantique via Qdrant (5b)

Serveur : longterm.py — collection Qdrant stt-memory (embeddings Qwen3 gpu-01, dim auto,
Cosine), recall top-k injecté au prompt, remember des tours user. Tout dégrade proprement
si Qdrant/embeddings injoignables (la mémoire court-terme tient). Env STT_MEMORY_LONGTERM,
STT_QDRANT_URL, STT_EMBED_URL, STT_MEMORY_TOPK.

Testé en process : dégradation OK (Qdrant down → mem=0, pas de crash, court-terme tient).
Qdrant réparé le 17/06 (5c). Recherche sémantique réelle à valider sur cluster.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): endpoint /v1/memory/health + upsert Qdrant synchrone

- /v1/memory/health sonde activement embeddings + Qdrant + collection et
  expose les erreurs (recall/remember dégradent en silence → indébogables).
  Permet de diagnostiquer la mémoire long-terme sans kubectl exec.
- remember() : upsert avec ?wait=true → le souvenir est immédiatement
  cherchable (sans wait, Qdrant met l'écriture en file → un recall
  cross-session immédiat pouvait le rater).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 20:32:04 +02:00
github-actions[bot]
a670784e4d ci(stt): image → sha-1986ab5 [skip ci] 2026-06-17 14:54:20 +00:00
1986ab56d8
feat(stt): mémoire long-terme sémantique via Qdrant (5b) (#10)
Serveur : longterm.py — collection Qdrant stt-memory (embeddings Qwen3 gpu-01, dim auto,
Cosine), recall top-k injecté au prompt, remember des tours user. Tout dégrade proprement
si Qdrant/embeddings injoignables (la mémoire court-terme tient). Env STT_MEMORY_LONGTERM,
STT_QDRANT_URL, STT_EMBED_URL, STT_MEMORY_TOPK.

Testé en process : dégradation OK (Qdrant down → mem=0, pas de crash, court-terme tient).
Qdrant réparé le 17/06 (5c). Recherche sémantique réelle à valider sur cluster.


Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 16:52:33 +02:00
70499b7d84
ci(stt): images taguées par SHA + bump auto du manifest (fin du :latest) (#9)
La CI build l'image en sha-<commit> et, sur main, met à jour k8s/apps/stt/deployment.yaml
avec ce tag (commit [skip ci]). ArgoCD redéploie alors une image immuable et déterministe
— fini les races de timing et les 'kubectl rollout restart' manuels.

permissions: contents write (pour le bump). :latest gardé en parallèle sur main (fallback).


Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 16:39:14 +02:00
815beaf37c
feat(stt): mémoire court-terme de session côté serveur (5a) (#8)
Serveur : SessionStore (historique borné + TTL, en mémoire), /v1/ask accepte session_id
et injecte l'historique dans l'appel LLM, /v1/reset l'efface. Dockerfile en 1 worker
(cohérence mémoire process).

Client : session_id généré par run (uuid), envoyé à chaque requête ; commande /reset
en mode texte.

Testé en process (TestClient) : historique croît 0→2→4, reset→0, sessions isolées,
sans session_id = sans état.

Mémoire long-terme Qdrant (5b) + réparation Qdrant (5c) à suivre.


Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 16:15:57 +02:00
bcdb4f8b2a
feat(stt): mode texte + sélection de modèle (client→serveur par requête) (#7)
Serveur : /v1/ask accepte un model optionnel (validé contre STT_ALLOWED_MODELS),
nouvel endpoint GET /v1/models (défaut + alias autorisés). Pas de switch global.

Client : 'stt --text' (chat texte simple sans micro/HUD), '--model hermes|claude|qwen|opus'
(noms courts → alias LiteLLM), commandes /model et /models en mode texte. Le modèle
choisi est envoyé au serveur à chaque requête (voix comme texte).


Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 13:36:06 +02:00
47936b0088
fix(stt): joindre LiteLLM en IP directe (192.168.10.1:4000) (#6)
L'indirection litellm-ext (Service sans sélecteur + Endpoints manuel) ne routait pas
('All connection attempts failed'). open-webui joint LiteLLM en IP directe — on copie
ce pattern éprouvé et on supprime litellm-external.yaml.


Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 13:19:51 +02:00
35f37bd293
fix(stt): imagePullSecret ghcr-pull pour l'image privée ghcr (#5)
* fix(stt): imagePullSecret ghcr-pull pour l'image privée

Le Deployment référence un secret de pull ghcr-pull (ns ai) — image ghcr privée.
Secret créé manuellement (même pratique que ghostfolio-secret, non versionné).
Doc d'install dans stt/README.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* fix(stt): securityContext conforme PodSecurity restricted (ns ai)

runAsNonRoot + runAsUser 1000 + seccompProfile RuntimeDefault (pod),
allowPrivilegeEscalation false + drop ALL caps (conteneur).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 12:40:34 +02:00
e390ddef12
feat(stt): assistant vocal Jarvis — client pipx + STT-server in-cluster (#4)
* feat(stt): cadrage + squelette assistant vocal Jarvis

Conception validée du projet STT — assistant vocal/HUD du homelab Funk :
- HUD web sur-mesure + STT/TTS local (faster-whisper + Piper)
- Packaging commande pipx (stt), démarrage auto systemd --user
- Cerveau 3 modes + auto-détection LAN : hermes / local-direct / claude-direct
- Mémoire 3 tiers : SQLite local + Qdrant s01 + GitHub (distillée, versionnée)

Réutilise tools/hermes-voice, LiteLLM, Hermes Agent. Squelette + doc admin/ia/stt.md,
implémentation par phases (roadmap dans le doc).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* feat(stt): phase 1-2 — commande, backend vocal, routeur cerveau, HUD MVP

- cli.py : commande `stt` (--setup, --mode, --no-tts)
- config.py : défauts embarqués + ~/.config/stt/stt.toml
- voice/engine.py : refactor de hermes-voice en classe avec callbacks d'état
- brain/router.py : 3 modes (hermes SSH / local LiteLLM / claude API) + auto-détection LAN
- server/app.py : HTTP statique (HUD) + websocket (états → HUD)
- memory/store.py : tier local SQLite (Qdrant + sync GitHub = phase 4)
- hud/index.html : HUD MVP (visualiseur d'état + conversation)

Vérifié hors-LAN : py_compile, --help, config, routeur (→ claude), mémoire SQLite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* fix(stt): embarquer le HUD dans le package (404 après pipx install)

Le HUD était à la racine du projet (stt/hud/) donc absent du package installé
par pipx → HTTP 404 sur /. Déplacé dans le package (stt/stt/hud/) + package-data,
HUD_DIR ajusté. Vérifié : le wheel contient bien stt/hud/index.html.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

* refactor(stt): pivot client-serveur — STT-server in-cluster + client pipx

Sépare STT en deux :
- stt/client/ : commande `stt` (pipx), voix locale (Whisper/Piper) + HUD ; envoie
  le texte au serveur via api.py (ServerClient → POST /v1/ask). URL serveur paramétrable,
  pas de cerveau local (suppression du routeur 3 modes).
- stt/server/ : STT-server FastAPI (conteneur), /healthz + /v1/ask → LiteLLM (Qwen3/Claude).

Déploiement cluster :
- k8s/apps/stt/ : Deployment, Service, IngressRoute (stt.lab.local), litellm-ext
  (Service + Endpoints → 192.168.10.1:4000 pour joindre LiteLLM hors cluster)
- k8s/apps-of-apps/apps/stt.yaml : Application ArgoCD (depuis main)
- .github/workflows/build-stt-server.yml : build/push image → ghcr.io/alkatrazz24/funk-stt-server

Inférence/chat seulement (outils Hermes 'agir sur Funk' = phase ultérieure, API :8080 à spécifier).
Vérifié : py_compile client+serveur, YAML manifests, ServerClient.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 12:08:58 +02:00
22d40023e1 docs(n8n): rapports portefeuille — news en FR + piège apostrophe JS + édition via API
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 13:24:21 +02:00
047785be1a docs(n8n): rapports portefeuille (hebdo+quotidien) auth durable + news + recommandations
Auth via jeton de securite (auto-renouvelle, plus d'expiration JWT). News par
action via Yahoo RSS dans le noeud Code. Analyse approfondie + recommandations.
Caveat: Qwen 8B peut se tromper sur les chiffres -> se fier au tableau exact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 23:44:27 +02:00
69818c29a8 docs(n8n): workflow Rapport Portefeuille Hebdo (Ghostfolio + Qwen)
Cron dimanche 18h -> API Ghostfolio (perf+holdings) -> Qwen commente -> email.
Filtre le cash, poids relatifs aux actions. Auth JWT en dur (exp 2026-12-12).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 23:31:35 +02:00
e61f1c76fc docs(n8n): fix parsing webhook alertes (0 alerte/unknown) + filtre anti-bruit
Le noeud Format Alertes lisait body.alerts/body.status au lieu de body.body.* ->
tous les mails affichaient 0 alerte/unknown meme en cas de vraie alerte.
Correctif applique au workflow (live) + filtre Watchdog/InfoInhibitor/severity none.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 21:37:13 +02:00
6437df5ff7 revert(ghostfolio): retirer BASE_CURRENCY (no-op en v3.11)
La devise interne est figée à USD en v3.11 (BASE_CURRENCY non pris en compte) ;
EUR devient disponible via la collecte du taux EUR/USD, pas via cet env.
La devise d'affichage se choisit par utilisateur dans Paramètres.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 14:50:22 +02:00
6b6103992c feat(ghostfolio): devise système BASE_CURRENCY=EUR
Avoirs majoritairement en euros — fixe la devise de base système à l'installation
pour un affichage natif en EUR sans dépendre d'un taux de change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 14:30:58 +02:00
b615e9e0fd docs(ghostfolio): sslmode=disable + caveat grant schema public
Corrige la procédure : sslmode=disable (PG s01 sans SSL, seed Prisma 7.x échoue
en TLS sinon) et documente le GRANT ALL ON SCHEMA public requis pour les bases
possédées par postgres.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 14:20:05 +02:00
4f1c03df08 feat(ghostfolio): suivi de portefeuille sur k8s (PG s01 + Redis)
Nouvel app ArgoCD ghostfolio (namespace ai) : suivi/analyse de portefeuille
boursier. Base PostgreSQL dédiée sur storage-01, Redis in-cluster pour le cache.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 14:04:19 +02:00
0aa4c3650d docs(ansible): README par rôle (19) + gaps IaC découverts à l'audit
Audit complet des rôles vs état réel du cluster. Chaque rôle a maintenant
un README.md : but, variables (défauts + surcharges host_vars/vault),
handlers, vérifications, caveats.

Gaps découverts et documentés :
- minio : rôle VIDE (tasks/main.yml sans aucune tâche), service inactif —
  placeholder à implémenter ou retirer (ports 9000/9001 ouverts pour rien)
- llama_server : ne gère que l'instance GPU :1234 — les services CPU
  llama-server-system :1236 et llama-server-monitor :1237 sont créés à la
  main sur gpu-01, non reproductibles par make apply-gpu (+ un
  llama-server-dev.service non documenté présent sur l'hôte)
- hermes_auto_improve : defaults port/repo/branch/log non consommés
  (valeurs en dur dans les scripts), défaut branch obsolète
- lm_studio : README de dépréciation, candidat suppression

Tables admin/ops/ansible.md, README.md et CLAUDE.md corrigées en conséquence.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 15:21:24 +02:00
40fd7f0868 docs: synchroniser la doc avec l'état réel du cluster (revue Ansible + incident Qdrant)
- ops/ansible.md : tableau complet des rôles par playbook (15 storage-01, 6 gpu-01),
  caveat hermes_agent, note lm_studio inutilisé
- ia/hermes-auto-improve.md : NOUVEAU — doc du worker déployé (trigger :9095,
  modes du script, endpoints, PR squash, pièges connus)
- k8s/n8n.md : workflow 3 "Hermes Doc Worker" documenté (22h, /trigger/all,
  boucle de polling), clé API → vault
- incidents.md : Qdrant crash-loop depuis 2026-06-05 (segment funk-docs corrompu,
  invisible dans --state=failed) + procédure de réparation
- ia/rag.md : bandeau RAG HS
- CLAUDE.md : état 2026-06-10, rôle hermes_auto_improve, 3 workflows n8n,
  vault complet (n8n_api_key, Gmail au lieu de Brevo), section auto-improve
- README.md : lien admin/ops/cluster.md corrigé, arborescence complète
  (tools/, admin/, progress/, skills), roadmap à jour
- PROGRESS.md : entrée 2026-05-29 (migration NVMe) qui existait sans être référencée
- ansible : suppression effective des templates daily timer (cleanup b9be63c)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 15:11:53 +02:00
ddff71a0fb chore(vault+ansible): clé API n8n dans vault + cleanup rôle hermes_auto_improve
- vault.yml : ajout vault_n8n_api_key (clé API n8n "claude", label n8n UI)
- hermes_auto_improve tasks : retirer déploiement timer/service daily (scheduling via n8n)
- hermes_auto_improve handlers : retirer handler Reload systemd daemon (inutilisé)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 14:01:46 +02:00
b9be63cd59 refactor(hermes-auto-improve): scheduling via n8n — supprimer timer systemd
Le scheduling est géré par n8n (workflow "Hermes Doc Worker — Funk-lab") :
- Schedule 30min désactivé dans n8n
- Schedule 22h → POST /trigger/all (tous les docs, timeout 2h)
- Attendre run 5min → 120min dans le workflow n8n

Ansible : retirer les templates daily service/timer (plus nécessaires)
auto-improve.py : flag --all conservé (utilisé par le trigger /trigger/all)
trigger-server.py : timeout 7200s conservé pour les runs --all

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 13:58:00 +02:00
7d02efd9fa feat(hermes-auto-improve): passe quotidienne complète à 22h (tous les docs)
- Ajout systemd timer hermes-auto-improve-daily.timer (22h00, Persistent=true)
- Service oneshot : --all puis --daily-pr (TimeoutSec=7200 pour 28 fichiers)
- auto-improve.py : flag --all qui bypass MAX_FILES et traite tout admin/
- trigger-server.py : timeout 600s → 7200s pour les runs --all via HTTP

La rotation par batch (MAX_FILES=5) reste active pour les triggers n8n
à la demande. Le workflow n8n 30-min doit être désactivé manuellement.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 13:46:14 +02:00
3780c90804 refactor(hermes-doc-enrich): append-only — section État vérifié, jamais de réécriture
Le script n'écrase plus les docs existants. Pour chaque fichier admin/ :
- Inspecte le cluster en read-only (systemctl, kubectl, nft, etc.)
- Demande à Hermes d'écrire UNIQUEMENT une section "## État vérifié — DATE"
- Appende cette section au doc (ou remplace la précédente)
- Commit local dans hermes/daily-work, pas de push
- rag-ingest Qdrant à la fin du batch

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 13:46:14 +02:00
d79ebf7d36 fix(hermes-auto-improve): squash merge + correction PR existante dans create_github_pr
- GitHub repo configuré squash-only (allow_merge_commit=false, allow_rebase_merge=false)
- create_github_pr() vérifie si une PR hermes/daily-work est déjà ouverte :
  si oui → met à jour titre+body (pas de PR dupliquée)
  si non → crée une nouvelle PR
- Supprime le bug de silence sur "a pull request for branch X already exists"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 13:46:14 +02:00
e62832fd71 feat(hermes-auto-improve): ajouter hermes-doc-rewrite pour réécriture doc basée sur état cluster
Script hermes-doc-rewrite : inspecte l'état réel du cluster (read-only)
et demande à Hermes de réécrire chaque fichier admin/ avec des infos exactes.
Commit local dans hermes/daily-work, pas de push automatique.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 13:46:14 +02:00
alkatrazz
994a2f1e54 fix(hermes-auto-improve): configurer user.email/name git dans git_sync() pour root 2026-06-10 13:46:14 +02:00
a6f5207aa5
merge: rapports Hermes analyse documentation 03-05 juin 2026
[Hermes] Rapport documentation — 2026-06-03
2026-06-05 11:41:54 +02:00
Hermes Bot
18e5174166 docs(hermes): rapport analyse 2026-06-05_11-30 — 5 fichiers
Analysés : litellm.md, llama_server.md, rag.md, rocm.md, incidents.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 11:32:58 +02:00
Hermes Bot
5d240fe2f0 docs(hermes): rapport analyse 2026-06-05_11-00 — 5 fichiers
Analysés : README.md, alertmanager-webhook.md, hermes-souls.md, hermes-voice.md, hermes.md
À améliorer : 1/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 11:03:02 +02:00
Hermes Bot
00869a61cd docs(hermes): rapport analyse 2026-06-05_10-30 — 3 fichiers
Analysés : ansible.md, cluster.md, systeme.md
À améliorer : 0/3

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 10:32:04 +02:00
Hermes Bot
29f45959bc docs(hermes): rapport analyse 2026-06-05_10-00 — 5 fichiers
Analysés : k9s.md, monitoring.md, n8n.md, open-webui.md, talos.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 10:02:55 +02:00
Hermes Bot
0b3a934704 docs(hermes): rapport analyse 2026-06-05_09-30 — 5 fichiers
Analysés : README.md, gpu-01.md, kubernetes.md, storage-01.md, argocd.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 09:32:58 +02:00
Hermes Bot
8f59e5cacb docs(hermes): rapport analyse 2026-06-05_09-00 — 5 fichiers
Analysés : dnsmasq.md, email.md, nfs.md, reseau.md, ssh.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 09:02:37 +02:00
Hermes Bot
037ea15884 docs(hermes): rapport analyse 2026-06-05_08-30 — 5 fichiers
Analysés : litellm.md, llama_server.md, rag.md, rocm.md, incidents.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 08:33:03 +02:00
Hermes Bot
c1cef4869c docs(hermes): rapport analyse 2026-06-05_08-00 — 5 fichiers
Analysés : README.md, alertmanager-webhook.md, hermes-souls.md, hermes-voice.md, hermes.md
À améliorer : 2/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 08:03:38 +02:00
Hermes Bot
27f3397b41 docs(hermes): rapport analyse 2026-06-05_07-30 — 3 fichiers
Analysés : ansible.md, cluster.md, systeme.md
À améliorer : 0/3

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 07:32:12 +02:00
Hermes Bot
fbc3f34d9d docs(hermes): rapport analyse 2026-06-05_07-00 — 5 fichiers
Analysés : k9s.md, monitoring.md, n8n.md, open-webui.md, talos.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 07:02:51 +02:00
Hermes Bot
5d36731364 docs(hermes): rapport analyse 2026-06-05_06-30 — 5 fichiers
Analysés : README.md, gpu-01.md, kubernetes.md, storage-01.md, argocd.md
À améliorer : 1/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 06:33:05 +02:00
Hermes Bot
9ea51b8101 docs(hermes): rapport analyse 2026-06-05_06-00 — 5 fichiers
Analysés : dnsmasq.md, email.md, nfs.md, reseau.md, ssh.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 06:02:47 +02:00
Hermes Bot
083bb12660 docs(hermes): rapport analyse 2026-06-05_05-30 — 5 fichiers
Analysés : litellm.md, llama_server.md, rag.md, rocm.md, incidents.md
À améliorer : 0/5

Co-Authored-By: Hermes <hermes@funk.lab>
2026-06-05 05:32:51 +02:00