Eventos de streaming
Si habilitasstreaming: true en SessionConfig, todo lo que ocurre durante la sesión se transmite como eventos.
Esta página es una versión en español, más legible para Laravel, del streaming-events.md oficial.
La página SessionEvent explica la propia clase SessionEvent extendida para Laravel.
Esta página es la referencia de «qué tipo de evento entrega qué datos».
Resumen
Todo el procesamiento del agente Copilot (inferencia, generación de mensajes, ejecución de herramientas, confirmaciones de permiso, etc.) se emite como eventos de sesión.- Evento ephemeral: solo se entrega en tiempo real. No se persiste en el log de la sesión (no se reproduce al reanudar).
- Evento persisted: se guarda en el log de la sesión (se reproduce al reanudar).
- Evento delta: evento incremental que llega por fragmentos (
deltaContent, etc.). Se concatena para obtener el texto completo. - Cadena
parentId: cada evento referencia al ID del evento inmediatamente anterior.
Envoltura de evento (campos comunes)
Todos los eventos tienen la siguiente estructura común:| Campo | Tipo | Descripción |
|---|---|---|
id | string | ID único del evento (UUID v4) |
timestamp | string | Hora de creación (ISO 8601) |
parentId | string | null | ID del evento anterior (null para el primero) |
ephemeral | boolean? | true si es un evento temporal |
type | string | Tipo de evento |
data | object | Payload específico del evento |
Ejemplo de suscripción en Laravel
Principales categorías de evento
Assistant events
assistant.turn_start
Inicio del turn.
turnId(obligatorio)interactionId(opcional)
assistant.intent (ephemeral)
Intención de ejecución actual (por ejemplo, Exploring codebase).
intent(obligatorio)
assistant.reasoning
Bloque de razonamiento completo.
reasoningId(obligatorio)content(obligatorio)
assistant.reasoning_delta (ephemeral)
Delta de texto de razonamiento.
reasoningId(obligatorio)deltaContent(obligatorio)
assistant.message
Mensaje del assistant ya completo.
Campos principales:
messageId(obligatorio)content(obligatorio)toolRequests(opcional)reasoningOpaque/reasoningText/encryptedContent(opcional)phase/outputTokens/interactionId(opcional)parentToolCallId(opcional, cuando proviene de un subagente)
assistant.message_delta (ephemeral)
Delta del cuerpo del mensaje.
messageId(obligatorio)deltaContent(obligatorio)parentToolCallId(opcional)
assistant.turn_end
Fin del turn.
turnId(obligatorio)
assistant.usage (ephemeral)
Información de uso por llamada a API.
Campos principales:
model(obligatorio)inputTokens/outputTokens/cost/duration(opcional)apiCallId/providerCallId(opcional)quotaSnapshots/copilotUsage(opcional)
assistant.streaming_delta (ephemeral)
Progreso de recepción a bajo nivel.
totalResponseSizeBytes(obligatorio)
Tool execution events
tool.execution_start
Inicio de ejecución de herramienta.
toolCallId(obligatorio)toolName(obligatorio)arguments/mcpServerName/mcpToolName/parentToolCallId(opcional)
tool.execution_partial_result (ephemeral)
Salida parcial mientras se ejecuta la herramienta.
toolCallId(obligatorio)partialOutput(obligatorio)
tool.execution_progress (ephemeral)
Mensaje de progreso.
toolCallId(obligatorio)progressMessage(obligatorio)
tool.execution_complete
Ejecución de herramienta completada (éxito/fallo).
toolCallId(obligatorio)success(obligatorio)result(en caso de éxito)error(en caso de fallo)toolTelemetry/parentToolCallId(opcional)
tool.user_requested
Invocación de herramienta a petición explícita del usuario.
toolCallId(obligatorio)toolName(obligatorio)arguments(opcional)
Session lifecycle events
session.start
Inicio de la sesión. En Cloud Sessions, es más seguro enviar el primer prompt después de que producer confirme el session.start del copilot-agent.
producer(opcional)
session.idle (ephemeral)
El procesamiento actual ha terminado y se espera la siguiente entrada.
backgroundTasks(opcional)
session.error
Error durante el procesamiento de la sesión.
errorType(obligatorio)message(obligatorio)stack/statusCode/providerCallId(opcional)
session.compaction_start
Inicio de la compactación de contexto (data es un objeto vacío).
session.compaction_complete
Fin de la compactación de contexto.
Campos principales:
success(obligatorio)error(opcional)preCompactionTokens/postCompactionTokens(opcional)summaryContent/checkpointPath(opcional)
session.title_changed (ephemeral)
Actualización automática del título.
title(obligatorio)
session.context_changed
Cambio del contexto de trabajo.
cwd(obligatorio)gitRoot/repository/branch(opcional)
session.info
Información de la sesión como URL remota.
infoType(obligatorio)url(opcional, por ejemplo cuandoinfoTypeesremote)
session.remote_steerable_changed
Evento que indica cambios en la disponibilidad de operación remota desde Mission Control.
remoteSteerable(opcional)
session.usage_info (ephemeral)
Estado de uso de la ventana de contexto.
tokenLimit(obligatorio)currentTokens(obligatorio)messagesLength(obligatorio)
session.task_complete
Notificación de tarea completada.
summary(opcional)
session.shutdown
Cierre de la sesión.
Campos principales:
shutdownType(obligatorio)errorReason(opcional)totalPremiumRequests/totalApiDurationMs(obligatorios)codeChanges/modelMetrics(obligatorios)
Permission / user input events
permission.requested (ephemeral)
Solicitud de confirmación de permiso.
requestId(obligatorio)permissionRequest(obligatorio)
permissionRequest.kind:
shellwritereadmcpurlmemorycustom-tool
permission.completed (ephemeral)
Resolución de la confirmación de permiso.
requestId(obligatorio)result.kind(obligatorio)
user_input.requested (ephemeral)
Pregunta al usuario.
requestId(obligatorio)question(obligatorio)choices/allowFreeform(opcional)
user_input.completed (ephemeral)
Entrada del usuario completada.
requestId(obligatorio)
elicitation.requested (ephemeral)
Solicitud de entrada estructurada (formulario).
requestId(obligatorio)message(obligatorio)requestedSchema(obligatorio)
elicitation.completed (ephemeral)
Entrada estructurada completada.
requestId(obligatorio)
Sub-agent / skill events
subagent.started
toolCallId(obligatorio)agentName/agentDisplayName/agentDescription(obligatorios)
subagent.completed
toolCallId(obligatorio)agentName/agentDisplayName(obligatorios)
subagent.failed
toolCallId(obligatorio)agentName/agentDisplayName(obligatorios)error(obligatorio)
subagent.selected
agentName(obligatorio)agentDisplayName(obligatorio)tools(obligatorio, admitenull)
subagent.deselected
Vuelta al agente por defecto (data es un objeto vacío).
skill.invoked
name/path/content(obligatorios)allowedTools/pluginName/pluginVersion(opcional)
Otros eventos
abort
reason(obligatorio)
user.message
content(obligatorio)transformedContent/attachments/source/agentMode/interactionId(opcional)
system.message
content(obligatorio)role(obligatorio)name/metadata(opcional)
external_tool.requested (ephemeral)
requestId/sessionId/toolCallId/toolName(obligatorios)arguments(opcional)
external_tool.completed (ephemeral)
requestId(obligatorio)
exit_plan_mode.requested (ephemeral)
requestId/summary/planContent/actions/recommendedAction(obligatorios)
exit_plan_mode.completed (ephemeral)
requestId(obligatorio)
command.queued (ephemeral)
requestId(obligatorio)command(obligatorio)
command.completed (ephemeral)
requestId(obligatorio)
Orden de eventos habitual
Lista completa de eventos (referencia rápida)
| Tipo de evento | Ephemeral | Categoría |
|---|---|---|
session.start | Session | |
assistant.turn_start | Assistant | |
assistant.intent | ✅ | Assistant |
assistant.reasoning | Assistant | |
assistant.reasoning_delta | ✅ | Assistant |
assistant.streaming_delta | ✅ | Assistant |
assistant.message | Assistant | |
assistant.message_delta | ✅ | Assistant |
assistant.turn_end | Assistant | |
assistant.usage | ✅ | Assistant |
tool.user_requested | Tool | |
tool.execution_start | Tool | |
tool.execution_partial_result | ✅ | Tool |
tool.execution_progress | ✅ | Tool |
tool.execution_complete | Tool | |
session.idle | ✅ | Session |
session.error | Session | |
session.compaction_start | Session | |
session.compaction_complete | Session | |
session.title_changed | ✅ | Session |
session.context_changed | Session | |
session.info | Session | |
session.remote_steerable_changed | Session | |
session.usage_info | ✅ | Session |
session.task_complete | Session | |
session.shutdown | Session | |
permission.requested | ✅ | Permission |
permission.completed | ✅ | Permission |
user_input.requested | ✅ | User Input |
user_input.completed | ✅ | User Input |
elicitation.requested | ✅ | User Input |
elicitation.completed | ✅ | User Input |
subagent.started | Sub-Agent | |
subagent.completed | Sub-Agent | |
subagent.failed | Sub-Agent | |
subagent.selected | Sub-Agent | |
subagent.deselected | Sub-Agent | |
skill.invoked | Skill | |
abort | Control | |
user.message | User | |
system.message | System | |
external_tool.requested | ✅ | External Tool |
external_tool.completed | ✅ | External Tool |
command.queued | ✅ | Command |
command.completed | ✅ | Command |
exit_plan_mode.requested | ✅ | Plan Mode |
exit_plan_mode.completed | ✅ | Plan Mode |
Documentación relacionada
- Referencia oficial de Streaming Events
- Explicación de la clase de evento en la versión Laravel: SessionEvent
- Patrones de implementación de streaming: Streaming