me
Back to all articles
Post in FrenchFrench flag
Daryl Ngako

Construire une armée d'agents IA avec Hermes : orchestration, délégation et kanban

Monte une organisation de 48 agents IA sur Hermes : orchestrateur, kanban de délégation, cron autonome et les pièges réels (s6, conflits, environnement minimal).

IAAutomatisationDockerTutoriel
Construire une armée d'agents IA avec Hermes : orchestration, délégation et kanban

Un seul agent IA, c'est déjà puissant. Mais quand tu lui demandes une tâche complexe (faire une veille, produire un rapport, lancer une campagne), il fait tout lui-même, en série, et finit par s'essouffler sur les gros sujets.

L'étape d'après, c'est l'orchestration multi-agents : un chef d'orchestre qui décompose un objectif en tâches, les distribue à des spécialistes, et coordonne le tout. Dans ce guide, je te montre comment j'ai monté une véritable organisation de 48 agents sur Hermes, avec un orchestrateur, des sous-équipes (marketing, dev, sales, R&D) et un tableau kanban partagé qui pilote la délégation.

Tu vas comprendre le système de profils de Hermes, comment exposer un orchestrateur dans une interface de chat, comment fonctionne le kanban de délégation, et comment automatiser tout ça avec un cron. Avec les vrais pièges techniques que j'ai dû résoudre : la limite du superviseur s6, les conflits de bot, et l'environnement minimal qui casse la délégation.

Si tu n'as pas encore Hermes installé sur ton VPS, commence par mon article précédent sur le déploiement Docker. Ici, on construit par-dessus.

C'est quoi un profil dans Hermes ?

Un profil Hermes, c'est une instance isolée de l'agent, avec sa propre configuration : son modèle, ses outils, son authentification, sa personnalité, ses sessions. Pense à ça comme à des employés différents dans une entreprise : chacun a son rôle, ses compétences et son bureau, mais ils partagent les mêmes locaux.

Tu listes tes profils avec :

docker exec -it hermes-api hermes profile list

Dans mon installation, ça affiche 48 profils organisés en hiérarchie :

  • orchestrator : le chef d'orchestre
  • Direction : ceo, cfo, cto, cmo, coo, cro, crdo
  • Plateforme : ops, coder, wikicurator (+ leurs sous-agents)
  • Marketing : mkt-x, mkt-li, reddit (+ analystes, rédacteurs, publishers)
  • Growth : seo et ses spécialistes (technical, content, offpage), geo-specialist
  • Sales : sales, sales-research, sales-copy, sales-crm
  • R&D : rnd, rnd-research, rnd-proto, rnd-eval
  • Qualité : critic (le vérificateur adversarial)

Chaque profil tourne sur un modèle adapté à son rôle : les rôles de coordination utilisent un modèle de raisonnement avancé (type Claude Sonnet), les rôles d'exécution un modèle plus rapide et léger.

Pour voir le détail d'un profil :

docker exec hermes-api hermes profile show orchestrator

Tu obtiens son chemin, son modèle, le nombre de skills, l'état de sa gateway et la présence d'un fichier SOUL.md.

C'est quoi le SOUL.md (et pourquoi c'est le cerveau de l'orchestrateur) ?

Le SOUL.md d'un profil définit sa personnalité et son comportement. Pour l'orchestrateur, c'est le document le plus important du système : il contient la carte de toute l'organisation et les règles de routage.

Voici un extrait du SOUL.md de mon orchestrateur :

You are the Orchestrator of an AI agent organization. You turn a high-level
objective into an explicit plan: decompose it into tasks, assign each to the
best-fit specialist (match by their role description), sequence dependencies,
and run it on the kanban.

You insert human-approval gates before any action that is irreversible, costly,
externally visible, or touches production. You do NOT do specialists' work
yourself.

Ce fichier précise plusieurs choses fondamentales :

  • Le routage : à quel spécialiste confier quel type de tâche.
  • Les flux de travail : pour le marketing, par exemple, analyste (collecte) → rédacteur (draft) → critic (review) → publisher (publication).
  • Les gates d'approbation humaine : avant toute action irréversible, coûteuse ou publique, l'orchestrateur s'arrête et demande validation.
  • La persistance dans le vault : chaque agent dépose ses livrables dans un dossier partagé.

Point clé : deux profils peuvent tourner sur le même modèle mais avoir des SOUL.md différents, donc des comportements radicalement différents. Le SOUL est ce qui transforme un LLM générique en spécialiste.

C'est quoi le kanban de délégation ?

Le kanban Hermes, c'est un tableau de tâches partagé entre tous les profils, stocké dans une base SQLite (kanban.db). C'est le moteur de toute l'organisation.

Le principe : l'orchestrateur reçoit un objectif, le décompose en tâches, les pose sur le board, et chaque tâche est exécutée par le bon profil dans un workspace isolé. Les tâches peuvent dépendre les unes des autres, être réclamées atomiquement, et passer par des étapes (triage, todo, en cours, done).

Tu listes les tâches du board avec :

docker exec hermes-api hermes kanban list

Dans mon système, après plusieurs runs, le board affichait des dizaines de tâches terminées par les bons agents :

✓ done  researcher      Cartographier les concepts du wiki
✓ done  critic          Verify swarm outputs
✓ done  wikicurator     Synthesize swarm outputs
✓ done  mkt-x-analyst   Collecte une veille X sourcée sur l'IA
✓ done  cto             Brief Technologie (ops, dev, doc technique)

C'est la preuve que la délégation fonctionne : un objectif unique (par exemple "produire un rapport exécutif") a mobilisé tous les C-levels, chacun produisant son brief.

Le point important sur le board partagé

Le kanban est unique et partagé entre tous les profils et tous les conteneurs. Que tu crées une tâche depuis n'importe quel profil, elle s'affiche toujours sur le même board. Ce qui change selon la configuration, c'est qui décompose et exécute la tâche, pas où elle s'affiche.

Dans les réglages d'orchestration (accessibles via le dashboard), tu définis :

  • L'Orchestrator Profile : quel agent joue le chef d'orchestre.
  • Le Default Assignee : à qui vont les tâches non assignées.
  • L'Auto-decompose : si l'orchestrateur découpe automatiquement les nouvelles tâches de triage.

Comment exposer l'orchestrateur dans une interface de chat

Tu veux pouvoir parler à ton orchestrateur en langage naturel, pas seulement via le kanban. Pour ça, il faut lancer son serveur API et le brancher dans Open WebUI.

Première découverte importante : dans Hermes, tu ne peux pas faire tourner deux gateways dans le même conteneur. L'image utilise un superviseur s6-overlay qui l'interdit. Si tu tentes de lancer une seconde gateway, tu obtiens :

ERROR gateway.run: Another gateway instance (PID 1) started during our
startup. Exiting to avoid double-running.

La solution propre : un conteneur séparé pour l'orchestrateur. Il partage le même /root/.hermes (donc les mêmes profils, le même kanban, la même auth), mais tourne en isolation sur le profil orchestrator.

Le script de démarrage de l'orchestrateur

start-orchestrator.sh
#!/bin/sh
umask 0000
hermes profile use orchestrator
exec hermes gateway run --no-supervise

Note bien le hermes profile use orchestrator. J'ai d'abord essayé de passer le profil via une variable d'environnement HERMES_PROFILE, mais elle est ignorée par Hermes. La seule méthode fiable pour cibler un profil, c'est hermes profile use.

Le docker-compose de l'orchestrateur

docker-compose.orchestrator.yml
services:
  hermes-orchestrator:
    build: .
    container_name: hermes-orchestrator
    restart: unless-stopped
    expose:
      - "8642"
    environment:
      - DOCKER_HOST=tcp://docker-socket-proxy:2375
    volumes:
      - /home/user/hermes-proxy/auth:/root/.hermes
      - /home/user/hermes-proxy/vault:/root/vault
    networks:
      - n8nnet

networks:
  n8nnet:
    external: true
    name: mon-reseau-docker

Le DOCKER_HOST pointe vers un docker-socket-proxy. C'est une bonne pratique de sécurité : au lieu de monter le socket Docker brut (qui donne un accès root à l'hôte), on passe par un proxy qui filtre les commandes autorisées. L'orchestrateur en a besoin pour créer les conteneurs sandbox de ses sous-agents.

Une fois le conteneur lancé, vérifie qu'il expose bien le bon profil :

docker exec hermes-orchestrator python -c "import urllib.request; r=urllib.request.Request('http://localhost:8642/v1/models', headers={'Authorization':'Bearer TA_CLE_API'}); print(urllib.request.urlopen(r).read().decode())"

Tu dois voir "id": "orchestrator". Ensuite, tu l'ajoutes dans Open WebUI comme une nouvelle connexion (http://hermes-orchestrator:8642/v1), et il apparaît dans le menu.

Le piège qui casse tout : l'environnement minimal

Voici l'erreur qui m'a fait tourner en rond le plus longtemps. Mon conteneur orchestrateur répondait en chat, mais dès qu'il tentait de déléguer, tout échouait :

ERROR tools.terminal_tool: Docker executable not found in PATH
WARNING agent.tool_executor: Tool web_search returned error: Feature
'search.firecrawl' unavailable

La cause : j'avais construit le conteneur orchestrateur avec un Dockerfile minimal, alors que pour déléguer il a besoin du même environnement complet que le conteneur principal. Il lui manquait le binaire Docker (pour créer les sandbox) et certaines dépendances Python (pour la recherche web).

La leçon : un agent qui orchestre a besoin de toutes les capacités d'exécution. Aligne le Dockerfile de ton orchestrateur sur celui de ton conteneur principal, avec le binaire Docker statique et les dépendances complètes :

Dockerfile
RUN curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-27.3.1.tgz \
    | tar -xz -C /usr/local/bin --strip-components=1 docker/docker
RUN pip install --no-cache-dir pipx && \
    pipx install hermes-agent && \
    pipx inject hermes-agent aiohttp fastapi uvicorn ptyprocess "mcp>=1.27" httpx-sse langfuse

Après ce correctif, la délégation s'est débloquée. Les tâches swarm: ont commencé à apparaître sur le kanban, exécutées par researcher, wikicurator, seo-analyst et les autres.

Automatiser la délégation avec un cron

Le vrai pouvoir d'une armée d'agents, c'est qu'elle travaille sans toi. Hermes a un système de cron natif pour planifier des tâches récurrentes.

Crée un job de veille quotidienne :

docker exec hermes-orchestrator hermes cron create \
  --name "veille-dev-web" \
  --profile orchestrator \
  --deliver local \
  "0 7 * * *" \
  "Tâche autonome, n'attends aucune validation, ne demande aucune clarification, exécute directement. Recherche web sur les nouveautés du dev web et de l'IA. Écris une page datée dans /root/vault/wiki/. Mets à jour index.md et log.md."

Plusieurs détails comptent ici :

  • "0 7 * * *" est au format cron standard. Attention au fuseau : ton conteneur est probablement en UTC. Pour 8h heure locale en UTC+1, tu programmes 7h UTC.
  • --deliver local dépose le résultat dans le vault plutôt que de le notifier ailleurs.
  • La consigne ultra-directive est la clé du succès. C'est ma plus grosse leçon sur le cron.

Pourquoi la consigne doit être directive

À mes premiers essais, l'orchestrateur créait des tâches "Clarify the task request" et restait bloqué. La raison : en mode cron autonome, il n'y a personne pour répondre à ses demandes de clarification. Son SOUL.md lui dit d'insérer des gates humains, donc il s'arrête en attendant une réponse qui ne vient jamais.

La solution : une consigne qui coupe court à toute hésitation. Les phrases "n'attends aucune validation, ne demande aucune clarification, exécute directement" évitent qu'il se bloque. Avec des étapes numérotées explicites et un chemin de fichier précis, il sait exactement quoi faire.

Vérifie que ton scheduler tourne :

docker exec hermes-orchestrator hermes cron status

Tu dois voir ✓ Gateway is running — cron jobs will fire automatically.

Pour tester sans attendre l'heure programmée :

docker exec hermes-orchestrator hermes cron run veille-dev-web

Après quelques minutes, une page fraîche apparaît dans le vault. La chaîne complète a fonctionné : cron → orchestrateur → recherche web → synthèse → écriture dans le vault.

Deux modes de fonctionnement : solo vs délégation

À l'usage, tu as deux façons de faire travailler ton orchestrateur, avec des compromis différents :

ModeDescriptionAvantageInconvénient
SoloL'orchestrateur fait tout lui-mêmeRapide, fiablePas de division du travail
DélégationIl répartit aux spécialistesTravail riche et structuréPlus lent, plus coûteux en quota

Pour une veille simple, le mode solo suffit et il est plus robuste. Pour un livrable complexe (rapport multi-domaines, campagne), la délégation aux spécialistes donne un résultat bien plus riche, mais consomme nettement plus.

Attention au coût : une seule demande à l'orchestrateur peut déclencher une cascade d'appels de modèle (l'orchestrateur, puis chaque sous-agent, puis le critic). Surveille ta consommation, surtout sur les profils utilisant un modèle de raisonnement avancé.

Les pièges de cohabitation sur un système partagé

Quand plusieurs conteneurs partagent le même /root/.hermes, certaines ressources entrent en conflit. Le cas le plus courant : le bot de messagerie.

Si deux conteneurs lisent le même token de bot (Telegram par exemple), ils se disputent la même connexion et tu obtiens :

Conflict: terminated by other getUpdates request; make sure that only one
bot instance is running

C'est une limite de la plateforme de messagerie, pas de Hermes : un bot ne peut avoir qu'une seule connexion active. Deux solutions propres :

  • Un seul conteneur gère le bot : tu désactives la messagerie sur le second.
  • Un second bot dédié : tu crées un nouveau bot (token différent) pour le conteneur orchestrateur.

Comme chaque profil lit son propre fichier .env, tu peux donner un token différent au profil orchestrator sans toucher au profil par défaut. La modification est chirurgicale : une seule ligne dans le .env du profil concerné.

Bonne pratique : si tu travailles à plusieurs sur le même système, mets-toi d'accord sur qui gère quoi (le bot, les crons partagés, les configs de profil). Sur une architecture partagée, deux personnes qui modifient la même config se neutralisent vite.

Récapitulatif

Voici les étapes essentielles pour monter ton orchestration multi-agents :

ActionCommande clé
Lister les profilshermes profile list
Voir un profilhermes profile show orchestrator
Voir le kanbanhermes kanban list
Cibler un profilhermes profile use orchestrator
Créer un cronhermes cron create --name ... --profile ...
Tester un cronhermes cron run [nom]
Vérifier le schedulerhermes cron status

Et les leçons techniques à retenir :

  • Une seule gateway par conteneur (limite s6) : utilise un conteneur séparé pour l'orchestrateur.
  • HERMES_PROFILE ne marche pas : utilise hermes profile use.
  • L'orchestrateur a besoin de l'environnement complet (Docker + dépendances) pour déléguer.
  • En mode cron, une consigne directive évite les blocages sur clarification.
  • Le kanban est partagé : un seul board, mais qui décompose dépend des réglages.

Tu as maintenant une organisation d'agents IA qui décompose tes objectifs, délègue à des spécialistes, et travaille en autonomie sur un planning. C'est un changement d'échelle par rapport à un agent unique : tu ne donnes plus des tâches, tu donnes des objectifs, et l'organisation s'occupe du reste.

La prochaine étape logique ? Affiner les descriptions de chaque profil pour améliorer le routage de l'orchestrateur, et créer des boards kanban dédiés par projet. Mais ça, c'est pour un prochain article.

À toi de bâtir ton armée !