O loop que aprende|INEMA.CLUB-PRO

Aula 7 · 18 min

Observabilidade: rastros e custo por ciclo

Um loop que roda sozinho precisa deixar rastro: quanto tempo cada ciclo levou, quantos tokens gastou, o que decidiu e por quê. Sem isso, um laço de erro ou um ciclo que estoura a cota só aparece na fatura do fim do mês. Nesta aula você grava uma linha por ciclo e tira dela custo por ciclo, custo por keep e os alertas.

Começar a aula
Painel com vários medidores analógicos e um registrador de papel contínuo desenhando linhas, um ponteiro com ponta amarela.

Nesta aula você vai

  1. 1Uma linha JSON por ciclo: o mínimo que vale guardar
  2. 2Custo por ciclo e custo por keep
  3. 3Alertas: teto, ciclos sem keep, erros iguais seguidos
  4. 4Tokens reais de uma chamada do Claude Code

Objetivo: gravar um rastro por ciclo (tempo, tokens, veredito) e tirar dele custo por ciclo, custo por keep e os alertas do meta-agente.

01Do ciclo ao alerta

O mesmo papel do Meta-agente do LOOP-R: observa o sistema, não o problema, e só relata. Clique em cada bloco.

Rastro sem tokens ainda serve: tempo, status e motivo já mostram laço de erro e estagnação.

O alerta não para o loop: quem para é o teto do curso 2 (loop-longrun.sh) ou a pessoa. Aqui, a leitura do rastro.

02Ensaio: seis ciclos, dois problemas

Agentes falsos com tokens inventados: um ciclo caro e três falhas iguais (como um agente sem resposta por limite da sessão).

Terminal · ensaio sem custo
K=~/projetos/loop-r-eng-aprende-v72/kit
E=${TMPDIR:-/tmp}/ensaio-aprende/a7; rm -rf $E; mkdir -p $E
bash $K/novo-sistema.sh $E/sis > /dev/null; export RASTRO=$E/rastros.jsonl
c() { TOKENS_FALSOS="$2" AGENTE="bash $K/agente-falso.sh $1" bash $K/experimento.sh $E/sis "$1" > /dev/null; }
c comenta "8000 500"; c sinonimos "9000 700"; c estraga "41000 3000"   # tokens inventados para o ensaio
c falha "0 0"; c falha "0 0"; c falha "0 0"
echo "## uma linha do rastro"; sed -n 2p $RASTRO
echo "## custo por ciclo"; python3 $K/custo-ciclo.py $RASTRO --teto 50000; echo "saída: $?"
Exemplo do repositório
## uma linha do rastro
{"ciclo": 2, "descricao": "sinonimos", "segundos": 0, "tokens_entrada": 9000, "tokens_saida": 700, "status": "keep", "motivo": "melhorou"}
## custo por ciclo
ciclo  status   segundos  tokens(ent+saída)  motivo
    1  discard         0               8500  não melhorou
    2  keep            0               9700  melhorou
    3  discard         0              44000  não melhorou
    4  erro            0                  0  agente falhou (saída 1): ERRO: sem resposta do m
    5  erro            0                  0  agente falhou (saída 1): ERRO: sem resposta do m
    6  erro            0                  0  agente falhou (saída 1): ERRO: sem resposta do m
total: 6 ciclos · 1 keep · 62200 tokens
custo por keep: 62200 tokens
ALERTA: ciclo 3 usou 88% do teto de 50000 tokens
ALERTA: 3 erros seguidos iguais: agente falhou (saída 1): ERRO: sem resposta do modelo (limit
saída: 1

Os tokens deste ensaio são inventados (variável TOKENS_FALSOS); tempo, status e alertas são do script de verdade. O laço de erro é o caso que mais custa sem aparecer: no curso 1, o juiz real parou no limite da sessão a partir da 16ª chamada.

03Os tokens de uma chamada real

O agente-claude.sh pede ao claude -p --output-format json e escreve no rastro a soma de entrada (com cache) e a saída. Uma chamada pela assinatura.

Terminal · real, uma chamada
K=~/projetos/loop-r-eng-aprende-v72/kit
E=${TMPDIR:-/tmp}/ensaio-aprende/a7      # o ensaio acima
RASTRO=$E/rastros.jsonl AGENTE="bash $K/agente-claude.sh" bash $K/experimento.sh $E/sis "claude"; echo "saída: $?"
tail -1 $E/rastros.jsonl | python3 -c 'import json,sys; d=json.load(sys.stdin); print("tokens:", "sim" if (d["tokens_entrada"] or 0) > 0 else "não", "·", d["status"])'
Exemplo do repositório
ciclo 7 · keep · 0.800 → 1.000 · melhorou
saída: 0
tokens: sim · keep

A linha gravada no rastro dessa rodada: 10 segundos, 247.492 tokens de entrada (somando leitura e escrita de cache) e 364 de saída. O pedido tem menos de 2 KB: quase toda a entrada é o contexto que a sessão do Claude Code carrega nesta máquina. Uma medição, Claude Code 2.1.303; a sua muda com as suas instruções, plugins e MCPs.

04O que já se mede no INEMA

Dois casos locais, com a data de cada número.

1. Exemplo LOOP-R

Cada ciclo do vendas-whatsapp tem um custo.md por agente. Os quatro ciclos somam cerca de 1,7 milhão de tokens para uma promoção (README do exemplo).

Dados de vendas sintéticos, agentes de verdade: o custo é real, o efeito foi desenhado.

05Prática

Ensaio, real e o seu loop.

E19 · Os dois alertas

10 min

Rode o ensaio.

Pronto quando: ALERTA: ciclo 3 usou 88% do teto, ALERTA: 3 erros seguidos iguais e saída: 1.

E20 · Tokens de verdade

5 min

Rode o bloco real logo depois do ensaio.

Pronto quando: a última linha impressa começa com tokens: sim; se vier tokens: não · erro, o agente ficou sem resposta (limite da sessão): espere e rode de novo.

E21 · Rastro no seu loop

20 min

Ligue RASTRO no seu experimento (ou grave a mesma linha JSON no fim de cada ciclo do seu loop) e defina o teto de tokens por ciclo a partir da medição real do E20.

Pronto quando: python3 $K/custo-ciclo.py [seu rastro] --teto [seu teto] lista um ciclo por linha e termina em sem alerta ou em ALERTA: que você sabe explicar.

06Teste da aula

Pergunta 1 de 4

Seis ciclos, um keep, 62.200 tokens no total. Qual é o custo por keep?competência

07Em três frases

Uma linhaCada ciclo grava tempo, tokens, status e motivo; nada de texto de prompt.
Custo por keepTotal de tokens sobre as melhorias que ficaram; inclui as tentativas que não ficaram.
AlertasTeto, ciclos sem keep e erros iguais seguidos; o alerta relata, o teto e a pessoa param.

Para ir além

Aula anteriorPróxima aula