"Context compression timed out before it could commit" significa que o modelo de resumo do Hermes — o que está em auxiliary.compression, não o seu modelo principal — não avançou antes que o orçamento de compactação do Hermes acabasse, e o turno foi interrompido sem que a chamada principal fosse enviada. Isso depende da versão: reproduzimos ambas as mensagens no Hermes Agent v0.21.3 e nos recuperamos delas fazendo o resumidor responder e tentando novamente na mesma sessão, enquanto no v0.21.5 o mesmo travamento produziu uma espera longa, e não o erro. Testado em 1º de outubro de 2026 contra um substituto que registrava as solicitações para ambos os modelos, não contra um provedor real.
Se você está configurando o Hermes para usar seu próprio endpoint, em vez de depurá-lo, comece por Hermes Agent com uma API personalizada.
As duas mensagens e o que cada uma informa
| O que você vê | Quando apareceu | A chamada principal foi enviada? |
|---|---|---|
| "A compactação de contexto atingiu o limite de tempo antes de poder salvar o resultado, enquanto a solicitação ainda tinha aproximadamente 83.485 tokens. A chamada ao provedor não foi enviada. Execute /compress e aguarde sua conclusão; depois, tente novamente." | v0.21.3, resumidor silencioso, solicitação (~83,485 tokens) maior que a janela de 64,000 tokens do modelo | Não |
| "A compactação de contexto atingiu o timeout sem reduzir esta conversa. Nenhuma mensagem foi descartada. Inicie uma sessão nova com /new ou verifique auxiliary.compression antes de tentar /compress novamente." | v0.21.3, resumidor silencioso, solicitação (~57,489 tokens) acima do gatilho de compactação de 54,400 tokens, mas dentro da janela | Não |
O número de tokens na primeira mensagem é a estimativa do Hermes para a solicitação que ele teria enviado. Ambas as mensagens terminaram no log como reason=context_compression_timeout com api_calls=0, após um aviso no formato "Context compression made no progress for 5.0s" — cinco segundos porque o teste definiu compression.context_timeout_seconds: 5 para manter as execuções curtas; o padrão é 120.
A versão usada determina o que acontece
| Estado do resumidor | v0.21.3 (14 de setembro) | v0.21.5 (24 de setembro) |
|---|---|---|
| Silencioso, solicitação dentro da janela | Mensagem interrompida — segunda mensagem acima | Aguardou (esperas de 30 s e 90 s), compactou 9 mensagens para 5, enviou a solicitação |
| Silencioso, solicitação acima da janela | Mensagem interrompida — primeira mensagem acima | Não executado com um resumidor silencioso; a documentação limita este caso por um orçamento de inatividade e um resumo alternativo determinístico |
| Erros de resposta (404) | Duas tentativas, compactação ignorada, solicitação enviada (testado dentro da janela) | Igual; uma solicitação acima da janela também foi enviada, o que um provedor real rejeitaria |
| Responsivo | Compactado e enviado | Compactado e enviado |
O limite está no código-fonte. No v0.21.4 (tag v2026.9.21), a função que interrompe uma mensagem após uma compactação com timeout foi restringida a solicitações acima da janela do modelo, citando os problemas #113646 e #114594; o v0.21.3 interrompe todas. A documentação de configuração do v0.21.5 acrescenta que a espera pela compactação "is floored at the auxiliary compression request's own timeout (auxiliary.compression.timeout, minimum 300s)" — por isso nossa configuração de cinco segundos não teve efeito nele. Assim, em uma compilação atual, um resumidor lento custa minutos de espera, e não um erro, enquanto um resumidor morto é ignorado.
Diagnóstico mais curto
- Verifique a versão com
hermes --version. No v0.21.3 ou anterior, ambas as mensagens acima são o comportamento esperado para um resumidor travado. - Encontre o resumidor em
~/.hermes/logs/agent.log: uma linha "Auxiliary compression: using <provider> (<model>) at <url>" identifica o modelo e o endpoint que atingiram o timeout. Sem um blocoauxiliary.compression, ele herda seu modelo principal. - Leia a linha do gatilho, "Pre-API compression: ~N request tokens >= T threshold (context=W)". Se N estiver acima de W, a mensagem não poderá ser enviada sem redução em nenhuma versão.
- Verifique a janela do resumidor. A documentação do Hermes exige que ela seja pelo menos tão grande quanto a do modelo principal, porque todo o meio da conversa é enviado a ele.
Recuperação verificada
Em todos os casos do v0.21.3 acima, reiniciar o substituto com um resumidor que respondesse e enviar mais uma mensagem na mesma sessão (--resume) produziu uma resposta normal, com a conversa intacta. Na prática, isso significa uma destas opções: apontar auxiliary.compression para um modelo rápido ao qual você tenha acesso, corrigir o endpoint para o qual ele aponta ou aumentar compression.context_timeout_seconds se o seu resumidor for lento, mas saudável — um modelo local, por exemplo. Depois, tente novamente na mesma sessão.
# ~/.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: 600Duas coisas não foram testadas: as superfícies Desktop e messaging-gateway do Hermes, que têm sua própria compactação de higiene com orçamentos diferentes, e um provedor real rejeitando uma solicitação acima da janela. As execuções foram mensagens hermes chat -Q únicas.
Quanto custa
Uma mensagem interrompida não envia nenhuma solicitação ao modelo principal, portanto o modelo principal não cobra nada por ela. A solicitação de resumo foi enviada — cerca de 19,000 caracteres de prompt nessas execuções — e um provedor a cobra se ela for concluída. A tentativa seguinte paga por um resumo e uma chamada principal. Um resumidor pequeno e rápido reduz tanto a espera quanto essa sobrecarga; no Kunavo, Claude Haiku 4.5 custa $0.70 por milhão de tokens de entrada e $3.50 por milhão de tokens de saída, cobrados por token a partir de um saldo pré-pago. Ninguém no Kunavo executou o Hermes contra seu endpoint; as execuções aqui usaram um substituto local.
Perguntas frequentes
O que significa "Context compression timed out before it could commit" no Hermes?
O Hermes tentou reduzir a conversa antes de enviar sua mensagem, o modelo de resumo usado para isso não avançou dentro do tempo disponível, e a solicitação era grande demais para ser enviada sem redução — então o Hermes interrompeu a mensagem sem chamar seu modelo principal. Reproduzido no Hermes Agent v0.21.3 com um resumidor travado e uma solicitação de 83,485 tokens contra uma janela de 64,000 tokens; a linha de log da mensagem registrava api_calls=0. Seu modelo principal e o timeout de sua API não são o problema. O problema é o resumidor: o modelo em auxiliary.compression no config.yaml.
Como corrijo um timeout de compactação de contexto do Hermes?
Faça o resumidor responder e tente novamente na mesma sessão. Na reprodução, apontar auxiliary.compression para um modelo responsivo e enviar a próxima mensagem na mesma sessão funcionou no v0.21.3 todas as vezes, com o histórico intacto — a própria mensagem diz que nenhuma mensagem foi descartada. A atualização também muda o cenário: a partir do v0.21.4, uma compactação com timeout não interrompe mais uma solicitação que ainda caiba na janela do modelo, e no v0.21.5 a espera pelo resumo é limitada inferiormente pelo timeout da própria solicitação do resumidor, em pelo menos 300 segundos. Iniciar uma sessão nova com /new também funciona, ao custo do contexto da conversa.
O timeout de compactação do Hermes foi corrigido?
Parcialmente, e ele mudou de forma. Até o v0.21.3 (14 de setembro de 2026), qualquer compactação de pré-voo com timeout interrompia a mensagem. O v0.21.4 (21 de setembro) interrompe apenas uma solicitação que excede a janela de contexto do modelo. No v0.21.5 (24 de setembro), um resumidor travado mantido por 30 e depois 90 segundos não interrompeu a mensagem: o Hermes esperou, compactou e enviou a solicitação — portanto, em uma versão atual, o sintoma de um resumidor lento é uma pausa longa, não este erro. Um resumidor morto, e não lento, é diferente: ele é tentado novamente, depois ignorado, e a mensagem prossegue sem compactação.
Aumentar HERMES_API_TIMEOUT ajuda?
Não. Essa variável controla a chamada do modelo principal, 1,800 segundos por padrão. A compactação tem seus próprios limites em config.yaml: compression.context_timeout_seconds (um limite de inatividade, padrão de 120 segundos), compression.context_total_ceiling_seconds (padrão de 600) e auxiliary.compression.timeout para a própria solicitação de resumo. A documentação do Hermes acrescenta um requisito tão importante quanto a velocidade: a janela de contexto do modelo de resumo deve ser pelo menos tão grande quanto a do modelo principal, porque ele recebe todo o meio da conversa.
A mensagem que sofreu timeout custou alguma coisa?
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.
Reproduzido em 1º de outubro de 2026 com o Hermes Agent v0.21.3 (tag v2026.9.14) e v0.21.5 (tag v2026.9.24), instalados a partir do código-fonte de suas versões, contra um substituto local que registrava as solicitações e servia tanto o modelo principal quanto o modelo de resumo (retinha as respostas para um resumidor travado e retornava 404 para um que falhava), com uma janela de 64.000 tokens e quatro turnos retomados com conteúdo de preenchimento antes do turno de teste. O limite entre versões foi lido de agent/turn_context.py nas tags v2026.9.14, v2026.9.21 e v2026.9.24, e os orçamentos foram obtidos da documentação de configuração de cada tag. O substituto não é um modelo nem um provedor: ele aceita solicitações de qualquer tamanho, portanto erros de contexto do lado do provedor não foram reproduzidos.