Ajustei Cada Linha do config.yaml do Hermes — 3 Configurações Que Impedem Tarefas Longas de Travar

A coisa mais frustrante ao usar o Hermes Agent em tarefas complexas não é receber uma resposta errada — é ver a tarefa travar no meio do caminho: chamadas de API paradas, limite de contexto explodindo após várias rodadas, ou uma ferramenta falhando presa em um loop de retry infinito. Na maioria das vezes, esses não são problemas do modelo. São valores padrão no ~/.hermes/config.yaml que não foram ajustados para execuções longas.
Depois de rodar centenas de tarefas longas, revisei minha configuração linha por linha e descobri que apenas três configurações realmente decidem se uma tarefa longa termina bem. Configure-as de acordo com sua carga de trabalho e a maioria dos trabalhos complexos terminará sem intervenção manual.
Abaixo, cada seção segue o padrão: sintoma → causa → solução → valores recomendados, com trechos de YAML prontos para copiar e colar.
Configuração 1: Coloque uma Coleira Curta nas Chamadas de API — Timeouts de Provider
Sintomas
- A tarefa chega a 50%, o terminal fica em silêncio e, depois de trinta segundos, você vê “Connection timed out.”
- Um job em background ou cron mostra
running, mas o log não avança há minutos. - Após mudar para outro provider da OpenRouter, as respostas ficam irregulares e ocasionalmente travam.
Causa
As chamadas de API do Hermes recaem por padrão sobre duas variáveis de ambiente: HERMES_API_TIMEOUT (1800 s) e HERMES_API_CALL_STALE_TIMEOUT (90 s). No entanto, as chaves request_timeout_seconds e stale_timeout_seconds sob o bloco providers no config.yaml têm prioridade; as variáveis de ambiente só são usadas quando nenhuma configuração está definida.
Sem ajuste por provider:
- Modelos de nuvem com longo raciocínio (Claude Opus, o1, deep-research) podem ser mortos antes de terminar.
- Endpoints locais (LM Studio, Ollama, vLLM) podem levar dezenas de segundos para iniciar, mas os timeouts de request padrão são muito menores.
- Um único provider instável pode travar toda a execução porque não há timeout explícito.
Solução
Adicione um bloco providers no topo do config.yaml e ajuste por provider:
providers:
anthropic:
request_timeout_seconds: 600 # tolera 10 min para raciocínio lento
stale_timeout_seconds: 300 # apenas chamadas não-streaming
openrouter:
request_timeout_seconds: 300
stale_timeout_seconds: 120
lmstudio:
request_timeout_seconds: 300 # cold-start local é lento
stale_timeout_seconds: 900 # reativa explicitamente a detecção de stale
ollama-local:
request_timeout_seconds: 300
stale_timeout_seconds: 900
Se você usa principalmente um provider, configurar apenas aquele provider é suficiente. request_timeout_seconds é passado diretamente ao SDK como timeout=, substituindo a variável de ambiente legada.
Valores recomendados
| Cenário | request_timeout_seconds | stale_timeout_seconds |
|---|---|---|
| Modelos de nuvem rápidos (Claude 3.5 Sonnet, GPT-4o mini) | 60–120 | 60–90 |
| Modelos de raciocínio longo (Claude Opus, o1, deep-research) | 300–600 | 120–300 |
| Modelos locais (LM Studio / Ollama / vLLM) | 180–300 | 600–900 |
| Jobs em background / cron | 300–600 | 120–300 |
Nota:
stale_timeout_secondssó se aplica a chamadas não-streaming. Chamadas em streaming são consideradas ativas enquanto tokens continuam chegando.
Configuração 2: Não Deixe o Contexto Explodir Primeiro — Estratégia de Compressão
Sintomas
- Depois de muitas rodadas de ferramentas, o modelo começa a responder fora do tema ou lança “context length exceeded.”
- A compressão dispara tarde demais, em 80% da janela, e já comprime resultados intermediários importantes.
- Após a compressão, o agente “esquece” coisas que você acabou de confirmar: chaves de API, caminhos de arquivo, restrições.
Causa
O bloco compression do Hermes dispara quando o uso de tokens atinge threshold × context_length. Os padrões podem não se adequar à sua carga de trabalho:
threshold: 0.50é agressivo para 200K de contexto, mas tarde demais para 32K.protect_last_n: 20mantém apenas as últimas 20 mensagens, o que em uma tarefa longa pode cobrir apenas 2–3 turnos críticos.target_ratio: 0.20decide quanto do final recente manter; muito pequeno perde detalhes, muito grande desperdiça espaço.
Há também uma regra oculta no código: para modelos com janela de contexto menor que 512K, o threshold é fixado em 0.75. Então modelos de janela pequena não disparam em 50%, mas sim em 75%. Saber disso ajuda a estimar o ponto real de compressão.
Solução
compression:
enabled: true
threshold: 0.65 # dispara mais cedo que o padrão
target_ratio: 0.25 # mantém 25% do final recente
protect_last_n: 30 # ~15 turnos completos
protect_first_n: 1 # apenas system prompt + primeira mensagem do usuário
codex_app_server_auto: native
Se sua tarefa precisa frequentemente voltar ao contexto inicial (ex.: “sempre use Python 3.11”, “este projeto usa pnpm”), aumente protect_first_n para 3. Caso contrário, mantenha em 1 para economizar espaço.
Valores recomendados
| Janela de contexto | threshold | target_ratio | protect_last_n |
|---|---|---|---|
| ≤ 32K (Claude 3.5 Sonnet, GPT-4o) | 0.75 (padrão mínimo) | 0.25 | 30–40 |
| 128K–200K | 0.60–0.65 | 0.20–0.25 | 20–30 |
| ≥ 1M (Gemini, Kimi k1.5) | 0.50–0.55 | 0.15–0.20 | 20 |
Dica: O resumidor de compressão usa Gemini Flash por padrão, que é rápido e barato. Para tarefas com muito código, você pode fixar um modelo diferente em
auxiliary.compression, mas o padrão geralmente é suficiente.
Configuração 3: Trave o Loop de Ferramentas — agent.max_turns
Sintomas
- Uma tarefa simples invoca 50 turnos de ferramentas e o agente ainda está em “deixe-me confirmar novamente.”
- Uma instabilidade de rede faz uma ferramenta falhar repetidamente, enviando o agente a uma espiral de retry e sua fatura subindo.
- Uma tarefa em background roda por meia hora e acaba presa em um loop.
Causa
agent.max_turns limita quantas iterações de chamadas de ferramentas o agente pode fazer em uma única requisição do usuário. O padrão de 60 é suficiente para Q&A casual, mas é rapidamente esgotado em debugging complexo, processamento em lote ou confirmação iterativa. Sem um limite, uma ferramenta falhando pode retryar indefinidamente.
Combinar max_turns com tool_loop_guardrails.hard_stop_enabled cria um disjuntor para loops anormais.
Solução
agent:
max_turns: 100 # espaço para tarefas complexas
api_max_retries: 2 # falha rápido e deixa o fallback assumir
reasoning_effort: medium
tool_loop_guardrails:
warnings_enabled: true
hard_stop_enabled: true # disjuntor para loops anormais
warn_after:
exact_failure: 2
same_tool_failure: 3
idempotent_no_progress: 2
hard_stop_after:
exact_failure: 5
same_tool_failure: 8
idempotent_no_progress: 5
Valores recomendados
| Tipo de tarefa | max_turns | hard_stop_enabled |
|---|---|---|
| Q&A casual / consultas de uma etapa | 30–40 | false |
| Debugging de código / complexidade média | 60–80 | true |
| Processamento em lote / jobs longos em background | 100–150 | true |
| Pesquisa exploratória / refatoração multi-arquivo | 100–200 | true |
Nota:
max_turnsé o limite de iteração de ferramentas por requisição, não o limite de mensagens da sessão inteira. Você pode resetar o contexto a qualquer momento com/newou outros comandos de gerenciamento de sessão do nosso panorama de comandos do Hermes v0.18.
Referência Completa: Trecho de config.yaml Pronto para Uso
Aqui está um trecho consolidado para o cenário comum de OpenRouter como provider principal + modelos locais ocasionais + tarefas longas frequentes:
model:
default: "anthropic/claude-opus-4.6"
provider: "auto"
base_url: "https://openrouter.ai/api/v1"
providers:
anthropic:
request_timeout_seconds: 600
stale_timeout_seconds: 300
openrouter:
request_timeout_seconds: 300
stale_timeout_seconds: 120
lmstudio:
request_timeout_seconds: 300
stale_timeout_seconds: 900
compression:
enabled: true
threshold: 0.65
target_ratio: 0.25
protect_last_n: 30
protect_first_n: 1
codex_app_server_auto: native
codex_gpt55_autoraise: true
agent:
max_turns: 100
api_max_retries: 2
reasoning_effort: medium
tool_loop_guardrails:
warnings_enabled: true
hard_stop_enabled: true
warn_after:
exact_failure: 2
same_tool_failure: 3
idempotent_no_progress: 2
hard_stop_after:
exact_failure: 5
same_tool_failure: 8
idempotent_no_progress: 5
Salve em ~/.hermes/config.yaml. Novas sessões o carregam imediatamente; sessões já em execução precisam de /new para recarregá-lo.
Verificação: Realmente Funcionou?
Três verificações rápidas:
- Dispare raciocínio longo de propósito. Peça ao agente para processar um arquivo de log de 500 linhas ou ler dez arquivos de código de uma vez. Você não deve mais ver
context length exceeded. - Simule instabilidade de API. Bloqueie brevemente o IP do provider com
timeoutouiptablese confirme que o agente falha dentro do timeout configurado e tenta fallback, em vez de ficar pendurado para sempre. - Inspecione a compressão. Durante uma tarefa longa, execute
/compressou aguarde a compressão automática e verifique se as últimas ~30 mensagens e o system prompt ainda estão presentes.
Para modos de falha mais complexos, veja nosso mergulho profundo em manipulação de erros e recuperação do Hermes, que combina timeouts, fallbacks e retries em uma única estratégia de resiliência.
Resumo
Tarefas longas geralmente travam não porque o modelo ficou mais lento, mas porque timeouts de API, compressão de contexto e limites do loop de ferramentas não estão alinhados. Depois de ajustar essas três configurações:
- Chamadas de API expiram de forma limpa e fazem fallback para outro provider em vez de ficar penduradas.
- O contexto é comprimido no momento certo, preservando detalhes recentes sem atingir o limite da janela.
- Chamadas de ferramentas têm um teto rígido, impedindo espirais de retry e contas fora de controle.
Se você está começando, leia primeiro o guia de instalação para garantir que seu ambiente esteja sólido, e depois guarde este trecho como um “modelo para tarefas longas” para copiar em trabalhos exigentes.
Referências: este artigo é baseado no cli-config.yaml.example oficial do Hermes Agent e na documentação oficial.