feat(stt): Phase 3 — actions admin pilotées par le LLM (admin_action) (#51)

Asa peut désormais AGIR sur le homelab quand on le demande explicitement, via
un outil de la boucle agentique — mais jamais sans confirmation.

- Outil admin_action(description) (contexte asa) : le LLM PROPOSE une action,
  n'exécute rien. brain.ask_with_tools gagne `confirm_tools` : un tel outil
  arrête la boucle et surface sa réponse (la question de confirmation).
- _handle_agentic : stocke la proposition en pending par session ; au tour
  suivant « confirme » → agent.run_action → hermes-exec (hermes -z --yolo),
  « annule » → oubli. Réutilise le handshake + jeton du contexte agent.
- admin_action n'est exposé que si _actions_available() (STT_ACTIONS_ENABLED
  + jeton) ; sinon retiré des schémas envoyés au modèle.
- Factorisation du ctx_debug du visualiseur. 1 test unitaire (confirm_tools
  arrête la boucle). Serveur 0.9.0 ; doc stt.md + journal.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-22 22:51:11 +02:00 committed by GitHub
parent dc7a2093ae
commit 3ea4c3c706
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 163 additions and 28 deletions

View file

@ -108,8 +108,16 @@ présélection — ex. « gpu-01 tourne bien ? » → l'outil `host_health` est
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).
des outils appelés est renvoyé dans `context` → visualiseur HUD (un bloc par appel).
**Outil d'écriture `admin_action` (Phase 3)** : pour une demande explicite d'AGIR, le LLM appelle
`admin_action(description)` qui **n'exécute rien** — la boucle s'arrête (`confirm_tools` dans
`ask_with_tools`), Asa **propose** l'action et stocke un `pending` par session. Le tour suivant,
si l'utilisateur dit « confirme » (mots de `agent.is_confirmation`), `_handle_agentic` exécute via
`agent.run_action`**hermes-exec** (`hermes -z --yolo`) ; « annule » l'oublie. Réutilise le
handshake + le jeton du contexte `agent`. **Exposé seulement si `_actions_available()`** (opt-in
`STT_ACTIONS_ENABLED` + jeton) : sinon `admin_action` est retiré des schémas. La confirmation
protège des erreurs de transcription ; le jeton, des déclenchements non autorisés.
> **`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
@ -121,7 +129,7 @@ des outils appelés est renvoyé dans `context` → visualiseur HUD (un bloc par
`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**.
Outil = `STT_SEARXNG_URL` (`tools._web_search`).
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 »).