Hermes deja de adivinar el tamaño de tu contexto: el anclaje de uso alinea los umbrales de compresión con números reales


Tu sesión llega al turno 40 y todo va bien — hasta que, de la nada, aparece un aviso de «contexto demasiado largo, comprimiendo», aunque estés lejísimos del límite de la ventana. O un día la API lanza un error 413 diciendo que la petición es demasiado grande, cuando la conversación claramente no es tan larga. Ambos escenarios solían ser habituales en Hermes y comparten una única causa raíz: Hermes estaba adivinando el tamaño de tu contexto — reestimando todo el transcript turno tras turno con heurísticas como chars/4 e imágenes planas de 1500 tokens, dejando que el error se acumulara a medida que crecía el historial. El cambio fusionado el 28 de agosto (PR #97206) arranca esa raíz: el recuento de contexto ahora se ancla en el uso reportado por el provider, y la ventana de estimación se reduce de «toda la conversación» a «los mensajes añadidos desde la última respuesta».

Antes: estimación de todo el transcript, error en bola de nieve

Cada respuesta del provider lleva en realidad un informe de uso preciso: usage.prompt_tokens (exactamente cuántos tokens envió esta petición, incluyendo system prompt, tool schemas e historial completo) y usage.completion_tokens (cuántos se generaron). El proveedor del modelo los cuenta por sí mismo — eso es ground truth real.

Pero el viejo Hermes apenas lo usaba. Cada vez que necesitaba comprobar el tamaño del contexto, reestimaba toda la sesión con heurísticas: caracteres ASCII divididos por 4, 1500 tokens planos por imagen, reglas de densidad CJK… La estimación estaba bien al principio de la sesión, pero a medida que crecía el historial, el error se acumulaba. Algunas sesiones se sobreestimaban — se comprimían antes de tocar el umbral; otras se subestimaban — la petición superaba el límite del provider y recibía un 413. Los issues #89938 y #88960 son ejemplos típicos de esta clase «estimación vs. realidad».

Nuevo mecanismo: anclaje de uso, ventana de error reducida a un turno

El núcleo del PR #97206 es una fórmula:

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

En otras palabras: el tamaño real de toda la conversación sale directamente de los números del provider; solo el puñado de mensajes añadidos desde la última respuesta necesita estimación. La ventana de error se reduce de «todo el transcript» a «un turno» — y se autocorrige en cada respuesta, porque el valor real es el punto de partida, nunca algo que la estimación tenga que perseguir.

El ancla se captura en exactamente un punto: el bloque de uso justo después de context_compressor.update_from_response() en el bucle principal de la conversación (capture_usage_anchor), actualizado en cada respuesta. Los umbrales de compresión y la lógica de recuperación de 413 pasan todos a este número anclado.

Arreglos acompañantes: la recuperación de 413 cuenta bytes

La misma ola trae arreglos acompañantes (#97197 y compañía): la recuperación de 413 solía medir el tamaño de la petición en tokens estimados — ahora mide bytes reales, porque el juicio de 413 del provider se basa en el tamaño del payload HTTP, y ninguna estimación de tokens se convierte a bytes correctamente. El compresor además ahora libera de verdad los bytes que ocupan las imágenes históricas durante la compactación (#97160), así que la recuperación de 413 no es «apenas pasar» sino «liberar espacio de verdad».

Qué significa esto para ti

  • Menos compresiones sorpresa: los chequeos de umbral se alinean con números reales, las sesiones dejan de estar «virtualmente infladas» y de comprimirse antes de tiempo;
  • Menos 413: los chequeos de tamaño de petición pasan de estimaciones a conteos de bytes, las sesiones largas dejan de morir al azar con «payload demasiado grande»;
  • /context honesto: los números que ves coinciden con los de la factura de tu provider — lo que ves es real.

El mantenedor Teknium lo dijo sin rodeos: «Estoy realmente cansado de que estimemos tokens. Dejad de estimar cosas». Esta ola es esa frase convertida en código.

Estos cambios se fusionaron el 28 de agosto y viven actualmente en main de upstream, todavía sin release tag. Se aplican automáticamente en cuanto hagas hermes update a una build que los incluya.

Lecturas recomendadas