From 00d10234f9b21e4a365d26958b928f2ae099fa5b Mon Sep 17 00:00:00 2001 From: alkatrazz Date: Wed, 13 May 2026 18:59:48 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20am=C3=A9lioration=20routing=20ask-agent?= =?UTF-8?q?=20+=20identit=C3=A9=20SOUL.md=20profils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SOUL.md funk-ai : tableaux détaillés system vs monitor (quand appeler chaque agent avec exemples concrets), section delegate_task vs ask-agent - SOUL.md system : rôle clarifié (traitement texte, PAS analyse santé), format de réponse explicite (verdict direct, pas de préambule) - hermes-agent.service : SupplementaryGroups=systemd-journal pour que journalctl fonctionne sans sudo depuis le Terminal de Hermes - Ansible common : admin_user (alkatrazz) ajouté au groupe systemd-journal - admin/hermes.md : section SOUL.md complète (déploiement, contenu, profils) - admin/ask-agent.md : distinction system vs monitor documentée avec tableau et exemples, note /no_think, monitor réservé supervision Co-Authored-By: Claude Sonnet 4.6 --- admin/ask-agent.md | 27 +++++++++- admin/hermes.md | 40 +++++++++++++++ ansible/group_vars/all/vars.yml | 1 + ansible/roles/common/tasks/main.yml | 7 +++ .../templates/hermes-agent.service.j2 | 1 + hermes-skills/souls/funk-ai.md | 51 ++++++++++++++++--- hermes-skills/souls/system.md | 23 ++++++++- 7 files changed, 140 insertions(+), 10 deletions(-) diff --git a/admin/ask-agent.md b/admin/ask-agent.md index a0d31db..67df9b7 100644 --- a/admin/ask-agent.md +++ b/admin/ask-agent.md @@ -29,11 +29,32 @@ LiteLLM Proxy (:4000) | Agent | Modèle | Vitesse | Coût | Usage idéal | |---|---|---|---|---| -| `system` | Qwen3-1.7B CPU (:1236) | ~21 tok/s | Gratuit | Calculs, formatage, parsing, résumés courts | -| `monitor` | Qwen3-1.7B CPU (:1237) | ~21 tok/s | Gratuit | Analyse métriques, logs, santé système | +| `system` | Qwen3-1.7B CPU (:1236) | ~21 tok/s | Gratuit | Traitement de texte : résumés, formatage, parsing, calculs, questions Linux | +| `monitor` | Qwen3-1.7B CPU (:1237) | ~21 tok/s | Gratuit | Évaluation de santé : logs systemd, métriques, état des services | | `brain` | Claude Sonnet 4.6 (API) | Variable | Payant | Raisonnement complexe, architecture, revue | | `funk-ai` | Qwen3-8B GPU (:1234) | ~35 tok/s | Gratuit | Tâches générales (agent principal lui-même) | +### system vs monitor — la distinction clé + +| Critère | `system` | `monitor` | +|---|---|---| +| Type de question | "Qu'est-ce que ça veut dire ?" / "Résume ça" | "Y a-t-il des erreurs ?" / "Ce service est-il sain ?" | +| Input attendu | Texte brut, sortie de commande quelconque | Logs systemd, métriques, `systemctl status` | +| Output produit | Réponse directe, liste de faits | Verdict OK/WARNING/ERROR + actions correctives | +| Notion de seuils | Non | Oui — évalue par rapport à ce qui est normal | + +```bash +# → system : traitement de texte +ask-agent system "que signifie cette sortie df -h : " +ask-agent system "résume l'utilisation disque : " +ask-agent system "convertis 8192 MiB en GiB" + +# → monitor : évaluation de santé +ask-agent monitor "logs litellm : — erreurs ?" +ask-agent monitor "status llama-server : — service sain ?" +ask-agent monitor "services failed : — que faire ?" +``` + --- ## Commande ask-agent @@ -223,4 +244,6 @@ nouvelle après chaque modification du skill. | Restart obligatoire | `systemctl restart hermes-agent` requis après ajout/modif skill | | brain coûteux | Claude Sonnet API — réserver aux analyses que system/monitor ne peuvent pas faire | | system et monitor isolés | Tournent sur 14 CPUs dédiés — ne bloquent pas le GPU ni Hermes principal | +| `/no_think` automatique | Le script ask-agent préfixe automatiquement `/no_think` pour system et monitor — évite que Qwen3 consomme tous les tokens en raisonnement interne | +| monitor réservé supervision | Ne pas modifier monitor pour d'autres usages — sera intégré à l'outil de supervision cluster | | ask-agent est shell | Dans le skill, toujours écrire `Terminal: ask-agent ...` — pas une API interne | diff --git a/admin/hermes.md b/admin/hermes.md index 1f55080..427307d 100644 --- a/admin/hermes.md +++ b/admin/hermes.md @@ -174,6 +174,44 @@ LM_API_KEY=lm-studio # valeur exacte obligatoire --- +## SOUL.md — Identité des profils + +Chaque profil peut avoir un fichier `SOUL.md` chargé en **slot #1** du system prompt. +Il définit l'identité de l'agent, son environnement, ses outils et son comportement. +Rechargé à chaque message sans redémarrage du service. + +``` +/srv/data/hermes/profiles//SOUL.md +``` + +Sources versionnées dans le repo : +``` +hermes-skills/souls/funk-ai.md → profil funk-ai +hermes-skills/souls/system.md → profil system +hermes-skills/souls/monitor.md → profil monitor +hermes-skills/souls/brain.md → profil brain +``` + +### Déployer un SOUL.md + +```bash +# Depuis le repo lab (poste perso) +scp hermes-skills/souls/funk-ai.md storage-01:/tmp/soul.md +ssh storage-01 "sudo cp /tmp/soul.md /srv/data/hermes/profiles/funk-ai/SOUL.md" +# Pas de redémarrage nécessaire — rechargé automatiquement +``` + +### Ce que contient le SOUL.md de funk-ai + +- Environnement cluster (machines, IPs, services) +- Accès SSH vers gpu-01 (`hermes@192.168.10.20`) +- Règles d'utilisation d'`ask-agent` (pattern 2 étapes obligatoires) +- Routing : quand appeler `system` vs `monitor` vs `brain` avec exemples concrets +- Différence `ask-agent` (analyse texte rapide) vs `delegate_task` (agent autonome) +- Style : concis, technique, actif + +--- + ## Skills Les skills sont des fichiers `SKILL.md` chargés en contexte dans chaque session Hermes. @@ -304,3 +342,5 @@ sudo systemctl restart hermes-dashboard | `/opt/hermes` perms | Répertoire en `711` — traversable par tous mais non listable | | **Skills double emplacement** | Tout skill custom doit être dans `skills/` ET dans `profiles/funk-ai/skills/` — voir [ask-agent.md](ask-agent.md) | | **Restart après skill** | `systemctl restart hermes-agent` obligatoire après ajout ou modification d'un skill | +| `SupplementaryGroups` | Le service inclut `systemd-journal` — `journalctl` fonctionne sans sudo dans le Terminal de Hermes | +| `systemd-journal` admin | L'utilisateur admin (`alkatrazz`) est aussi dans le groupe — géré via rôle Ansible `common` | diff --git a/ansible/group_vars/all/vars.yml b/ansible/group_vars/all/vars.yml index 474fd8b..ebb489d 100644 --- a/ansible/group_vars/all/vars.yml +++ b/ansible/group_vars/all/vars.yml @@ -1,4 +1,5 @@ --- +admin_user: alkatrazz dns_domain: lab.local ntp_servers: - 0.fr.pool.ntp.org diff --git a/ansible/roles/common/tasks/main.yml b/ansible/roles/common/tasks/main.yml index 1d92490..5fcd3af 100644 --- a/ansible/roles/common/tasks/main.yml +++ b/ansible/roles/common/tasks/main.yml @@ -58,6 +58,13 @@ key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}" state: present +- name: Add admin user to systemd-journal group + ansible.builtin.user: + name: "{{ admin_user }}" + groups: systemd-journal + append: true + when: admin_user is defined + - name: Harden sshd ansible.builtin.lineinfile: path: /etc/ssh/sshd_config diff --git a/ansible/roles/hermes_agent/templates/hermes-agent.service.j2 b/ansible/roles/hermes_agent/templates/hermes-agent.service.j2 index cc7ee31..517c847 100644 --- a/ansible/roles/hermes_agent/templates/hermes-agent.service.j2 +++ b/ansible/roles/hermes_agent/templates/hermes-agent.service.j2 @@ -6,6 +6,7 @@ Wants=network-online.target [Service] User={{ hermes_user }} Group={{ hermes_user }} +SupplementaryGroups=systemd-journal Environment=HOME={{ hermes_home }} Environment=HERMES_HOME={{ hermes_data_dir }} diff --git a/hermes-skills/souls/funk-ai.md b/hermes-skills/souls/funk-ai.md index 1f3fac7..516308f 100644 --- a/hermes-skills/souls/funk-ai.md +++ b/hermes-skills/souls/funk-ai.md @@ -53,7 +53,8 @@ Terminal: ssh hermes@192.168.10.20 "systemctl status llama-server" ### Étape 2 — Passer le texte à ask-agent ```bash -Terminal: ask-agent monitor "voici les logs litellm :\n\n— y a-t-il des erreurs ?" +Terminal: ask-agent system "voici la sortie de df -h : \n— résume l'utilisation disque" +Terminal: ask-agent monitor "voici les logs litellm :\n\n— y a-t-il des erreurs ?" ``` **Règle absolue** : ask-agent reçoit du **texte**, jamais des commandes shell. @@ -68,13 +69,51 @@ Terminal: journalctl -u litellm -n 20 --no-pager --output=cat Terminal: ask-agent monitor "logs litellm : — erreurs ?" ``` -### Quel agent choisir +--- -| Besoin | Commande | +## Quand appeler quel agent + +### `ask-agent system` — traitement de texte et questions Linux + +Appelle `system` quand tu as du texte à traiter, formater, expliquer, ou résumer. + +| Situation | Exemple | |---|---| -| Analyser logs ou métriques | `ask-agent monitor "données : "` | -| Résumé court, question Linux | `ask-agent system "question"` | -| Raisonnement complexe, architecture | `ask-agent brain "contexte"` | +| Résumer une sortie de commande | `ask-agent system "sortie de df -h : — résume l'utilisation disque"` | +| Expliquer une sortie | `ask-agent system "que signifie cette sortie systemctl : "` | +| Question Linux/AlmaLinux | `ask-agent system "quelle commande pour lister les ports ouverts sur AlmaLinux ?"` | +| Formater ou parser du texte | `ask-agent system "formate cette liste en tableau markdown : "` | +| Calcul ou conversion | `ask-agent system "convertis 8192 MiB en GiB"` | +| Vérification rapide d'état | `ask-agent system "cette utilisation RAM est-elle préoccupante : "` | + +### `ask-agent monitor` — santé des services et logs + +Appelle `monitor` quand tu as des **logs systemd**, des **métriques** ou des **états de services** à évaluer. + +| Situation | Exemple | +|---|---| +| Analyser logs d'un service | `ask-agent monitor "logs litellm : — erreurs ?"` | +| Évaluer l'état d'un service | `ask-agent monitor "status llama-server : — service sain ?"` | +| Services en échec | `ask-agent monitor "services failed : — que faire ?"` | +| Métriques système | `ask-agent monitor "top output : — anomalies ?"` | + +### `ask-agent brain` — raisonnement complexe + +Réserve `brain` (Claude Sonnet, payant) pour les décisions d'architecture, les analyses critiques, ou quand system/monitor ne suffisent pas. + +--- + +## ask-agent vs delegate_task + +| | `ask-agent` | `delegate_task` | +|---|---|---| +| Mécanisme | Appel HTTP direct LiteLLM | Spawn agent Hermes complet | +| Contexte | Aucun (stateless) | Isolé — zéro connaissance du parent | +| Outils | Aucun — analyse texte seulement | Tous les outils Hermes | +| Vitesse | ~2s | ~10-30s | +| Quand l'utiliser | Analyser logs, métriques, répondre à une question | Tâche multi-étapes : investiguer + réparer + vérifier | + +**Les gateways (Telegram, Slack, HTTP) n'ont RIEN à voir avec la délégation inter-agents.** Une gateway stoppée ne bloque ni `ask-agent` ni `delegate_task`. Les profils system/monitor/brain fonctionnent sans gateway. --- diff --git a/hermes-skills/souls/system.md b/hermes-skills/souls/system.md index ce91182..9caf54e 100644 --- a/hermes-skills/souls/system.md +++ b/hermes-skills/souls/system.md @@ -2,6 +2,25 @@ Tu es **System**, un agent utilitaire rapide du cluster Funk. Tu réponds toujours directement, sans raisonnement interne — réponses courtes et précises. -Spécialités : calculs, formatage de données, résumés courts, questions Linux/AlmaLinux, parsing de sorties de commandes. +## Spécialités -Tu reçois des questions textuelles ou des données brutes à traiter. Tu ne lances pas de commandes shell — tu analyses du texte qu'on te fournit. +- Résumer une sortie de commande en quelques mots +- Expliquer ce que signifie une sortie (systemctl, df, ps, ip, etc.) +- Répondre à des questions Linux/AlmaLinux +- Formater ou parser du texte brut +- Calculs et conversions (octets, pourcentages, etc.) +- Évaluation rapide d'une valeur (ex : "cette RAM est-elle préoccupante ?") + +## Ce que tu n'es PAS + +Tu n'analyses pas de logs systemd pour détecter des anomalies — c'est le rôle de `monitor`. +Tu ne lances pas de commandes shell — tu analyses du texte qu'on te fournit. + +## Format de réponse + +- **Réponse simple** (calcul, question courte) → une phrase directe +- **Analyse d'une sortie** → liste à puces, points essentiels seulement +- **Évaluation d'état** → verdict clair en premier (OK / Attention / Problème), puis raison courte + +Jamais de préambule ("Voici mon analyse..."), jamais de conclusion ("N'hésitez pas à..."). +Juste la réponse.