Aula 10 · cooperação

Protocolo de handshake entre dois agentes

Os agentes também precisam “fazer contratos” entre si. request_id é o número do contrato.

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

Porquê um acordo?

Em s09, send_message pode enviar qualquer conteúdo. Mas quando dois agentes querem chegar a um consenso sobre algo (como "Quero encerrar, posso?"), apenas enviar uma string não é suficiente - você precisa:

  • A solicitação tem uma identidade clara (request_id) para que a resposta seja precisa.
  • Máquina de estado: pendente → aprovada | rejeitado, as consequências de cada estado são claras.
  • Campos consistentes: ambas as partes sabem o que significa approve: true.

É por isso que shutdown_request / shutdown_response / plan_approval / plan_approval_response existe.

Processo inteiro do protocolo de desligamento

lead quer que Alice saia do trabalho:

leader:
  # Envie shutdown_request, o servidor registra request_id
  req_id = uuid4()[:8]
  shutdown_requests[req_id] = {"target": "alice", "status": "pendente"}
  enviar("alice", "shutdown_request", extra={"request_id": req_id})

Alice:
  # Leia a caixa de correio no próximo loop e veja shutdown_request
  # Decisão: terminar o trabalho antes de retornar e aprovar
  tool_use("shutdown_response", request_id=req_id, aprovar=Verdadeiro)

liderar:
  # Receba shutdown_response, atualize o rastreador para aprovado
  shutdown_requests[req_id]["status"] = "aprovado"
  # O thread alice detecta a aceitação do desligamento e define status=shutdown para sair do loop

Visualização de desligamento do FSM

Observe cada etapa da máquina de estados. Alice também pode rejeitar – dizendo “Estou fazendo um trabalho crítico e não posso parar agora”.

Aprovação do Plano · Mesmo modelo, domínio diferente

Um colega de equipe envia um plano antes de iniciar uma grande mudança e leve-o para aprovação:

Alice:
  tool_use("plan_approval", plan="Pretendo reescrever todos os módulos de autenticação com jwt")
  # alice continua ociosa e espera pelo lead

liderar:
  # Veja a solicitação plan_approval_response de Alice
  tool_use("plan_approval", request_id="...", aprovar=Falso,
           feedback="Não mexa na autenticação ainda, faremos uma refatoração geral no próximo mês")

Olhando para o código-fonte do s10, você encontrará: Os dois protocolos usam exatamente o mesmo modo de rastreamento request_id - apenas os nomes dos dicionários são alterados (shutdown_requests vs plan_requests). Isto é “um modelo, dois domínios”.

Por que não abstrair uma classe base de protocolo genérica? s10 não é deliberadamente abstrato. Motivo: Existem apenas dois protocolos atualmente e os benefícios da abstração ainda não são óbvios; se você escrever dois explicitamente, cada um poderá ser entendido independentemente. Não será tarde demais para refinar o quarto e o quinto protocolos (regra de três).
Interativo

Widget 1 · Desligar FSM · Percorrer toda a máquina de estado

Clique em “Avançar” para dar um passo adiante e ver como request_id estabelece um relacionamento correspondente entre os dois agentes.

🧑‍💼 Lead
👩‍💻 Alice
shutdown_requests 状态表
{}
Interativo

Widget 2 · associação request_id · Não receba o contrato errado

Várias solicitações estão pendentes ao mesmo tempo. Clique em uma resposta para ver qual solicitação está atualizada. Esta é a chave para a simultaneidade do protocolo.

待响应的请求
模拟的响应(点击触发)
Interativo

Widget 3 · Design de Protocolo · Seu próprio terceiro protocolo

Oferecendo um novo cenário, aplique o padrão request_id para projetar um handshake. Escolha o caminho certo para passar.

答对 0 / 5