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:
- Loop aceito —
↻ Loop set (every 5m): check the deploy status… - Primeiro despertar em 5m — enquanto a sessão está ociosa, o Hermes injeta o despertar e roda um turno normal contra o estado atual.
- 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ção | Como |
|---|---|
| O agente decide que acabou | O 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ça | loops.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
| Comando | O que faz |
|---|---|
/loop [intervalo] <prompt> [--times N] [--until <cond>] | Inicia (ou substitui) o loop desta sessão. |
/loop ou /loop status | Mostra a cadência, quantos tiques dispararam e o tempo até o próximo despertar. |
/loop pause | Para de disparar sem perder o loop. |
/loop resume | Retoma. |
/loop stop | Encerra 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
/resumee à 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
/loopsubstitui 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 | /goal | cron | |
|---|---|---|---|
| Disparo | Cronômetro (ou ritmo próprio) | Veredito do juiz após cada turno | Agendamento, fora de qualquer sessão |
| Vive em | Sua sessão atual | Sua sessão atual | Uma sessão própria por execução |
| Termina quando | Condição de parada / tetos / você | Objetivo atingido / orçamento / você | Você remove o job |
| Melhor para | Consulta, monitoramento, repetições periódicas | Um objetivo, iterando até concluir | Agendas longas e sem supervisão |