Hermes v0.21.1 : une mise à jour qui a réduit Hermes d'un tiers — et accéléré tout ce qui vous tient à cœur

La plupart des mises à jour de Hermes vous demandent quelque chose : une nouvelle commande à apprendre, une nouvelle clé de config à peser, une nouvelle valeur par défaut qui change le comportement de votre setup. v0.21.1 (tag v2026.9.7, publié le 7 septembre 2026) est le rare contraire — une mise à jour que vous installez sans presque la remarquer, parce que tout ce qui a changé se trouve sous le capot ou dans les recoins du flux de travail qui vous agaçaient le plus. Le projet appelle cela un patch de consolidation : environ 5 139 commits, ~4 364 fichiers modifiés et ~632 PR fusionnées depuis v0.21.0, avec des notes officielles volontairement brèves et la curation complète reportée à v0.22.0. Nous avons parcouru la fenêtre à votre place — voici ce qui compte vraiment.
Une mise à jour qui a réduit le codebase d’un tiers
La plus grande histoire de cette fenêtre est invisible tant que vous n’ouvrez pas le dépôt : une simplification de tout le codebase (PR #102117) a fait passer le code source de 1 063 826 à 698 363 lignes — une coupe de 34,4 % — avec un comportement garanti inchangé. Trente-sept fichiers de plus de 5 000 lignes sont devenus six. Les monstres légendaires ont disparu : gateway/run.py est passé de 34 847 à 5 512 lignes, cli.py de 22 426 à 4 656, et le nombre de fonctions de plus de 300 lignes est tombé de 192 à 2. Les anciens fichiers sont restés en place comme de minces points d’entrée, et l’équipe a vérifié, avant de fusionner, que les schémas d’outils, les défauts de config et les formats filaires étaient identiques octet pour octet à ceux de l’arbre d’avant la refonte.
Pourquoi s’en soucier, si rien de ce que vous voyez n’a changé ? Parce qu’un codebase qui tient dans la tête d’un modèle coûte moins cher à naviguer : les évaluations menées par la PR elle-même ont mesuré le taux de réussite des tâches d’agent et la dépense en tokens sur la navigation de dépôt, avant et après, et chaque sous-système est désormais assez petit pour qu’un agent (ou un humain) puisse réellement le garder en contexte. Votre prochaine session sur un gros codebase se charge plus vite et commet moins de faux pas — la refonte est en pratique une remise permanente de tokens pour le codage agentique. La page de release qui suit sur ce site contient tous les chiffres si vous aimez ce genre de choses : notes de release v0.21.1.
Des fan-outs qui rapportent dès qu’ils atterrissent
Si vous avez déjà envoyé cinq subagents faire des recherches puis fixé un chat vide pendant une heure parce que le plus lent était coincé, celle-ci est pour vous. delegate_task retournait auparavant un résultat géant après que le dernier enfant eut fini ; désormais, chaque tâche rapporte dès qu’elle se termine (PR #104299). Les tâches qui vont ensemble peuvent opter pour un group, et les résultats groupés arrivent toujours en un seul message :
{
"tasks": [
{ "goal": "check api latency", "group": "bench" },
{ "goal": "check db latency", "group": "bench" },
{ "goal": "scan the changelog" }
]
}
Les deux tâches de benchmark reviennent ensemble ; le scan du changelog atterrit tout seul dès qu’il est terminé. Vous pouvez commencer à agir sur les résultats précoces au lieu d’attendre le traînard — et l’appel entier compte toujours pour un seul slot contre delegation.max_concurrent_children, si bien que l’arithmétique de capacité ne change pas. Associez cela au guide d’orchestration en direct des subagents et un fan-out commence à ressembler à une équipe que vous pouvez regarder travailler.
Les enfants vous rendent le volant — processus d’arrière-plan compris
La même passe de délégation a corrigé l’un des pires modes de défaillance du travail multi-agents : un enfant qui lance un long processus d’arrière-plan puis se termine laissait auparavant ce processus sans propriétaire — le nettoyage de l’enfant le tuait en silence, ou le parent attendait un avis de complétion qui ne pouvait jamais arriver, parce que le notify=true de l’enfant était une promesse que personne ne pouvait tenir. Désormais, un subagent peut vous rendre un processus en cours d’exécution avant de se terminer avec process_manage(action="handoff", session_id=<id>, data="<purpose>") — la propriété bascule vers le parent, et quand le processus se termine, l’avis atterrit dans votre chat, avec le purpose attaché (PR #105125). Les restes sont rapportés honnêtement comme terminés, et les enfants sont prévenus d’emblée que les notifications ne sont pas garanties. Le mystère des processus orphelins est résolu.
Connexions MCP sans navigateur
Vous vous connectez en SSH à une machine headless, vous pointez Hermes vers un serveur MCP auto-hébergé, et vous butez sur le mur : le serveur exige un flux OAuth navigateur, et le seul navigateur du bâtiment est sur votre téléphone. Les device codes de la RFC 8628 sont exactement faits pour cette situation, et v0.21.1 les câble de bout en bout (PR #104891). Une seule commande lance le flux :
hermes mcp login <server> --flow device
Hermes trouve l’endpoint device du serveur, imprime un URI de vérification et un code, puis interroge jusqu’à votre approbation — depuis n’importe quel appareil pourvu d’un navigateur. Définissez oauth.flow: device dans la config du serveur et cela devient le défaut pour la connexion et la ré-authentification. Les octrois refusés ou expirés n’écrasent jamais vos identifiants existants, et les reconnexions en arrière-plan vous renvoient vers une connexion explicite au lieu de lancer silencieusement un device flow. Si vous faites tourner des serveurs MCP sur des hôtes distants, cela supprime toute une classe de douleurs « impossible de s’autoriser ici » — voyez notre guide des variables de contexte MCP pour le reste de l’outillage MCP compatible headless.
Des choix toujours frais, des épingles qui tiennent
Deux améliorations de sélection de modèles sont arrivées dans cette fenêtre, et ensemble elles règlent le moment « mais pourquoi a-t-il utilisé ce provider ? ». D’abord, le routage OpenRouter peut désormais être épinglé par modèle, et non plus seulement globalement (PR #104159) :
provider_routing:
sort: price
models:
"openai/gpt-6-astra": { only: [openai] }
"anthropic/claude-fable-5.1": { only: [anthropic] }
Une seule config verrouille désormais GPT-6 Astra sur OpenAI et Claude Fable sur Anthropic, tandis que tout le reste continue de trier par prix — et comme la règle s’applique au point de passage unique que partagent tous les chemins de requête, les jobs cron et les enfants délégués l’honorent aussi. Si vous suivez le guide du discovery gating Astra, c’est le bouton qui rend déterministes les setups Astra multi-providers.
Ensuite, le sélecteur /model a cessé de périmer : les catalogues distants se rafraîchissent toutes les 20 minutes au lieu d’un TTL d’une heure, et une boucle d’arrière-plan du gateway les garde au chaud même si personne n’ouvre le sélecteur (PR #101319) — un modèle qui sort ou qui est retiré apparaît (ou disparaît) en vingt minutes sur toutes les surfaces. Le provider Meta Model API est aussi passé à sa réponse live /v1/models comme catalogue faisant autorité, si bien que les nouveaux modèles Muse apparaissent sans attendre une mise à jour du client (PR #101503). Plus de mécanique de catalogue et d’overrides dans le guide des model overrides.
Plus rapide sous le capot : recherche, compaction et cron plus discret
search_filesexécute désormais du ripgrep natif sur les machines POSIX locales (PR #104502) — les recherches de contenu passent de ~85 ms à ~15 ms et les recherches par nom de fichier de ~73 ms à ~12 ms. Mêmes résultats, 5 à 6× moins de latence d’outil, ce qui s’additionne vite dans les boucles d’agents qui cherchent en permanence.HERMES_NATIVE_FILE_READ=0restaure l’ancien chemin shell si quelque chose d’inattendu apparaît.- La compaction conserve son cache de préfixe dans les sessions de codage (PR #104455) : l’instantané du workspace de codage est épinglé par session au lieu de re-sonder
git statusà chaque frontière de compaction, si bien que les longues sessions cessent de payer la reconstruction du prompt à partir de zéro après chaque compact. - Les subagents terminés cessent de fuir la mémoire (PR #102032) : les transcripts des enfants sont libérés du heap du parent et exclus de l’index de texte intégral — une exécution de 1 320 enfants laissait auparavant un heap de 1,9 Go et ~1 Go de shadow tables derrière elle.
- Cron dit la vérité sur les échecs de déclenchement (PR #100445, #104877) :
hermes cron listaffiche désormais une ligneDispatch:par job —⚠ catch-up after missed fireau lieu d’un « ok » trompeusement propre — et les ticks de monitor silencieux n’effacent plus le contexte de continuité dont la prochaine exécution a besoin. Plus d’hygiène cron dans le guide du cron doctor.
La sécurité a reçu une vraie correction dans la même fenêtre : les règles approvals.deny sont désormais appliquées à l’intérieur des sandboxes Docker et cloud isolées (PR #103649), fermant un chemin où une liste de refus pouvait être contournée avec un shell sandboxé même sous --yolo. La release Pantheon v0.21.0 était la grosse release de fonctionnalités ; v0.21.1 est le nettoyage qui maintient la maison debout. Si vous avez sauté les dernières correctives, notre récapitulatif v0.20.6 couvre ce qui est arrivé avant.
hermes update
Mettez à jour, lancez hermes doctor, redémarrez le gateway — et profitez d’une mise à jour qui a changé un tiers du code sans vous demander de changer un seul réglage.