Protocolo de handshake entre dois agentes
Os agentes também precisam “fazer contratos” entre si. request_id é o número do contrato.
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).