Protocole de poignée de main entre deux agents
Les agents doivent également « conclure des contrats » entre eux. request_id est le numéro de contrat.
Pourquoi un accord ?
Dans s09, send_message peut envoyer n'importe quel contenu. Mais lorsque deux agents veulent parvenir à un consensus sur quelque chose (comme "Je veux arrêter, puis-je ?"), il ne suffit pas d'envoyer une chaîne : il vous faut :
- La requête a une identité claire (request_id) afin que la réponse soit exacte.
- Machine d'état : en attente → approuvé | rejetée, les conséquences de chaque État sont claires.
- Champs cohérents : les deux parties savent ce que signifie
approve : true.
C'est pourquoi shutdown_request / shutdown_response / plan_approval / plan_approval_response existe.
Processus complet du protocole d’arrêt
le responsable veut qu'Alice quitte son travail :
responsable : # Envoyer shutdown_request, le serveur enregistre request_id req_id = uuid4()[:8] shutdown_requests[req_id] = {"target" : "alice", "status" : "en attente"} send("alice", "shutdown_request", extra={"request_id" : req_id}) Alice : # Lire la boîte aux lettres dans la boucle suivante et voir shutdown_request # Décision : terminer le travail en cours avant de revenir et d'approuver tool_use("shutdown_response", request_id=req_id, approuve=True) diriger : # Recevoir shutdown_response, mettre à jour le tracker comme approuvé shutdown_requests[req_id]["status"] = "approved" # Le thread Alice détecte l'acceptation de l'arrêt et définit status=shutdown pour quitter la boucle
Visualisation d'arrêt du FSM
Observez chaque étape de la machine à états. Alice peut également rejeter - en disant "Je fais un travail critique et je ne peux pas m'arrêter maintenant".
Approbation du plan · Même modèle, domaine différent
un coéquipier soumet un plan avant de lancer une action importante et veuillez le diriger pour approbation :
alice : tool_use("plan_approval", plan="Je prévois de réécrire tous les modules d'authentification avec jwt") # Alice reste inactive et attend une piste diriger : # Voir la demande plan_approval_response d'Alice tool_use("plan_approval", request_id="...", approuve=False, feedback="Ne touchez pas encore à l'authentification, nous ferons une refactorisation globale le mois prochain")
En regardant le code source du s10, vous découvrirez : Les deux protocoles utilisent exactement le même mode de suivi request_id - seuls les noms des dictionnaires sont modifiés (shutdown_requests vs plan_requests). C'est « un modèle, deux domaines ».
Pourquoi ne pas extraire une classe de base de protocole générique ? s10 n’est délibérément pas abstrait. Raison : Il n’existe actuellement que deux protocoles, et les avantages de l’abstraction ne sont pas encore évidents ; si vous en écrivez deux explicitement, chacun peut être compris indépendamment. Il ne sera pas trop tard pour affiner les quatrième et cinquième protocoles (règle de trois).