Aula 09 · Colaboração

Múltiplos agents se comunicam por caixas de e-mail em arquivo

De subagent a teammate: descartável → persistente; anônimo → com nome; sem comunicação → caixas de e-mail em arquivo.

⏱ ~12 min · 📝 3 componentes interativos · 🧑‍💻 Baseado em shareAI-lab · s09_agent_teams.py

Qual a diferença entre subagent e teammate?

O subagent do S04 é simples e descartável: spawn → executa → retorna summary → morre. É temporário, sem nome, e não há comunicação bidirecional entre pai e filho.

O teammate do s09 é um agent independente com nome, que pode ser ativado repetidamente e trocar mensagens:

subagent (s04):  spawn -> execute -> return -> destroyed
teammate (s09):  spawn -> work -> idle -> work -> ... -> shutdown

Os dois mecanismos têm propósitos diferentes:

  • subagent é para "fazer uma exploração específica" (por exemplo, revisar um PR).
  • teammate é para "manter um papel de forma contínua" (por exemplo, um reviewer permanente, ativado a cada novo commit).

A caixa de entrada é um arquivo JSONL

Como os membros da equipe se comunicam? O s09 usa o mecanismo mais simples possível: arquivo JSONL append-only.

.team/
  config.json          # lista dos membros da equipe
  inbox/
    alice.jsonl        # toda mensagem para alice vai aqui com append
    bob.jsonl
    lead.jsonl

Enviar é open("alice.jsonl", "a").write(msg); ler é ler o arquivo inteiro, parsear JSONL e depois truncate para limpar (semântica de drain).

Por que arquivos, não fila em memória? Arquivos são naturalmente persistentes. Reiniciou o agent, o processo crashou, até a máquina reiniciou — as mensagens ainda estão lá. E são legíveis e pesquisáveis com grep, o que torna a depuração muito mais fácil.

Fluxo completo de uma mensagem do lead para alice

O widget abaixo deixa você enviar uma mensagem para alice e acompanhar cada passo no sistema de arquivos.

5 tipos de mensagem

O s09 define 5 tipos de mensagem (VALID_MSG_TYPES), mas implementa apenas os dois primeiros — os três restantes são concluídos na lição s10 sobre protocolos:

  • message — mensagem de texto simples.
  • broadcast — envia para todos os teammates exceto o remetente.
  • shutdown_request / shutdown_response — solicitar/responder um shutdown gracioso (s10).
  • plan_approval_response — aprovação de plano (s10).

Por que declarar sem implementar? Porque o s09 quer deixar a "extensão de protocolo" aberta — o tipo de mensagem é um enum, e adicionar um novo tipo exige apenas inserir uma entrada no dicionário e tratar no roteamento do _exec.

Interativo

Widget 1 · Mail Flow · uma mensagem do lead até alice

Clique em Send e acompanhe cada passo no sistema de arquivos: lead.send → append alice.jsonl → alice lê a inbox na próxima rodada → truncate.

Interativo

Widget 2 · Team Config · quem está online e em qual status

O .team/config.json é o cadastro da equipe. Execute algumas operações (spawn / message / shutdown) e veja como a configuração muda.

Operações
.team/config.json

        
Interativo

Widget 3 · Subagent vs Teammate · decida qual usar

6 cenários de tarefas — decida se usa subagent (spawn-then-die) ou teammate (spawn-then-live). Pense se a tarefa é um "trabalho pontual".

Acertos: 0 / 6