Hermes Agent v0.21.6
Overview
v0.21.6 — das erste Tag, das von der neuen Stable-Release-Pipeline geschnitten wurde. Veröffentlicht am 8. Oktober 2026. Seit v2026.9.24 (semantische Version v0.21.5): 8.867 Nicht-Merge-Commits · 8.342 geänderte Dateien (+772.490 / −225.600) · 2.106 gemergte PRs · 3.027 geschlossene Issues, gemessen am Commit 818c13be1dc4fd28987e1e881a9408224afd4535.
Was hier anders ist, ist nicht der Inhalt, sondern wie das Release erstellt wird: Das ist die erste Version, die von der neuen Stable-Release-Pipeline geschnitten wurde, und ihre Form ist „ein Versuchs-Ref, ein getestetes Docker-Image und ein Beleg-Tag beim Veröffentlichen“. In klaren Worten: Der Release-Versuch selbst trägt den Build und die Tests, das Image wird erst veröffentlicht, wenn er besteht, und der Beleg für diese Veröffentlichung wird am Tag festgehalten — nachgelagerte Konsumenten bekommen ein Artefakt, das getestet wurde, statt eines Tags, aus dem sie danach bauen.
Mit diesem Release werden nur drei Dinge ausgeliefert: der Tag, dieses GitHub-Release und das Docker-Image. Die Desktop-App, die Termux-Pakete und der Microsoft Store bleiben auf ihrem aktuellen Build und ziehen mit dem nächsten gebündelten Release um.
Der offizielle Text stellt explizit klar, dass die vollständigen kuratierten Notizen mit v0.22.0 erscheinen, die alles ab v0.21.0 dokumentieren werden — Highlights, Feature-Bereiche und vollständige Contributor-Credits — und dass nichts in diesem Fenster übersprungen wird. Bis dahin hält diese Seite fest, was das Tag ist, plus die Änderungen, die bereits auf deiner Maschine laufen.
Highlights
1. Eine Stable-Release-Pipeline, deren Artefakt getestet wurde
Das ist die am leichtesten zu übersehende Änderung mit dem größten nachgelagerten Effekt. Ein Tag war früher der Startschuss: das Image, gehostete Deployments und Nix-Pakete bauten sich danach jeweils selbst. Die Reihenfolge ist jetzt umgekehrt — zuerst ein Release-Versuch, der den Build und die Tests trägt, dann das Docker-Image, sobald er besteht, dann ein am Tag festgehaltener Beleg. Der praktische Nutzen: nousresearch/hermes-agent:stable zeigt auf ein Image, das vor der Veröffentlichung getestet wurde. Um zu bestätigen, was du hast, prüfe den Image-Digest, nicht die Pull-Zeit, an die du dich erinnerst.
2. Drei Security-Fix-Gruppen (in diesem Release separat hervorgehoben)
- Dashboard-Authentifizierung gehärtet (PRs #133367, #133369, #133370, plus Session-Takeover #130685). Vier von Tenable Research gemeinsam gemeldete Probleme (TRA-725 … TRA-728): Ein gefälschtes
X-Forwarded-Forkonnte das Rate-Limit für die Passwort-Anmeldung zurücksetzen und die Pro-IP-Grenze umgehen; unauthentifizierte Anmeldeanfragen konnten unbegrenzte Werte ins Audit-Log schreiben; die öffentlichen/auth/-Routen hatten keine Größenbegrenzung für den Request-Body; und die native Anmeldung konnte Login-Codes an ein Nicht-Loopback-Redirect senden, was Session-Takeover ermöglichte. - Git-Filter von Repositories gehärtet (#130661). Automatische Git-Aufrufe (Session-Workspace-Snapshots, Subagent-Worktrees, Kanban, Worktree-Cleanup,
hermes -w) konnten vonclean- /smudge- /process-Filterprogrammen gekapert werden, die in der eigenen Config eines nicht vertrauenswürdigen Repositories definiert sind, und zwar bevor du deinen ersten Prompt getippt hast. - E-Mail-Gateway-Absender gehärtet (#125212, #124322). Ein in Anführungszeichen gesetzter Anzeigename im
From-Header konnte so gestaltet werden, dass er wie ein allowlisteter Absender aussah, wodurch die Nachricht eines Angreifers die E-Mail-Allowlist passieren konnte.
3. Voice: gesprochene Turns bekommen ihr eigenes Modell, und der Desktop bekommt einen zweiten Modus
- Ein dediziertes Voice-Modell: Der neue Slot
auxiliary.voice_chat(provider / model / reasoning_effort) ersetzt nur das Modell, das den gesprochenen Turn beantwortet; Tippen nutzt weiterhin das Session-Modell. Er gilt für CLI/TUI-Voice, die Voice-Konversation im Desktop und Voice-Notizen auf Messaging-Plattformen, mit Nutzung untervoice_chatverbucht. Konfiguriere es im Desktop unter Settings → Models → Auxiliary models oder unterhermes model→ Auxiliary models. - Voice-Turns sind standardmäßig ohne Reasoning, auch wenn der Slot auf
autobleibt und das Session-Modell antwortet; ein Modell, das Reasoning nicht deaktivieren kann, fällt auf sein niedrigstes akzeptiertes Level zurück, und eine Laufzeit-Ablehnung wird gemerkt. - Full-Duplex-Modus im Desktop:
voice.voice_chat_mode: gpt-liveersetzt die ganze Kette STT → Turn → TTS durch ein Full-Duplex-Voice-Modell, das Unterbrechungen und Hintergrundgeräusche selbst übernimmt, keine Tools hat und jede echte Anfrage an das Session-Modell delegiert. Es braucht einen direkten OpenAI-Key (voice.gpt_live.api_key/OPENAI_API_KEY/VOICE_TOOLS_OPENAI_KEY) und rechnet die Voice-Schicht mit $0,05 pro Minute Sitzungszeit ab (Leerlaufzeit zählt). Nur Desktop; CLI/TUI/voicebleibt auf der verketteten Schleife.
4. Ein Gate für das Image-Routing: MCP-Bilder, computer_use-Captures, Browser-Screenshots
- Das
ImageContenteines MCP-Tools kam früher nur alsMEDIA:/pathzurück, also erhielt selbst ein vision-fähiges Modell keine Pixel (ein rohercua-driver-Server konnte den Bildschirm überhaupt nicht sehen). Wenn die aktive Route Bilder in Tool-Results akzeptiert, gibt der Registry-Handler jetzt eine multimodale Hülle zurück: Das Bild stammt aus dem Cache-Schreibvorgang dieses Aufrufs selbst, wird neu kodiert, aufvision.embed_target_bytes(standardmäßig 256 KiB, geklemmt 64 KiB–4 MiB) und eine Obergrenze von 1.568 px skaliert, höchstens 4 pro Ergebnis, während die Text-Hälfte ihreMEDIA:-Pfade behält. tools.vision_tools._native_tool_result_images(provider, model, cfg)ist jetzt das einzige Gate, geteilt vonvision_analyze, Browser-Screenshots,computer_use-Captures und MCP-Bildern.computer_use-Captures ignorierten zuvoragent.image_input_modeund gingen auch auf Text-only-Modellen nativ.- Zwei Sicherheitsverhalten kommen damit einher: unsichtbare TAG-Zeichen (U+E0000–U+E007F) werden aus MCP-Ergebnissen entfernt (legitime Emoji-Tag-Sequenzen von Regionalflaggen bleiben erhalten), und Vendor-
_metawird sichtbar gemacht, während Keys unter protokollreservierten Präfixen (modelcontextprotocol,mcp) verworfen werden.
5. /yolo reist jetzt mit der Session; ein Neustart lässt es nicht mehr still fallen
/yolo kippte früher nur ein In-Memory-Set in tools.approval, also brachte jeder Gateway-Neustart diesen Chat still auf manuelle Approvals zurück, während der Nutzer weiter glaubte, es umgehe sie. Das Flag lebt jetzt am Routing-Eintrag des Chats (SessionEntry.yolo, persistiert in gateway_routing), jeder Turn lädt das Live-Flag aus dem aufgelösten Eintrag neu, und es wird über Compression und Binding-Repoints hinweg mitgeführt. Gleichzeitig löschen /new, /resume, /branch und Auto-Reset beide Kopien, die persistierte und die im Speicher — ein Neustart kann nie ein von dir verworfenes Bypass wiederbeleben. Die alte Behauptung der Docs, /yolo setze HERMES_YOLO_MODE, wurde korrigiert: Diese Umgebungsvariable ist ein separater Aktivierungspfad.
6. Außerdem im Fenster (vom offiziellen Text benannt, hier noch nicht behandelt)
Live-Transkription, während du auf CLI, TUI und Desktop sprichst; Favoriten und angepinnte Modelle oben im Desktop-Picker, ein Nutzungs-Chip, bevor ein Abo an seine Wand stößt, und ratenbegrenzte Provider, die sagen, warum und bis wann; lokale Modelle in hermes model plus llama.cpp CUDA auf Linux x64 und arm64; steckbare geschichtete Sprachpakete über Core, Desktop und TUI hinweg; ein Zusammenfassung-zuerst hermes status; ein Diff-Scope-Selektor im Review-Pane (Uncommitted / Branch / Last turn); Warnungen von cron, doctor und Home-Channel, wenn der Cron-Store unbeschreibbar wird; activate.fish; eine vereinheitlichte Kanban-Workflow-Definition; und GPT-6.1 Sol plus Claude Sonnet 5.5 / Haiku 5.5 in den Katalogen.
Verbesserungen
- Die Plugin-Namensauflösung wurde in einen einzigen Auflöser zusammengefasst (
_find_plugin_entry): kanonischer Key oder Manifest-Name, dann ein eindeutiges nacktes Blatt, dann der Katalog-Name, aufgelöst über den eigenen Record des Installers (.install-metadata.json) — und er schlägt bei Mehrdeutigkeit fehl, statt zu raten. Einträge, deren Katalog-Name von ihrem Manifest-Namen abweicht (17 von 484, z. B.hermes-memory-wiki→memory-wiki,touchdesigner→td), funktionieren jetzt mitenable/disable/show/capabilities/update/remove. Im Desktop ging das Anschalten eines zweiteiligen Pakets von drei Schritten auf einen Schalter. - Desktop-Plugin-Entwicklung: Ein per Symlink verknüpfter Checkout (
ln -s ~/src/my-plugin ~/.hermes/plugins/my-plugin) wird jetzt erkannt und treibt seine Desktop-Hälfte an, die Kopie synchronisiert sich bei jedem Byte-Unterschied neu und beobachtet die Quelldatei für Hot-Reload, undhermes plugins doctor <id>benennt eine veraltete Kopie und wie man sie aktualisiert. - Beide davon wurden gemergt, nachdem dieses Tag geschnitten wurde, sind also nur auf
main: Git-Installationen, diemaintracken, haben sie; Installationen auf dem Tag (Docker-Images eingeschlossen) bekommen sie mit dem nächsten Tag.
Upgrade
# CLI (Git-Installationen)
hermes update
# Docker / Hermes Cloud
# nousresearch/hermes-agent:stable (oder :latest)
# Desktop-App und Termux
# in diesem Release unverändert; sie ziehen mit dem nächsten gebündelten Release um
Nach dem Upgrade nimm dir eine Minute, um zu bestätigen, was du tatsächlich bekommen hast: hermes version (Git-Installationen melden auch den Abstand zum Tag und den kurzen Commit) und den Image-Digest, wenn du auf Docker bist.