Leçon 10 · coopération

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.

⏱ ~10 min · 📝 3 widgets interactifs · 🧑‍💻 Basé sur shareAI-lab · s10_team_protocols.py

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).
Interactif

Widget 1 · Arrêter le FSM · Parcourez toute la machine à états

Cliquez sur "Suivant" pour aller plus loin et voir comment request_id établit une relation correspondante entre les deux agents.

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

Widget 2 · association request_id · Ne vous trompez pas de contrat

Plusieurs demandes sont en attente en même temps – cliquez sur une réponse pour voir quelle demande est mise à jour. C’est la clé de la concurrence du protocole.

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

Widget 3 · Conception du protocole · Votre propre troisième protocole

En vous offrant un nouveau scénario, appliquez le modèle request_id pour concevoir une poignée de main. Choisissez le bon pour réussir.

答对 0 / 5