Skip to main content
Skip to content

Événements de session de streaming

Chaque action qu’effectue l’agent Copilot — réflexion, écriture de code, exécution d’outils — est émise sous la forme d’un événement de session auquel vous pouvez vous abonner. Ce guide est une référence au niveau du champ pour chaque type d’événement afin de savoir exactement quelles données s’attendent sans lire la source du Kit de développement logiciel (SDK).

Overview

Lorsqu’il streaming: true est défini sur une session, le SDK émet des événements éphémères en temps réel (deltas, mises à jour de progression) ainsi que des événements persistants (messages complets, résultats de l’outil). Tous les événements partagent une enveloppe commune et portent une data charge utile dont la forme dépend de l’événement type.

Diagramme : diagramme de séquence montrant le processus décrit.

ConceptDescription
Événement éphémèreTransitoire; diffusé en temps réel, mais pas conservé dans le journal de session. Pas rejoué lors de la reprise de session.
Événement persistantEnregistré dans le journal des événements de session sur le disque. Rejoué lors de la reprise d’une session.
Événement DeltaSegment de streaming éphémère (texte ou raisonnement). Accumulez des deltas pour générer le contenu complet.
parentId ChaîneChaque événement pointe vers l’événement parentId précédent, formant une liste liée que vous pouvez parcourir.

Enveloppe d’événement

Chaque événement de session, quel que soit le type, inclut les champs suivants :

ChampCatégorieDescription
id
string (UUID v4)Identificateur d’événement unique
timestamp
string (ISO 8601)Lors de la création de l’événement
parentIdstring | nullID de l’événement précédent dans la chaîne ; null pour le premier événement
agentIdstring?ID d’instance de sous-agent pour les événements provenant d’un sous-agent ; absent pour les événements de l’agent racine/principal et pour les événements au niveau de la session
ephemeralboolean?
true pour les événements temporaires ; absents ou false pour les événements persistants
typestringDiscriminateur de type d’événement (voir les tableaux ci-dessous)
dataobjectCharge utile spécifique à l’événement

Abonnement aux événements

Langages de code navigation

TypeScript
// All events
session.on((event) => {
    console.log(event.type, event.data);
});

// Specific event type — data is narrowed automatically
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

Conseil

(Python/Go) Ces kits SDK utilisent des types de données distincts par événement (par exemple), AssistantMessageDeltaDatade sorte que seuls les champs pertinents existent sur chaque type.

(.NET) Le sdk .NET utilise des classes de données distinctes et fortement typées par événement (par exemple, AssistantMessageDeltaData), de sorte que seuls les champs pertinents existent sur chaque type.

(TypeScript) Le Kit de développement logiciel (SDK) TypeScript utilise une union discriminée : lorsque vous faites correspondre event.type, la charge utile data est automatiquement réduite à la forme correcte.

Abonnement avant le démarrage d’une session

Une session peut émettre des événements avant son retour d’appel de création ou de reprise. L’agent est peut-être déjà en cours d’exécution — en particulier lors d’une reprise avec continuePendingWork — et des événements éphémères tels que session.idle ne sont jamais consignés dans le journal de session, de sorte que getMessages ne peut pas les récupérer par la suite. Un abonnement installé une fois l’identifiant de session créé ne bénéficie pas de cette fenêtre de démarrage.

Conseil

(Rust)Client::prepare_session et Client::prepare_resume_session retourne un PreparedSession qui possède le canal d’événements de la session avant qu’une activité de protocole ne se produise. Abonnez-vous d’abord, puis appelez start().

use github_copilot_sdk::{Client, SessionConfig};

async fn create_without_missing_startup_events(
    client: &Client,
) -> Result<(), github_copilot_sdk::Error> {
    let prepared = client.prepare_session(
        SessionConfig::default().with_event_buffer_capacity(2048),
    )?;

    // Installed before any wire activity: nothing is dropped for lack of a receiver.
    let mut events = prepared.subscribe();
    tokio::spawn(async move {
        while let Ok(event) = events.recv().await {
            println!("{}", event.event_type);
        }
    });

    let session = prepared.start().await?;
    let _ = session;
    Ok(())
}

prepare_* est synchrone et inerte : il valide la capacité de mémoire tampon, alloue un canal local et ne fait rien d’autre. Aucune session n’est enregistrée et rien n’arrive à l’interface de ligne de commande (CLI) tant que start() n’a pas fait l’objet d’une première interrogation. La suppression d’une session préparée qui n’a jamais été démarrée ne laisse aucun état résiduel et ferme ses abonnements ; la suppression du future start() annule le démarrage en cours et désinscrit la session, de sorte qu’une nouvelle tentative avec le même ID de session réussit. Le nettoyage est limité à l’enregistrement exact détenu par l’instance de démarrage abandonnée ; il ne peut donc pas évincer une nouvelle tentative qui a déjà repris le même ID de session.

La mise en mémoire tampon de démarrage vaut la peine de planifier :

  • La mémoire tampon d’événements est limitée à 512 événements, à moins que event_buffer_capacity ne remplace cette valeur. Une capacité de 0 est rejetée avec une erreur « invalid-config » au lieu d’être bornée.
  • Les abonnés lents voient apparaître une erreur Lagged indiquant combien d’événements ont été ignorés. Ils n’appliquent jamais de contre-pression à la boucle d’événements de la session.
  • Les consommateurs qui ont besoin d’une vue sans perte d’une grande rafale de démarrage doivent configurer une capacité qui la couvre ou vider l’abonnement simultanément avec start().

Remarque

Pour les sessions cloud où le serveur affecte l’ID de session, le Kit de développement logiciel (SDK) ne peut pas acheminer les notifications tant que la réponse de création arrive et que l’ID est connu. Les événements émis avant ce point ne sont pas routables vers une session. La garantie est plus étroite : les événements routés ne sont jamais supprimés sans récepteur installé. Épinglez session_id sur la configuration pour obtenir le routage — et une couverture complète avant la réponse — dès le premier octet.

Afficher uniquement la réponse de l’agent parent

Les événements des sous-agents partagent le flux de la session parente et incluent la balise agentId au niveau de l’enveloppe. Les événements de l’agent racine/principal et les événements au niveau de la session omettent agentId, de sorte que les renderers main-chat peuvent ignorer les événements d’assistant où agentId est défini et acheminer ces événements vers des traces ou une interface utilisateur de progression à la place.

Langages de code navigation

TypeScript
import type { CopilotSession } from "@github/copilot-sdk";

export function subscribeParentResponse(session: CopilotSession): void {
    session.on("assistant.message_delta", (event) => {
        if (!event.agentId) {
            process.stdout.write(event.data.deltaContent);
        }
    });
}

Événements de l'Assistant

Ces événements effectuent le suivi du cycle de vie de réponse de l’agent, du début en passant par les flux en continu jusqu’au message final.

assistant.turn_start

Émis lorsque l'agent commence à traiter une itération.

Champ de donnéesCatégorieObligatoireDescription
turnIdstring✅Identifiant de tour (généralement un numéro de tour converti en chaîne de caractères)
interactionIdstring
ID d’interaction CAPI pour la corrélation de télémétrie

assistant.intent

Éphémère. Brève description de ce que fait actuellement l’agent, et mise à jour à mesure qu’il travaille.

Champ de donnéesCatégorieObligatoireDescription
intentstring✅Intention lisible par l’homme (par exemple, « Exploration de codebase »)

assistant.reasoning

Bloc de pensée étendu complet du modèle. Émis après la fin du raisonnement.

Champ de donnéesCatégorieObligatoireDescription
reasoningIdstring✅Identificateur unique pour ce bloc de raisonnement
contentstring✅Texte complet de réflexion approfondie

assistant.reasoning_delta

Éphémère. Partie incrémentielle de la pensée étendue du modèle, diffusée en temps réel.

Champ de donnéesCatégorieObligatoireDescription
reasoningIdstring✅Correspond à l’événement correspondant assistant.reasoning
deltaContentstring✅Bloc de texte à ajouter au contenu de raisonnement

assistant.message

Réponse complète de l’Assistant pour cet appel LLM. Peut inclure des demandes d’appel d’outil.

Champ de donnéesCatégorieObligatoireDescription
messageIdstring✅Identificateur unique pour ce message
contentstring✅Réponse textuelle de l’Assistant
toolRequestsToolRequest[]
Les appels que l'assistant souhaite faire avec l'outil (voir ci-dessous)
reasoningOpaquestring
Pensée étendue chiffrée (modèles anthropiques) ; liée à la session
reasoningTextstring
Texte de raisonnement lisible résultant d'une réflexion approfondie
encryptedContentstring
Contenu de raisonnement chiffré (modèles OpenAI) ; liées à la session
phasestring
Phase de génération (par exemple, "thinking" vs "response")
outputTokensnumber
Nombre exact de jetons de sortie dans la réponse de l’API
interactionIdstring
ID d’interaction CAPI pour la télémétrie
parentToolCallIdstring
Deprecated. Utiliser agentId au niveau de l’enveloppe pour l’attribution du sous-agent

** ToolRequest Champs:**

ChampCatégorieObligatoireDescription
toolCallIdstring✅ID unique pour cet appel d’outil
namestring✅Nom de l’outil (par exemple, "bash", "edit", "grep")
argumentsobject
Arguments analysés pour l’outil
type"function" | "custom"
Type d’appel ; prend la valeur par défaut "function" lorsqu’il est absent

assistant.message_delta

Éphémère. Segment incrémentiel de la réponse de texte de l’assistant, diffusé en temps réel.

Champ de donnéesCatégorieObligatoireDescription
messageIdstring✅Correspond à l’événement correspondant assistant.message
deltaContentstring✅Bloc de texte à ajouter au message
parentToolCallIdstring
Deprecated. Utiliser agentId au niveau de l’enveloppe pour l’attribution du sous-agent

assistant.turn_end

Émis lorsque l’agent termine un tour (toutes les exécutions d’outils sont terminées, réponse finale remise).

Champ de donnéesCatégorieObligatoireDescription
turnIdstring✅Correspond à l’événement correspondant assistant.turn_start

assistant.usage

Éphémère. Informations d’utilisation et de coût des jetons pour un appel d’API individuel.

Champ de donnéesCatégorieObligatoireDescription
modelstring✅Identificateur de modèle (par exemple, "gpt-5.4")
inputTokensnumber
Jetons d’entrée consommés
outputTokensnumber
Jetons de sortie produits
reasoningTokensnumber
Jetons de sortie utilisés pour le raisonnement/la chaîne de pensée (sous-ensemble de outputTokens)
cacheReadTokensnumber
Jetons lus à partir du cache d’invite
cacheWriteTokensnumber
Jetons écrits dans le cache d’invite
cacheExpiresAtstring
Horodatage ISO 8601 lorsque le cache d’invite de cet appel de modèle expire
contentFilterTriggeredboolean
Indique si la réponse a été bloquée ou tronquée par le filtrage de contenu (finish_reason === 'content_filter')
finishReasonstring
Motif de fin du modèle (par exemple, "stop", "tool_calls", "length", "content_filter")
costnumber
Coût du multiplicateur de modèle pour la facturation
durationnumber
Durée des appels d’API en millisecondes
timeToFirstTokenMsnumber
Temps écoulé entre l’envoi de la requête et la réception du premier token (latence de streaming)
interTokenLatencyMsnumber
Latence moyenne entre les jetons consécutifs (débit de streaming)
reasoningEffortstring
Niveau d’effort de raisonnement utilisé pour cet appel (par exemple, "low", "medium", "high")
initiatorstring
Ce qui a déclenché cet appel (par exemple, "sub-agent") ; absent si l’appel est initié par l’utilisateur
apiCallIdstring
ID d’achèvement du fournisseur (par exemple, chatcmpl-abc123)
serviceRequestIdstring
ID de requête de service Copilot (x-copilot-service-request-id) pour la corrélation des journaux CAPI
apiEndpoint"/chat/completions" | "/v1/messages" | "/responses" | "ws:/responses"
Point de terminaison d’API utilisé pour l’appel de modèle ; utile pour l’observabilité et l’attribution des coûts.
ws:/responses est la variante websocket de l’API réponses
providerCallIdstring
ID de suivi de requête GitHub (x-github-request-id)
parentToolCallIdstring
Deprecated. Utiliser agentId au niveau de l’enveloppe pour l’attribution du sous-agent
quotaSnapshotsRecord<string, QuotaSnapshot>
Utilisation des ressources par quota, indexé par identificateur de quota
copilotUsageCopilotUsage
Répartition des coûts des jetons itemisés à partir de l’API

assistant.streaming_delta

Éphémère. Indicateur de progression réseau de bas niveau : nombre total d’octets reçus de la réponse de l’API de diffusion en continu.

Champ de donnéesCatégorieObligatoireDescription
totalResponseSizeBytesnumber✅Octets cumulés reçus jusqu’à présent

Événements d’exécution d’outils

Ces événements suivent le cycle de vie complet de chaque appel d'outil, depuis la demande d'appel d'outil par le modèle, à travers l'exécution, jusqu'à son achèvement.

tool.execution_start

Émis lorsqu’un outil commence à s’exécuter.

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Identificateur unique pour cet appel d’outil
toolNamestring✅Nom de l’outil (par exemple, "bash", "edit", "grep")
argumentsobject
Arguments analysés passés à l’outil
mcpServerNamestring
Nom du serveur MCP, lorsque l’outil est fourni par un serveur MCP
mcpToolNamestring
Nom de l’outil d’origine sur le serveur MCP
parentToolCallIdstring
Deprecated. Utiliser agentId au niveau de l’enveloppe pour l’attribution du sous-agent

tool.execution_partial_result

Éphémère. Sortie incrémentielle d’un outil en cours d’exécution (par exemple, sortie bash en streaming).

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Correspond au tool.execution_start correspondant
partialOutputstring✅Segment de sortie incrémentiel

tool.execution_progress

Éphémère. État de progression lisible par l’homme à partir d’un outil en cours d’exécution (par exemple, notifications de progression du serveur MCP).

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Correspond au tool.execution_start correspondant
progressMessagestring✅Message d’état de progression

tool.execution_complete

Émis lorsqu'un outil termine son exécution, avec succès ou avec une erreur.

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Correspond au tool.execution_start correspondant
successboolean✅Indique si l’exécution a réussi
modelstring
Modèle qui a généré cet appel d’outil
interactionIdstring
ID d’interaction CAPI
isUserRequestedboolean
true lorsque l’utilisateur a explicitement demandé cet appel d’outil
resultResult
Présentation sur la réussite (voir ci-dessous)
error{ message, code? }
Présent en cas d’échec
toolTelemetryobject
Télémétrie spécifique à l’outil (par exemple, nombre de vérifications CodeQL)
parentToolCallIdstring
Deprecated. Utiliser agentId au niveau de l’enveloppe pour l’attribution du sous-agent

** Result Champs:**

ChampCatégorieObligatoireDescription
contentstring✅Résultat concis envoyé au LLM (pouvant être tronqué pour l'optimisation des tokens)
detailedContentstring
Résultat complet pour l'affichage, préservant le contenu complet, y compris les différences
contentsContentBlock[]
Blocs de contenu structurés (texte, terminal, image, audio, ressource)

tool.user_requested

Émis lorsque l’utilisateur demande explicitement un appel d’outil (plutôt que le modèle choisissant d’en appeler un).

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Identificateur unique pour cet appel d’outil
toolNamestring✅Nom de l’outil que l’utilisateur souhaite appeler
argumentsobject
Arguments pour l’appel

Événements de cycle de vie de session

session.idle

Éphémère. L’agent a terminé tout le traitement et est prêt pour le message suivant. Il s’agit du signal qu’un tour est entièrement terminé.

Champ de donnéesCatégorieObligatoireDescription
abortedboolean
True lorsque le tour précédent a été annulé par le biais d’un signal d’abandon

session.error

Une erreur s’est produite pendant le traitement de la session.

Champ de donnéesCatégorieObligatoireDescription
errorTypestring✅Catégorie d’erreur (par exemple, "authentication", "quota", "rate_limit")
messagestring✅Message d’erreur lisible par l’humain
stackstring
Trace de l'erreur
statusCodenumber
Code d’état HTTP à partir de la requête en amont
providerCallIdstring
Identifiant GitHub de traçage des requêtes pour la corrélation des journaux côté serveur

session.compaction_start

La compaction de la fenêtre de contexte a commencé. La charge utile des données est vide ({}).

session.compaction_complete

Compactage de fenêtre de contexte terminé.

Champ de donnéesCatégorieObligatoireDescription
successboolean✅Indique si la compaction a réussi
errorstring
Message d’erreur en cas d’échec de compactage
preCompactionTokensnumber
Jetons avant compactage
postCompactionTokensnumber
Jetons après compactage
preCompactionMessagesLengthnumber
Nombre de messages avant compactage
messagesRemovednumber
Messages supprimés
tokensRemovednumber
Jetons supprimés
summaryContentstring
Résumé de l'historique compacté généré par le LLM
checkpointNumbernumber
Numéro d’instantané de point de contrôle créé pour la récupération
checkpointPathstring
Chemin d’accès au fichier où le point de contrôle a été stocké
compactionTokensUsed{ input, output, cachedInput }
Utilisation des jetons pour l'appel de la compaction avec LLM
requestIdstring
GitHub ID de suivi de requête pour l’appel de compactage

session.title_changed

Éphémère. Le titre généré automatiquement de la session a été mis à jour.

Champ de donnéesCatégorieObligatoireDescription
titlestring✅Nouveau titre de session

session.context_changed

Le répertoire de travail ou le contexte du référentiel de la session a changé.

Champ de donnéesCatégorieObligatoireDescription
cwdstring✅Répertoire de travail actuel
gitRootstring
Racine du référentiel Git
repositorystring
Référentiel au format "owner/name"
branchstring
Branche git actuelle

session.usage_info

Éphémère. Instantané d’utilisation de la fenêtre de contexte.

Champ de donnéesCatégorieObligatoireDescription
tokenLimitnumber✅Nombre maximal de jetons pour la fenêtre de contexte du modèle
currentTokensnumber✅Jetons actuels dans la fenêtre de contexte
messagesLengthnumber✅Nombre de messages actuels dans la conversation

session.session_limits_changed

Les limites de session ont changé pour la fenêtre de comptabilité actuelle. Une null``sessionLimits valeur signifie qu’aucune limite n’est active.

Champ de donnéesCatégorieObligatoireDescription
sessionLimitsSessionLimitsConfig | null✅Limites de session actuelles ou null quand aucune limite n’est active
sessionLimits.maxAiCreditsnumber
Nombre maximal de crédits IA autorisés dans la fenêtre de comptabilité actuelle de la session

session.usage_checkpoint

Point de contrôle de l’utilisation agrégée durable utilisé pour reconstituer la comptabilité lors de la reprise d’une session.

Champ de donnéesCatégorieObligatoireDescription
totalNanoAiunumber✅Coût des unités nano-IA accumulées à l’échelle de la session au moment du point de contrôle
totalPremiumRequestsnumber
Nombre total de demandes d’API Premium utilisées au moment du point de contrôle

session.task_complete

L’agent a terminé sa tâche affectée.

Champ de donnéesCatégorieObligatoireDescription
summarystring
Résumé de la tâche terminée

session.shutdown

La session s’est terminée.

Champ de donnéesCatégorieObligatoireDescription
shutdownType"routine" | "error"✅Arrêt normal ou panne
errorReasonstring
Description de l’erreur quand shutdownType est "error"
totalPremiumRequestsnumber✅Nombre total de demandes d’API Premium utilisées
totalApiDurationMsnumber✅Temps d’appel d’API cumulé en millisecondes
sessionStartTimenumber✅Horodatage Unix (ms) au démarrage de la session
codeChanges{ linesAdded, linesRemoved, filesModified }✅Métriques globales de modification de code
modelMetricsRecord<string, ModelMetric>✅Répartition de l’utilisation par modèle
currentModelstring
Modèle sélectionné au moment de l’arrêt

Événements d’autorisation et d’entrée utilisateur

Ces événements sont émis lorsque l’agent a besoin d’approbation ou d’entrée de l’utilisateur avant de continuer.

permission.requested

L’agent a besoin d’une autorisation pour effectuer une action (exécuter une commande, écrire un fichier, etc.).

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Utilisez-le pour répondre via session.respondToPermission()
permissionRequestPermissionRequest✅Détails de l’autorisation demandée

Il permissionRequest s’agit d’une union discriminatoire sur kind:

kindChamps clésDescription
"shell"
fullCommandText, intention, commands[], possiblePaths[]Exécuter une commande shell
"write"
fileName, diff, intention, newFileContents?Écrire/modifier un fichier
"read"
path, intentionLire un fichier ou un répertoire
"mcp"
serverName, , toolName``toolTitle, , args?``readOnlyAppeler un outil MCP
"url"
url, intentionRécupérer une URL
"memory"
subject, fact, citationsStocker une mémoire
"custom-tool"
toolName, toolDescription, args?Appeler un outil personnalisé

Toutes les kind variantes incluent également une liaison facultative toolCallId vers l’appel d’outil qui a déclenché la demande.

permission.completed

Une demande d’autorisation a été résolue.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Correspond au permission.requested correspondant
result.kindstring✅Un des : "approved", , "denied-by-rules"``"denied-interactively-by-user", "denied-no-approval-rule-and-could-not-request-from-user","denied-by-content-exclusion-policy"

user_input.requested

Éphémère. L’agent pose une question à l’utilisateur.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Utilisez-le pour répondre via session.respondToUserInput()
questionstring✅Question à présenter à l’utilisateur
choicesstring[]
Choix prédéfinis pour l’utilisateur
allowFreeformboolean
Indique si l’entrée de texte de forme libre est autorisée

user_input.completed

Éphémère. Une demande d’entrée utilisateur a été résolue.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Correspond au user_input.requested correspondant

elicitation.requested

Éphémère. L'agent a besoin d'une entrée de formulaire structurée de l'utilisateur (protocole MCP d'élucidation).

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Utilisez-le pour répondre via session.respondToElicitation()
messagestring✅Description des informations nécessaires
mode"form"
Mode d’élicitation (actuellement uniquement "form")
requestedSchema{ type: "object", properties, required? }✅Schéma JSON décrivant les champs de formulaire

elicitation.completed

Éphémère. Une demande d’éciation a été résolue.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Correspond au elicitation.requested correspondant

Événements de sous-agent et de compétence

subagent.started

Un agent personnalisé a été appelé en tant que sous-agent.

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Appel de l’outil parent qui a généré ce sous-agent
agentNamestring✅Nom interne du sous-agent
agentDisplayNamestring✅Nom d’affichage lisible par l’homme
agentDescriptionstring✅Description de ce que fait le sous-agent
modelstring
Modèle utilisé par le sous-agent, s’il est connu dès le départ

subagent.completed

Un sous-agent a terminé avec succès.

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Correspond au subagent.started correspondant
agentNamestring✅Nom interne
agentDisplayNamestring✅Nom d'affichage
modelstring
Modèle utilisé par le sous-agent
durationMsnumber
Durée d’exécution de l’horloge murale en millisecondes
totalTokensnumber
Nombre total de jetons d’entrée et de sortie consommés
totalToolCallsnumber
Nombre total d’appels d’outil effectués

subagent.failed

Un sous-agent a rencontré une erreur.

Champ de donnéesCatégorieObligatoireDescription
toolCallIdstring✅Correspond au subagent.started correspondant
agentNamestring✅Nom interne
agentDisplayNamestring✅Nom d'affichage
errorstring✅Message d’erreur
modelstring
Modèle sélectionné pour le sous-agent, lorsqu’il est connu
durationMsnumber
Durée d’exécution de l’horloge murale en millisecondes
totalTokensnumber
Nombre total de jetons d’entrée et de sortie consommés avant l’échec
totalToolCallsnumber
Nombre total d’appels d’outils effectués avant l’échec

subagent.selected

Un agent personnalisé a été sélectionné (déduit) pour gérer la requête actuelle.

Champ de donnéesCatégorieObligatoireDescription
agentNamestring✅Nom interne de l’agent sélectionné
agentDisplayNamestring✅Nom d'affichage
toolsstring[] | null✅Noms d’outils disponibles pour cet agent ; null pour tous les outils

subagent.deselected

Un agent personnalisé a été désélectionné, retournant à l’agent par défaut. La charge utile des données est vide ({}).

skill.invoked

Une compétence a été activée pour la conversation actuelle.

Champ de donnéesCatégorieObligatoireDescription
namestring✅Nom de la compétence
pathstring✅Chemin d’accès au fichier de la définition SKILL.md
contentstring✅Contenu de compétences intégral intégré dans la conversation
allowedToolsstring[]
Outils approuvés automatiquement pendant que cette compétence est active
pluginNamestring
Le plug-in d'origine de la compétence
pluginVersionstring
Version du plug-in

Autres événements

abort

Le tour actuel a été abandonné.

Champ de donnéesCatégorieObligatoireDescription
reasonstring✅Pourquoi le tour a été abandonné (par exemple, "user initiated")

user.message

L’utilisateur a envoyé un message. Enregistré pour la chronologie de la session.

Champ de donnéesCatégorieObligatoireDescription
contentstring✅Texte du message de l’utilisateur
transformedContentstring
Version transformée après prétraitement
attachmentsAttachment[]
Pièces jointes de type fichier, répertoire, sélection, blob ou référence GitHub
sourcestring
Identificateur de source de message
agentModestring
Mode agent : "interactive", , "plan"``"autopilot"ou"shell"
interactionIdstring
ID d’interaction CAPI

system.message

Une invite de système ou de développeur a été injectée dans la conversation.

Champ de donnéesCatégorieObligatoireDescription
contentstring✅Texte de l’invite
role"system" | "developer"✅Rôle du message
namestring
Identificateur de la source
metadata{ promptVersion?, variables? }
Métadonnées du modèle d'invite

external_tool.requested

L’agent souhaite appeler un outil externe (fourni par le consommateur du SDK).

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Utilisez-le pour répondre via session.respondToExternalTool()
sessionIdstring✅Session à laquelle cette demande appartient
toolCallIdstring✅Identifiant d'outil appelé pour cet appel
toolNamestring✅Nom de l’outil externe
argumentsobject
Arguments en faveur de l'outil

external_tool.completed

Une demande d’outil externe a été résolue.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Correspond au external_tool.requested correspondant

exit_plan_mode.requested

Éphémère. L’agent a créé un plan et souhaite quitter le mode plan.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Utilisez-le pour répondre via session.respondToExitPlanMode()
summarystring✅Résumé du plan
planContentstring✅Contenu complet du fichier de plan
actionsstring[]✅Actions utilisateur disponibles (par exemple, approuver, modifier, rejeter)
recommendedActionstring✅Action suggérée

exit_plan_mode.completed

Éphémère. Une demande de mode de plan de sortie a été résolue.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Correspond au exit_plan_mode.requested correspondant

command.queued

Éphémère. Une commande slash a été mise en file d’attente pour exécution.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Utilisez-le pour répondre via session.respondToQueuedCommand()
commandstring✅Texte de la commande slash (par exemple, /help, /clear)

command.completed

Éphémère. Une commande mise en file d’attente a été résolue.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Correspond au command.queued correspondant

session_limits_exhausted.requested

Éphémère. Le budget de session actuel a été épuisé et le runtime a besoin d’une décision de l’utilisateur avant de continuer.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Utilisez cet ID lors de la réponse à la demande de limite épuisée en attente
maxAiCreditsnumber✅Nombre maximal de crédits IA configurés pour la fenêtre de comptabilité actuelle
usedAiCreditsnumber✅Crédits IA déjà consommés dans la fenêtre de comptabilité actuelle

session_limits_exhausted.completed

Éphémère. Une demande de limite épuisée en attente a été résolue.

Champ de donnéesCatégorieObligatoireDescription
requestIdstring✅Correspond à l’événement correspondant session_limits_exhausted.requested
response.action"add" | "set" | "unset" | "cancel"✅Action sélectionnée pour la requête de limite atteinte
response.additionalAiCreditsnumber
Crédits IA à ajouter au maximum actuel quand response.action est "add"
response.maxAiCreditsnumber
Nouveau nombre maximal absolu de crédits IA quand response.action est "set"

Référence rapide : flux de transformation agentique

Un tour agentique classique émet des événements dans cet ordre :

assistant.turn_start          → Turn begins
├── assistant.intent          → What the agent plans to do (ephemeral)
├── assistant.reasoning_delta → Streaming thinking chunks (ephemeral, repeated)
├── assistant.reasoning       → Complete thinking block
├── assistant.message_delta   → Streaming response chunks (ephemeral, repeated)
├── assistant.message         → Complete response (may include toolRequests)
├── assistant.usage           → Token usage for this API call (ephemeral)
│
├── [If tools were requested:]
│   ├── permission.requested  → Needs user approval
│   ├── permission.completed  → Approval result
│   ├── tool.execution_start  → Tool begins
│   ├── tool.execution_partial_result  → Streaming tool output (ephemeral, repeated)
│   ├── tool.execution_progress        → Progress updates (ephemeral, repeated)
│   ├── tool.execution_complete        → Tool finished
│   │
│   └── [Agent loops: more reasoning → message → tool calls...]
│
assistant.turn_end            → Turn complete
session.idle                  → Ready for next message (ephemeral)

Tous les types d’événements en un clin d’œil

Ce tableau répertorie les principaux champs de la charge utile data. Les champs d’enveloppe courants sont documentés ci-dessus.

Type d’événementÉphémèreCatégorieChamps de données clés
assistant.turn_start
Assistant
turnId, interactionId?
assistant.intent✅Assistantintent
assistant.reasoning
Assistant
reasoningId, content
assistant.reasoning_delta✅Assistant
reasoningId, deltaContent
assistant.streaming_delta✅AssistanttotalResponseSizeBytes
assistant.message
Assistant
messageId, , content``toolRequests?, , outputTokens?``phase?
assistant.message_delta✅Assistant
messageId, deltaContent
assistant.turn_end
AssistantturnId
assistant.usage✅Assistant
model, , apiEndpoint?, inputTokens?``outputTokens?, , cost?``duration?
tool.user_requested
Tool
toolCallId, toolName, arguments?
tool.execution_start
Tool
toolCallId, toolName, arguments?, mcpServerName?
tool.execution_partial_result✅Tool
toolCallId, partialOutput
tool.execution_progress✅Tool
toolCallId, progressMessage
tool.execution_complete
Tool
toolCallId, success, result?, error?
session.idle✅Sessionaborted?
session.error
Session
errorType, message, statusCode?
session.compaction_start
Session
(vide)
session.compaction_complete
Session
success, preCompactionTokens?, summaryContent?
session.title_changed✅Sessiontitle
session.context_changed
Session
cwd, gitRoot?, repository?, branch?
session.usage_info✅Session
tokenLimit, currentTokens, messagesLength
session.session_limits_changed
SessionsessionLimits
session.usage_checkpoint
Session
totalNanoAiu, totalPremiumRequests?
session.task_complete
Sessionsummary?
session.shutdown
Session
shutdownType, codeChanges, modelMetrics
permission.requested
Autorisation
requestId, permissionRequest
permission.completed
Autorisation
requestId, result.kind
user_input.requested✅Entrée utilisateur
requestId, question, choices?
user_input.completed✅Entrée utilisateurrequestId
elicitation.requested✅Entrée utilisateur
requestId, message, requestedSchema
elicitation.completed✅Entrée utilisateurrequestId
subagent.started
Sous-agent
toolCallId, agentName, agentDisplayName, model?
subagent.completed
Sous-agent
toolCallId, agentName, model?, agentDisplayName, durationMs?, totalTokens?, totalToolCalls?
subagent.failed
Sous-agent
toolCallId, agentName, model?, error, durationMs?, totalTokens?, totalToolCalls?
subagent.selected
Sous-agent
agentName, agentDisplayName, tools
subagent.deselected
Sous-agent
(vide)
skill.invoked
Compétence
name, path, content, allowedTools?
abort
Contrôlereason
user.message
Utilisateur
content, attachments?, agentMode?
system.message
System
content, role
external_tool.requested
Outil externe
requestId, toolName, arguments?
external_tool.completed
Outil externerequestId
command.queued✅Command
requestId, command
command.completed✅CommandrequestId
session_limits_exhausted.requested✅Session
requestId, maxAiCredits, usedAiCredits
session_limits_exhausted.completed✅Session
requestId, response.action
exit_plan_mode.requested✅Mode de plan
requestId, summary, planContent, actions
exit_plan_mode.completed✅Mode de planrequestId