mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 18:24:42 +02:00
docs: réorganisation complète de admin/ en 4 domaines thématiques
Structure avant : 20 fichiers à plat dans admin/ — difficile à naviguer.
Structure après : 4 sous-répertoires thématiques + index clair.
Réorganisation :
admin/ops/ → cluster.md, ansible.md, systeme.md
admin/infra/ → reseau.md, nfs.md, dnsmasq.md, ssh.md
admin/k8s/ → talos.md, argocd.md, monitoring.md
admin/ia/ → llama_server.md, rocm.md, litellm.md, hermes.md
Suppressions :
- ask-agent.md : contenu fusionné dans ia/hermes.md (section ask-agent)
- lm_studio.md : obsolète (LM Studio remplacé par llama-server)
Mises à jour contenu :
- ia/hermes.md : fusion complète avec ask-agent.md (profils, skills,
SOUL.md, ask-agent CLI, dépannage) — doc unifiée sans redondance
- ops/cluster.md : section GitOps réduite à 2 lignes + lien argocd.md
- incidents.md : tableau de résumé en tête + 4 nouveaux incidents
(Grafana OOMKilled, AlertManager null receiver, llama-server 501,
nftables règle après drop)
- README.md : réécrit — navigation rapide + index par domaine
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d552abd2ef
commit
5bcf95b82e
19 changed files with 633 additions and 677 deletions
|
|
@ -1,32 +1,72 @@
|
|||
# Administration Funk — Index
|
||||
|
||||
## Navigation rapide
|
||||
|
||||
| Besoin | Fichier |
|
||||
|---|---|
|
||||
| Allumer / éteindre le homelab | [ops/cluster.md](ops/cluster.md) |
|
||||
| Déployer quelque chose sur k8s | [k8s/argocd.md](k8s/argocd.md) |
|
||||
| Débugger l'inférence LLM | [ia/llama_server.md](ia/llama_server.md) · [ia/rocm.md](ia/rocm.md) |
|
||||
| Débugger Hermes / ask-agent | [ia/hermes.md](ia/hermes.md) |
|
||||
| Voir les métriques / alertes | [k8s/monitoring.md](k8s/monitoring.md) |
|
||||
| Problème réseau / nftables | [infra/reseau.md](infra/reseau.md) |
|
||||
| Problème NFS / stockage | [infra/nfs.md](infra/nfs.md) |
|
||||
| Incident passé | [incidents.md](incidents.md) |
|
||||
|
||||
---
|
||||
|
||||
## Guides d'installation (première mise en place)
|
||||
|
||||
| Guide | Cible |
|
||||
|---|---|
|
||||
| [install/storage-01.md](install/storage-01.md) | AlmaLinux + RAID5 + Ansible + stack IA complète |
|
||||
| [install/gpu-01.md](install/gpu-01.md) | AlmaLinux + ROCm + llama-server (RX 6700XT) |
|
||||
| [install/kubernetes.md](install/kubernetes.md) | Talos + MetalLB + Traefik + DNS wildcard |
|
||||
| [install/kubernetes.md](install/kubernetes.md) | Talos + MetalLB + Traefik + DNS wildcard + NFS + monitoring |
|
||||
|
||||
## Référence opérationnelle (administration courante)
|
||||
---
|
||||
|
||||
## ops/ — Opérations quotidiennes
|
||||
|
||||
| Fichier | Contenu |
|
||||
|---|---|
|
||||
| [ansible.md](ansible.md) | Commandes Ansible — ping, apply, vault, debug, facts |
|
||||
| [ssh.md](ssh.md) | Connexions SSH — alias, jump host, transfert de fichiers |
|
||||
| [reseau.md](reseau.md) | nftables, IP forwarding, routage, debug NAT |
|
||||
| [dnsmasq.md](dnsmasq.md) | DNS local lab.local — résolution, logs, ajout d'entrées |
|
||||
| [rocm.md](rocm.md) | GPU AMD RX 6700XT — ROCm, HSA_OVERRIDE, debug |
|
||||
| [llama_server.md](llama_server.md) | llama-server — inférence ROCm 7.x, API OpenAI, build, modèles |
|
||||
| [lm_studio.md](lm_studio.md) | LM Studio — supprimé du cluster, CLI `lms` conservée pour téléchargement modèles |
|
||||
| [nfs.md](nfs.md) | NFS + RAID5 — exports, montages, automount, ajout de partages |
|
||||
| [systeme.md](systeme.md) | Services, logs, ressources, NetworkManager, dnf |
|
||||
| [litellm.md](litellm.md) | LiteLLM Proxy — routage Qwen local + Claude API, config, validation |
|
||||
| [hermes.md](hermes.md) | Hermes Agent — service, profils, skills, config, debug |
|
||||
| [ask-agent.md](ask-agent.md) | Délégation inter-agents — ask-agent CLI + skill agent-delegation |
|
||||
| [talos.md](talos.md) | Talos Linux — administration quotidienne du cluster k8s |
|
||||
| [incidents.md](incidents.md) | Incidents passés — causes, résolutions, fixes permanents |
|
||||
| **Gestion cluster** | |
|
||||
| [cluster.md](cluster.md) | Démarrage / arrêt / status — `funk-start`, `funk-stop`, `funk-stop --k8s` |
|
||||
| [argocd.md](argocd.md) | ArgoCD GitOps — installation, déploiement d'apps, dépannage |
|
||||
| [monitoring.md](monitoring.md) | Grafana + Prometheus + AlertManager — accès, comptes, métriques GPU/llama-server, webhook Hermes |
|
||||
| [ops/cluster.md](ops/cluster.md) | `funk-start`, `funk-stop`, `funk-status` — démarrage/arrêt cluster complet |
|
||||
| [ops/ansible.md](ops/ansible.md) | Commandes Ansible — ping, apply, vault, debug, facts |
|
||||
| [ops/systeme.md](ops/systeme.md) | Services systemd, logs, ressources, NetworkManager, dnf |
|
||||
|
||||
---
|
||||
|
||||
## infra/ — Infrastructure socle
|
||||
|
||||
| Fichier | Contenu |
|
||||
|---|---|
|
||||
| [infra/reseau.md](infra/reseau.md) | nftables, IP forwarding, routage, NAT, debug |
|
||||
| [infra/nfs.md](infra/nfs.md) | NFS + RAID5 — exports, montages, automount, ajout de partages |
|
||||
| [infra/dnsmasq.md](infra/dnsmasq.md) | DNS local `lab.local` — résolution, logs, ajout d'entrées |
|
||||
| [infra/ssh.md](infra/ssh.md) | Connexions SSH — alias, jump host, transfert de fichiers |
|
||||
|
||||
---
|
||||
|
||||
## k8s/ — Cluster Kubernetes
|
||||
|
||||
| Fichier | Contenu |
|
||||
|---|---|
|
||||
| [k8s/talos.md](k8s/talos.md) | Talos Linux — talhelper, nœuds, upgrades, backup etcd |
|
||||
| [k8s/argocd.md](k8s/argocd.md) | ArgoCD GitOps — App of Apps, déploiement, dépannage |
|
||||
| [k8s/monitoring.md](k8s/monitoring.md) | Grafana · Prometheus · AlertManager — métriques, dashboards, alertes |
|
||||
|
||||
---
|
||||
|
||||
## ia/ — Stack IA Funk
|
||||
|
||||
| Fichier | Contenu |
|
||||
|---|---|
|
||||
| [ia/llama_server.md](ia/llama_server.md) | llama-server — 3 instances (GPU+CPU), métriques, build, modèles |
|
||||
| [ia/rocm.md](ia/rocm.md) | GPU RX 6700XT — ROCm, `HSA_OVERRIDE_GFX_VERSION`, debug |
|
||||
| [ia/litellm.md](ia/litellm.md) | LiteLLM Proxy — routage Qwen local + Claude API, config, validation |
|
||||
| [ia/hermes.md](ia/hermes.md) | Hermes Agent + ask-agent — profils, skills, SOUL.md, délégation |
|
||||
|
||||
---
|
||||
|
||||
## incidents.md
|
||||
|
||||
[incidents.md](incidents.md) — historique des incidents avec causes, résolutions et fixes permanents.
|
||||
|
|
|
|||
|
|
@ -1,249 +0,0 @@
|
|||
# Délégation inter-agents — ask-agent + skill agent-delegation
|
||||
|
||||
Le cluster Funk dispose de 4 agents spécialisés accessibles via la commande `ask-agent`.
|
||||
Le skill `funk/agent-delegation` enseigne à Hermes (profil `funk-ai`) comment et quand
|
||||
les utiliser pour décomposer des tâches.
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
funk-ai (Qwen3-8B GPU — profil principal)
|
||||
│
|
||||
│ Terminal: ask-agent <agent> "question"
|
||||
▼
|
||||
ask-agent (/usr/local/bin/ask-agent)
|
||||
│ POST http://127.0.0.1:4000/v1/chat/completions
|
||||
▼
|
||||
LiteLLM Proxy (:4000)
|
||||
├── ask-agent system → qwen3-1.7b-system (CPU :1236)
|
||||
├── ask-agent monitor → qwen3-1.7b-monitor (CPU :1237)
|
||||
├── ask-agent brain → claude-sonnet-4-6 (API Anthropic)
|
||||
└── ask-agent funk-ai → qwen3-8b (GPU :1234)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Agents disponibles
|
||||
|
||||
| Agent | Modèle | Vitesse | Coût | Usage idéal |
|
||||
|---|---|---|---|---|
|
||||
| `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
|
||||
|
||||
```bash
|
||||
# Syntaxe
|
||||
ask-agent <agent> "<question>"
|
||||
ask-agent <agent> "<question>" [--max-tokens N] [--system "<prompt système>"]
|
||||
|
||||
# Exemples
|
||||
ask-agent system "quelle commande pour lister les ports en écoute ?"
|
||||
ask-agent monitor "analyse ces logs systemd : <coller logs>"
|
||||
ask-agent brain "architecture optimale pour ce schéma k8s : <contexte>"
|
||||
ask-agent system "calcule la taille totale en Go de ces fichiers : <ls -lh output>"
|
||||
|
||||
# Avec prompt système personnalisé
|
||||
ask-agent monitor "est-ce que ces métriques sont normales ?" \
|
||||
--system "Tu es expert Linux AlmaLinux, réponds en 1 phrase max."
|
||||
|
||||
# Max tokens (défaut : 1000)
|
||||
ask-agent brain "revois ce manifest k8s" --max-tokens 3000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Skill Hermes — agent-delegation
|
||||
|
||||
Le skill `funk/agent-delegation` est installé dans le profil `funk-ai`.
|
||||
Il charge automatiquement le contexte suivant dans chaque session Hermes :
|
||||
- La liste des 4 agents et leurs spécialités
|
||||
- Le pattern "collecter localement → déléguer"
|
||||
- La règle "tu tournes sur storage-01, ne pas SSH vers toi-même"
|
||||
|
||||
### Localisation du skill
|
||||
|
||||
```
|
||||
/srv/data/hermes/skills/funk/agent-delegation/SKILL.md ← source (Git)
|
||||
/srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md ← profil actif
|
||||
```
|
||||
|
||||
Le fichier source est versionné dans le repo lab :
|
||||
```
|
||||
hermes-skills/funk/agent-delegation/SKILL.md
|
||||
```
|
||||
|
||||
### Utilisation depuis Hermes TUI
|
||||
|
||||
Hermes utilise `ask-agent` via l'outil Terminal — pas un appel API direct.
|
||||
Le skill lui indique d'utiliser exactement :
|
||||
|
||||
```
|
||||
Terminal: ask-agent system "ta question"
|
||||
Terminal: ask-agent monitor "ta question"
|
||||
Terminal: ask-agent brain "ta question"
|
||||
```
|
||||
|
||||
Pattern typique (Hermes collecte en local, délègue l'analyse) :
|
||||
|
||||
```
|
||||
Terminal: systemctl --state=failed --no-pager
|
||||
Terminal: ask-agent monitor "voici les services en erreur : <résultat> — résume les problèmes"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Gestion des skills dans Hermes
|
||||
|
||||
### Pourquoi le skill doit être dans le profil
|
||||
|
||||
Hermes charge les skills depuis `$HERMES_HOME/profiles/<profil>/skills/`.
|
||||
Un skill placé uniquement dans `$HERMES_HOME/skills/` **n'est pas chargé** par le profil.
|
||||
|
||||
```bash
|
||||
# Vérifier les skills du profil funk-ai
|
||||
sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list | grep -i funk
|
||||
|
||||
# État attendu :
|
||||
# │ agent-delegation │ funk │ local │ local │ enabled │
|
||||
```
|
||||
|
||||
### Ajouter un skill custom à un profil
|
||||
|
||||
```bash
|
||||
# 1. Créer le skill dans le repo (versionné)
|
||||
mkdir -p hermes-skills/funk/<nom-skill>
|
||||
vim hermes-skills/funk/<nom-skill>/SKILL.md
|
||||
|
||||
# 2. Déployer dans le répertoire global HERMES_HOME
|
||||
sudo mkdir -p /srv/data/hermes/skills/funk/<nom-skill>
|
||||
sudo cp hermes-skills/funk/<nom-skill>/SKILL.md /srv/data/hermes/skills/funk/<nom-skill>/
|
||||
|
||||
# 3. Copier dans le profil cible
|
||||
sudo mkdir -p /srv/data/hermes/profiles/funk-ai/skills/funk/<nom-skill>
|
||||
sudo cp /srv/data/hermes/skills/funk/<nom-skill>/SKILL.md \
|
||||
/srv/data/hermes/profiles/funk-ai/skills/funk/<nom-skill>/
|
||||
sudo chown -R hermes:hermes /srv/data/hermes/profiles/funk-ai/skills/funk
|
||||
|
||||
# 4. Redémarrer le service
|
||||
sudo systemctl restart hermes-agent
|
||||
|
||||
# 5. Vérifier
|
||||
sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list | grep funk
|
||||
```
|
||||
|
||||
### Mettre à jour un skill existant
|
||||
|
||||
```bash
|
||||
# Modifier le source dans le repo
|
||||
vim hermes-skills/funk/agent-delegation/SKILL.md
|
||||
|
||||
# Synchroniser vers les deux emplacements
|
||||
sudo cp hermes-skills/funk/agent-delegation/SKILL.md \
|
||||
/srv/data/hermes/skills/funk/agent-delegation/SKILL.md
|
||||
sudo cp hermes-skills/funk/agent-delegation/SKILL.md \
|
||||
/srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md
|
||||
sudo chown hermes:hermes /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md
|
||||
|
||||
sudo systemctl restart hermes-agent
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Script ask-agent — référence technique
|
||||
|
||||
Déployé sur storage-01 : `/usr/local/bin/ask-agent`
|
||||
Source versionnée : `ansible/roles/litellm/files/ask-agent`
|
||||
|
||||
```bash
|
||||
# Déployer manuellement (si pas via Ansible)
|
||||
scp ansible/roles/litellm/files/ask-agent s01:/tmp/
|
||||
ssh s01 "sudo cp /tmp/ask-agent /usr/local/bin/ask-agent && sudo chmod +x /usr/local/bin/ask-agent"
|
||||
|
||||
# Redéployer via Ansible
|
||||
ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags litellm
|
||||
```
|
||||
|
||||
Paramètres hardcodés dans le script :
|
||||
|
||||
| Paramètre | Valeur |
|
||||
|---|---|
|
||||
| LiteLLM URL | `http://127.0.0.1:4000/v1/chat/completions` |
|
||||
| API key | `lm-studio` (= master_key LiteLLM) |
|
||||
| Timeout | 120s (curl) |
|
||||
| stream | false |
|
||||
|
||||
---
|
||||
|
||||
## Dépannage
|
||||
|
||||
### ask-agent retourne du garbage
|
||||
|
||||
Le modèle GGUF est peut-être corrompu (signe d'une erreur disque précédente).
|
||||
```bash
|
||||
ssh g01 "sudo systemctl status llama-server-system"
|
||||
ssh g01 "md5sum /mnt/models/<chemin-vers-gguf>"
|
||||
```
|
||||
|
||||
### ask-agent timeout
|
||||
|
||||
LiteLLM ou llama-server ne répond pas.
|
||||
```bash
|
||||
ssh s01 "curl -s http://localhost:4000/health -H 'Authorization: Bearer lm-studio'"
|
||||
ssh g01 "systemctl status llama-server-system llama-server-monitor"
|
||||
```
|
||||
|
||||
### Le skill n'est pas chargé dans Hermes
|
||||
|
||||
Vérifier la présence dans le profil :
|
||||
```bash
|
||||
sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/
|
||||
```
|
||||
Si absent → copier depuis `/srv/data/hermes/skills/funk/agent-delegation/` et redémarrer.
|
||||
|
||||
### Hermes fait du SSH vers storage-01
|
||||
|
||||
Le skill lui dit "tu es déjà sur storage-01" — mais si une ancienne session Hermes est
|
||||
ouverte, le skill chargé est l'ancienne version. Fermer la session TUI et en ouvrir une
|
||||
nouvelle après chaque modification du skill.
|
||||
|
||||
---
|
||||
|
||||
## Points d'attention
|
||||
|
||||
| Sujet | Détail |
|
||||
|---|---|
|
||||
| Deux emplacements | Modifier le skill dans le repo ET dans le profil — sinon désynchronisé |
|
||||
| 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 |
|
||||
346
admin/hermes.md
346
admin/hermes.md
|
|
@ -1,346 +0,0 @@
|
|||
# Hermes Agent — Commandes d'administration
|
||||
|
||||
Hermes Agent tourne en deux services systemd sur **storage-01** :
|
||||
- `hermes-agent` — gateway (messagerie, API)
|
||||
- `hermes-dashboard` — interface web (port 9119)
|
||||
|
||||
Il passe par **LiteLLM** (`:4000`) pour toute inférence — Qwen local ou Claude API.
|
||||
Les données persistantes sont sur le RAID5 : `/srv/data/hermes`.
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
funk-ai / brain / system / monitor (alias → profil)
|
||||
│
|
||||
▼ LM_BASE_URL=http://127.0.0.1:4000/v1
|
||||
LiteLLM Proxy (:4000)
|
||||
├── qwen3-8b → llama-server gpu-01 :1234 (GPU RX 6700XT)
|
||||
├── qwen3-1.7b-system → llama-server gpu-01 :1236 (CPU 14 threads)
|
||||
├── qwen3-1.7b-monitor → llama-server gpu-01 :1237 (CPU 14 threads)
|
||||
├── claude-sonnet-4-6 → api.anthropic.com
|
||||
└── claude-opus-4-7 → api.anthropic.com
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Profils
|
||||
|
||||
Hermes supporte plusieurs profils isolés — chacun a son propre `config.yaml`, ses
|
||||
mémoires, sessions et modèle. Tous stockés dans `$HERMES_HOME/profiles/<nom>/`.
|
||||
|
||||
### Tableau des profils
|
||||
|
||||
| Profil | Alias CLI | Modèle | Usage |
|
||||
|---|---|---|---|
|
||||
| `funk-ai` ◆ | `funk-ai` | qwen3-8b (GPU, ~35 tok/s) | Principal — par défaut |
|
||||
| `brain` | `brain` | claude-sonnet-4-6 (API) | Analyse complexe, coûteux |
|
||||
| `system` | `system` | qwen3-1.7b-system (CPU, ~21 tok/s) | Appels rapides |
|
||||
| `monitor` | `monitor` | qwen3-1.7b-monitor (CPU, ~21 tok/s) | Appels rapides |
|
||||
|
||||
`◆` = profil actif par défaut
|
||||
|
||||
### Utilisation
|
||||
|
||||
```bash
|
||||
# Lancer un profil (nouvelle session TUI)
|
||||
funk-ai # Qwen3-8B GPU
|
||||
brain # Claude Sonnet
|
||||
system # Qwen3-1.7B CPU
|
||||
monitor # Qwen3-1.7B CPU
|
||||
|
||||
# Oneshot
|
||||
sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes --profile system -z "ta question"'
|
||||
|
||||
# Changer le profil par défaut
|
||||
sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile use funk-ai'
|
||||
|
||||
# Lister les profils
|
||||
sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile list'
|
||||
```
|
||||
|
||||
> Il n'y a pas de changement de profil à chaud dans le TUI — ouvrir une nouvelle session.
|
||||
|
||||
### Points d'attention profils
|
||||
|
||||
| Sujet | Détail |
|
||||
|---|---|
|
||||
| `HERMES_HOME` | Toujours préfixer les commandes avec `HERMES_HOME=/srv/data/hermes` |
|
||||
| `context_length` | Hermes exige 64k minimum — override via `model.context_length: 65536` dans config.yaml |
|
||||
| GPU vs CPU | system/monitor : Qwen3-1.7B sur 14 CPUs (5950X) — pour appels courts et rapides |
|
||||
| brain | Facturé à l'API Anthropic — réserver aux tâches complexes |
|
||||
|
||||
---
|
||||
|
||||
## Dashboard Web
|
||||
|
||||
Accessible depuis le poste admin uniquement (`192.168.1.10`) :
|
||||
|
||||
```
|
||||
http://192.168.1.200:9119
|
||||
```
|
||||
|
||||
Inclut : gestion des sessions, configuration, API keys.
|
||||
|
||||
> L'onglet Chat (TUI embarqué via WebSocket/PTY) ne s'affiche pas dans le dashboard malgré `--tui`.
|
||||
> Utiliser `hermes-tui` en SSH à la place (voir ci-dessous).
|
||||
|
||||
```bash
|
||||
# Service dashboard
|
||||
sudo systemctl status hermes-dashboard
|
||||
sudo systemctl restart hermes-dashboard
|
||||
sudo journalctl -u hermes-dashboard -f
|
||||
```
|
||||
|
||||
## TUI (chat interactif)
|
||||
|
||||
Le TUI nécessite un terminal interactif (PTY) et doit tourner sous le compte `hermes` :
|
||||
|
||||
```bash
|
||||
# Depuis le poste perso
|
||||
ssh storage-01
|
||||
sudo -i -u hermes # basculer vers le compte hermes
|
||||
cd /srv/data/hermes
|
||||
hermes --tui
|
||||
```
|
||||
|
||||
> Lancer depuis un autre compte (ex: ansible) génère des "gateway error" — toujours utiliser le compte hermes.
|
||||
|
||||
---
|
||||
|
||||
## Service systemd
|
||||
|
||||
```bash
|
||||
sudo systemctl status hermes-agent
|
||||
sudo systemctl restart hermes-agent
|
||||
sudo journalctl -u hermes-agent -f
|
||||
sudo journalctl -u hermes-agent -n 50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Utilisation CLI
|
||||
|
||||
```bash
|
||||
# Chat interactif (depuis storage-01)
|
||||
cd /srv/data/hermes && hermes chat
|
||||
|
||||
# Question one-shot
|
||||
cd /srv/data/hermes && hermes -z "ta question"
|
||||
|
||||
# Statut global
|
||||
hermes status
|
||||
|
||||
# Diagnostics
|
||||
hermes doctor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### config.yaml (profil par défaut : `/srv/data/hermes/config.yaml`)
|
||||
|
||||
```yaml
|
||||
model:
|
||||
provider: lmstudio
|
||||
base_url: "http://127.0.0.1:4000/v1"
|
||||
default: "hermes-default"
|
||||
context_length: 65536
|
||||
|
||||
gateway:
|
||||
host: "0.0.0.0"
|
||||
port: 8080
|
||||
```
|
||||
|
||||
### .env (`/srv/data/hermes/.env`)
|
||||
|
||||
```bash
|
||||
LM_BASE_URL=http://127.0.0.1:4000/v1
|
||||
LM_API_KEY=lm-studio # valeur exacte obligatoire
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Variables d'environnement (service systemd)
|
||||
|
||||
| Variable | Valeur |
|
||||
|---|---|
|
||||
| `HOME` | `/opt/hermes` |
|
||||
| `HERMES_HOME` | `/srv/data/hermes` |
|
||||
| `LM_BASE_URL` | `http://127.0.0.1:4000/v1` |
|
||||
| `LM_API_KEY` | `lm-studio` |
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
Ils enseignent à l'agent des patterns, commandes et procédures spécifiques.
|
||||
|
||||
> **Point d'attention critique** : un skill doit être présent dans **deux endroits** :
|
||||
> - `$HERMES_HOME/skills/<cat>/<nom>/SKILL.md` — répertoire global (référence)
|
||||
> - `$HERMES_HOME/profiles/<profil>/skills/<cat>/<nom>/SKILL.md` — chargé par le profil
|
||||
>
|
||||
> Placer un skill uniquement dans le répertoire global ne suffit pas — le profil ne le charge pas.
|
||||
|
||||
```bash
|
||||
# Lister les skills actifs du profil courant
|
||||
sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list
|
||||
|
||||
# Vérifier qu'un skill est bien dans le profil funk-ai
|
||||
sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/
|
||||
|
||||
# Redémarrer après ajout/modif d'un skill
|
||||
sudo systemctl restart hermes-agent
|
||||
```
|
||||
|
||||
### Skills custom Funk
|
||||
|
||||
| Skill | Catégorie | Usage |
|
||||
|---|---|---|
|
||||
| `agent-delegation` | `funk` | Déléguer des sous-tâches aux agents system/monitor/brain via `ask-agent` |
|
||||
|
||||
Documentation complète : [ask-agent.md](ask-agent.md)
|
||||
|
||||
### Skill Qdrant Vector Search
|
||||
|
||||
```bash
|
||||
# Vérifier le skill installé
|
||||
cat /srv/data/hermes/skills/mlops/qdrant/SKILL.md
|
||||
|
||||
# Tester les embeddings (requis pour le skill)
|
||||
curl -s -X POST http://192.168.10.20:1234/v1/embeddings \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"model":"qwen3-8b","input":["test"]}' | python3 -c \
|
||||
"import sys,json; print('dim:', len(json.load(sys.stdin)['data'][0]['embedding']))"
|
||||
|
||||
# Installer qdrant-client si absent
|
||||
sudo -u hermes /opt/hermes/.hermes/hermes-agent/venv/bin/pip install "qdrant-client>=1.12.0"
|
||||
```
|
||||
|
||||
> Toujours passer par le terminal (fichier /tmp/*.py) pour accéder à Qdrant depuis Hermes,
|
||||
> jamais via execute_code (pas de qdrant-client dans cet environnement).
|
||||
|
||||
---
|
||||
|
||||
## Arborescence
|
||||
|
||||
Depuis l'incident 2026-05-13, le code est sur le SSD OS et les données sur le RAID5.
|
||||
|
||||
```
|
||||
/opt/hermes/ → home utilisateur hermes (SSD OS)
|
||||
├── .local/bin/hermes → wrapper bash → venv hermes-agent
|
||||
└── .hermes/hermes-agent/ → code source + venv Python
|
||||
├── venv/ → environnement Python (uv)
|
||||
├── hermes_cli/ → source CLI
|
||||
└── web/ → source frontend dashboard
|
||||
|
||||
/srv/data/hermes/ → HERMES_HOME (RAID5) — données persistantes
|
||||
├── config.yaml → configuration profil par défaut (géré Ansible)
|
||||
├── .env → LM_BASE_URL, LM_API_KEY (géré Ansible)
|
||||
├── memories/ → mémoire persistante profil par défaut
|
||||
├── sessions/ → historique sessions profil par défaut
|
||||
├── logs/ → logs
|
||||
├── skills/ → skills installées
|
||||
├── state.db → base SQLite état agent
|
||||
└── profiles/ → profils isolés
|
||||
├── funk-ai/ → config.yaml, memories/, sessions/, state.db
|
||||
├── brain/
|
||||
├── system/
|
||||
└── monitor/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Mise à jour de Hermes
|
||||
|
||||
```bash
|
||||
# Stopper les services
|
||||
sudo systemctl stop hermes-dashboard hermes-agent
|
||||
|
||||
# Mettre à jour (depuis le compte hermes)
|
||||
sudo -i -u hermes bash -c 'HOME=/opt/hermes HERMES_HOME=/srv/data/hermes hermes update'
|
||||
|
||||
# Redémarrer
|
||||
sudo systemctl start hermes-agent hermes-dashboard
|
||||
sudo systemctl status hermes-agent hermes-dashboard --no-pager
|
||||
```
|
||||
|
||||
> Après une mise à jour majeure, recompiler le frontend (voir section suivante) et vérifier
|
||||
> que `hermes --tui` fonctionne encore (`npm install --ignore-scripts` dans `/opt/hermes/.hermes/hermes-agent/ui-tui/` si besoin).
|
||||
|
||||
---
|
||||
|
||||
## Recompiler le frontend dashboard
|
||||
|
||||
Si mise à jour de hermes-agent nécessite un rebuild :
|
||||
|
||||
```bash
|
||||
sudo -u hermes bash -c \
|
||||
'HOME=/opt/hermes && \
|
||||
cd /opt/hermes/.hermes/hermes-agent/web && \
|
||||
npm install && npm run build'
|
||||
sudo systemctl restart hermes-dashboard
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Points d'attention
|
||||
|
||||
| Sujet | Détail |
|
||||
|---|---|
|
||||
| Code vs données | Code + venv : `/opt/hermes/.hermes/hermes-agent/` (SSD OS) — Profils/données : `/srv/data/hermes/` (RAID5) |
|
||||
| LiteLLM requis | litellm.service doit tourner avant hermes-agent |
|
||||
| `LM_API_KEY` | Doit valoir `lm-studio` exactement |
|
||||
| Contexte | GPU (funk-ai) : 32768 tokens réels, override Hermes à 65536 via config.yaml |
|
||||
| Contexte CPU | system/monitor : 32768 tokens réels, idem override |
|
||||
| path `hermes -z` | Toujours lancer depuis `/srv/data/hermes` (cherche .git en remontant) |
|
||||
| Gemma 4 | Interdit — crash ROCm sur prompts >800 tokens |
|
||||
| SELinux | Fichiers sur RAID5 ont contexte `unlabeled_t` — exécuter via binaire dans `/opt/hermes/.local/bin/` |
|
||||
| Dashboard | Accessible uniquement depuis `192.168.1.10:9119` (restreint nftables) |
|
||||
| TUI | `hermes --tui` nécessite un TTY — utiliser `sudo hermes-tui` en SSH interactif |
|
||||
| `/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` |
|
||||
428
admin/ia/hermes.md
Normal file
428
admin/ia/hermes.md
Normal file
|
|
@ -0,0 +1,428 @@
|
|||
# Hermes Agent
|
||||
|
||||
Hermes Agent tourne en deux services systemd sur **storage-01** :
|
||||
- `hermes-agent` — gateway (messagerie, inférence, outils)
|
||||
- `hermes-dashboard` — interface web (port 9119)
|
||||
|
||||
Il passe par **LiteLLM** (`:4000`) pour toute inférence — Qwen local ou Claude API.
|
||||
Les données persistantes sont sur le RAID5 : `/srv/data/hermes`.
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Profils Hermes → LiteLLM Proxy (:4000) → llama-server / API Anthropic
|
||||
├── qwen3-8b → gpu-01:1234 (GPU RX 6700XT)
|
||||
├── qwen3-1.7b-system → gpu-01:1236 (CPU 14 threads)
|
||||
├── qwen3-1.7b-monitor → gpu-01:1237 (CPU 14 threads)
|
||||
├── claude-sonnet-4-6 → api.anthropic.com
|
||||
└── claude-opus-4-7 → api.anthropic.com
|
||||
|
||||
Depuis Hermes (TUI ou ask-agent) :
|
||||
funk-ai (principal) ──┐
|
||||
brain ├── LM_BASE_URL=http://127.0.0.1:4000/v1
|
||||
system │
|
||||
monitor ──┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Profils
|
||||
|
||||
| Profil | Alias CLI | Modèle | Usage |
|
||||
|---|---|---|---|
|
||||
| `funk-ai` ◆ | `funk-ai` | qwen3-8b (GPU, ~35 tok/s) | Principal — par défaut |
|
||||
| `brain` | `brain` | claude-sonnet-4-6 (API) | Analyse complexe — facturé |
|
||||
| `system` | `system` | qwen3-1.7b-system (CPU, ~21 tok/s) | Traitement texte rapide |
|
||||
| `monitor` | `monitor` | qwen3-1.7b-monitor (CPU, ~21 tok/s) | Évaluation état services |
|
||||
|
||||
`◆` = profil actif par défaut
|
||||
|
||||
```bash
|
||||
# Lancer un profil (nouvelle session TUI)
|
||||
funk-ai # Qwen3-8B GPU
|
||||
brain # Claude Sonnet
|
||||
system # Qwen3-1.7B CPU
|
||||
monitor # Qwen3-1.7B CPU
|
||||
|
||||
# Oneshot
|
||||
sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes --profile system -z "ta question"'
|
||||
|
||||
# Changer le profil par défaut
|
||||
sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile use funk-ai'
|
||||
|
||||
# Lister les profils
|
||||
sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile list'
|
||||
```
|
||||
|
||||
> Pas de changement de profil à chaud dans le TUI — ouvrir une nouvelle session.
|
||||
|
||||
---
|
||||
|
||||
## Service systemd
|
||||
|
||||
```bash
|
||||
sudo systemctl status hermes-agent
|
||||
sudo systemctl restart hermes-agent
|
||||
sudo journalctl -u hermes-agent -f
|
||||
sudo journalctl -u hermes-agent -n 50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## TUI (chat interactif)
|
||||
|
||||
Le TUI nécessite un TTY et doit tourner sous le compte `hermes` :
|
||||
|
||||
```bash
|
||||
ssh storage-01
|
||||
sudo -i -u hermes
|
||||
cd /srv/data/hermes
|
||||
hermes --tui
|
||||
```
|
||||
|
||||
> Lancer depuis un autre compte génère des "gateway error" — toujours utiliser le compte hermes.
|
||||
|
||||
---
|
||||
|
||||
## Dashboard Web
|
||||
|
||||
Accessible depuis le poste admin uniquement (`192.168.1.10`) :
|
||||
|
||||
```
|
||||
http://192.168.1.200:9119
|
||||
```
|
||||
|
||||
```bash
|
||||
sudo systemctl status hermes-dashboard
|
||||
sudo systemctl restart hermes-dashboard
|
||||
sudo journalctl -u hermes-dashboard -f
|
||||
```
|
||||
|
||||
> L'onglet Chat (TUI via WebSocket) ne fonctionne pas dans le dashboard. Utiliser le TUI SSH.
|
||||
|
||||
---
|
||||
|
||||
## CLI
|
||||
|
||||
```bash
|
||||
# Chat interactif (depuis storage-01, compte hermes)
|
||||
cd /srv/data/hermes && hermes chat
|
||||
|
||||
# Question one-shot
|
||||
cd /srv/data/hermes && hermes -z "ta question"
|
||||
|
||||
# Statut global
|
||||
hermes status
|
||||
|
||||
# Diagnostics
|
||||
hermes doctor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### config.yaml (`/srv/data/hermes/config.yaml`)
|
||||
|
||||
```yaml
|
||||
model:
|
||||
provider: lmstudio
|
||||
base_url: "http://127.0.0.1:4000/v1"
|
||||
default: "hermes-default"
|
||||
context_length: 65536
|
||||
|
||||
gateway:
|
||||
host: "0.0.0.0"
|
||||
port: 8080
|
||||
```
|
||||
|
||||
### .env (`/srv/data/hermes/.env`)
|
||||
|
||||
```bash
|
||||
LM_BASE_URL=http://127.0.0.1:4000/v1
|
||||
LM_API_KEY=lm-studio # valeur exacte obligatoire
|
||||
```
|
||||
|
||||
### Variables d'environnement (service systemd)
|
||||
|
||||
| Variable | Valeur |
|
||||
|---|---|
|
||||
| `HOME` | `/opt/hermes` |
|
||||
| `HERMES_HOME` | `/srv/data/hermes` |
|
||||
| `LM_BASE_URL` | `http://127.0.0.1:4000/v1` |
|
||||
| `LM_API_KEY` | `lm-studio` |
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
```
|
||||
|
||||
Le SOUL.md de `funk-ai` contient : environnement cluster (IPs, machines, services),
|
||||
accès SSH gpu-01, règles `ask-agent`, routing system/monitor/brain, style de réponse.
|
||||
|
||||
```bash
|
||||
# Déployer un SOUL.md depuis le repo
|
||||
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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Skills
|
||||
|
||||
Les skills sont des fichiers `SKILL.md` chargés en contexte dans chaque session Hermes.
|
||||
|
||||
> **Règle critique** : un skill doit être présent dans **deux endroits** :
|
||||
> - `$HERMES_HOME/skills/<cat>/<nom>/SKILL.md` — répertoire global (référence)
|
||||
> - `$HERMES_HOME/profiles/<profil>/skills/<cat>/<nom>/SKILL.md` — chargé par le profil
|
||||
>
|
||||
> Placer un skill uniquement dans le global ne suffit pas.
|
||||
|
||||
```bash
|
||||
# Lister les skills actifs du profil courant
|
||||
sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list
|
||||
|
||||
# Vérifier qu'un skill est dans le profil funk-ai
|
||||
sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/
|
||||
```
|
||||
|
||||
### Skills custom Funk
|
||||
|
||||
| Skill | Catégorie | Usage |
|
||||
|---|---|---|
|
||||
| `agent-delegation` | `funk` | Déléguer des sous-tâches aux agents system/monitor/brain via `ask-agent` |
|
||||
|
||||
### Ajouter un skill custom
|
||||
|
||||
```bash
|
||||
# 1. Créer dans le repo (versionné)
|
||||
mkdir -p hermes-skills/funk/<nom-skill>
|
||||
vim hermes-skills/funk/<nom-skill>/SKILL.md
|
||||
|
||||
# 2. Déployer dans le répertoire global
|
||||
sudo mkdir -p /srv/data/hermes/skills/funk/<nom-skill>
|
||||
sudo cp hermes-skills/funk/<nom-skill>/SKILL.md /srv/data/hermes/skills/funk/<nom-skill>/
|
||||
|
||||
# 3. Copier dans le profil cible
|
||||
sudo mkdir -p /srv/data/hermes/profiles/funk-ai/skills/funk/<nom-skill>
|
||||
sudo cp /srv/data/hermes/skills/funk/<nom-skill>/SKILL.md \
|
||||
/srv/data/hermes/profiles/funk-ai/skills/funk/<nom-skill>/
|
||||
sudo chown -R hermes:hermes /srv/data/hermes/profiles/funk-ai/skills/funk
|
||||
|
||||
# 4. Redémarrer + vérifier
|
||||
sudo systemctl restart hermes-agent
|
||||
sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list | grep funk
|
||||
```
|
||||
|
||||
### Mettre à jour un skill existant
|
||||
|
||||
```bash
|
||||
vim hermes-skills/funk/agent-delegation/SKILL.md
|
||||
|
||||
sudo cp hermes-skills/funk/agent-delegation/SKILL.md \
|
||||
/srv/data/hermes/skills/funk/agent-delegation/SKILL.md
|
||||
sudo cp hermes-skills/funk/agent-delegation/SKILL.md \
|
||||
/srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md
|
||||
sudo chown hermes:hermes \
|
||||
/srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md
|
||||
|
||||
sudo systemctl restart hermes-agent
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ask-agent — Délégation inter-agents
|
||||
|
||||
`ask-agent` permet à Hermes (profil `funk-ai`) de déléguer des sous-tâches
|
||||
aux agents spécialisés. Le skill `funk/agent-delegation` lui enseigne quand et comment.
|
||||
|
||||
```
|
||||
funk-ai (Qwen3-8B GPU)
|
||||
│
|
||||
│ Terminal: ask-agent <agent> "question"
|
||||
▼
|
||||
ask-agent (/usr/local/bin/ask-agent)
|
||||
│ POST http://127.0.0.1:4000/v1/chat/completions
|
||||
▼
|
||||
LiteLLM Proxy (:4000)
|
||||
├── ask-agent system → qwen3-1.7b-system (CPU :1236)
|
||||
├── ask-agent monitor → qwen3-1.7b-monitor (CPU :1237)
|
||||
├── ask-agent brain → claude-sonnet-4-6 (API Anthropic)
|
||||
└── ask-agent funk-ai → qwen3-8b (GPU :1234)
|
||||
```
|
||||
|
||||
### Agents disponibles
|
||||
|
||||
| Agent | Modèle | Usage idéal |
|
||||
|---|---|---|
|
||||
| `system` | Qwen3-1.7B CPU (:1236) | Traitement texte : résumés, formatage, parsing, calculs Linux |
|
||||
| `monitor` | Qwen3-1.7B CPU (:1237) | Évaluation santé : logs systemd, métriques, état des services |
|
||||
| `brain` | Claude Sonnet 4.6 (API) | Raisonnement complexe, architecture — facturé |
|
||||
| `funk-ai` | Qwen3-8B GPU (:1234) | Tâches générales (agent principal lui-même) |
|
||||
|
||||
### system vs monitor
|
||||
|
||||
| Critère | `system` | `monitor` |
|
||||
|---|---|---|
|
||||
| Type de question | "Qu'est-ce que ça signifie ?" / "Résume ça" | "Y a-t-il des erreurs ?" / "Ce service est-il sain ?" |
|
||||
| Output | Réponse directe, liste de faits | Verdict OK/WARNING/ERROR + actions correctives |
|
||||
|
||||
### Utilisation
|
||||
|
||||
```bash
|
||||
# system : traitement de texte
|
||||
ask-agent system "que signifie cette sortie df -h : <texte>"
|
||||
ask-agent system "convertis 8192 MiB en GiB"
|
||||
|
||||
# monitor : évaluation santé
|
||||
ask-agent monitor "logs litellm : <texte> — erreurs ?"
|
||||
ask-agent monitor "status llama-server : <texte> — service sain ?"
|
||||
|
||||
# brain : analyse complexe
|
||||
ask-agent brain "architecture optimale pour ce schéma k8s : <contexte>" --max-tokens 3000
|
||||
|
||||
# Avec prompt système personnalisé
|
||||
ask-agent monitor "est-ce normal ?" --system "Tu es expert Linux, réponds en 1 phrase max."
|
||||
```
|
||||
|
||||
Pattern typique — Hermes collecte en local, délègue l'analyse :
|
||||
```
|
||||
Terminal: systemctl --state=failed --no-pager
|
||||
Terminal: ask-agent monitor "voici les services en erreur : <résultat> — résume les problèmes"
|
||||
```
|
||||
|
||||
### Paramètres du script
|
||||
|
||||
Déployé sur storage-01 : `/usr/local/bin/ask-agent`
|
||||
Source versionnée : `ansible/roles/litellm/files/ask-agent`
|
||||
|
||||
| Paramètre | Valeur |
|
||||
|---|---|
|
||||
| LiteLLM URL | `http://127.0.0.1:4000/v1/chat/completions` |
|
||||
| API key | `lm-studio` |
|
||||
| Timeout | 120s (curl) |
|
||||
| `/no_think` | Préfixé automatiquement pour system et monitor (évite la surconsommation de tokens) |
|
||||
|
||||
```bash
|
||||
# Redéployer via Ansible
|
||||
ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags litellm
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Arborescence
|
||||
|
||||
Depuis l'incident 2026-05-13, le code est sur le SSD OS et les données sur le RAID5.
|
||||
|
||||
```
|
||||
/opt/hermes/ → home utilisateur hermes (SSD OS)
|
||||
├── .local/bin/hermes → wrapper bash → venv hermes-agent
|
||||
└── .hermes/hermes-agent/ → code source + venv Python
|
||||
├── venv/ → environnement Python (uv)
|
||||
├── hermes_cli/ → source CLI
|
||||
└── web/ → source frontend dashboard
|
||||
|
||||
/srv/data/hermes/ → HERMES_HOME (RAID5) — données persistantes
|
||||
├── config.yaml → configuration profil par défaut (géré Ansible)
|
||||
├── .env → LM_BASE_URL, LM_API_KEY (géré Ansible)
|
||||
├── memories/ → mémoire persistante profil par défaut
|
||||
├── sessions/ → historique sessions
|
||||
├── logs/ → logs
|
||||
├── skills/ → skills installées
|
||||
├── state.db → base SQLite état agent
|
||||
└── profiles/ → profils isolés
|
||||
├── funk-ai/ → config.yaml, memories/, sessions/, state.db, SOUL.md
|
||||
├── brain/
|
||||
├── system/
|
||||
└── monitor/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Mise à jour de Hermes
|
||||
|
||||
```bash
|
||||
sudo systemctl stop hermes-dashboard hermes-agent
|
||||
|
||||
sudo -i -u hermes bash -c 'HOME=/opt/hermes HERMES_HOME=/srv/data/hermes hermes update'
|
||||
|
||||
sudo systemctl start hermes-agent hermes-dashboard
|
||||
sudo systemctl status hermes-agent hermes-dashboard --no-pager
|
||||
```
|
||||
|
||||
Si rebuild frontend nécessaire après mise à jour majeure :
|
||||
```bash
|
||||
sudo -u hermes bash -c \
|
||||
'HOME=/opt/hermes && cd /opt/hermes/.hermes/hermes-agent/web && npm install && npm run build'
|
||||
sudo systemctl restart hermes-dashboard
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dépannage
|
||||
|
||||
### ask-agent retourne du garbage
|
||||
|
||||
Modèle GGUF potentiellement corrompu (signe d'erreur disque).
|
||||
```bash
|
||||
ssh g01 "sudo systemctl status llama-server-system"
|
||||
ssh g01 "md5sum /mnt/models/<chemin-gguf>"
|
||||
```
|
||||
|
||||
### ask-agent timeout
|
||||
|
||||
LiteLLM ou llama-server ne répond pas.
|
||||
```bash
|
||||
ssh s01 "curl -s http://localhost:4000/health -H 'Authorization: Bearer lm-studio'"
|
||||
ssh g01 "systemctl status llama-server-system llama-server-monitor"
|
||||
```
|
||||
|
||||
### Le skill n'est pas chargé
|
||||
|
||||
```bash
|
||||
sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/
|
||||
```
|
||||
Si absent → copier depuis `/srv/data/hermes/skills/funk/agent-delegation/` et redémarrer.
|
||||
|
||||
### Hermes fait SSH vers storage-01
|
||||
|
||||
Le skill lui dit "tu es déjà sur storage-01". Une session déjà ouverte charge l'ancien skill.
|
||||
Fermer le TUI et en ouvrir un nouveau après chaque modification.
|
||||
|
||||
---
|
||||
|
||||
## Points d'attention
|
||||
|
||||
| Sujet | Détail |
|
||||
|---|---|
|
||||
| Code vs données | Code + venv : `/opt/hermes/.hermes/hermes-agent/` (SSD OS) — Profils/données : `/srv/data/hermes/` (RAID5) |
|
||||
| `HERMES_HOME` | Toujours préfixer les commandes hermes avec `HERMES_HOME=/srv/data/hermes` |
|
||||
| `LM_API_KEY` | Doit valoir `lm-studio` exactement |
|
||||
| `context_length` | Hermes exige 64k minimum — override via `model.context_length: 65536` dans config.yaml |
|
||||
| `hermes -z` path | Toujours lancer depuis `/srv/data/hermes` (cherche .git en remontant) |
|
||||
| LiteLLM requis | `litellm.service` doit tourner avant `hermes-agent` |
|
||||
| Skills double emplacement | Tout skill custom doit être dans `skills/` ET dans `profiles/funk-ai/skills/` |
|
||||
| Restart après skill | `systemctl restart hermes-agent` obligatoire après ajout ou modification d'un skill |
|
||||
| brain coûteux | Claude Sonnet API — réserver aux analyses que system/monitor ne peuvent pas faire |
|
||||
| Gemma 4 interdit | Crash ROCm sur prompts >800 tokens |
|
||||
| Dashboard | Accessible uniquement depuis `192.168.1.10:9119` (restreint nftables) |
|
||||
| TUI | `hermes --tui` nécessite un TTY — utiliser SSH interactif sous le compte hermes |
|
||||
| `systemd-journal` | Le service inclut ce groupe — `journalctl` fonctionne sans sudo dans le Terminal de Hermes |
|
||||
|
|
@ -46,7 +46,7 @@ sudo journalctl -u litellm -n 50
|
|||
| `claude-opus-4-7` | Anthropic API | Plus cher, meilleur raisonnement |
|
||||
|
||||
> `qwen3-1.7b-system` et `qwen3-1.7b-monitor` sont utilisés par `ask-agent system` et
|
||||
> `ask-agent monitor` — voir [ask-agent.md](ask-agent.md).
|
||||
> `ask-agent monitor` — voir [hermes.md](hermes.md).
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -1,5 +1,145 @@
|
|||
# Incidents — Historique et résolutions
|
||||
|
||||
## Index
|
||||
|
||||
| Date | Composant | Résumé | Sévérité |
|
||||
|---|---|---|---|
|
||||
| 2026-05-14 | Grafana | OOMKilled — limite 256Mi trop serrée pour Grafana 13 | Warning |
|
||||
| 2026-05-13 | AlertManager | Receiver "null" non défini — ReconciliationFailed | Warning |
|
||||
| 2026-05-13 | llama-server | `/metrics` retourne 501 Not Implemented — flag `--metrics` absent | Warning |
|
||||
| 2026-05-13 | nftables storage-01 | Règle monitoring ajoutée après le drop — paquets bloqués | Warning |
|
||||
| 2026-05-13 | storage-01 | Corruption EXT4 + réinstallation hermes-agent | Critique |
|
||||
| 2026-05-11 | storage-01 | Boucle fsck après coupure de courant — XFS corrompu | Critique |
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-14 — Grafana : OOMKilled (limite mémoire trop serrée)
|
||||
|
||||
### Symptôme
|
||||
|
||||
Erreurs "No available server" intermittentes sur `grafana.lab.local`. Pod en CrashLoop.
|
||||
|
||||
```bash
|
||||
kubectl describe pod -n monitoring -l app.kubernetes.io/name=grafana
|
||||
# → Last State: Terminated, Reason: OOMKilled, Exit Code: 137
|
||||
# → RESTARTS: 5
|
||||
```
|
||||
|
||||
### Cause
|
||||
|
||||
Limite mémoire à 256Mi dans `k8s/infra/monitoring/values.yaml`. Grafana 13 consomme plus que ses prédécesseurs — OOM systématique. Traefik perd le backend pendant chaque redémarrage.
|
||||
|
||||
### Résolution
|
||||
|
||||
Augmenter les limites dans `k8s/infra/monitoring/values.yaml` :
|
||||
|
||||
```yaml
|
||||
grafana:
|
||||
resources:
|
||||
requests:
|
||||
memory: 256Mi
|
||||
limits:
|
||||
memory: 1Gi # était 256Mi
|
||||
```
|
||||
|
||||
`git push` → ArgoCD applique → pod redémarre proprement.
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-13 — AlertManager : ReconciliationFailed — receiver "null" non défini
|
||||
|
||||
### Symptôme
|
||||
|
||||
AlertManager en erreur dans ArgoCD. Logs :
|
||||
```
|
||||
level=error msg="loading configuration" err="undefined receiver \"null\" used in route"
|
||||
```
|
||||
|
||||
### Cause
|
||||
|
||||
kube-prometheus-stack génère en interne une sous-route référençant le receiver `"null"` pour le heartbeat Watchdog. Une config AlertManager custom qui ne définissait pas ce receiver cassait la validation.
|
||||
|
||||
### Résolution
|
||||
|
||||
Ajouter explicitement le receiver et la route dans `values.yaml` :
|
||||
|
||||
```yaml
|
||||
alertmanager:
|
||||
config:
|
||||
route:
|
||||
routes:
|
||||
- matchers:
|
||||
- alertname = "Watchdog"
|
||||
receiver: "null"
|
||||
repeat_interval: 24h
|
||||
receivers:
|
||||
- name: "null" # obligatoire même si vide
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-13 — llama-server : /metrics retourne 501 Not Implemented
|
||||
|
||||
### Symptôme
|
||||
|
||||
Prometheus ne scrappe rien sur les jobs `llama-server-*`. Targets en erreur avec `501 Not Implemented`.
|
||||
|
||||
### Cause
|
||||
|
||||
Le flag `--metrics` doit être passé explicitement à llama-server pour activer l'endpoint `/metrics`. Sans lui, la route existe mais répond 501.
|
||||
|
||||
### Résolution
|
||||
|
||||
Ajouter `--metrics` dans le service systemd (template Ansible `llama-server.service.j2`) :
|
||||
|
||||
```ini
|
||||
ExecStart=/opt/llama.cpp/build/bin/llama-server \
|
||||
...
|
||||
--metrics \
|
||||
--log-disable
|
||||
```
|
||||
|
||||
Fix live sur les 3 instances + `daemon-reload` + restart :
|
||||
```bash
|
||||
# Sur gpu-01
|
||||
for svc in llama-server llama-server-system llama-server-monitor; do
|
||||
sudo sed -i 's/--log-disable/--metrics \\\n --log-disable/' /etc/systemd/system/$svc.service
|
||||
done
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart llama-server llama-server-system llama-server-monitor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-13 — nftables storage-01 : règle monitoring bloquée par le drop
|
||||
|
||||
### Symptôme
|
||||
|
||||
Prometheus ne pouvait pas scrapper `storage-01:9100` (node_exporter) ni recevoir les webhooks AlertManager sur `:9093`. Targets en `connection refused` dans Prometheus.
|
||||
|
||||
### Cause
|
||||
|
||||
`nft add rule` ajoute la règle **en fin de chaîne**, après la règle terminale `log prefix "nft-drop:" drop`. Les paquets étaient droppés avant d'atteindre la nouvelle règle.
|
||||
|
||||
```bash
|
||||
# Vérifier l'ordre
|
||||
sudo nft -n -a list chain inet filter input
|
||||
# → handle 22 : log drop (terminal)
|
||||
# → handle 27 : tcp dport { 9093, 9100 } accept (ajouté APRÈS → jamais atteint)
|
||||
```
|
||||
|
||||
### Résolution
|
||||
|
||||
Supprimer la règle mal placée et la réinsérer **avant** le drop avec `insert rule position` :
|
||||
|
||||
```bash
|
||||
sudo nft delete rule inet filter input handle 27
|
||||
sudo nft insert rule inet filter input position 22 \
|
||||
tcp dport { 9093, 9100 } ip saddr 192.168.10.0/24 accept
|
||||
```
|
||||
|
||||
Fix permanent dans le template Ansible `nftables.conf.j2` : placer la règle avant la règle drop.
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-13 — storage-01 : corruption EXT4 après arrêt brutal + reinstall hermes-agent
|
||||
|
|
|
|||
|
|
@ -1,46 +0,0 @@
|
|||
# LM Studio — Historique
|
||||
|
||||
> **LM Studio est supprimé du cluster Funk (2026-05-13).**
|
||||
> L'inférence GPU est assurée par **llama-server** (llama.cpp compilé ROCm 7.x).
|
||||
> L'utilisateur `lmstudio` et le répertoire `/opt/lmstudio` ont été supprimés.
|
||||
> La CLI `lms` reste disponible sur gpu-01 pour télécharger des modèles GGUF.
|
||||
|
||||
---
|
||||
|
||||
## Télécharger des modèles (lms CLI)
|
||||
|
||||
```bash
|
||||
# Lister les modèles installés (stockés sur NFS /mnt/models)
|
||||
ssh g01 "lms ls"
|
||||
|
||||
# Télécharger un modèle depuis HuggingFace
|
||||
ssh g01 "lms get https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF -y"
|
||||
|
||||
# Les modèles sont stockés sur le NFS partagé :
|
||||
# storage-01:/srv/data/models → gpu-01:/mnt/models
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Pourquoi llama-server remplace LM Studio
|
||||
|
||||
| Critère | LM Studio (Vulkan) | llama-server (ROCm) |
|
||||
|---|---|---|
|
||||
| Prefill | ~100 tok/s | ~400 tok/s |
|
||||
| Génération | ~15 tok/s | ~70 tok/s |
|
||||
| Backend | Vulkan (ROCm 6.x uniquement) | ROCm 7.x natif |
|
||||
| API | OpenAI-compatible | OpenAI-compatible |
|
||||
|
||||
Le backend ROCm de LM Studio était compilé pour ROCm 6.x, incompatible avec ROCm 7.x installé.
|
||||
llama.cpp compilé from source avec ROCm 7.x donne un gain de ~5x sur la vitesse d'inférence.
|
||||
|
||||
---
|
||||
|
||||
## Points d'attention
|
||||
|
||||
| Sujet | Détail |
|
||||
|---|---|
|
||||
| GPU non officiel | RX 6700XT (gfx1031) — `HSA_OVERRIDE_GFX_VERSION=10.3.0` dans le service llama-server |
|
||||
| Gemma 4 interdit | Gemma 4 E2B/E4B crash ROCm sur prompts >800 tokens — utiliser Qwen |
|
||||
| Modèles sur NFS | Stockés dans `/mnt/models/` sur gpu-01 (NFS automount depuis storage-01) |
|
||||
| lms get | Télécharger avec `lms get <url-hf>`, puis pointer llama-server sur le GGUF |
|
||||
|
|
@ -105,21 +105,10 @@ Vérifie dans l'ordre :
|
|||
|
||||
---
|
||||
|
||||
## GitOps — ArgoCD
|
||||
## GitOps
|
||||
|
||||
Les workloads k8s sont gérés par ArgoCD. **Ne jamais faire `helm install` ou `kubectl apply` manuellement pour les workloads.**
|
||||
|
||||
```bash
|
||||
# Déployer quelque chose : modifier k8s/ → git push → ArgoCD applique (~3 min)
|
||||
|
||||
# Vérifier l'état des applications
|
||||
kubectl get applications -n argocd
|
||||
|
||||
# Forcer un refresh si ArgoCD n'a pas encore détecté un commit
|
||||
kubectl -n argocd annotate application <nom> argocd.argoproj.io/refresh=hard --overwrite
|
||||
```
|
||||
|
||||
UI : http://argocd.lab.local — voir [argocd.md](argocd.md) pour la doc complète.
|
||||
Modifier `k8s/` → `git push` → ArgoCD applique (~3 min).
|
||||
UI : http://argocd.lab.local — doc complète : [k8s/argocd.md](../k8s/argocd.md)
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -112,7 +112,7 @@ sudo dnf update -y
|
|||
```
|
||||
|
||||
> **Attention post-reboot RAID5** : vérifier que dnsmasq est démarré
|
||||
> (`systemctl status dnsmasq`). Si `failed`, voir `admin/dnsmasq.md`.
|
||||
> (`systemctl status dnsmasq`). Si `failed`, voir [infra/dnsmasq.md](../infra/dnsmasq.md).
|
||||
> Les `.pyc` Python peuvent être corrompus sur reboot non-propre —
|
||||
> symptôme : `bad marshal data` dans les logs d'une app Python.
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue