v0.21.5

Hermes Agent v0.21.5


Overview

v0.21.5 — erneut ein Tag, der für nachgelagerte Konsumenten existiert. Veröffentlicht am 24. September 2026. Seit v0.21.4: 1.610 Nicht-Merge-Commits · 4.828 geänderte Dateien (+164.132 / −149.440) · 460 gemergte PRs · 475 geschlossene Issues, gemessen am Commit f97608f178d1ffeca59860195ab7da295f7c8e5f.

Der Tag existiert aus demselben Grund wie v0.21.4: Docker-Images, Hermes Cloud und gehostete Deployments bauen alle aus dem neuesten Release-Tag. Die Fixes aus diesem Fenster müssen also in einer stabilen Version landen, bevor Cloud-Nutzer sie bekommen können. Der Release-Text sagt es unmissverständlich: die vollständige kuratierte Beschreibung ist auf v0.22.0 verschoben, die alles ab v0.21.0 dokumentieren wird — Highlights, Funktionsbereiche und vollständige Contributor-Credits. Nichts in diesem Fenster wird ausgelassen.

Bis dahin hält diese Seite fest, für wen der Tag gedacht ist, und welche Änderungen im Fenster bereits auf Ihrem Rechner laufen.


Highlights

1. Desktop erhält vollständige französische, deutsche und spanische Kataloge, dazu eine Einstellung für die Textrichtung

Desktop liefert jetzt vollständige Oberflächenkataloge für Französisch, Deutsch und Spanisch, auswählbar unter Settings → Appearance → Language. Die drei Kataloge übersetzen jeden Key aus en.ts, einschließlich aller Labels und Beschreibungen aus defineFieldCopy und der reinen Anzeige-Rotation des Intros (intro-{fr,de,es}.ts). Sie registrieren sich als defineLocale()-Overlays wie ja, ar und ru, sodass ein später auf Englisch ergänzter Key auf Englisch zurückfällt, statt für jeden Contributor den Typecheck zu brechen. Das Backend liefert bereits locales/{fr,de,es}.yaml; display.language: fr|de|es und regionale Aliase wie fr-CA, de-AT und es-419 lösen nun auf den passenden Katalog auf, statt auf Englisch zurückzufallen. Französisch verwendet vous, Deutsch Sie, Spanisch den neutralen Imperativ tú. Eigennamen und technische Bezeichner (Hermes, MCP, API, OAuth, Model-IDs, Env-Variablen, Dateinamen) bleiben unübersetzt. PRs #120829.

Daneben: Appearance → Chat display → Text direction mit drei Optionen — Auto / Right-to-left / Left-to-right. Bisher leitete jeder Prosa-Block im Chat und jede Composer-Zeile ihre Basisrichtung aus ihrem ersten starken Zeichen ab (UAX#9 plaintext), was nicht zwischen einem arabischen Absatz, der mit einem lateinischen Namen beginnt, und einem englischen Absatz unterscheiden kann, der Arabisch zitiert. Auto ist exakt das alte Verhalten — kein neues Attribut, kein Storage-Key; wer RTL oder LTR wählt, wendet ein dir auf die Chat-Prosa und beide Composer an, einschließlich jeder Zeile eines mehrzeiligen Entwurfs. Code bleibt LTR (Fenced- und Inline-Code sowie KaTeX bleiben isoliert), und die App-Chrome (Sidebar, Toolbar, Composer-Buttons) kippt nicht. Es ist reine Darstellung: Keine Bidi-Steuerzeichen landen in Entwürfen, gesendeten Nachrichten oder kopiertem Text. Die Einstellung gehört dem Renderer, nicht einem Key in config.yaml. PRs #120822.

2. Webhook-Zustellungen können in die Session des Ziel-Chats gespiegelt werden

Standardmäßig ist eine Zustellung fire-and-forget: Jedes Event läuft in seiner eigenen Session, eine Antwort wie „so he’s out?“ in diesem Chat bringt Ihnen also nur „who are you referring to?“. Eine Route kann sich jetzt per mirror_to_session: true (oder hermes webhook subscribe … --mirror-to-session) dafür entscheiden, und nach einem erfolgreichen Versand wird der zugestellte Text an die Session des Ziel-Chats angehängt — als [Webhook delivery: <route>] plus die Nachricht, als etikettierter User-Turn mit User-Autorität, über denselben Pfad und dieselbe Rollenkonvention wie fortsetzbare Cron-Briefs (gateway.mirror.mirror_to_session). Standardmäßig aus; nur ein echtes boolesches true schaltet es ein. Der Mirror läuft innerhalb von _profile_scope(profile), eine Route unter /p/<profile>/ schreibt also in die state.db dieses Profils und nie in die eines anderen. Er ist Best-Effort: Er lässt eine Zustellung nie scheitern und wird übersprungen, wenn der Chat noch keine Gateway-Session hat. Bei einer deliver_only-Route ist der gespiegelte Text die roh gerenderte Payload, aktivieren Sie ihn also nur für Quellen, denen Sie in Ihrer Unterhaltung vertrauen. PRs #120825.

3. Bot Screen erreicht gehostete Images über -desktop-Tags

Gehostete und immutable Deployments bekommen Bot Screen jetzt über einen -desktop-Image-Tag. Das veröffentlichte Image wird ohne Xvnc/Xfce ausgeliefert und kann zur Laufzeit nichts nachinstallieren (unprivilegierter hermes-Nutzer, kein sudo, versiegeltes /opt/hermes), der Image-Layer ist also der einzige Auslieferungsweg. :latest / :main / :v* sind das Image, das sie heute sind; :latest-desktop / :main-desktop / :v*-desktop ergänzen die Pakete und Playwrights headed Chromium. Ein Manifest pro Variante, damit ein Fehlschlag beim Desktop-Publish nicht das :latest der schlanken Variante überspringt. Container haben kein logind, deshalb wird XDG_RUNTIME_DIR=/tmp/hermes-runtime beim Boot mit 0700 als hermes angelegt — der alte $HOME/.cache-Fallback landete auf dem geteilten /opt/data-Volume, wo zwei Instanzen um einen Display-Lock stritten —, und ein Verzeichnis in fremdem Besitz oder ein Symlink wird abgelehnt statt gechownt. PRs #120914; das Funktionsdokument ist website/docs/user-guide/features/bot-screen.md.

4. Ein Modell per Slug aus jedem Model-Picker hinzufügen

Das Modell-Menü im Composer, der Dialog zum Modellwechsel, Settings → Model und die Liste zum Bearbeiten von Modellen können jetzt alle ein Modell per Slug hinzufügen: Eine neue Fußzeile Add custom model… verwandelt das Suchfeld in eine Slug-Eingabe, bietet während der Eingabe eine Zeile pro konfiguriertem Provider an, und der gemerkte Slug bleibt als normale Zeile mit einem Entfernen-× in der Liste. PRs #120693.

5. Lokale Stimmen laden nicht mehr bei jedem Aufwachen neu

tts.keep_warm_seconds (Standard 60) ist neu: Nachdem das letzte Lease freigegeben wurde, wartet das Entladen so lange, und jedes Umschalten, das die Sprache innerhalb des Fensters wieder einschaltet, bricht es ab und nutzt das geladene Modell weiter. 0 entlädt sofort. Am wichtigsten ist das für reine Wake-Word-Sprachunterhaltungen, die direkt nach ihrem etwa 2 s langen Piper-Warm-up enden — die Stimme wurde früher Millisekunden nach dem Laden verworfen, sodass jedes Aufwachen den vollständigen Reload bezahlte. PRs #121080.

6. Die Desktop-Voiceschleife beginnt, Ihre Konfiguration zu lesen

Read Aloud spricht keine englischen Platzhalter wie „code block omitted“ und „link“ mehr vor und lässt Markdown-Tabellen nicht mehr wegfallen: Codeblöcke und URLs bleiben stumm, MEDIA:-Dateilink-Tokens erreichen die Stimme nie (Interpunktion direkt nach einem Inline-Token bleibt erhalten), ein zeilenfinaler Doppelpunkt, der durch einen entfernten Block hängen bleibt, wird zum Punkt, und Tabellen sprechen ihre Kopfzeile („Item, Value, Notes.“), während die Body-Zeilen übersprungen werden. PRs #120752. Spoken stop liest jetzt voice.stop_phrases (Standard ["stop"]) — zuvor wurde eine hartcodierte englische Liste abgeglichen, sodass ein russischer Nutzer, der wie im Hinweis „отбой“ sagte, dies als Prompt an den Agenten geschickt bekam —, und die gesamte Äußerung muss einer Phrase entsprechen, wobei [] Spoken Stop deaktiviert. Die Barge-in-Wiedergabe nutzt keinen hartcodierten 0.14-Trigger mehr, der über dem Sprachpegel eines Bluetooth-HFP-Headsets lag, während eine Antwort abgespielt wurde, sodass Dazwischenreden die Antwort nie unterbrach; jetzt wird der vorhandene voice.barge_in_threshold_multiplier (Standard 3.0) verwendet. PRs #120751.

7. Funktionstasten-Voice-Shortcuts sind neu belegbar

Die einmalige Composer-Diktion ist jetzt eine nicht belegte Tastaturaktion composer.dictate, getrennt von der Sprachunterhaltung, und nutzt den kanonischen Capture-Pfad von Desktop für F-Tasten, Caps Lock, Delete, Space und Modifier-Kombinationen. Das veraltete Desktop-Feld voice.record_key wurde entfernt, mit dem Hinweis, dass die Konfiguration CLI/TUI-only bleibt. Die Electron-Arbitrierung sorgt dafür, dass ein zugewiesenes F12 den Renderer erreicht, während ein nicht zugewiesenes F12 das DevTools-Verhalten behält. PRs #120928. Im selben Fenster wurden Funktionstasten-Workflows unter macOS repariert: Der TUI-Parser hält F1–F12-Terminalsequenzen intakt (einschließlich der Protokollpfade für modifizierte Tasten), und Ctrl+R wurde als portabler F7-Fallback für das Live-Work-Dock über TUI und klassisches CLI hinweg ergänzt. PRs #120666.

8. Ein Bündel von Fehlern, die ausschließlich lokalisiertes Windows treffen

Vier unabhängige, nur unter Windows auftretende Probleme:

  • Der Zonennamen-Crash. Windows gibt Zonennamen in der ANSI-Codepage zurück (Paris, Madrid (heure d'été) als cp1252-Bytes). Ist LC_CTYPE UTF-8, werden diese Bytes mit surrogateescape dekodiert, sodass tzname() am Ende einsame Surrogate enthält; datetime.strftime fügt tzname() als UTF-8 in das Format ein, also wirft %Z einen UnicodeEncodeError innerhalb von strftime — bevor überhaupt ein String existiert, den der vorhandene _sanitize_surrogates-Durchlauf bereinigen könnte. Der System-Prompt wird bei jedem Gesprächsstart und bei jeder Kompaktierung neu gebaut, der Fehler kam also immer wieder zurück. Das neue hermes_time.safe_strftime() ist auf gesunden Locales byte-identisch zu strftime (die Prefix-Cache-Invariante hält) und dekodiert surrogate-escapte Bytes andernfalls über die ANSI-Codepage. PRs #120748.
  • Dekodierung von Kindprozessen auf chinesischem Windows. _readerthread von subprocess.communicate() dekodiert unter Windows die Ausgabe von Kindprozessen mit subprocess._text_encoding() — locale.getencoding(), auf chinesischem Windows cp936/GBK —, wann immer ein Capture text=True ohne encoding= übergibt. Die betreffenden Kindprozesse schreiben UTF-8, jedes in GBK illegale Byte löst also einen UnicodeDecodeError in diesem Thread aus, den der threading.excepthook des Serve-Prozesses als [gateway-crash]-Zeile ausgibt. hermes_cli/web_routers/files.py::_fs_git_branch war einer davon (seine kwargs stehen in einem Dict-Literal, sodass die zeilenbasierte text=True-Regel dort nie griff), und Desktop pollt ihn kontinuierlich. PRs #120749.
  • Absolute Windows-Pfade. C:\...\report.html und UNC-Pfade \\server\share\... wurden weder als Pfade erkannt (es erschien also kein Artifact-Tag) noch vom Renderer-Fallback in Ruhe gelassen, der alles, was nicht mit / beginnt, als relativ behandelte und an cwd anhängte, was Pfade wie /repo/C:\... erzeugte; das Preview-Label las C: dann als URL-Schema. Das neue isWindowsAbsolutePath akzeptiert einen Laufwerksbuchstaben mit beiden Slashes und ein UNC-Präfix. PRs #121074.
  • Die Boot-Probe beim Kaltstart. Bei einem Windows-Kaltstart antwortet das lokale Backend per HTTP, dann stockt seine Event-Loop 12–28 s lang, während der GIL beim Import von Gateway-Plattformmodulen gehalten wird. Die WebSocket-Probe beim Boot gab nach festen 10 s auf, verriegelte damit einen Boot-Fehler, riss den Kindprozess ab und landete in der Kaskade „Ignoring stale Hermes backend exit (1)“. Ein Backend, das diese App selbst gestartet hat, wartet jetzt über das Basisbudget von 10 s hinaus weiter, solange der Kindprozess lebt, bis zu einer Obergrenze von 90 s — dasselbe Budget, das der Schritt zur Port-Ankündigung für einen Kaltstart bereits zugesteht. Das Fortschrittssignal ist Liveness, nicht die Aktualität der Ausgabe, denn der Stillstand ist stumm. Remote-Gateways, die Schaltfläche „Test remote“ und das Anhängen an ein Host-Backend behalten das feste Budget von 10 s. PRs #120750.

Improvements

  • Die Welle des Desktop-Plugin-SDK (Composer-Draft-API, Slots für Session-Liste und Zeilendekoration, Sidebar-Nav-Prefs, Model-Pill-Labels, typisierte Brücken für Settings/Skills/Toolsets/Profiles, ein sandboxed Embed-Primitive, ein Slot für Appearance-Einstellungen, eine öffentliche Event-Bridge für Plugin-Backends) ist komplett in diesem Fenster gelandet; ihre geplante Beschreibung ist ebenfalls verschoben.
  • Die Connectors-Seite hat den MCP-Tab ersetzt, mit „Connect now“ für die MCP-Server eines frisch installierten Plugins, und die Tools und Skills installierter Plugins gehen in jedem offenen Chat live; das Onboarding bietet Katalog-Plugins neben Connectors an.
  • Kanban hat einen Design-Durchgang bekommen: ein zweispaltiges Ticket-Modal und Markdown-Task-Text.
  • Das Fenster enthält außerdem eine lange Serie von Hot-Path-Performance-Arbeit über Config-Loading, Tool-Registry, Gateway-Nachrichtenverarbeitung und Model-Picker hinweg.

Upgrade

hermes update                 # git installs
# or re-run the installer one-liner

Docker / Hermes Cloud: Die Images bauen aus diesem Tag, nousresearch/hermes-agent:v2026.9.24.

Vollständiges Changelog: v2026.9.21…v2026.9.24

Versionszuordnung: Der Tag ist datumsbasiert (v2026.9.24) und die semantische Version ist v0.21.5 — dasselbe Release.

← Hermes Agent Changelog