feat(stt): recherche web (SearXNG in-cluster) + fix cluster_status (#49)

Phase 2 d'Asa agentique : nouvel outil web_search adossé à un SearXNG
self-host in-cluster, + correction du faux positif de cluster_status.

- SearXNG (k8s/apps/searxng/) : Deployment + Service + ConfigMap settings.yml
  + IngressRoute searxng.lab.local, Application ArgoCD. Namespace ai, interne
  (l'outil tape http://searxng:8080). use_default_settings + search.formats
  inclut json (sinon API JSON 403) ; limiter/image_proxy off ; image pinnée ;
  conf copiée dans un emptyDir via initContainer (contourne le mount RO) ;
  PodSecurity restricted.
- Outil web_search (tools._web_search) ajouté au contexte asa + STT_SEARXNG_URL.
- fix(cluster_status) : les pods de CronJob TERMINÉS (Succeeded/Failed, ex.
  sacrifice-assign-renfort) comptaient comme « non prêts » → fausse alarme.
  Join kube_pod_status_phase{phase=~"Running |Pending"} (3 faux positifs → 0,
  validé in-cluster).
- Serveur 0.8.0 ; doc stt.md + journal mis à jour.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-22 22:10:59 +02:00 committed by GitHub
parent c9e89c91b9
commit 73b52cde2c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 270 additions and 16 deletions

View file

@ -103,13 +103,25 @@ sur un contexte figé, Asa **décide elle-même** quels outils appeler (`tools.p
partir de leurs résultats (`brain.ask_with_tools`, boucle bornée par `STT_TOOL_MAX_ITERS=4` ;
au-delà, réponse forcée sans outils). C'est ce qui débloque les questions à **état live** sans
présélection — ex. « gpu-01 tourne bien ? » → l'outil `host_health` est appelé → réponse réelle
(avant : le RAG seul disait « la doc ne le précise pas »). Outils Phase 1, **LECTURE SEULE** :
(avant : le RAG seul disait « la doc ne le précise pas »). Outils **LECTURE SEULE** (`tools.py`) :
`search_docs` (RAG `funk-docs`), `host_health(gpu-01|storage-01)` (up/charge/RAM + llama-server,
Prometheus), `cluster_status` (nœuds/pods), `prometheus_query(expr)` (PromQL arbitraire). Modèle
**local** Qwen3-8B (le tool-calling natif de llama.cpp fonctionne, **même avec `/no_think`**
vérifié). Le `trace` des outils appelés est renvoyé dans `context` → visualiseur HUD (un bloc par
appel). L'écriture (agir) reste au contexte `agent` ci-dessous (Phase 3 : la brancher comme outil).
> Web search (SearXNG in-cluster) = Phase 2 ; actions admin pilotées par le LLM = Phase 3.
Prometheus), `cluster_status` (nœuds/pods), `prometheus_query(expr)` (PromQL arbitraire), et
**`web_search(query)`** (recherche INTERNET via SearXNG, **Phase 2**). Modèle **local** Qwen3-8B
(le tool-calling natif de llama.cpp fonctionne, **même avec `/no_think`** — vérifié). Le `trace`
des outils appelés est renvoyé dans `context` → visualiseur HUD (un bloc par appel). L'écriture
(agir) reste au contexte `agent` ci-dessous (Phase 3 : la brancher comme outil).
> **`cluster_status`** filtre les pods **terminés** (CronJob Succeeded/Failed) via un join
> `kube_pod_status_phase` → ne signale comme « non prêts » que les pods réellement actifs (sinon
> les pods cron finis, ex. `sacrifice-assign-renfort`, déclenchaient une fausse alarme).
**SearXNG (recherche web in-cluster, Phase 2)** : méta-moteur self-host, manifests
`k8s/apps/searxng/` (Deployment + Service + ConfigMap `settings.yml` + IngressRoute
`searxng.lab.local`), Application ArgoCD `searxng`. Namespace `ai`, **interne** (l'outil tape
`http://searxng:8080`). Points clés : `use_default_settings: true` (hérite des moteurs),
**`search.formats` inclut `json`** (sinon l'API JSON renvoie 403), `limiter:false`/`image_proxy:false`
(usage interne), image **pinnée**, conf copiée dans un emptyDir via initContainer (évite le mount RO).
Outil = `STT_SEARXNG_URL` (`tools._web_search`). Actions admin pilotées par le LLM = **Phase 3**.
La réponse `/v1/ask` renvoie le **contexte assemblé** (`context`: system prompt + blocs live +
extraits RAG + mémoire) → alimente le **visualiseur** du HUD (« voir ce qu'on envoie à Asa »).