«Context compression timed out before it could commit» significa que el modelo de resumen de Hermes —el que está bajo auxiliary.compression, no tu modelo principal— no avanzó antes de que se agotara el presupuesto de compresión de Hermes, y el turno se detuvo sin enviar la llamada principal. Depende de la versión: reproducimos ambos mensajes en Hermes Agent v0.21.3 y nos recuperamos de ellos haciendo que el resumidor respondiera y reintentando en la misma sesión, mientras que en v0.21.5 el mismo bloqueo produjo una espera larga en lugar del error. Probado el 1 de octubre de 2026 contra un sustituto de grabación para ambos modelos, no contra un proveedor real.
Si estás configurando Hermes contra tu propio endpoint en lugar de depurarlo, empieza por Hermes Agent con una API personalizada.
Los dos mensajes y lo que indica cada uno
| Lo que ves | Cuándo apareció | ¿Se envió la llamada principal? |
|---|---|---|
| «La compresión del contexto agotó el tiempo de espera antes de poder guardar el resultado, mientras la solicitud todavía tenía aproximadamente 83.485 tokens. La llamada al proveedor no se envió. Ejecuta /compress y espera a que termine; después, vuelve a intentarlo.» | v0.21.3, resumidor silencioso, solicitud (~83,485 tokens) mayor que la ventana de 64,000 tokens del modelo | No |
| «La compresión del contexto agotó el tiempo de espera sin reducir esta conversación. No se descartaron mensajes. Inicia una sesión nueva con /new o comprueba auxiliary.compression antes de volver a intentar /compress.» | v0.21.3, resumidor silencioso, solicitud (~57,489 tokens) por encima del activador de compresión de 54,400 tokens, pero dentro de la ventana | No |
La cifra de tokens del primer mensaje es la estimación propia de Hermes de la solicitud que habría enviado. Ambos turnos terminaron en el registro como reason=context_compression_timeout con api_calls=0, después de una advertencia del tipo «Context compression made no progress for 5.0s»; cinco segundos porque el conjunto de pruebas estableció compression.context_timeout_seconds: 5 para mantener breves las ejecuciones; el valor predeterminado es 120.
La versión que utilizas determina lo que ocurre
| Estado del resumidor | v0.21.3 (14 de septiembre) | v0.21.5 (24 de septiembre) |
|---|---|---|
| Silencioso, solicitud dentro de la ventana | Turno detenido: segundo mensaje anterior | Esperó (retenciones de 30 s y 90 s), comprimió 9 mensajes en 5 y envió la solicitud |
| Silencioso, solicitud fuera de la ventana | Turno detenido: primer mensaje anterior | No se ejecutó con un resumidor silencioso; la documentación limita este caso mediante un presupuesto de inactividad y un resumen de respaldo determinista |
| Errores de respuesta (404) | Dos intentos, compresión omitida y solicitud enviada (probado dentro de la ventana) | Igual; también se envió una solicitud fuera de la ventana, que un proveedor real rechazaría |
| Receptivo | Comprimió y envió | Comprimió y envió |
El límite está en el código fuente. En v0.21.4 (etiqueta v2026.9.21), la función que detiene un turno después de una compresión cuyo tiempo de espera se agotó se restringió a solicitudes por encima de la ventana del modelo, citando los problemas #113646 y #114594; v0.21.3 detiene todas. La documentación de configuración de v0.21.5 añade que la espera de compresión «is floored at the auxiliary compression request's own timeout (auxiliary.compression.timeout, minimum 300s)», razón por la que nuestra configuración de cinco segundos no tuvo efecto allí. Por tanto, en una compilación actual, un resumidor lento te cuesta minutos de espera en lugar de un error, y uno muerto se omite.
Diagnóstico más breve
- Comprueba la versión con
hermes --version. En v0.21.3 o anteriores, ambos mensajes anteriores son el comportamiento esperado de un resumidor bloqueado. - Encuentra el resumidor en
~/.hermes/logs/agent.log: una línea «Auxiliary compression: using <provider> (<model>) at <url>» identifica el modelo y el endpoint cuyo tiempo de espera se agotó. Si no hay un bloqueauxiliary.compression, hereda tu modelo principal. - Lee la línea del activador: «Pre-API compression: ~N request tokens >= T threshold (context=W)». Si N es mayor que W, el turno no puede salir sin reducirse en ninguna versión.
- Comprueba la ventana del resumidor. La documentación de Hermes exige que sea al menos tan grande como la del modelo principal, porque se le envía todo el centro de la conversación.
Recuperación verificada
En todos los casos anteriores de v0.21.3, reiniciar el sustituto con un resumidor que respondiera y enviar un turno más en la misma sesión (--resume) produjo una respuesta normal, con la conversación intacta. En la práctica, eso significa una de estas opciones: apunta auxiliary.compression a un modelo rápido al que puedas acceder, corrige el endpoint al que apunta o aumenta compression.context_timeout_seconds si tu resumidor es lento pero funciona correctamente, por ejemplo, un modelo local. Después, vuelve a intentarlo en la misma sesión.
# ~/.hermes/config.yaml — the summariser is its own model, with its own budget
auxiliary:
compression:
base_url: https://api.kunavo.com/v1 # overrides provider; any OpenAI-compatible endpoint
api_key: sk-kn-...
model: claude-haiku-4-5 # fast, and a context window >= your main model's
timeout: 300
compression:
context_timeout_seconds: 120 # inactivity budget for the summary (default)
context_total_ceiling_seconds: 600No se probaron dos aspectos: las superficies Desktop y messaging-gateway de Hermes, que tienen su propia compresión de higiene con presupuestos diferentes, y un proveedor real que rechazara una solicitud fuera de la ventana. Las ejecuciones fueron turnos hermes chat -Q individuales.
Cuánto cuesta
Un turno detenido no envía ninguna solicitud al modelo principal, por lo que el modelo principal no cobra nada por él. La solicitud de resumen sí se envió —aproximadamente 19,000 caracteres de indicación en estas ejecuciones— y un proveedor la factura si finalmente se completa. El reintento paga entonces un resumen y una llamada principal. Un resumidor pequeño y rápido reduce tanto la espera como ese coste adicional; en Kunavo, Claude Haiku 4.5 figura a $0.70 por millón de tokens de entrada y $3.50 por millón de salida, facturados por token desde un saldo prepagado. Nadie en Kunavo ha ejecutado Hermes contra su endpoint; las ejecuciones de aquí utilizaron un sustituto local.
Preguntas frecuentes
¿Qué significa «Context compression timed out before it could commit» en Hermes?
Hermes intentó reducir la conversación antes de enviar tu turno, el modelo de resumen que utiliza no avanzó dentro de su límite de tiempo y la solicitud era demasiado grande para enviarla sin reducirla; por eso Hermes detuvo el turno sin llamar en absoluto a tu modelo principal. Se reprodujo en Hermes Agent v0.21.3 con un resumidor bloqueado y una solicitud de 83,485 tokens contra una ventana de 64,000 tokens; la línea del registro del turno decía api_calls=0. Tu modelo principal y su tiempo de espera de API no son el problema. El problema es el resumidor: el modelo bajo auxiliary.compression en config.yaml.
¿Cómo soluciono un tiempo de espera agotado de compresión de contexto en Hermes?
Haz que el resumidor responda y vuelve a intentarlo en la misma sesión. En la reproducción, apuntar auxiliary.compression a un modelo receptivo y enviar el siguiente turno en la misma sesión funcionó siempre en v0.21.3, con el historial intacto; el propio mensaje dice que no se descartaron mensajes. Actualizar también cambia la situación: desde v0.21.4, una compresión cuyo tiempo de espera se agota ya no detiene una solicitud que todavía cabe en la ventana del modelo, y en v0.21.5 la espera del resumen queda limitada por el tiempo de espera de la propia solicitud del resumidor, al menos 300 segundos. Iniciar una sesión nueva con /new también funciona, a cambio de perder el contexto de la conversación.
¿Está solucionado el tiempo de espera de compresión de Hermes?
En parte, y cambió de forma. Hasta v0.21.3 (14 de septiembre de 2026), cualquier compresión previa cuyo tiempo de espera se agotara detenía el turno. v0.21.4 (21 de septiembre) solo detiene una solicitud que supera la ventana de contexto del modelo. En v0.21.5 (24 de septiembre), un resumidor bloqueado que esperó 30 y luego 90 segundos no detuvo el turno: Hermes esperó, comprimió y envió la solicitud; por tanto, en una versión actual el síntoma de un resumidor lento es una pausa larga, no este error. Un resumidor muerto, en lugar de lento, es distinto: se reintenta, luego se omite y el turno continúa sin comprimir.
¿Ayuda aumentar HERMES_API_TIMEOUT?
No. Esa variable controla la llamada al modelo principal, 1,800 segundos de forma predeterminada. La compresión tiene sus propios límites en config.yaml: compression.context_timeout_seconds (un límite de inactividad, 120 segundos de forma predeterminada), compression.context_total_ceiling_seconds (600 de forma predeterminada) y auxiliary.compression.timeout para la propia solicitud de resumen. La documentación de Hermes añade un requisito tan importante como la velocidad: la ventana de contexto del modelo de resumen debe ser al menos tan grande como la del modelo principal, porque recibe todo el centro de la conversación.
¿El turno cuyo tiempo de espera se agotó tuvo algún coste?
Not on the main model: the turn ended before the main call was sent. The summary request was sent, though, and a summariser that eventually finishes is billed by its provider like any other call — in the runs here the summary prompt was about 19,000 characters. The retry then pays for one summary and one main call. That is why pointing compression at a small, fast model is cheaper as well as quicker: on Kunavo, Claude Haiku 4.5 lists at $0.70 per million input tokens.
Reproducido el 1 de octubre de 2026 con Hermes Agent v0.21.3 (etiqueta v2026.9.14) y v0.21.5 (etiqueta v2026.9.24), instalados desde sus fuentes de lanzamiento, contra un sustituto local de grabación que servía tanto el modelo principal como el de resumen (mantenía las respuestas de un resumidor bloqueado y devolvía 404 para uno que fallaba), con una ventana de 64,000 tokens y cuatro turnos reanudados de texto de relleno antes del turno de prueba. El límite de versiones se leyó de agent/turn_context.py en las etiquetas v2026.9.14, v2026.9.21 y v2026.9.24, y los presupuestos de la documentación de configuración de cada etiqueta. El sustituto no es un modelo ni un proveedor: acepta cualquier tamaño de solicitud, por lo que no se reprodujeron errores de contexto del lado del proveedor.