Pular para o conteúdo principal

Documentação oficial desta página · v0.20.6

Loops Recorrentes (/loop)

O /loop repete um prompt (ou um comando de barra) numa cadência recorrente dentro da sua sessão atual. Cada despertar é um turno de agente de verdade: o Hermes lê o estado atual do zero — o último resultado da CI, a fila como ela está agora, o arquivo como ele está agora —, faz o trabalho, relata e fica quieto até o próximo tique.

É a versão do Hermes para o /loop do Claude Code (e o apelido /proactive, que também funciona aqui). Enquanto o /goal é guiado por um juiz — "continue trabalhando até este objetivo ser atingido" —, o /loop é guiado por um cronômetro: "faça isso de novo a cada N minutos (ou quando fizer sentido) até algo mandar parar."

Quando usar​

  • Consultar estado externo. "Acompanhe o deploy / a execução da CI / a fila e me avise quando mudar." É o caso de uso clássico.
  • Repetir até ficar verde. "Rode os testes, conserte o que falhar, repita até passarem."
  • Monitorar durante uma sessão de trabalho. Fique de olho na taxa de erro ou no progresso de um job longo enquanto você faz outra coisa na mesma conversa.
  • Manutenção periódica. Repita um lint ou um resumo de status a cada N minutos numa sessão longa.

Quando o trabalho deve rodar sem ninguém olhando — de madrugada, num horário de verdade, sobrevivendo a reinícios do terminal —, use um job de cron no lugar. O /loop vive dentro de uma sessão; o cron vive fora de todas elas. E quando a tarefa é um objetivo único com uma definição de pronto, o /goal costuma servir melhor.

Início rápido​

/loop 5m verifique o status do deploy e me diga se já está no ar

O que você vai ver:

  1. Loop aceito — ↻ Loop set (every 5m): check the deploy status…
  2. Primeiro despertar em 5m — enquanto a sessão está ociosa, o Hermes injeta o despertar e roda um turno normal contra o estado atual.
  3. Repetição — a cada 5 minutos, até uma condição de parada disparar ou você parar o loop.

Colocar um comando de barra em loop é igualmente simples:

/loop 10m /recap

Os dois modos de cadência​

Intervalo fixo — você acerta o relógio. Passe um intervalo (30s, 5m, 2h, 1h30m) e o loop dispara nesse ritmo. Use quando a coisa observada muda no ritmo dela:

/loop 2m consulte o build em ci.exemplo.com/job/42 e me avise assim que terminar

Ritmo próprio — o Hermes acerta o relógio. Omita o intervalo e o loop se autorregula: começa no piso (1 minuto por padrão) e, enquanto as respostas do agente não mudam, ele recua exponencialmente — 2m, 4m, 8m, até o teto (15 minutos por padrão). No instante em que uma resposta difere da anterior, a cadência volta ao piso. A detecção de mudança é uma comparação local de digest (timestamps são ignorados), então as esperas ociosas não custam nada a mais:

/loop fique de olho na migração e resuma o progresso

A regra de bolso: intervalo fixo quando um relógio externo comanda o trabalho; ritmo próprio quando o trabalho comanda o ritmo.

Condições de parada​

Um loop termina quando qualquer uma destas dispara:

CondiçãoComo
O agente decide que acabouO prompt de despertar ensina o agente a terminar a resposta com LOOP_COMPLETE numa linha própria quando a tarefa está pronta ou perdeu o sentido.
Um teto de execuções--times N — para depois de N despertares.
Uma condição baseada em evidência--until <condição> — depois de cada despertar, o mesmo juiz auxiliar que move o /goal confere a resposta contra a sua condição (falha aberta: um juiz quebrado nunca trava o loop).
Você/loop stop (ou /loop pause para manter o loop guardado).
O orçamento de segurançaloops.max_ticks (padrão 100) pausa o loop para que uma sessão sem supervisão não queime tokens para sempre. 0 = ilimitado.

Exemplos:

/loop 2m consulte a CI --times 30
/loop 5m acompanhe a fila --until a fila chegar a zero

Comandos​

ComandoO que faz
/loop [intervalo] <prompt> [--times N] [--until <cond>]Inicia (ou substitui) o loop desta sessão.
/loop ou /loop statusMostra a cadência, quantos tiques dispararam e o tempo até o próximo despertar.
/loop pausePara de disparar sem perder o loop.
/loop resumeRetoma.
/loop stopEncerra o loop.
/proactive …Apelido de /loop (paridade com o Claude Code).

Funciona na CLI, na TUI (hermes --tui), no chat do painel web, no aplicativo de desktop e em toda plataforma de gateway (Telegram, Discord, Slack, WhatsApp, …). Nas plataformas de mensagem o gateway dispara os despertares até entre as suas mensagens — o loop pertence à sessão daquela conversa, e os resultados chegam como respostas comuns.

Misturando com o /goal​

Os dois recursos injetam turnos sintéticos nas bordas de ociosidade, então seguem uma regra só: um objetivo ativo é dono da sessão. Enquanto um /goal está conduzindo de fato (com o juiz dizendo "continue"), os despertares do loop ficam para depois. O loop volta a usar o tempo ocioso assim que o objetivo termina, pausa ou estaciona numa barreira de espera (/goal wait, ou o veredito WAIT automático do juiz). Um objetivo estacionado somado a um /loop é uma combinação natural: o objetivo espera pela coisa assíncrona grande enquanto o loop mantém um batimento em outra frente.

Uma mensagem de verdade sua sempre ganha dos dois — os despertares só disparam com a sessão ociosa e nada seu na fila.

Detalhes de comportamento​

  • Um despertar é um turno normal de papel user. Sem mutação do prompt de sistema, sem troca de conjunto de ferramentas — o cache de prompt continua intacto.
  • Sobrevive ao /resume e à compressão. O estado do loop persiste por sessão e migra através das fronteiras de compressão de contexto, igual ao /goal.
  • Um loop por sessão. Definir um novo /loop substitui o anterior. Para vários loops, rode várias sessões (ou use cron para uma frota de agendamentos).
  • Interromper um turno de despertar (Ctrl+C) pausa o loop — recuperável com /loop resume, então cancelar realmente cancela.
  • O custo em tokens acompanha a cadência. Todo tique é um turno completo de agente. Ajuste o intervalo à frequência real de mudança do estado; prefira o ritmo próprio para esperas ociosas.

Configuração​

# ~/.hermes/config.yaml
loops:
min_interval_seconds: 30 # piso dos intervalos fixos
max_ticks: 100 # orçamento de segurança (0 = ilimitado)
self_paced_floor_seconds: 60 # cadência inicial do ritmo próprio
self_paced_ceiling_seconds: 900 # recuo máximo do ritmo próprio

O juiz do --until passa pela tarefa auxiliar goal_judge, então os ajustes de auxiliary.goal_judge.* (provedor, modelo, max_tokens) valem também para as condições do loop.

/loop vs /goal vs cron​

/loop/goalcron
DisparoCronômetro (ou ritmo próprio)Veredito do juiz após cada turnoAgendamento, fora de qualquer sessão
Vive emSua sessão atualSua sessão atualUma sessão própria por execução
Termina quandoCondição de parada / tetos / vocêObjetivo atingido / orçamento / vocêVocê remove o job
Melhor paraConsulta, monitoramento, repetições periódicasUm objetivo, iterando até concluirAgendas longas e sem supervisão