Skip to main content
Skip to content

Eventos de la sesión de transmisión

Cada acción que realiza el agente de Copilot —pensar, escribir código o ejecutar herramientas— se emite como un evento de sesión al que puedes suscribirte. Esta guía es una referencia de nivel de campo para cada tipo de evento para saber exactamente qué datos esperar sin leer el origen del SDK.

Visión general

Cuando streaming: true se establece en una sesión, el SDK emite eventos efímeros en tiempo real (deltas, actualizaciones de progreso) junto con eventos persistentes (mensajes completos, resultados de la herramienta). Todos los eventos comparten un sobre común y llevan una data carga cuya forma depende del evento type.

Diagrama: diagrama de secuencia que muestra el proceso descrito.

ConceptoDescription
Evento efímeroTransitorio; se transmite en tiempo real, pero no se conserva en el registro de sesión. No se reproduce al reanudar la sesión.
Evento persistenteGuardado en el registro de eventos de sesión en el disco. Se reproduce al reanudar una sesión.
Evento DeltaUn fragmento de streaming efímero (texto o razonamiento). Acumule las diferencias para crear el contenido completo.
parentId cadenaCada evento parentId apunta al evento anterior, formando una lista enlazada que se puede recorrer.

Contenedor de eventos

Cada evento de sesión, independientemente del tipo, incluye estos campos:

CampoTipoDescription
id
string (UUID v4)Identificador de evento único
timestamp
string (ISO 8601)Cuándo se creó el evento
parentIdstring | nullId. del evento anterior de la cadena; null para el primer evento
agentIdstring?Id. de instancia del subagente para eventos originados por subagente; ausente para los eventos raíz/principal y de nivel de sesión
ephemeralboolean?
true para eventos transitorios; ausente o false para eventos persistentes
typestringDiscriminador de tipo de evento (consulte las tablas siguientes)
dataobjectCarga específica del evento

Suscribirse a eventos

Lenguajes de código 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);
});

Sugerencia

(Python / Go) Estos SDK usan tipos de datos independientes por evento (por ejemplo, AssistantMessageDeltaData), por lo que solo existen los campos pertinentes en cada tipo.

(.NET) El SDK de .NET usa clases de datos independientes y fuertemente tipadas por evento (por ejemplo, AssistantMessageDeltaData), por lo que solo existen los campos pertinentes en cada tipo.

(TypeScript) El SDK de TypeScript utiliza una unión discriminada: cuando se realiza una coincidencia con event.type, la carga data se restringe automáticamente a la forma correcta.

Suscribirse antes de que se inicie una sesión

Una sesión puede emitir eventos antes de que se devuelva su llamada de creación o reanudación. Es posible que el agente ya esté trabajando —especialmente al reanudar con continuePendingWork—, y los eventos efímeros, como session.idle, nunca se escriben en el registro de la sesión, por lo que getMessages no puede recuperarlos después. Una suscripción instalada después de que exista el descriptor de sesión pierde esa ventana de inicio.

Sugerencia

(Rust)Client::prepare_session y Client::prepare_resume_session devuelve un PreparedSession que posee el canal de eventos de la sesión antes de que se produzca cualquier actividad de protocolo. Suscríbase primero y, a continuación, llame a 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_* es sincrónico e inert: valida la capacidad del búfer, asigna un canal local y no hace nada más. No hay ninguna sesión registrada y nada llega a la CLI hasta que se consulta start() por primera vez. Descartar una sesión preparada que nunca se inició no deja ningún estado residual y cierra sus suscripciones; al descartar el valor futuro start(), se cancela el inicio en curso y se cancela el registro de la sesión, por lo que un reintento con el mismo identificador de sesión tiene éxito. La limpieza tiene como ámbito el registro exacto que posee el inicio abandonado, por lo que no puede expulsar un reintento que ya haya tomado el mismo identificador de sesión.

Conviene planificar el almacenamiento en búfer al iniciar:

  • El búfer de eventos es finito: 512 eventos, a menos que event_buffer_capacity lo anule. Se rechaza una capacidad de 0 con un error de configuración no válida en lugar de limitarla.
  • Los suscriptores lentos observan un Lagged error que informa de cuántos eventos se han omitido. Nunca ejercen contrapresión sobre el bucle de eventos de la sesión.
  • Los consumidores que necesiten una visión sin pérdida de una gran ráfaga de arranque deben configurar una capacidad que la cubra o vaciar la suscripción simultáneamente con start().

Nota:

En el caso de las sesiones en la nube en las que el servidor asigna el identificador de sesión, el SDK no puede enrutar las notificaciones hasta que llegue la respuesta de creación y se conozca el identificador. Los eventos emitidos antes de ese punto no se pueden enrutar a ninguna sesión. La garantía es más limitada: los eventos enrutados nunca se descartan por la falta de un receptor instalado. Fije session_id en la configuración para obtener el enrutamiento y una cobertura completa antes de la respuesta desde el primer byte.

Representar solo la respuesta del agente primario

Los eventos de los subagentes comparten el flujo de la sesión principal e incluyen agentId en el nivel de sobre. Los eventos del agente raíz/principal y los eventos en el nivel de sesión omiten agentId, por lo que los renderizadores del chat principal pueden ignorar los eventos del asistente en los que se ha establecido agentId y, en su lugar, redirigir dichos eventos a trazas o a la interfaz de usuario de progreso.

Lenguajes de código 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);
        }
    });
}

Eventos del asistente

Estos eventos realizan un seguimiento del ciclo de vida de respuesta del agente, desde el inicio del turno mediante fragmentos transmitidos en streaming hasta el mensaje final.

assistant.turn_start

Se genera cuando el agente inicia a procesar un turno.

Campo de datosTipoObligatorioDescription
turnIdstring✅Identificador de turno (normalmente un número de turno con cadena)
interactionIdstring
Id. de interacción de CAPI para la correlación de telemetría

assistant.intent

Efímero. Descripción breve de lo que el agente está haciendo actualmente, actualizado a medida que funciona.

Campo de datosTipoObligatorioDescription
intentstring✅Intención comprensible para humanos (p. ej., "Explorando la base de código")

assistant.reasoning

Bloque completo de razonamiento ampliado del modelo. Emitido después de finalizar el razonamiento.

Campo de datosTipoObligatorioDescription
reasoningIdstring✅Identificador único de este bloque de razonamiento
contentstring✅Texto completo de pensamiento avanzado

assistant.reasoning_delta

Efímero. Fragmento incremental del razonamiento ampliado del modelo, transmitido en tiempo real.

Campo de datosTipoObligatorioDescription
reasoningIdstring✅Coincide con el evento correspondiente assistant.reasoning .
deltaContentstring✅Fragmento de texto que se va a anexar al contenido de razonamiento

assistant.message

Respuesta completa del asistente para esta llamada al LLM. Puede incluir solicitudes de invocación de herramientas.

Campo de datosTipoObligatorioDescription
messageIdstring✅Identificador único de este mensaje
contentstring✅Respuesta de texto del asistente
toolRequestsToolRequest[]
Llamadas a herramientas que el asistente desea realizar (ver abajo)
reasoningOpaquestring
Pensamiento extendido cifrado (modelos antrópicos); vinculado a sesión
reasoningTextstring
Texto de razonamiento legible a partir del pensamiento ampliado
encryptedContentstring
Contenido de razonamiento cifrado (modelos de OpenAI); vinculado a la sesión
phasestring
Fase de generación (por ejemplo, "thinking" frente a "response")
outputTokensnumber
Recuento real de tokens de salida de la respuesta de la API
interactionIdstring
ID de interacción de CAPI para telemetría
parentToolCallIdstring
Deprecated. Utilizar agentId en el nivel de sobre para la atribución de subagentes

** ToolRequest campos:**

CampoTipoObligatorioDescription
toolCallIdstring✅Identificador único para esta llamada de herramienta
namestring✅Nombre de la herramienta (por ejemplo, "bash", "edit", "grep")
argumentsobject
Argumentos analizados para la herramienta
type"function" | "custom"
Tipo de llamada; el valor predeterminado es "function" cuando está ausente.

assistant.message_delta

Efímero. Fragmento incremental de la respuesta de texto del asistente, transmitido en tiempo real.

Campo de datosTipoObligatorioDescription
messageIdstring✅Coincide con el evento correspondiente assistant.message .
deltaContentstring✅Fragmento de texto que se va a anexar al mensaje
parentToolCallIdstring
Deprecated. Utilizar agentId en el nivel de sobre para la atribución de subagentes

assistant.turn_end

Se genera cuando el agente finaliza un turno (todas las ejecuciones de herramientas se completan y se entrega la respuesta final).

Campo de datosTipoObligatorioDescription
turnIdstring✅Coincide con el evento correspondiente assistant.turn_start .

assistant.usage

Efímero. Información de costos y uso de tokens para una llamada API individual.

Campo de datosTipoObligatorioDescription
modelstring✅Identificador del modelo (por ejemplo, "gpt-5.4")
inputTokensnumber
Tokens de entrada consumidos
outputTokensnumber
Tokens de salida generados
reasoningTokensnumber
Tokens de salida usados para el razonamiento o la cadena de pensamiento (subconjunto de outputTokens)
cacheReadTokensnumber
Tokens leídos de la caché de solicitud
cacheWriteTokensnumber
Tokens escritos para solicitar caché
cacheExpiresAtstring
Marca de tiempo ISO 8601 cuando caduca la caché de indicaciones para esta llamada al modelo
contentFilterTriggeredboolean
Indica si la respuesta se ha bloqueado o truncado mediante el filtrado de contenido (finish_reason === 'content_filter')
finishReasonstring
Motivo de finalización del modelo (por ejemplo, "stop", "length", "tool_calls", "content_filter")
costnumber
Coste del multiplicador de modelos para la facturación
durationnumber
Duración de la llamada API en milisegundos
timeToFirstTokenMsnumber
Tiempo desde el envío de solicitudes hasta el primer token recibido (latencia de streaming)
interTokenLatencyMsnumber
Latencia media entre tokens consecutivos (rendimiento de streaming)
reasoningEffortstring
Nivel de esfuerzo de razonamiento usado para esta llamada (por ejemplo, "low", "medium", "high")
initiatorstring
Lo que desencadenó esta llamada (por ejemplo, "sub-agent"); ausente para el iniciado por el usuario
apiCallIdstring
Identificador de finalización del proveedor (por ejemplo, chatcmpl-abc123)
serviceRequestIdstring
Identificador de solicitud de servicio de Copilot (x-copilot-service-request-id) para la correlación del registro de CAPI
apiEndpoint"/chat/completions" | "/v1/messages" | "/responses" | "ws:/responses"
Punto de conexión de API usado para la llamada de modelo; útil para la observabilidad y la atribución de costos.
ws:/responses es la variante websocket de la API de respuestas.
providerCallIdstring
ID de trazado de solicitudes de GitHub (x-github-request-id)
parentToolCallIdstring
Deprecated. Utilizar agentId en el nivel de sobre para la atribución de subagentes
quotaSnapshotsRecord<string, QuotaSnapshot>
Uso de recursos por cuota, con clave según el identificador de cuota
copilotUsageCopilotUsage
Desglose de costos de tokens detallados de la API

assistant.streaming_delta

Efímero. Indicador de progreso de red de bajo nivel: bytes totales recibidos de la respuesta de la API de streaming.

Campo de datosTipoObligatorioDescription
totalResponseSizeBytesnumber✅Bytes acumulados recibidos hasta ahora

Eventos de ejecución de herramientas

Estos eventos realizan un seguimiento del ciclo de vida completo de cada invocación de herramienta, desde el modelo que solicita una llamada de herramienta a través de la ejecución hasta la finalización.

tool.execution_start

Se genera cuando una herramienta comienza a ejecutarse.

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Identificador único de esta llamada de herramienta
toolNamestring✅Nombre de la herramienta (por ejemplo, "bash", "edit", "grep")
argumentsobject
Argumentos analizados pasados a la herramienta
mcpServerNamestring
Nombre del servidor MCP, cuando un servidor MCP proporciona la herramienta
mcpToolNamestring
Nombre de la herramienta original en el servidor MCP
parentToolCallIdstring
Deprecated. Utilizar agentId en el nivel de sobre para la atribución de subagentes

tool.execution_partial_result

Efímero. Salida incremental de una herramienta en ejecución (p. ej., salida de bash en streaming).

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Coincide con el correspondiente tool.execution_start
partialOutputstring✅Fragmento de salida incremental

tool.execution_progress

Efímero. Estado de progreso legible de una herramienta en ejecución (por ejemplo, notificaciones de progreso del servidor MCP).

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Coincide con el correspondiente tool.execution_start
progressMessagestring✅Mensaje de estado de progreso

tool.execution_complete

Se genera cuando una herramienta termina de ejecutarse correctamente o con un error.

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Coincide con el correspondiente tool.execution_start
successboolean✅Si la ejecución se realizó correctamente
modelstring
Modelo que generó esta invocación de herramienta
interactionIdstring
ID de interacción de CAPI
isUserRequestedboolean
true cuando el usuario solicitó explícitamente el uso de esta herramienta
resultResult
Presente en caso de éxito (véase más abajo)
error{ message, code? }
Presente en caso de fallo
toolTelemetryobject
Telemetría específica de la herramienta (por ejemplo, recuentos de comprobación de CodeQL)
parentToolCallIdstring
Deprecated. Utilizar agentId en el nivel de sobre para la atribución de subagentes

** Result campos:**

CampoTipoObligatorioDescription
contentstring✅Resultado conciso enviado al LLM (podría truncarse para la eficacia del uso de tokens)
detailedContentstring
Resultado completo para su visualización, conservando el contenido completo, como las diferencias
contentsContentBlock[]
Bloques de contenido estructurados (texto, terminal, imagen, audio, recurso)

tool.user_requested

Se activa cuando el usuario solicita explícitamente una invocación de herramienta, en lugar de que el modelo decida llamarla.

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Identificador único de esta llamada de herramienta
toolNamestring✅Nombre de la herramienta que el usuario quiere invocar
argumentsobject
Argumentos para la invocación

Eventos del ciclo de vida de la sesión

session.idle

Efímero. El agente ha terminado todo el procesamiento y está listo para el siguiente mensaje. Esta es la señal de que un turno ha finalizado por completo.

Campo de datosTipoObligatorioDescription
abortedboolean
Verdadero cuando el turno anterior se canceló mediante una señal de aborto

session.error

Error durante el procesamiento de la sesión.

Campo de datosTipoObligatorioDescription
errorTypestring✅Categoría de error (por ejemplo, "authentication", "quota", "rate_limit")
messagestring✅Mensaje de error legible por humanos
stackstring
Traza de pila de errores
statusCodenumber
Código de estado HTTP de la solicitud ascendente
providerCallIdstring
Identificador de seguimiento de solicitudes de GitHub para la correlación de registros del servidor

session.compaction_start

Se ha iniciado la compactación de ventanas de contexto. La carga de datos está vacía ({}).

session.compaction_complete

La compactación de la ventana de contexto finalizó.

Campo de datosTipoObligatorioDescription
successboolean✅Si la compactación se realizó correctamente
errorstring
Mensaje de error si se produjo un error en la compactación
preCompactionTokensnumber
Tokens antes de la compactación
postCompactionTokensnumber
Tokens después de la compactación
preCompactionMessagesLengthnumber
Recuento de mensajes antes de la compactación
messagesRemovednumber
Mensajes quitados
tokensRemovednumber
Tokens eliminados
summaryContentstring
Resumen generado por LLM del historial compacto
checkpointNumbernumber
Número de instantánea de punto de control creado para la recuperación
checkpointPathstring
Ruta del archivo donde se almacenó el punto de control
compactionTokensUsed{ input, output, cachedInput }
Uso de tokens para la llamada LLM de compactación
requestIdstring
ID de rastreo de solicitud de GitHub para la llamada de compactación

session.title_changed

Efímero. Se actualizó el título generado automáticamente de la sesión.

Campo de datosTipoObligatorioDescription
titlestring✅Nuevo título de sesión

session.context_changed

Se ha cambiado el directorio de trabajo o el contexto del repositorio de la sesión.

Campo de datosTipoObligatorioDescription
cwdstring✅Directorio de trabajo actual
gitRootstring
Raíz del repositorio de Git
repositorystring
Repositorio en "owner/name" formato
branchstring
Rama actual de Git

session.usage_info

Efímero. Instantánea de uso de la ventana de contexto.

Campo de datosTipoObligatorioDescription
tokenLimitnumber✅Número máximo de tokens para la ventana de contexto del modelo
currentTokensnumber✅Tokens actuales en la ventana de contexto
messagesLengthnumber✅Recuento de mensajes actual en la conversación

session.session_limits_changed

Se han cambiado los límites de sesión para la ventana de contabilidad actual. Un null``sessionLimits valor significa que no hay límites activos.

Campo de datosTipoObligatorioDescription
sessionLimitsSessionLimitsConfig | null✅Límites de sesión actuales o null cuando no hay límites activos
sessionLimits.maxAiCreditsnumber
Créditos de IA máximos permitidos en la ventana de contabilidad actual de la sesión

session.usage_checkpoint

Punto de control de uso agregado duradero que se usa para reconstruir la contabilidad cuando se reanuda una sesión.

Campo de datosTipoObligatorioDescription
totalNanoAiunumber✅Coste acumulado de unidades de nano-IA en toda la sesión en el momento del punto de control
totalPremiumRequestsnumber
Número total de solicitudes de API Premium usadas en el momento del punto de comprobación

session.task_complete

El agente ha completado su tarea asignada.

Campo de datosTipoObligatorioDescription
summarystring
Resumen de la tarea completada

session.shutdown

La sesión finalizó.

Campo de datosTipoObligatorioDescription
shutdownType"routine" | "error"✅Apagado normal o fallo
errorReasonstring
Descripción del error cuando shutdownType está "error"
totalPremiumRequestsnumber✅Total de solicitudes de API Premium usadas
totalApiDurationMsnumber✅Tiempo de llamada API acumulado en milisegundos
sessionStartTimenumber✅Marca de tiempo de Unix (ms) cuando se inició la sesión
codeChanges{ linesAdded, linesRemoved, filesModified }✅Métricas agregadas de cambio de código
modelMetricsRecord<string, ModelMetric>✅Desglose del uso por modelo
currentModelstring
Modelo seleccionado en el momento de apagado

Permisos y eventos de entrada de usuario

Estos eventos se emiten cuando el agente necesita aprobación o entrada del usuario antes de continuar.

permission.requested

El agente necesita permiso para realizar una acción (ejecutar un comando, escribir un archivo, etc.).

Campo de datosTipoObligatorioDescription
requestIdstring✅Usa esto para responder a través de session.respondToPermission()
permissionRequestPermissionRequest✅Detalles del permiso que se solicita

El permissionRequest es una unión discriminada en kind:

kindCampos de claveDescription
"shell"
fullCommandText, intention, , commands[], possiblePaths[]Ejecutar un comando de shell
"write"
fileName, diff, , intention, newFileContents?Escribir o modificar un archivo
"read"
path, intentionLeer un archivo o directorio
"mcp"
serverName, toolName, toolTitle, , args?, readOnlyInvocar una herramienta MCP
"url"
url, intentionCapturar una dirección URL
"memory"
subject, , fact, citationsAlmacenar una memoria
"custom-tool"
toolName, , toolDescription, args?Llame a una herramienta personalizada

Todas las variantes kind también incluyen un enlace opcional toolCallId que retorna a la llamada de herramienta que desencadenó la solicitud.

permission.completed

Se resolvió una solicitud de permiso.

Campo de datosTipoObligatorioDescription
requestIdstring✅Coincide con el correspondiente permission.requested
result.kindstring✅Uno de: "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

Efímero. El agente está haciendo una pregunta al usuario.

Campo de datosTipoObligatorioDescription
requestIdstring✅Usa esto para responder a través de session.respondToUserInput()
questionstring✅Pregunta que se va a presentar al usuario
choicesstring[]
Opciones predefinidas para el usuario
allowFreeformboolean
Indica si se permite la entrada de texto de forma libre

user_input.completed

Efímero. Se resolvió una solicitud de entrada de usuario.

Campo de datosTipoObligatorioDescription
requestIdstring✅Coincide con el correspondiente user_input.requested

elicitation.requested

Efímero. El agente necesita una entrada de formulario estructurada del usuario (protocolo de elicitación MCP).

Campo de datosTipoObligatorioDescription
requestIdstring✅Usa esto para responder a través de session.respondToElicitation()
messagestring✅Descripción de la información necesaria
mode"form"
Modo de elicitación (actualmente solo "form")
requestedSchema{ type: "object", properties, required? }✅Esquema JSON que describe los campos de formulario

elicitation.completed

Efímero. Se resolvió una solicitud de elicitación.

Campo de datosTipoObligatorioDescription
requestIdstring✅Coincide con el correspondiente elicitation.requested

Eventos de subagentes y aptitudes

subagent.started

Se invocó un agente personalizado como subagente.

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Llamada a la herramienta primaria que generó este subagente
agentNamestring✅Nombre interno del subagente
agentDisplayNamestring✅Nombre de visualización legible por humanos
agentDescriptionstring✅Descripción de lo que hace el subagente
modelstring
Modelo con el que se ejecutará el subagente, si se conoce desde el principio

subagent.completed

Un subagente finalizó correctamente.

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Coincide con el correspondiente subagent.started
agentNamestring✅Nombre interno
agentDisplayNamestring✅Nombre para mostrar
modelstring
Modelo usado por el subagente
durationMsnumber
Duración de la ejecución en tiempo real, en milisegundos
totalTokensnumber
Número total de tokens de entrada y salida consumidos
totalToolCallsnumber
Total de llamadas a herramientas realizadas

subagent.failed

Un subagente encontró un error.

Campo de datosTipoObligatorioDescription
toolCallIdstring✅Coincide con el correspondiente subagent.started
agentNamestring✅Nombre interno
agentDisplayNamestring✅Nombre para mostrar
errorstring✅Mensaje de error
modelstring
Modelo seleccionado para el subagente, cuando se conoce
durationMsnumber
Duración de la ejecución en tiempo real, en milisegundos
totalTokensnumber
Total de tokens de entrada y salida consumidos antes del error
totalToolCallsnumber
Total de llamadas a herramientas realizadas antes del error

subagent.selected

Se ha seleccionado (deducido) un agente personalizado para administrar la solicitud actual.

Campo de datosTipoObligatorioDescription
agentNamestring✅Nombre interno del agente seleccionado
agentDisplayNamestring✅Nombre para mostrar
toolsstring[] | null✅Nombres de herramientas disponibles para este agente; null para todas las herramientas

subagent.deselected

Se deseleccionó un agente personalizado y se devolvió al agente predeterminado. La carga de datos está vacía ({}).

skill.invoked

Se activó una habilidad en la conversación actual.

Campo de datosTipoObligatorioDescription
namestring✅Nombre de la habilidad
pathstring✅Ruta de archivo a la definición SKILL.md
contentstring✅Contenido completo de habilidades inyectado en la conversación
allowedToolsstring[]
Herramientas aprobadas automáticamente mientras esta habilidad está activa
pluginNamestring
Complemento del que proviene la aptitud
pluginVersionstring
Versión del complemento

Otros eventos

abort

Se anuló el turno actual.

Campo de datosTipoObligatorioDescription
reasonstring✅¿Por qué se anuló el turno (por ejemplo, "user initiated")

user.message

El usuario envió un mensaje. Registrado para la línea de tiempo de la sesión.

Campo de datosTipoObligatorioDescription
contentstring✅Texto del mensaje del usuario
transformedContentstring
Versión transformada después del preprocesamiento
attachmentsAttachment[]
Archivo, directorio, selección, blob o archivos adjuntos de referencia de GitHub.
sourcestring
Identificador de origen del mensaje
agentModestring
Modo de agente: "interactive", "plan", "autopilot"o "shell"
interactionIdstring
ID de interacción de CAPI

system.message

Se insertó un mensaje del sistema o del desarrollador en la conversación.

Campo de datosTipoObligatorioDescription
contentstring✅Texto del mensaje
role"system" | "developer"✅Rol de mensaje
namestring
Identificador de origen
metadata{ promptVersion?, variables? }
Metadatos de la plantilla de solicitud

external_tool.requested

El agente quiere invocar una herramienta externa (una proporcionada por el consumidor del SDK).

Campo de datosTipoObligatorioDescription
requestIdstring✅Usa esto para responder a través de session.respondToExternalTool()
sessionIdstring✅Sesión a la que pertenece esta solicitud
toolCallIdstring✅ID de llamada de herramienta para esta invocación
toolNamestring✅Nombre de la herramienta externa
argumentsobject
Argumentos de la herramienta

external_tool.completed

Se resolvió una solicitud de herramienta externa.

Campo de datosTipoObligatorioDescription
requestIdstring✅Coincide con el correspondiente external_tool.requested

exit_plan_mode.requested

Efímero. El agente ha creado un plan y quiere salir del modo de plan.

Campo de datosTipoObligatorioDescription
requestIdstring✅Usa esto para responder a través de session.respondToExitPlanMode()
summarystring✅Resumen del plan
planContentstring✅Contenido completo del archivo de plan
actionsstring[]✅Acciones de usuario disponibles (por ejemplo, aprobar, editar, rechazar)
recommendedActionstring✅Acción sugerida

exit_plan_mode.completed

Efímero. Se resolvió una solicitud de modo de plan de salida.

Campo de datosTipoObligatorioDescription
requestIdstring✅Coincide con el correspondiente exit_plan_mode.requested

command.queued

Efímero. Se ha puesto en cola un comando de barra para su ejecución.

Campo de datosTipoObligatorioDescription
requestIdstring✅Usa esto para responder a través de session.respondToQueuedCommand()
commandstring✅El texto del comando con barra (p. ej., /help, /clear)

command.completed

Efímero. Se ha resuelto un comando en cola.

Campo de datosTipoObligatorioDescription
requestIdstring✅Coincide con el correspondiente command.queued

session_limits_exhausted.requested

Efímero. El presupuesto de sesión actual se agotó y el tiempo de ejecución necesita una decisión de usuario antes de continuar.

Campo de datosTipoObligatorioDescription
requestIdstring✅Use este identificador al responder a la solicitud de límite agotado pendiente.
maxAiCreditsnumber✅Créditos máximos de IA configurados para la ventana de contabilidad actual
usedAiCreditsnumber✅Créditos de IA ya consumidos en la ventana de contabilidad actual

session_limits_exhausted.completed

Efímero. Se resolvió una solicitud de límite agotado pendiente.

Campo de datosTipoObligatorioDescription
requestIdstring✅Coincide con el evento correspondiente session_limits_exhausted.requested .
response.action"add" | "set" | "unset" | "cancel"✅Acción seleccionada para la solicitud de límite agotado
response.additionalAiCreditsnumber
Créditos de IA que se van a agregar al máximo actual cuando response.action es "add"
response.maxAiCreditsnumber
Nuevos créditos máximos absolutos de IA cuando response.action es "set"

Referencia rápida: flujo de turnos de agentes

Un turno agente típico emite eventos en este orden:

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)

Todos los tipos de eventos de un vistazo

En esta tabla se enumeran los campos de carga clave data . Los campos comunes de la envolvente se describen más arriba.

Tipo de eventoEfímeroCategoryCampos de datos clave
assistant.turn_start
Asistente
turnId, interactionId?
assistant.intent✅Asistenteintent
assistant.reasoning
Asistente
reasoningId, content
assistant.reasoning_delta✅Asistente
reasoningId, deltaContent
assistant.streaming_delta✅AsistentetotalResponseSizeBytes
assistant.message
Asistente
messageId, content, toolRequests?, , outputTokens?, phase?
assistant.message_delta✅Asistente
messageId, deltaContent
assistant.turn_end
AsistenteturnId
assistant.usage✅Asistente
model, apiEndpoint?, inputTokens?, outputTokens?, , cost?, duration?
tool.user_requested
Herramienta
toolCallId, , toolName, arguments?
tool.execution_start
Herramienta
toolCallId, toolName, , arguments?, mcpServerName?
tool.execution_partial_result✅Herramienta
toolCallId, partialOutput
tool.execution_progress✅Herramienta
toolCallId, progressMessage
tool.execution_complete
Herramienta
toolCallId, success, , result?, error?
session.idle✅Sessionaborted?
session.error
Session
errorType, , message, statusCode?
session.compaction_start
Session
(vacío)
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
Permiso
requestId, permissionRequest
permission.completed
Permiso
requestId, result.kind
user_input.requested✅Entrada de usuario
requestId, , question, choices?
user_input.completed✅Entrada de usuariorequestId
elicitation.requested✅Entrada de usuario
requestId, , message, requestedSchema
elicitation.completed✅Entrada de usuariorequestId
subagent.started
Subagente
toolCallId, agentName, , agentDisplayName, model?
subagent.completed
Subagente
toolCallId, agentName, agentDisplayName, model?, durationMs?, , totalTokens?``totalToolCalls?
subagent.failed
Subagente
toolCallId, agentName, error, model?, durationMs?, , totalTokens?``totalToolCalls?
subagent.selected
Subagente
agentName, , agentDisplayName, tools
subagent.deselected
Subagente
(vacío)
skill.invoked
Habilidad
name, path, , content, allowedTools?
abort
Supervisiónreason
user.message
Usuario
content, , attachments?, agentMode?
system.message
System
content, role
external_tool.requested
Herramienta externa
requestId, , toolName, arguments?
external_tool.completed
Herramienta externarequestId
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✅Modo de plan
requestId, summary, , planContent, actions
exit_plan_mode.completed✅Modo de planrequestId