Multiagente e Orquestração|INEMA.CLUB-PRO

Aula 3 · 20 min

Orquestrador-trabalhadores e fan-out

Fan-out é um orquestrador soltando N trabalhadores sobre itens independentes e juntando só o que importa. Funciona quando cada item cabe num pedido claro, tem teto e devolve uma linha conferível. Nesta aula você roda um fan-out em shell com agente falso, vê o tempo cair e refaz só o item reprovado.

Começar a aula
Cabo grosso que se divide em cinco cabos finos ligados a cinco módulos iguais com LED verde.

Nesta aula você vai

  1. 1As formas de fan-out no Claude Code e no shell
  2. 2O pedido de delegação: objetivo, formato, fontes e fronteiras
  3. 3Teto por trabalhador e retorno em arquivo
  4. 4Consolidar pela última linha e refazer só o reprovado

Objetivo: rodar um fan-out com N trabalhadores, teto por item e consolidação curta, refazendo só o item reprovado.

01Um fan-out com controle

O orquestrador planeja e junta; os trabalhadores só fazem a sua parte. Clique em cada etapa.

Clique em cada bloco do diagrama para ver o que ele faz.

Fan-out de 500 arquivos mecânicos não pede modelo nenhum: é script. Agente entra quando cada item exige julgamento.

02As formas de fan-out hoje

Pela doc do Claude Code (Run agents in parallel, lida em 19/10/2026) e pelo Codex CLI 0.163.0.

1. Subagentes

Peça vários subagentes na mesma mensagem. Os resultados voltam para a conversa que os criou.

Para um lote grande e repetível, a doc aponta dynamic workflows (um script que roda muitos subagentes e confronta resultados) e o /batch, que divide uma mudança grande em 5 a 30 subagentes, cada um no seu worktree.

03Fan-out em shell, com ensaio

O AGENTE é qualquer comando que lê o pedido no stdin. Para o ensaio, um script que dorme 2 s e responde.

fanout.sh · salve em ~/treino-multi/
#!/usr/bin/env bash
# fanout.sh — um trabalhador por linha da lista, N ao mesmo tempo, retorno curto em arquivo.
# Uso: fanout.sh <lista.txt> <pasta-saida> [N]
#   AGENTE = comando que lê o pedido no stdin (padrão: claude -p). Para ensaio: um script falso.
#   TETO   = segundos por trabalhador (padrão 600)
set -u
LISTA="${1:?uso: fanout.sh <lista.txt> <pasta-saida> [N]}"; OUT="${2:?pasta de saída}"; N="${3:-3}"
export OUT AGENTE="${AGENTE:-claude -p}" TETO="${TETO:-600}"
mkdir -p "$OUT"

trabalho() {
  item="$1"; nome=$(printf '%s' "$item" | tr -cs 'a-zA-Z0-9' '-' | cut -c1-40)
  if [ -s "$OUT/$nome.md" ] && [ "$(tail -1 "$OUT/$nome.md")" = OK ]; then
    echo "pula $nome (aprovado)"; return 0     # só o reprovado volta
  fi
  printf 'Tarefa: %s\nResponda em no máximo 5 linhas. Última linha: OK, ou FALHA: <motivo>.\n' "$item" \
    | timeout "$TETO" $AGENTE > "$OUT/$nome.tmp" 2>&1
  rc=$?
  if [ $rc -eq 0 ]; then mv "$OUT/$nome.tmp" "$OUT/$nome.md"; echo "feito $nome"
  else mv "$OUT/$nome.tmp" "$OUT/$nome.erro"; echo "erro $nome (rc=$rc)"; fi
}
export -f trabalho

grep -v '^[[:space:]]*$' "$LISTA" | xargs -d '\n' -P "$N" -I{} bash -c 'trabalho "$1"' _ {}

# o orquestrador junta só as últimas linhas: é isso que volta para o contexto dele
for f in "$OUT"/*.md; do [ -e "$f" ] && printf '%s: %s\n' "$(basename "$f" .md)" "$(tail -1 "$f")"; done > "$OUT/../consolidado.txt"
echo "itens: $(grep -cv '^[[:space:]]*$' "$LISTA") · feitos: $(ls "$OUT"/*.md 2>/dev/null | wc -l) · com erro: $(ls "$OUT"/*.erro 2>/dev/null | wc -l) · OK: $(grep -c ': OK$' "$OUT/../consolidado.txt") · FALHA: $(grep -c ': FALHA' "$OUT/../consolidado.txt")"
Terminal · ensaio sem cota (agente falso)
cd ~/treino-multi && chmod +x fanout.sh
E=${TMPDIR:-/tmp}/ensaio-multi/fanout; rm -rf $E && mkdir -p $E
cat > $E/agente-falso.sh <<'SH'
#!/usr/bin/env bash
pedido=$(cat); sleep 2
case "$pedido" in
  *quebrado*) printf 'não consegui ler o arquivo\nFALHA: arquivo quebrado\n' ;;
  *) printf 'resumo de uma linha\nOK\n' ;;
esac
SH
chmod +x $E/agente-falso.sh
printf 'resumir docs/a.md\nresumir docs/b.md\nresumir docs/quebrado.md\nresumir docs/c.md\nresumir docs/d.md\n' > $E/lista.txt

time AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 1   # um por vez
rm -rf $E/saida
time AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3   # três ao mesmo tempo
AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3        # de novo: não refaz
cat $E/consolidado.txt
Terminal · real, com 2 ou 3 itens do seu projeto
cd ~/treino-multi
printf 'Resuma runtime/POLITICA.md em 3 linhas\nResuma runtime/ROTEAMENTO.md em 3 linhas\n' > lista-real.txt
./fanout.sh lista-real.txt real/saida 2 < /dev/null
cat real/consolidado.txt
Exemplo do repositório
feito resumir-docs-a-md
feito resumir-docs-b-md
feito resumir-docs-quebrado-md
feito resumir-docs-c-md
feito resumir-docs-d-md
itens: 5 · feitos: 5 · com erro: 0 · OK: 4 · FALHA: 1

real	0m10.094s
(…)
feito resumir-docs-a-md
feito resumir-docs-b-md
feito resumir-docs-quebrado-md
feito resumir-docs-d-md
feito resumir-docs-c-md
itens: 5 · feitos: 5 · com erro: 0 · OK: 4 · FALHA: 1

real	0m4.054s
(…)
pula resumir-docs-b-md (aprovado)
pula resumir-docs-a-md (aprovado)
pula resumir-docs-c-md (aprovado)
pula resumir-docs-d-md (aprovado)
feito resumir-docs-quebrado-md
itens: 5 · feitos: 5 · com erro: 0 · OK: 4 · FALHA: 1
resumir-docs-a-md: OK
resumir-docs-b-md: OK
resumir-docs-c-md: OK
resumir-docs-d-md: OK
resumir-docs-quebrado-md: FALHA: arquivo quebrado

Cortes: as linhas user/sys do time. O tempo caiu de 10 s para 4 s porque o agente falso só dorme: é a forma do ganho, não a medida de um agente de verdade. Na terceira rodada, só o reprovado rodou de novo.

04O pedido de delegação

Quando o fan-out é dentro da sessão, o orquestrador é você pedindo. Os quatro campos vêm do post da Anthropic.

Prompt · fan-out com subagentes numa sessão
Divida em subagentes, um por item da lista abaixo, todos na mesma mensagem.
Para cada subagente, escreva:
- Objetivo: <o que este item precisa responder>
- Formato de saída: no máximo 5 linhas; última linha OK ou FALHA: <motivo>; grave em saida/<item>.md
- Fontes e ferramentas: <arquivos ou pastas que pode ler>; não edite nada fora de saida/
- Fronteira: não trate dos outros itens; se depender de outro item, pare e diga qual
Depois, leia só a última linha de cada arquivo e me dê a tabela item → OK/FALHA.
Itens:
<item 1>
<item 2>
<item 3>

05Prática

Ensaio primeiro; depois dois itens reais.

E5 · Fan-out com agente falso

10 min

Salve o fanout.sh e rode o ensaio inteiro.

Pronto quando: a rodada com N=1 leva cerca de 10 s e a com N=3 cerca de 4 s; as duas imprimem OK: 4 · FALHA: 1; a terceira imprime quatro linhas pula … (aprovado) e uma feito resumir-docs-quebrado-md.

E6 · Dois itens reais

10 min

Rode o bloco real (ele usa claude -p, pela sua assinatura). Se um item sair FALHA, leia só o arquivo dele e rode o fanout.sh de novo.

Pronto quando: cat real/consolidado.txt mostra 2 linhas, cada uma terminando em OK ou FALHA: …, e ls real/saida/*.erro não acha nada.

06Teste da aula

Pergunta 1 de 4

Por que o orquestrador lê só a última linha de cada resultado?competência

07Em três frases

Itens congeladosSó entra no fan-out o que não depende de outro item; o resto vai antes ou depois.
Teto e arquivoCada trabalhador com timeout, resultado gravado e última linha OK ou FALHA.
Só o reprovado voltaO orquestrador lê as últimas linhas e reroda só o que falhou.

Para ir além

Aula anteriorPróxima aula