Hermes Agent v0.21.6
Aperçu
v0.21.6 — le premier tag découpé par le nouveau pipeline de releases stables. Publié le 8 octobre 2026. Depuis v2026.9.24 (version sémantique v0.21.5) : 8 867 commits non fusionnés · 8 342 fichiers modifiés (+772 490 / −225 600) · 2 106 PR fusionnées · 3 027 issues fermées, mesurés au commit 818c13be1dc4fd28987e1e881a9408224afd4535.
Ce qui est différent ici n’est pas le contenu mais la façon dont la release est produite : c’est la première version découpée par le nouveau pipeline de releases stables, et sa forme est « une ref de tentative, une image Docker testée, et un tag-reçu à la publication ». En clair : la tentative de release porte elle-même le build et les tests, l’image n’est publiée qu’une fois qu’ils passent, et le reçu de cette publication est enregistré sur le tag — les consommateurs en aval obtiennent un artefact qui a été testé, plutôt qu’un tag à partir duquel ils construisent ensuite.
Trois choses seulement sont livrées avec cette release : le tag, cette release GitHub et l’image Docker. L’application desktop, les paquets Termux et le Microsoft Store restent sur leur build actuel et suivront la prochaine release groupée.
Le corps officiel précise explicitement que les notes complètes et éditorialisées arrivent avec v0.22.0, qui documentera tout depuis v0.21.0 — points forts, domaines fonctionnels et crédits complets des contributeurs — et que rien dans cette fenêtre n’est omis. D’ici là, cette page consigne ce qu’est le tag, plus les changements déjà actifs sur votre machine.
Points forts
1. Un pipeline de releases stables dont l’artefact a été testé
C’est le changement le plus facile à manquer et au plus grand effet en aval. Un tag était autrefois le coup de départ : l’image, les déploiements hébergés et les paquets Nix se construisaient chacun tout seuls ensuite. L’ordre est désormais inversé — d’abord une tentative de release, portant le build et les tests, puis l’image Docker une fois qu’elle passe, puis un reçu enregistré sur le tag. L’avantage pratique : nousresearch/hermes-agent:stable pointe vers une image qui a été testée avant publication. Pour confirmer ce que vous avez, vérifiez le digest de l’image, pas l’heure de pull dont vous vous souvenez.
2. Trois groupes de correctifs de sécurité (signalés à part dans cette release)
- Durcissement de l’authentification du dashboard (PR #133367, #133369, #133370, plus la prise de contrôle de session #130685). Quatre problèmes rapportés ensemble par Tenable Research (TRA-725 … TRA-728) : un
X-Forwarded-Forusurpé pouvait réinitialiser la limite de débit de connexion par mot de passe et contourner le plafond par IP ; des requêtes de connexion non authentifiées pouvaient écrire des valeurs non bornées dans le journal d’audit ; les routes publiques/auth/n’avaient aucune limite de taille du corps de requête ; la connexion native pouvait envoyer les codes de connexion vers une redirection non-loopback, permettant une prise de contrôle de session. - Durcissement du filtre git des dépôts (#130661). Les appels git automatiques (instantanés de l’espace de travail de session, worktrees de sous-agents, kanban, nettoyage de worktree,
hermes -w) pouvaient être détournés par des programmes de filtreclean/smudge/processdéfinis dans la config d’un dépôt non fiable, avant votre premier prompt. - Durcissement de l’expéditeur du gateway e-mail (#125212, #124322). Un nom d’affichage entre guillemets dans l’en-tête
Frompouvait être forgé pour ressembler à un expéditeur autorisé, laissant le message d’un attaquant passer la liste d’autorisation e-mail.
3. Voix : les tours parlés ont leur propre modèle, et le Desktop gagne un second mode
- Un modèle vocal dédié : le nouveau slot
auxiliary.voice_chat(provider / model / reasoning_effort) ne remplace que le modèle qui répond au tour parlé ; la saisie utilise toujours le modèle de session. Il s’applique à la voix du CLI/TUI, à la conversation vocale du Desktop et aux notes vocales sur les plateformes de messagerie, avec l’usage enregistré sousvoice_chat. Configurez-le dans Settings → Models → Auxiliary models sur le Desktop, ou soushermes model→ Auxiliary models. - Les tours vocaux passent par défaut en raisonnement désactivé, y compris quand le slot reste sur
autoet que c’est le modèle de session qui répond ; un modèle qui ne peut pas désactiver le raisonnement retombe à son niveau accepté le plus bas, et un refus à l’exécution est mémorisé. - Mode full-duplex du Desktop :
voice.voice_chat_mode: gpt-liveremplace toute la chaîne STT → tour → TTS par un seul modèle vocal full-duplex qui gère lui-même les interruptions et le bruit de fond, n’a aucun outil, et délègue chaque vraie requête au modèle de session. Il nécessite une clé OpenAI directe (voice.gpt_live.api_key/OPENAI_API_KEY/VOICE_TOOLS_OPENAI_KEY) et facture la couche vocale à 0,05 $ par minute de temps de session (le temps d’inactivité compte). Desktop uniquement ;/voicedu CLI/TUI reste sur la boucle chaînée.
4. Un seul point de contrôle pour le routage d’images : images MCP, captures computer_use, captures d’écran du navigateur
- L’
ImageContentd’un outil MCP ne revenait auparavant que sous forme deMEDIA:/path, donc même un modèle capable de vision ne recevait aucun pixel (un serveurcua-driverbrut ne pouvait pas voir l’écran du tout). Quand la route active accepte les images dans les résultats d’outil, le handler du registre renvoie désormais une enveloppe multimodale : l’image provient de l’écriture en cache de cet appel lui-même, est ré-encodée, dimensionnée selonvision.embed_target_bytes(256 KiB par défaut, borné 64 KiB–4 MiB) et un plafond de 1568 px, au plus 4 par résultat, tandis que la moitié texte conserve ses cheminsMEDIA:. tools.vision_tools._native_tool_result_images(provider, model, cfg)est désormais le point de contrôle unique, partagé parvision_analyze, les captures d’écran du navigateur, les capturescomputer_useet les images MCP. Les capturescomputer_useignoraient auparavantagent.image_input_modeet passaient en natif même sur les modèles texte uniquement.- Deux comportements de sécurité l’accompagnent : les caractères TAG invisibles (U+E0000–U+E007F) sont supprimés des résultats MCP (les séquences de tag emoji de drapeaux régionaux légitimes sont préservées), et le
_metadu fournisseur est exposé tandis que les clés sous des préfixes réservés au protocole (modelcontextprotocol,mcp) sont écartées.
5. /yolo voyage désormais avec la session ; un redémarrage ne le fait plus disparaître silencieusement
/yolo ne basculait auparavant qu’un ensemble en mémoire dans tools.approval, donc n’importe quel redémarrage du gateway ramenait discrètement ce chat aux approbations manuelles pendant que l’utilisateur croyait encore qu’il les contournait. Le drapeau vit désormais sur l’entrée de routage du chat (SessionEntry.yolo, persistée dans gateway_routing), chaque tour réarme le drapeau en direct depuis l’entrée résolue, et il est transporté à travers la compression et les repoints de liaison. En même temps, /new, /resume, /branch et la réinitialisation automatique effacent à la fois les copies persistée et en mémoire — un redémarrage ne peut jamais ressusciter un bypass que vous avez abandonné. L’ancienne affirmation de la doc selon laquelle /yolo définit HERMES_YOLO_MODE a été corrigée : cette variable d’environnement est un chemin d’activation distinct.
6. Aussi dans la fenêtre (nommés par le corps officiel, pas encore couverts ici)
Transcription en direct pendant que vous parlez sur le CLI, le TUI et le Desktop ; modèles favoris et épinglés en haut du sélecteur du Desktop, une pastille d’usage avant qu’un abonnement atteigne sa limite, et des providers limités en débit qui disent pourquoi et jusqu’à quand ; modèles locaux dans hermes model plus llama.cpp CUDA sur Linux x64 et arm64 ; packs de langue en couches enfichables à travers le core, le Desktop et le TUI ; un hermes status orienté résumé ; un sélecteur de portée de diff dans le volet de revue (Uncommitted / Branch / Last turn) ; des avertissements de cron, doctor et home-channel quand le store de cron devient non inscriptible ; activate.fish ; une définition unifiée de workflow Kanban ; et GPT-6.1 Sol plus Claude Sonnet 5.5 / Haiku 5.5 dans les catalogues.
Améliorations
- La résolution des noms de plugins est ramenée à un résolveur unique (
_find_plugin_entry) : clé canonique ou nom de manifeste, puis une feuille nue unique, puis le nom de catalogue résolu via le propre enregistrement de l’installateur (.install-metadata.json) — et il échoue en cas d’ambiguïté au lieu de deviner. Les entrées dont le nom de catalogue diffère de leur nom de manifeste (17 sur 484, par ex.hermes-memory-wiki→memory-wiki,touchdesigner→td) fonctionnent désormais avecenable/disable/show/capabilities/update/remove. Sur le Desktop, activer un paquet à deux moitiés est passé de trois étapes à un seul interrupteur. - Développement de plugins desktop : un checkout symbolique (
ln -s ~/src/my-plugin ~/.hermes/plugins/my-plugin) est désormais reconnu et pilote sa moitié desktop, la copie se resynchronise sur n’importe quelle différence d’octet et surveille le fichier source pour le hot reload, ethermes plugins doctor <id>nomme une copie obsolète et comment la rafraîchir. - Ces deux-là ont été fusionnés après la découpe de ce tag, donc ils sont main-only : les installations git qui suivent
mainles ont ; les installations sur le tag (images Docker comprises) les auront avec le prochain tag.
Mise à jour
# CLI (installations git)
hermes update
# Docker / Hermes Cloud
# nousresearch/hermes-agent:stable (ou :latest)
# Application desktop et Termux
# inchangés dans cette release ; ils suivent la prochaine release groupée
Après la mise à niveau, prenez une minute pour confirmer ce que vous avez réellement obtenu : hermes version (les installations git rapportent aussi la distance au tag et le commit court), et le digest de l’image si vous êtes sous Docker.