Architecture du protocole Agent Client

ACP standardise la relation entre une interface de codage et un agent de codage. Il leur donne une maniĂšre commune d’établir des capacitĂ©s, d’ouvrir une session de projet, d’échanger des invites, de diffuser la progression en continu, de demander une autorisation, d’annuler le travail et de fermer ou reprendre la session.

Les deux rĂŽles

RÎleResponsabilités
Client / hĂŽteDĂ©marre le processus de l’agent, prĂ©sente l’interface humaine, sĂ©lectionne l’espace de travail, fournit des fichiers, des terminaux et des serveurs MCP facultatifs, applique la politique d’autorisation et affiche les mises Ă  jour en direct
ACP agentAccepte les sessions et les invites du projet, effectue le travail de codage, signale les messages et l’activitĂ© des outils, demande une autorisation lorsque nĂ©cessaire et renvoie une raison d’arrĂȘt typĂ©e

ADK-Rust peut occuper l’un ou l’autre rĂŽle. Ce sont deux directions de dĂ©ploiement, pas deux protocoles diffĂ©rents.

Rendering architecture


Lorsque ADK-Rust consomme un autre agent de codage, le cĂŽtĂ© gauche est ADK-Rust et le cĂŽtĂ© droit est le processus externe. Lorsqu’un Ă©diteur consomme un agent ADK-Rust, l’éditeur possĂšde le cĂŽtĂ© gauche et AcpServer possĂšde le cĂŽtĂ© droit.

Un tour de ACP

Rendering architecture


La connexion est bidirectionnelle. Un client doit continuer Ă  lire pendant qu’une invite s’exĂ©cute, car l’agent peut envoyer des notifications ou des demandes d’autorisation avant la rĂ©ponse finale de l’invite.

Identité et état de la session

Une session ACP identifie une conversation en cours au sujet d’un projet. Elle contient un cwd absolu, des rĂ©pertoires supplĂ©mentaires facultatifs, plusieurs invitations, des mises Ă  jour diffusĂ©es en continu et un cycle de vie. Dans le serveur ADK-Rust, une session ACP correspond Ă  une session ADK-Rust afin que l’historique du modĂšle et l’état de la session restent attachĂ©s Ă  la mĂȘme conversation.

Fermer une connexion active est diffĂ©rent de supprimer l’historique persistant :

  • session/close libĂšre la session active et ses processus ;
  • session/resume se rattache Ă  l’état de session persistant ADK ;
  • session/load rĂ©active une session persistante et rejoue sa conversation stockĂ©e vers le client sous forme de notifications session/update ordonnĂ©es avant que la requĂȘte ne se termine ;
  • session/fork crĂ©e une branche d’une session persistante vers un nouvel identifiant de session dont l’historique stockĂ© est une copie de celui de la source, en laissant la source intacte ;
  • session/delete supprime la session persistante ;
  • session/list renvoie les sessions visibles via le SessionService configurĂ©.

session/load valide le cwd fourni par rapport au rĂ©pertoire de travail stockĂ© de la session de la mĂȘme maniĂšre que session/resume, et renvoie une erreur de session introuvable pour un identifiant de session inconnu. La relecture mappe chaque Ă©vĂ©nement utilisateur, agent, rĂ©flexion et outil stockĂ© vers son variant SessionUpdate correspondant dans l’ordre chronologique d’origine, de sorte qu’un Ă©diteur qui se reconnecte restaure l’historique visible dans l’ordre oĂč il s’est produit.

ContrĂŽles de session interactive

Un agent peut exposer des contrĂŽles interactifs au client en fournissant un fournisseur SessionControls. Lorsqu’il le fait, le serveur les annonce dans les rĂ©ponses session/new, session/load, session/resume et session/fork :

  • Modes — un ensemble de modes nommĂ©s (par exemple "ask" versus "code") avec une sĂ©lection actuelle. session/set_mode valide le mode demandĂ© par rapport Ă  l’ensemble annoncĂ©, l’enregistre et Ă©met un CurrentModeUpdate ; un mode inconnu est rejetĂ© et le mode actuel reste inchangĂ©.
  • Options de configuration — des sĂ©lecteurs et des commutateurs que le client peut lire et modifier. session/set_config_option valide la valeur par rapport aux choix dĂ©clarĂ©s de l’option, l’enregistre et Ă©met un ConfigOptionUpdate ; une option inconnue ou une valeur invalide est rejetĂ©e.
  • Commandes disponibles — des slash-commands ACP exposĂ©es comme un AvailableCommandsUpdate lorsqu’une session devient active.

Les sĂ©lections de mode et de configuration persistent dans l’état de session ADK (acp:mode, acp:config:<id>), elles survivent donc au chargement, Ă  la reprise et Ă  la division. Un titre de session enregistrĂ© apparaĂźt comme un SessionInfoUpdate Ă  l’activation et chaque fois qu’il change. Une mapping de mise Ă  jour Plan existe mais reste dormante jusqu’à ce qu’une primitive de plan ADK fasse remonter les entrĂ©es de plan. Un agent qui ne fournit aucun SessionControls n’annonce aucun mode ni aucune option, ce qui maintient les capacitĂ©s annoncĂ©es exactement alignĂ©es sur ce que le serveur implĂ©mente.

Le contenu traverse la frontiĂšre via un seul mapping

Les invites qui arrivent d’un client et les mises Ă  jour qui lui sont renvoyĂ©es passent toutes deux par un seul module de contenu qui mappe des valeurs ACP ContentBlock vers des valeurs adk_core::Part et inversement. Le fait de conserver un seul mapping dans les deux sens signifie que le parseur d’invite du serveur, le diffuseur du serveur et le client s’accordent tous sur la reprĂ©sentation de chaque type de contenu.

Le mapping prĂ©serve fidĂšlement les charges utiles. Les blocs de texte se mappent vers Part::Text avec la chaĂźne intacte. Les blocs de ressource intĂ©grĂ©e se mappent vers Part::EmbeddedResource, en conservant la source URI, le type MIME facultatif et le contenu. Une ressource textuelle circule verbatim dans les deux sens et n’est jamais encodĂ©e en base64 ; une ressource binaire est encodĂ©e en base64 sur le fil et dĂ©codĂ©e en octets bruts du cĂŽtĂ© ADK de la frontiĂšre. Les blocs d’image et d’audio se mappent vers Part::InlineData, en prĂ©servant le type MIME et les octets dĂ©codĂ©s ; le serveur annonce et accepte ces mĂ©dias d’invite, et le client transmet le contenu non textuel ADK (ressource intĂ©grĂ©e, image, audio) sous forme du bloc ACP correspondant plutĂŽt que de l’abandonner.

Les mises à jour diffusées en continu transportent plus que du texte

Pendant qu’une invite s’exĂ©cute, le serveur traduit les Ă©vĂ©nements ADK typĂ©s en notifications ACP session/update. Le texte du modĂšle et les rĂ©flexions deviennent des fragments de message et de rĂ©flexion, et le contenu de ressource intĂ©grĂ©e devient un fragment de message de ressource intĂ©grĂ©e. Au-delĂ  de cette surface, deux types de mise Ă  jour donnent au client une vue plus riche du tour :

  • Mises Ă  jour d’utilisation. Lorsqu’un Ă©vĂ©nement ADK transporte des mĂ©tadonnĂ©es d’utilisation, le serveur envoie un UsageUpdate reflĂ©tant les dĂ©comptes de jetons signalĂ©s, ainsi que le coĂ»t en USD lorsque l’exĂ©cution l’indique. Les Ă©vĂ©nements sans mĂ©tadonnĂ©es d’utilisation ne produisent aucune mise Ă  jour, et le serveur n’invente jamais de dĂ©comptes.
  • Mises Ă  jour enrichies des appels d’outil. Un appel d’outil commence comme un ToolCall avec un kind d’outil dĂ©duit du comportement dĂ©clarĂ© de l’outil. Son ToolCallUpdate ultĂ©rieur transporte le contenu du rĂ©sultat de l’outil et les emplacements de fichiers que l’outil indique avoir affectĂ©s, afin qu’un Ă©diteur puisse afficher des diffs et des listes de fichiers affectĂ©s. La mise Ă  jour conserve le mĂȘme identifiant que le ToolCall d’origine, prĂ©servant ainsi la corrĂ©lation tout au long du tour.

La direction du client a la fidĂ©litĂ© correspondante. Lorsqu’une application ADK-Rust consomme un External_Agent, sa surface de diffusion en continu (OutputChunk) expose non seulement le texte et les pensĂ©es de l’agent, mais aussi le External_Agent ToolCallUpdate (sous la forme d’une mise Ă  jour d’outil corrĂ©lĂ©e Ă  l’id, contenant le statut, le type, le titre, le texte du contenu et les emplacements de fichiers affectĂ©s) ainsi que son UsageUpdate (tokens utilisĂ©s et taille, plus le coĂ»t et la devise lorsqu’ils sont renseignĂ©s). Le texte des messages de l’agent est exposĂ© exactement comme auparavant, donc les consommateurs de texte existants ne sont pas affectĂ©s.

Les demandes d’autorisation font le pont avec les confirmations d’outil

Un agent ADK-Rust peut suspendre un tour dans l’attente de l’approbation humaine d’un appel d’outil (ToolConfirmationRequest). CĂŽtĂ© serveur, cette suspension devient une demande native ACP session/request_permission dĂ©crivant l’outil et ses arguments. Le rĂ©sultat du client reprend le tour : une approbation se mappe Ă  allow, et un refus ou une annulation se mappent tous deux Ă  deny, de sorte qu’une demande annulĂ©e n’exĂ©cute jamais l’outil. Chaque rĂ©sultat est corrĂ©lĂ© Ă  l’appel exact par son identifiant d’appel de fonction et renvoyĂ© au runner via ses dĂ©cisions de confirmation d’outil. La demande d’autorisation imbriquĂ©e est Ă©mise depuis la tĂąche de prompt gĂ©nĂ©rĂ©e, donc la rĂ©ponse externe session/prompt se termine toujours normalement.

Les capacités sont un contrat

L’initialisation n’est pas une poignĂ©e de main dĂ©corative. Chaque partie annonce uniquement les opĂ©rations et le contenu qu’elle prend en charge. ADK-Rust utilise ces capacitĂ©s pour Ă©viter d’envoyer une configuration facultative HTTP ou SSE MCP Ă  un agent qui n’accepte que stdio, et il n’annonce les opĂ©rations d’hĂŽte du systĂšme de fichiers ou du terminal que lorsque l’application fournit l’implĂ©mentation correspondante.

Le serveur annonce exactement les types de contenu que son gestionnaire de prompt accepte. Il annonce les capacitĂ©s de prompt embedded_context, image et audio parce que le contenu de ressource intĂ©grĂ©e se mappe Ă  adk_core::Part::EmbeddedResource et que le contenu d’image et d’audio se mappe Ă  adk_core::Part::InlineData. Il annonce load_session parce qu’il enregistre un gestionnaire session/load, et la capacitĂ© de session fork parce qu’il enregistre un gestionnaire session/fork. Les modes de session et les options de configuration ne sont annoncĂ©s que lorsque l’agent fournit un fournisseur SessionControls, donc un agent qui n’en a pas n’annonce ni l’un ni l’autre. Les transports distants, les sĂ©lecteurs de modĂšle et les ajouts expĂ©rimentaux au protocole restent non annoncĂ©s. Un prompt portant un type de contenu que le serveur n’a pas annoncĂ© est rejetĂ© avec une erreur descriptive plutĂŽt que d’ĂȘtre traitĂ© partiellement. Les appelants doivent concevoir en fonction de l’objet de capacitĂ© nĂ©gociĂ© plutĂŽt que de supposer que chaque implĂ©mentation ACP a la mĂȘme surface.

Suivant

Architecture du protocole Agent Client - Documentation ADK-Rust | ADK-Rust