SessionEvent
Tous les messages provenant de Copilot sont des instances deRevolution\Copilot\Types\SessionEvent.
Comme cette classe est très utilisée, des commodités à la Laravel lui ont été ajoutées.
content()
Récupère le message de réponse le plus important renvoyé par l’IA.
__toString() renvoie également le contenu du message.
Test du type d’événement
isAssistantMessage(), isUserMessage(), isIdle(), isAssistantMessageDelta() sont disponibles.
Pour les types d’événements couramment utilisés, d’autres helpers peuvent être ajoutés.
is() permet de tester un EventType arbitraire.
type() renvoie la valeur chaîne de l’enum SessionEventType.
failed() / successful()
Si le type d’événement est SESSION_ERROR, failed() renvoie true.
successful() est l’inverse.
Pour s’aligner sur la nomenclature Laravel, isError() a été renommé.
throw()
Comme pour les APIs HTTP et Process de Laravel, l’erreur est conservée et peut être relancée via throw().
Si aucune erreur, la méthode ne fait rien ; vous pouvez donc écrire :
SESSION_ERROR, Revolution\Copilot\Exceptions\SessionErrorException est levée.
En cas de timeout, Revolution\Copilot\Exceptions\SessionTimeoutException est levée.
Pour les erreurs JSON-RPC, Revolution\Copilot\Exceptions\JsonRpcException est levée.
Conditionable
when() et unless() sont disponibles.
Dumpable
dump() et dd() sont disponibles.
Tappable
tap() est disponible.
InteractsWithData
Cette fonctionnalité ne s’applique qu’à la propriété$data de SessionEvent.
Vous disposez d’helpers familiers : all(), has(), only(), collect(), etc.
Pour plus de détails, voir InteractsWithData.
Comme la structure de $data diffère selon l’EventType, ces accès sont pratiques.
content() s’appuie également sur InteractsWithData en interne.
toArray() / toJson()
Vous pouvez convertir l’ensemble du SessionEvent en tableau ou en JSON.
collect() sur l’événement entier.
En effet, $data possède déjà collect() via InteractsWithData.
Pour manipuler l’événement en tant que collection, utilisez le helper collect() de Laravel.
broadcast() / broadcastNow()
La diffusion utilise la même interface que StreamEvent de Laravel AI SDK.
Là où l’AI SDK l’utilise en streaming, ici vous pouvez l’utiliser pour n’importe quel EventType.
broadcastNow() diffuse immédiatement sans passer par la file d’attente.
Métadonnées des événements
À partir de Copilot CLI 1.0.99, certains événements incluent des métadonnées supplémentaires. Le SDK conserve ces valeurs telles quelles dans$data, vous pouvez donc y accéder via $event->data ou les helpers InteractsWithData.
Événements de compaction
data.compactionAttemptId dans session.compaction_start et session.compaction_complete est un ID qui associe l’événement de début à l’événement de fin.
Si la compaction implique un changement de modèle, switchTargetModel est également inclus.
Si le modèle cible dispose d’un budget de tokens de prompt différent, targetPromptTokenLimit est également inclus.
L’événement de fin peut inclure initialModel, model, outcome, outcomeReason, failureReason, tokenAccountingBasis, etc.
outcome et les champs de raison sont des chaînes auxquelles de nouvelles valeurs pourront être ajoutées à l’avenir.
Ne les traitez pas comme un Enum figé et conservez les valeurs inconnues telles quelles.
L’absence d’un champ signifie que la valeur n’a pas été fournie. Ne supposez pas de valeur par défaut.
Utilisation lors de l’exécution des outils
data.toolUsage dans tool.execution_complete correspond à l’utilisation signalée par le fournisseur pour les opérations d’outils détenues par le runtime.
Elle est distincte de assistant.usage du modèle de conversation.
Elle peut contenir l’utilisation déjà signalée même si l’exécution de l’outil a échoué.
toolUsage.model est le modèle demandé par l’opération d’outil, et non le modèle de conversation.
Le nombre de tokens et les informations de facturation peuvent n’être fournis que partiellement.
L’absence d’un champ signifie que la donnée n’est pas disponible, et non 0 token.
inputTokensDetails et outputTokensDetails sont des ventilations incluses dans leurs totaux respectifs. Ne les ajoutez pas aux totaux.
toolUsage.requestId est un ID que le runtime utilise pour éliminer les livraisons en double et les rejeux. Ce n’est pas un identifiant de facturation en amont.
data.toolUsageRequestIds dans session.usage_checkpoint et session.shutdown sont également des métadonnées de déduplication internes au runtime, qui identifient les opérations d’outils incluses dans l’instantané comptable.
Ne les traitez pas comme des ID de facturation en amont.
Événements de résolution Fusion
data.selectedRuleId dans session.fusion_resolved identifie la règle serveur lorsque le routage côté serveur a choisi un workflow différent de celui de la règle locale.
Il est omis en l’absence de remplacement.
Événements de chargement des outils d’un serveur MCP
SessionEventType::SESSION_MCP_SERVER_TOOLS_LOADED (session.mcp_server_tools_loaded) est émis lorsque la liste des outils d’un serveur MCP devient disponible.
C’est un événement éphémère émis une seule fois par connexion et non persisté.
Il contient data.serverName et data.toolCount.
Le passage d’un serveur MCP à l’état connected ne signifie pas que le chargement de ses outils est terminé.
Après qu’il a quitté l’état connecté, considérez-le comme en cours de chargement jusqu’à ce que vous receviez à nouveau cet événement.
Lorsque des outils en cache sont utilisés, cet événement peut arriver avant connected.
Pour les dernières informations, consultez le dépôt GitHub.