Multiagente y Orquestación|INEMA.CLUB-PRO

Clase 3 · 20 min

Orquestador-trabajadores y fan-out

Fan-out es un orquestador soltando N trabajadores sobre ítems independientes y juntando solo lo que importa. Funciona cuando cada ítem cabe en un pedido claro, tiene tope y devuelve una línea verificable. En esta lección ejecutas un fan-out en shell con agente falso, ves cómo baja el tiempo y rehaces solo el ítem reprobado.

Empezar la clase
Cable grueso que se divide en cinco cables finos conectados a cinco módulos iguales con LED verde.

En esta clase vas a

  1. 1Las formas de fan-out en Claude Code y en el shell
  2. 2El pedido de delegación: objetivo, formato, fuentes y fronteras
  3. 3Tope por trabajador y retorno en archivo
  4. 4Consolidar por la última línea y rehacer solo el reprobado

Objetivo: ejecutar un fan-out con N trabajadores, tope por ítem y consolidación corta, rehaciendo solo el ítem reprobado.

01Un fan-out con control

El orquestador planifica y junta; los trabajadores solo hacen su parte. Haz clic en cada etapa.

Haz clic en cada bloque del diagrama para ver qué hace.

Un fan-out de 500 archivos mecánicos no pide ningún modelo: es un script. El agente entra cuando cada ítem exige criterio.

02Las formas de fan-out hoy

Según la doc de Claude Code (Run agents in parallel, leída el 19/10/2026) y Codex CLI 0.163.0.

1. Subagentes

Pide varios subagentes en el mismo mensaje. Los resultados vuelven a la conversación que los creó.

Para un lote grande y repetible, la doc apunta a dynamic workflows (un script que corre muchos subagentes y contrasta resultados) y a /batch, que divide un cambio grande en 5 a 30 subagentes, cada uno en su worktree.

03Fan-out en shell, con ensayo

El AGENTE es cualquier comando que lee el pedido por stdin. Para el ensayo, un script que duerme 2 s y responde.

fanout.sh · guárdalo en ~/treino-multi/
#!/usr/bin/env bash
# fanout.sh — un trabajador por línea de la lista, N al mismo tiempo, retorno corto en archivo.
# Uso: fanout.sh <lista.txt> <pasta-saida> [N]
#   AGENTE = comando que lee el pedido en stdin (por defecto: claude -p). Para ensayo: un script falso.
#   TETO   = segundos por trabajador (por defecto 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     # solo el reprobado vuelve
  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"' _ {}

# el orquestador junta solo las últimas líneas: eso es lo que vuelve a su contexto
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 · ensayo sin cuota (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   # uno a la vez
rm -rf $E/saida
time AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3   # tres al mismo tiempo
AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3        # otra vez: no rehace
cat $E/consolidado.txt
Terminal · real, con 2 o 3 ítems de tu proyecto
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
Ejemplo del repositorio
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

Recortes: las líneas user/sys del time. El tiempo bajó de 10 s a 4 s porque el agente falso solo duerme: es la forma de la ganancia, no la medida de un agente de verdad. En la tercera ronda, solo el reprobado corrió de nuevo.

04El pedido de delegación

Cuando el fan-out es dentro de la sesión, el orquestador eres tú pidiendo. Los cuatro campos vienen del post de Anthropic.

Prompt · fan-out con subagentes en una sesión
Divide en subagentes, uno por ítem de la lista de abajo, todos en el mismo mensaje.
Para cada subagente, escribe:
- Objetivo: <lo que este ítem necesita responder>
- Formato de salida: máximo 5 líneas; última línea OK o FALHA: <motivo>; grábalo en saida/<item>.md
- Fuentes y herramientas: <archivos o carpetas que puede leer>; no edites nada fuera de saida/
- Frontera: no trates los otros ítems; si depende de otro ítem, detente y di cuál
Después, lee solo la última línea de cada archivo y dame la tabla ítem → OK/FALHA.
Ítems:
<ítem 1>
<ítem 2>
<ítem 3>

05Práctica

Primero el ensayo; después dos ítems reales.

E5 · Fan-out con agente falso

10 min

Guarda el fanout.sh y corre el ensayo completo.

Listo cuando: la ronda con N=1 tarda cerca de 10 s y la de N=3 cerca de 4 s; las dos imprimen OK: 4 · FALHA: 1; la tercera imprime cuatro líneas pula … (aprovado) y una feito resumir-docs-quebrado-md.

E6 · Dos ítems reales

10 min

Corre el bloque real (usa claude -p, con tu suscripción). Si un ítem sale FALHA, lee solo su archivo y corre el fanout.sh de nuevo.

Listo cuando: cat real/consolidado.txt muestra 2 líneas, cada una terminando en OK o FALHA: …, y ls real/saida/*.erro no encuentra nada.

06Prueba de la clase

Pregunta 1 de 4

¿Por qué el orquestador lee solo la última línea de cada resultado?competencia

07En tres frases

Ítems congeladosSolo entra en el fan-out lo que no depende de otro ítem; el resto va antes o después.
Tope y archivoCada trabajador con timeout, resultado guardado y última línea OK o FALHA.
Solo el reprobado vuelveEl orquestador lee las últimas líneas y vuelve a ejecutar solo lo que falló.

Para ir más allá

Clase anteriorSiguiente clase