Aula 11 · Colaboração

O agent que procura trabalho sozinho

"The agent finds work itself." Sem precisar que um humano distribua tarefas — ele mesmo pega do quadro de tarefas.

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

De "ser acordado" para "procurar trabalho"

O teammate do s09/s10 é passivo: alguém precisa enviar uma mensagem para ele começar; quando termina, fica idle e espera ser chamado novamente.

O autonomous teammate do s11 é ativo: mesmo sem trabalho, não para completamente — ele varre o diretório .tasks/ a cada 5 segundos. Quando encontra uma task sem dono, faz claim_task e começa a trabalhar.

Ciclo de vida do Teammate:
  +-------+
  | spawn |
  +---+---+
      |
      v
  +-------+
  | WORK  | <-- loop de tool_use da LLM
  +---+---+
      |
      | stop_reason != tool_use OU tool_use("idle")
      v
  +-------+
  | IDLE  | poll a cada 5s, 12 vezes = timeout de 60s
  +---+---+
      |
      +--> inbox com nova mensagem?  → retoma WORK
      |
      +--> scan .tasks/, encontra task sem dono → claim → retoma WORK
      |
      +--> 60s sem nada → status = shutdown, thread encerra

Auto-claim · pegar uma tarefa do quadro

A função central:

def scan_unclaimed_tasks() -> list:
    unclaimed = []
    for f in sorted(TASKS_DIR.glob("task_*.json")):
        task = json.loads(f.read_text())
        if (task.get("status") == "pending"
                and not task.get("owner")
                and not task.get("blockedBy")):
            unclaimed.append(task)
    return unclaimed

Três filtros = pending + sem owner + sem blockedBy. Nenhum pode faltar.

O próprio claim tem um lock (_claim_lock) para evitar que dois agents vejam a mesma task e tentem pegá-la ao mesmo tempo — dentro do lock, relê o arquivo, verifica se o owner ainda está vazio, e só então escreve o status "in_progress" + owner no disco.

Simule múltiplos agents varrendo o quadro de tarefas

3 teammates em idle, 3 tasks esperando. Clique em "Próxima varredura" e veja quem pega qual task primeiro.

Reinjeção de identity · após compressão, o modelo ainda sabe quem é?

O s06 mostrou que o auto_compact substitui o messages[] por um summary. Um autonomous agent que roda por horas facilmente aciona isso — e após a compressão, o modelo não sabe mais seu nome nem seu papel.

A solução do s11: ao fazer claim de uma nova task, se len(messages) ≤ 3 (sinal de que o contexto foi comprimido), insere automaticamente um bloco de identity no início:

if len(messages) <= 3:
    messages.insert(0, {
        "role": "user",
        "content": f"<identity>You are 'alice', role: coder, team: my-team. Continue your work.</identity>",
    })
    messages.insert(1, {"role":"assistant", "content": f"I am alice. Continuing."})

Esse padrão se chama identity reinjection — uma rodada de conversa construída artificialmente que "diz ao modelo quem ele é" e restaura a sensação de papel.

Interativo

Widget 1 · Task Scanner · 3 agents concorrendo por 3 tasks

Alice, bob e charlie estão em idle. Clique em poll e veja quem (em ordem alfabética) faz claim da primeira task sem dono.

Diretório .tasks/
Status dos Teammates
Todos em idle, aguardando varredura
Interativo

Widget 2 · Identity Drift · o agent lembra quem é após a compressão?

Simule antes e depois da compressão de contexto: o agent responde "quem é você?" dos dois lados. Sem reinjeção de identity, o que acontece?

Sem reinjeção de identity
Com reinjeção de identity
Interativo

Widget 3 · Autonomous vs Assisted · quais papéis são adequados para autonomia

Decida se esse papel deve rodar em loop autônomo ou aguardar comandos. Considere o "custo de falha" e a "frequência de intervenção humana".

Acertos: 0 / 5