Skip to main content

SessionEvent

Todos los mensajes que llegan desde Copilot son de la clase Revolution\Copilot\Types\SessionEvent. Como es la clase que más se usa, incluye funcionalidades cómodas al estilo Laravel.

content()

Obtiene el mensaje de respuesta más importante de la IA.
Con la conversión implícita a string mediante __toString() también se devuelve el contenido del mensaje.

Detección del event type

Puedes usar isAssistantMessage(), isUserMessage(), isIdle(), isAssistantMessageDelta(). Si hay algún event type que se usa mucho, puede que se añadan más helpers. Con is() puedes comprobar cualquier EventType.
type() devuelve el valor string del enum SessionEventType.

failed() / successful()

Cuando el tipo de evento es SESSION_ERROR, failed() devuelve true. successful() es lo contrario. Para adecuarse al estilo de nombres de Laravel, se renombró desde isError().

throw()

Igual que en las APIs HTTP y Process de Laravel, el error se conserva y puedes lanzarlo como excepción con throw(). Si no hay error, no hace nada, así que puedes escribir:
Cuando el tipo de evento es SESSION_ERROR, se lanza Revolution\Copilot\Exceptions\SessionErrorException. En caso de timeout, se lanza Revolution\Copilot\Exceptions\SessionTimeoutException. Ante un error JSON-RPC, se lanza Revolution\Copilot\Exceptions\JsonRpcException.

Conditionable

Puedes usar when() y unless().

Dumpable

Puedes usar dump() y dd().

Tappable

Puedes usar tap().

InteractsWithData

Esta función solo se aplica a la propiedad $data de SessionEvent. Puedes usar helpers habituales como all(), has(), only(), collect(). Para más detalles, consulta InteractsWithData. Como la estructura de $data de SessionEvent varía según el EventType, es útil para acceder a los valores según el evento. content() también usa InteractsWithData internamente.

toArray() / toJson()

Puedes convertir todo el SessionEvent en array o JSON.
No hay un método collect() para el evento completo. Se debe a que $data tiene el collect() de InteractsWithData. Si quieres operar sobre todo el evento como colección, usa el helper collect() de Laravel.

broadcast() / broadcastNow()

Puedes emitir con la misma interfaz que StreamEvent de Laravel AI SDK. En AI SDK se usa durante el streaming, pero en SessionEvent puedes usarlo con cualquier EventType.
broadcastNow() emite inmediatamente, sin pasar por la cola.
Ejemplo de uso durante el streaming:

Metadatos de eventos

A partir de Copilot CLI 1.0.99, algunos eventos incluyen metadatos adicionales. El SDK conserva estos valores tal cual en $data, por lo que puedes acceder a ellos con $event->data o con los helpers de InteractsWithData.

Eventos de compactación

data.compactionAttemptId en session.compaction_start y session.compaction_complete es un ID que relaciona el evento de inicio con el de finalización. Si la compactación implica un cambio de modelo, también se incluye switchTargetModel. Si el modelo de destino tiene un presupuesto de tokens de prompt diferente, también se incluye targetPromptTokenLimit. El evento de finalización puede incluir initialModel, model, outcome, outcomeReason, failureReason, tokenAccountingBasis, entre otros. outcome y los campos de motivo son cadenas a las que se pueden añadir nuevos valores en el futuro. No los trates como un Enum fijo y conserva los valores desconocidos tal cual. Si falta un campo, significa que no se proporcionó el valor. No deduzcas un valor predeterminado.

Uso de la ejecución de herramientas

data.toolUsage en tool.execution_complete es el uso informado por el proveedor para las operaciones de herramientas que pertenecen al runtime. Es independiente de assistant.usage del modelo de conversación. Puede incluir el uso ya informado incluso si la ejecución de la herramienta falla. toolUsage.model es el modelo solicitado por la operación de la herramienta, no el modelo de conversación. Los recuentos de tokens y la información de facturación pueden proporcionarse solo parcialmente. Si falta un campo, significa que no está disponible, no que haya 0 tokens.
Los recuentos de tokens por modalidad de inputTokensDetails y outputTokensDetails son desgloses incluidos en sus respectivos totales. No los sumes a los totales. toolUsage.requestId es un ID que el runtime usa para descartar entregas duplicadas y reproducciones. No es un identificador de facturación upstream. data.toolUsageRequestIds en session.usage_checkpoint y session.shutdown también son metadatos internos del runtime para deduplicación, que identifican las operaciones de herramientas incluidas en la instantánea contable. No los trates como IDs de facturación upstream.

Eventos de resolución de Fusion

data.selectedRuleId en session.fusion_resolved identifica la regla del servidor cuando el enrutamiento del lado del servidor elige un flujo de trabajo distinto al de la regla local. Se omite cuando no hay reemplazo.

Eventos de carga de herramientas del servidor MCP

SessionEventType::SESSION_MCP_SERVER_TOOLS_LOADED (session.mcp_server_tools_loaded) se emite cuando la lista de herramientas de un servidor MCP está disponible. Es un evento efímero que se emite una sola vez por conexión y no se persiste. Incluye data.serverName y data.toolCount. Que un servidor MCP pase a connected no significa que la carga de sus herramientas haya terminado. Después de que salga del estado conectado, trátalo como en carga hasta que vuelvas a recibir este evento. Si se usan herramientas en caché, este evento puede llegar antes que connected.
Consulta la información más reciente en el repositorio de GitHub.
Última modificación el 19 de octubre de 2026