Tutoriel 26 : Traitement par lots
Tutoriel 26 : Traitement par lots — guide facile à comprendre basé sur la documentation officielle
Cette leçon fait partie de la série de tutoriels officiels d’Hermes Agent. Voir tous les tutoriels
Pensez à cela comme à une checklist matinale que vous exécutez avant de commencer à travailler — vous ne voulez pas avoir à mémoriser chaque tâche vous-même, alors vous les écrivez une fois, et votre assistant les coche automatiquement chaque jour. C’est exactement ce que Hermes vous permet de faire avec les gateway hooks et un simple fichier appelé BOOT.md.
Dans ce tutoriel, vous apprendrez à faire en sorte qu’Hermes exécute un « lot » personnalisé de tâches à chaque démarrage de votre gateway — comme vérifier des journaux, poster des rappels, ou même lancer un mini-agent qui réfléchit et fait son rapport.
Étape 1 : Créez votre répertoire de hook
Commencez par créer un dossier dans votre répertoire de hooks. Chaque hook vit dans son propre sous-dossier avec deux fichiers : HOOK.yaml (la configuration) et handler.py (la logique).
mkdir -p ~/.hermes/hooks/boot-md
cd ~/.hermes/hooks/boot-md
Créez maintenant HOOK.yaml :
name: "boot-md"
event: "gateway_startup"
C’est tout — l’événement indique à Hermes de déclencher ce hook au démarrage du gateway.
Étape 2 : Écrivez le handler
Créez maintenant handler.py. C’est là que la magie opère. Le handler lit un fichier appelé BOOT.md dans votre répertoire personnel, puis lance un thread en arrière-plan qui exécute un agent avec ces instructions.
Voici l’idée principale (simplifiée) :
import os, threading
from pathlib import Path
from hermes.agent import AIAgent
def run_boot_md():
content = Path.home().joinpath(".hermes", "BOOT.md").read_text()
print(f"Exécution de BOOT.md ({len(content)} caractères)")
agent = AIAgent(
instructions=content,
model=_resolve_gateway_model(), # utilise le modèle de votre gateway
**_resolve_runtime_agent_kwargs() # utilise vos identifiants fournisseur
)
result = agent.run()
print(f"boot-md terminé : {result.summary()}")
def handler(event):
thread = threading.Thread(target=run_boot_md, daemon=True)
thread.start()
Les deux lignes clés :
_resolve_gateway_model()lit le modèle actuellement configuré du gateway._resolve_runtime_agent_kwargs()résout les identifiants fournisseur de la même manière qu’un tour de gateway normal — y compris les clés API, les URL de base, les jetons OAuth et les pools d’identifiants.
Sans ces fonctions, un AIAgent() nu retombe sur les valeurs par défaut intégrées et renverra une erreur 401 contre tout endpoint non standard.
Étape 3 : Testez-le
Redémarrez le gateway :
hermes gateway restart
Surveillez les journaux :
hermes logs --follow --level INFO | grep boot-md
Vous devriez voir Exécution de BOOT.md (N caractères) suivi de boot-md terminé : ... (résumé de ce que l’agent a fait) ou boot-md terminé (rien à signaler) lorsque l’agent a répondu avec un jeton de silence exact tel que [SILENT].
Supprimez ~/.hermes/BOOT.md pour désactiver la checklist — le hook reste chargé mais ignore silencieusement l’exécution lorsque le fichier n’existe pas.
Étendre le modèle
- Checklists sensibles à l’horaire : basez-vous sur
datetime.now().weekday()dans les instructions de BOOT.md (« si c’est lundi, vérifiez aussi le journal de déploiement hebdomadaire »). Les instructions sont en texte libre, donc tout ce que l’agent peut raisonner est permis. - Checklists multiples : pointez le hook vers un autre fichier (
STARTUP.md,MORNING.md, etc.) et enregistrez des répertoires de hooks séparés pour chacun. - Variante sans agent : si vous n’avez pas besoin d’une boucle d’agent complète, ignorez
AIAgentet faites en sorte que le handler publie directement une notification fixe viahttpx. Moins cher, plus rapide et sans dépendance fournisseur.
Pourquoi ce n’est pas intégré nativement
Une version antérieure d’Hermes incluait cela comme hook intégré et lançait silencieusement un agent avec des valeurs par défaut nues à chaque démarrage du gateway. Cela a surpris les utilisateurs avec des endpoints personnalisés et a rendu la fonctionnalité invisible pour ceux qui ne savaient pas qu’elle tournait. Le garder comme modèle documenté — construit par vous, dans votre répertoire de hooks — signifie que vous voyez exactement ce qu’il fait et que vous l’activez en écrivant les fichiers.
Comment cela fonctionne
- Au démarrage du gateway,
HookRegistry.discover_and_load()scanne~/.hermes/hooks/ - Chaque sous-répertoire avec
HOOK.yaml+handler.pyest chargé dynamiquement - Les handlers sont enregistrés pour les événements déclarés
- À chaque point du cycle de vie,
hooks.emit()déclenche tous les handlers correspondants - Les erreurs dans chaque handler sont capturées et journalisées — un hook cassé ne fait jamais planter l’agent
:::info Les gateway hooks ne se déclenchent que dans le gateway (Telegram, Discord, Slack, WhatsApp, Teams). La CLI ne charge pas les gateway hooks. Pour des hooks qui fonctionnent partout, utilisez les plugin hooks. :::
Résumé
Vous savez maintenant comment transformer un simple fichier texte en une puissante checklist de démarrage qui s’exécute automatiquement. Qu’il s’agisse d’une boucle d’agent complète ou d’un appel HTTP rapide, le modèle est le même : écrivez un hook, pointez-le vers un fichier, et laissez Hermes s’occuper du reste.
À suivre : Tutoriel 27 — Mode vocal : parler à Hermes sans les mains.
📖 Documentation officielle
Cet article est basé sur la documentation officielle de Hermes Agent :Docs officiels › user-guide/features/batch-processing