Hermes hört auf, deine Context-Größe zu raten: Usage Anchoring richtet Kompressions-Schwellen an echten Zahlen aus


Deine Session erreicht Turn 40 und alles läuft – dann poppt aus dem Nichts eine „Context zu lang, komprimiere“-Meldung auf, obwohl du weit von der Fenstergrenze entfernt bist. Oder die API wirft eines Tages einen 413-Fehler, der Request sei zu groß, obwohl die Konversation offensichtlich nicht so lang ist. Beide Szenarien waren früher in Hermes Alltag und haben eine gemeinsame Wurzel: Hermes hat geraten, wie groß dein Context ist – Turn für Turn wurde das gesamte Transkript mit Heuristiken wie chars/4 und pauschalen 1500 Tokens pro Bild neu geschätzt, und der Fehler wuchs mit der Historie. Die am 28. August gemergte Änderung (PR #97206) zieht diese Wurzel: Die Context-Abrechnung verankert sich jetzt am vom Provider gemeldeten Usage, und das Schätzfenster schrumpft von „der ganzen Konversation“ auf „Nachrichten, die seit der letzten Antwort dazugekommen sind“.

Vorher: Schätzung des ganzen Transkripts, Schneeball-Fehler

Jede Provider-Antwort trägt eigentlich einen präzisen Usage-Report: usage.prompt_tokens (exakt, wie viele Tokens dieser Request gesendet hat, inklusive System-Prompt, Tool-Schemas und voller Historie) und usage.completion_tokens (wie viele generiert wurden). Der Modellanbieter zählt das selbst – das ist echte Ground Truth.

Aber das alte Hermes nutzte das kaum. Bei jeder Prüfung der Context-Größe schätzte es die gesamte Session mit Heuristiken neu: ASCII-Zeichen geteilt durch 4, pauschale 1500 Tokens pro Bild, CJK-Dichteregeln … Früh in einer Session war die Schätzung okay, aber mit wachsender Historie summierte sich der Fehler. Manche Sessions wurden überschätzt – komprimiert, bevor je der Schwellenwert erreicht war; andere unterschätzt – der Request überschritt das Provider-Limit und bekam eine 413. Die Issues #89938 und #88960 sind typische Beispiele dieser „Schätzung vs. Realität“-Klasse.

Neuer Mechanismus: Usage Anchoring, Fehlerfenster bis auf einen Turn

Der Kern von PR #97206 ist eine Formel:

current context tokens =
  last response's usage.prompt_tokens
  + last response's usage.completion_tokens
  + estimate(ONLY messages appended since that response)

Anders gesagt: Die echte Größe der gesamten Konversation kommt direkt aus den Zahlen des Providers; nur die paar Nachrichten, die seit der letzten Antwort dazugekommen sind, müssen geschätzt werden. Das Fehlerfenster schrumpft von „dem ganzen Transkript“ auf „einen Turn“ – und es korrigiert sich bei jeder Antwort selbst, weil der echte Wert der Startpunkt ist, nie etwas, das die Schätzung einholen muss.

Der Anker wird an genau einer Stelle erfasst: dem Usage-Block direkt nach context_compressor.update_from_response() in der Haupt-Konversationsschleife (capture_usage_anchor), aktualisiert bei jeder Antwort. Kompressions-Schwellen und 413-Recovery-Logik arbeiten alle mit dieser verankerten Zahl.

Begleitende Fixes: 413-Recovery zählt Bytes

Dieselbe Welle bringt begleitende Fixes mit (#97197 und Co.): Die 413-Recovery maß die Request-Größe früher in geschätzten Tokens – jetzt misst sie echte Bytes, denn das 413-Urteil des Providers basiert auf der HTTP-Payload-Größe, und keine Token-Schätzung lässt sich korrekt in Bytes umrechnen. Der Kompressor gibt außerdem jetzt tatsächlich die Bytes frei, die historische Bilder bei der Kompaktierung belegen (#97160) – die 413-Recovery ist also kein „gerade so bestanden“, sondern „wirklich Platz freigeräumt“.

Was das für dich bedeutet

  • Weniger Überraschungskompressionen: Schwellen-Checks richten sich an echten Zahlen aus, Sessions hören auf, „virtuell aufgebläht“ zu sein und vorzeitig zu komprimieren;
  • Weniger 413s: Request-Größen-Checks wechseln von Schätzungen auf Byte-Zählung, lange Sessions sterben nicht mehr zufällig mit „Payload too large“;
  • Ehrliches /context: Die Zahlen, die du siehst, entsprechen denen auf deiner Provider-Rechnung – was du siehst, ist echt.

Maintainer Teknium brachte es unverblümt auf den Punkt: „Ich habe es wirklich satt, dass wir Tokens schätzen. Hört auf, Dinge zu schätzen.“ Diese Welle ist dieser Satz, umgesetzt in Code.

Die Änderungen wurden am 28. August gemergt und leben derzeit auf upstream main, noch nicht in einem Release-Tag. Sie greifen automatisch, sobald du per hermes update auf einen Build mit ihnen aktualisierst.

Weiterlesen