Aller au contenu principal

Référence du protocole

Ce document fournit une référence complète des méthodes ACP (Agent Client Protocol) et des événements de streaming exposés par le serveur iac-code.

Aperçu du cycle de vie

Une session ACP typique suit ce flux :

initialize → new_session → prompt (loop) → close_session
↑ │
└── load_session / resume ──────┘
  1. initialize -- Poignée de main. Négocier la version du protocole et découvrir les capacités du serveur.
  2. session/new -- Créer une nouvelle session avec un runtime d'agent indépendant.
  3. session/prompt -- Envoyer l'entrée utilisateur ; recevoir des événements en streaming jusqu'à une réponse finale.
  4. session/close -- Libérer la session et ses ressources.

Les sessions peuvent également être chargées depuis l'historique (session/load) ou reprises (session/resume) au lieu d'en créer de nouvelles.


Sauvegardes de session

Les sessions ACP utilisent le même comportement de sauvegarde de session v2 que les exécutions interactives et headless. Lorsque IAC_CODE_CONFIG_BACKUP_DIR est défini, la fin normale d'un prompt enregistre une sauvegarde non bloquante normal_turn_end; si cette sauvegarde échoue, l'échec est journalisé comme warning et enregistré dans .backup-state.json, tandis que la réponse finale se termine encore sans champ warning garanti. Le mode Pipeline possède ses propres gates de sauvegarde critique.


Méthodes

initialize

Poignée de main du protocole. Doit être le premier appel sur chaque connexion.

Paramètres de requête

ChampTypeRequisDescription
protocolVersionintegerOuiVersion du protocole demandée (actuellement 1)
clientInfoobjectNonNom et version du client
clientCapabilitiesobjectNonCapacités prises en charge par le client

Champs de réponse

ChampTypeDescription
protocolVersionintegerVersion du protocole négociée
agentCapabilitiesobjectCapacités du serveur (voir ci-dessous)
agentInfoobjectNom et version du serveur
authMethodsarrayMéthodes d'authentification disponibles (vide si utilisation des identifiants intégrés)

Capacités de l'agent

CapacitéValeurSignification
loadSessiontruePrend en charge la restauration de sessions depuis l'historique
promptCapabilities.embeddedContexttrueAccepte le contenu de ressources embarquées dans les requêtes
promptCapabilities.imagefalseEntrée image non prise en charge (dégradée en marqueur texte)
promptCapabilities.audiofalseEntrée audio non prise en charge (dégradée en marqueur texte)
mcpCapabilities.httptrueAccepte les serveurs MCP HTTP/streamable lors de la création de session
mcpCapabilities.ssetrueAccepte les serveurs MCP SSE lors de la création de session
sessionCapabilities.list{}Prend en charge le listage des sessions
sessionCapabilities.close{}Prend en charge la fermeture des sessions

session/new

Créer une nouvelle session avec un runtime d'agent indépendant, un registre d'outils et un contexte LLM.

Paramètres de requête

ChampTypeRequisDescription
cwdstringOuiChemin absolu vers le répertoire de travail
mcpServersarrayNonTableau de configuration des serveurs MCP injecte dans le runtime de la session ; les serveurs HTTP (streamable) et SSE sont connectés pour la session

Champs de réponse

ChampTypeDescription
sessionIdstringIdentifiant de session unique pour les appels suivants
modesobjectModes disponibles et mode actuel
modelsobjectModèles disponibles et modèle actuel
Remarque

Chaque session crée un AgentLoop indépendant. Plusieurs sessions peuvent s'exécuter simultanément mais chacune consomme une connexion LLM.


session/load

Charger une session précédemment persistée depuis le disque, en restaurant son historique de messages.

Paramètres de requête

ChampTypeRequisDescription
cwdstringOuiChemin du répertoire de travail
sessionIdstringOuiIdentifiant de la session à charger

Champs de réponse

ChampTypeDescription
modelsobjectModèles disponibles et état du modèle actuel
modesobjectModes disponibles et état du mode actuel
Remarque

Le chargement d'une session lit l'historique depuis ~/.iac-code/sessions/, répare automatiquement les messages interrompus et injecte l'historique dans un nouvel AgentLoop.


session/fork

Dupliquer une session existante pour créer une branche indépendante avec le même historique.

Paramètres de requête

ChampTypeRequisDescription
cwdstringOuiChemin du répertoire de travail
sessionIdstringOuiIdentifiant de la session à dupliquer

Champs de réponse

ChampTypeDescription
sessionIdstringNouvel identifiant de session pour la branche dupliquée
modelsobjectModèles disponibles et état du modèle actuel
modesobjectModes disponibles et état du mode actuel

session/resume

Reprendre ou se reconnecter à une session existante. Charge automatiquement l'historique si nécessaire.

Paramètres de requête

ChampTypeRequisDescription
cwdstringOuiChemin du répertoire de travail
sessionIdstringOuiIdentifiant de la session à reprendre

Champs de réponse

ChampTypeDescription
modelsobjectModèles disponibles et état du modèle actuel (optionnel)
modesobjectModes disponibles et état du mode actuel (optionnel)
Remarque

Contrairement à session/new, la réponse n'inclut pas de champ sessionId puisque le client connaît déjà l'identifiant de session depuis la requête.


session/prompt

Envoyer l'entrée utilisateur et déclencher les réponses de l'agent en streaming.

Paramètres de requête

ChampTypeRequisDescription
sessionIdstringOuiIdentifiant de la session cible
promptarrayOuiTableau de blocs de contenu (voir Types de blocs de contenu ci-dessous)

Types de blocs de contenu

TypeDescription
TextContentBlockEntrée texte brut de l'utilisateur
EmbeddedResourceContentBlockContenu de fichier embarqué en ligne
ResourceContentBlockRéférence de lien vers une ressource
ImageContentBlockImage (dégradée en marqueur texte [image: mime/type])
AudioContentBlockAudio (dégradé en marqueur texte [audio: mime/type])

Champs de réponse

ChampTypeDescription
stopReasonstringRaison de la fin de la requête (voir Raisons d'arrêt)
_meta.usageobjectUtilisation des tokens sous l'objet _meta de la réponse : input_tokens, output_tokens, total_tokens

Raisons d'arrêt

ValeurSignification
end_turnLe modèle a terminé normalement
max_turn_requestsLimite maximale de la boucle d'appels d'outils atteinte
max_tokensLimite de tokens en sortie atteinte
cancelledLe client a annulé la requête
refusalLe modèle a refusé de répondre
Remarque

Pendant l'exécution, le serveur envoie des notifications session/update avec des événements en streaming avant de retourner la réponse finale.


session/cancel

Annuler une tâche de requête en cours d'exécution.

Paramètres de requête

ChampTypeRequisDescription
sessionIdstringOuiSession avec la requête en cours d'exécution

Comportement

  • Arrête la consommation des événements du flux
  • Les outils en cours d'exécution ne sont pas terminés de force, mais les résultats sont ignorés
  • L'appel prompt en attente retourne avec stopReason: "cancelled"

session/close

Fermer une session et libérer ses ressources.

Paramètres de requête

ChampTypeRequisDescription
sessionIdstringOuiSession à fermer

Comportement

  • La session est supprimée de la mémoire
  • L'historique persisté reste sur le disque
  • Les appels prompt suivants à cette session retournent une erreur

session/list

Lister toutes les sessions persistées pour un répertoire de travail donné.

Paramètres de requête

ChampTypeRequisDescription
cwdstringOuiRépertoire de travail pour limiter la portée du listage

Champs de réponse

ChampTypeDescription
sessionsarrayListe d'objets session avec sessionId et métadonnées

session/set_config_option

Définir dynamiquement une option de configuration pour une session.

Paramètres de requête

ChampTypeRequisDescription
sessionIdstringOuiSession cible
configIdstringOuiClé de configuration à définir
valueanyOuiNouvelle valeur

Événements de streaming

Pendant l'exécution de session/prompt, le serveur envoie des notifications session/update contenant des données d'événements en streaming.

Format des événements

Chaque notification session/update contient un objet de mise à jour avec un type spécifique :

{
"jsonrpc": "2.0",
"method": "session/update",
"params": {
"sessionId": "abc123",
"update": { "type": "agent_message_chunk", "text": "..." }
}
}

Correspondance des types d'événements

Événement interneType de mise à jour ACPDescription
TextDeltaEventAgentMessageChunkSortie texte incrémentale de l'agent
ThinkingDeltaEventAgentThoughtChunkContenu de raisonnement/réflexion du modèle
ToolUseStartEventToolCallStartDébut de l'invocation d'un outil
ToolResultEventToolCallProgressRésultat de l'outil (terminé ou échoué)
CompactionEventAgentMessageChunkNotification de compaction du contexte
ErrorEventAgentMessageChunkInformations d'erreur

Statut et avertissements MCP

ACP expose l'etat runtime MCP dans session/update.params.update._meta.iac_code sur le wire :

Cle de metadonneesType de mise a jour ACPDescription
mcpStatussession_info_updateEtat courant des serveurs MCP, pousse apres la creation de session et quand l'etat MCP auth, connection ou capability change.
mcpWarningagent_message_chunkUn avertissement de demarrage ou de configuration, associe a un court message visible par l'utilisateur.

mcpStatus contient servers et warnings. Les entrees server incluent serverName, state, authState, toolsCount, resourcesCount et promptsCount. Les valeurs de authState incluent configured, needs-auth et not-configured.

Les etats server courants sont connected, failed, pending, needs-auth, pending-approval et disabled.

Les grands status frames peuvent inclure truncated, truncationReason avec la valeur acp-frame-size-limit, serversOmittedCount, warningsOmittedCount ou des compteurs d'omission de capability list comme toolsOmittedCount.

Les entrees tool sous servers[].tools[] incluent publicName, originalServerName, originalToolName, et peuvent inclure annotations. Les annotations MCP peuvent porter des hints comme readOnlyHint et destructiveHint.

Les records permission audit operation peuvent inclure isReadOnly et isDestructive lorsque les annotations MCP fournissent des hints read-only ou destructive.

Les entrees mcpWarning incluent serverName, code, message, severity, source, et facultativement sourcePath ou scope. Les warning codes courants sont duplicate_config, invalid_name, invalid_config, missing_env, pending_approval, needs_auth, connection_failed, command_conflict, skill_read_failed, skill_truncated, alias_conflict, ainsi que les warnings dynamiques comme <capability>_failed.

Cycle de vie des appels d'outils

ToolCallStart (status=in_progress)

├── ToolCallProgress (status=in_progress, résumé d'entrée / entrée de prompt sûre)

├── ToolCallProgress (status=completed, raw_output=result) ← success

└── ToolCallProgress (status=failed, raw_output=error) ← failure

Correspondance des types d'outils

OutilToolKind ACP
read_file, list_filesread
glob, grepsearch
write_file, edit_fileedit
bash, agentexecute
web_fetchfetch
Autresother

Demandes de permission

Avant d'exécuter des outils à haut risque, iac-code envoie un callback request_permission au client.

Catégories de permissions des outils

CatégorieOutilsAuto-approuvé
Lecture seuleread_file, list_files, glob, grep, web_fetchOui
API cloud en lecture seuleActions aliyun_api classées en lecture seuleOui
Écriturewrite_file, edit_fileNon -- nécessite une approbation
Exécutionbash, agentNon -- nécessite une approbation
API cloud d'écritureAppels aliyun_api qui ne sont pas en lecture seuleNon -- nécessite une approbation par API

Événement request_permission

Le serveur envoie un callback request_permission avec :

ChampTypeDescription
optionsarrayChoix de permission disponibles
sessionIdstringSession demandant la permission
toolCallobjectDétails de l'appel d'outil (titre, type, entrée)

Pour les prompts de permission MCP, le title du ToolCallUpdate ACP utilise le libelle public de l'operation et le contenu transporte un resume d'entree redacte. Via le champ d'extensibilite ACP _meta, l'objet toolCall._meta.iac_code.permission contient permissionId, toolName, toolUseId, scope, inputSummary et, si disponibles, publicName, originalServerName, originalToolName, isReadOnly et isDestructive. inputSummary decrit la forme et les metadonnees de redaction, pas l'entree sensible brute.

Options de permission

Identifiant d'optionSignification
allow_onceAutoriser cette invocation spécifique
allow_alwaysAutoriser tous les appels futurs de cet outil dans cette session lorsque l'outil prend en charge l'autorisation globale ; non proposé par défaut pour bash ni aliyun_api
allow_rule:<rules>Autoriser les futurs appels correspondant aux règles suggérées dans cette session
deny_rule:<rules>Refuser les futurs appels correspondant aux règles suggérées dans cette session
reject_onceRefuser cette invocation spécifique
reject_alwaysRefuser tous les appels futurs de cet outil dans cette session

Pour aliyun_api, les actions en lecture seule sont autorisées automatiquement. Les actions RPC et ROA qui ne sont pas en lecture seule peuvent proposer une règle exacte comme aliyun_api(ros:CreateStack) ou aliyun_api(cs:CreateCluster). Les règles allow avec jokers n'approuvent toujours pas les appels qui ne sont pas en lecture seule.

Format de réponse

{
"outcome": "selected",
"optionId": "allow_once"
}

Ou pour refuser :

{
"outcome": "cancelled"
}
Réponse du clientComportement de l'outil
AllowedOutcomeL'outil s'exécute normalement
DeniedOutcomeL'outil est ignoré ; le modèle reçoit une erreur "Permission denied."

Gestion des erreurs

Format RequestError

Les erreurs suivent le format d'erreur JSON-RPC 2.0 :

{
"jsonrpc": "2.0",
"id": 3,
"error": {
"code": -32602,
"message": "Invalid params",
"data": {"session_id": "Session not found"}
}
}

Codes d'erreur courants

CodeNomDescription
-32700Erreur d'analyseJSON invalide
-32600Requête invalideJSON-RPC malformé
-32601Méthode introuvableMéthode inconnue
-32602Paramètres invalidesParamètres manquants ou invalides (ex. : identifiant de session inconnu)
-32603Erreur interneDéfaillance côté serveur