feat: amélioration routing ask-agent + identité SOUL.md profils

- 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 <noreply@anthropic.com>
This commit is contained in:
alkatrazz 2026-05-13 18:59:48 +02:00
parent ed963180f2
commit 00d10234f9
7 changed files with 140 additions and 10 deletions

View file

@ -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 : <texte>"
ask-agent system "résume l'utilisation disque : <texte>"
ask-agent system "convertis 8192 MiB en GiB"
# → monitor : évaluation de santé
ask-agent monitor "logs litellm : <texte> — erreurs ?"
ask-agent monitor "status llama-server : <texte> — service sain ?"
ask-agent monitor "services failed : <texte> — 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 |

View file

@ -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/<profil>/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` |

View file

@ -1,4 +1,5 @@
---
admin_user: alkatrazz
dns_domain: lab.local
ntp_servers:
- 0.fr.pool.ntp.org

View file

@ -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

View file

@ -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 }}

View file

@ -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<coller résultat étape 1>\n— y a-t-il des erreurs ?"
Terminal: ask-agent system "voici la sortie de df -h : <résultat>\n— résume l'utilisation disque"
Terminal: ask-agent monitor "voici les logs litellm :\n<résultat>\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 : <résultat ci-dessus> — 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 : <texte>"` |
| 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 : <texte> — résume l'utilisation disque"` |
| Expliquer une sortie | `ask-agent system "que signifie cette sortie systemctl : <texte>"` |
| 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 : <texte>"` |
| 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 : <texte>"` |
### `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 : <texte> — erreurs ?"` |
| Évaluer l'état d'un service | `ask-agent monitor "status llama-server : <texte> — service sain ?"` |
| Services en échec | `ask-agent monitor "services failed : <texte> — que faire ?"` |
| Métriques système | `ask-agent monitor "top output : <texte> — 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.
---

View file

@ -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.