Passer au contenu principal

SessionEvent

Tous les messages provenant de Copilot sont des instances de Revolution\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.
$response = Copilot::run('1 + 1');
echo $response->content(); // '2'
// content() peut être null
Une conversion implicite via __toString() renvoie également le contenu du message.
echo (string) $response; // '2'
// Ce cas n'est pas null

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.
use Revolution\Copilot\Enums\SessionEventType;

if ($response->is(SessionEventType::HOOK_START)) {
    // Traitement d'événement de démarrage d'un hook
}
type() renvoie la valeur chaîne de l’enum SessionEventType.
echo $response->type(); // 'assistant.message'

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 :
$content = $response->throw()->content();
Si le type d’événement est 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.
$response->when($response->isAssistantMessage(), function (SessionEvent $event) {
    // Traitement pour un message d'assistant
});

Dumpable

dump() et dd() sont disponibles.
$response->dump();

Tappable

tap() est disponible.
return $response->tap(function (SessionEvent $event) {
    // Effectuer un traitement
    info($event->content());
});

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.
return $this->data('content', $default);

// Avec une valeur par défaut, content() n'est pas null
echo $response->content('');

toArray() / toJson()

Vous pouvez convertir l’ensemble du SessionEvent en tableau ou en JSON.
$array = $response->toArray();
$json = $response->toJson();
Il n’existe pas de méthode 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.
$collect = collect($response->toArray());

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.
use Illuminate\Broadcasting\Channel;

$event->broadcast(new Channel('channel-name'));
broadcastNow() diffuse immédiatement sans passer par la file d’attente.
$event->broadcastNow(new Channel('channel-name'));
Exemple en streaming :
use Illuminate\Broadcasting\Channel;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\SessionEvent;

Copilot::start(function (CopilotSession $session) {
    $session->on(function (SessionEvent $event): void {
        if ($event->isAssistantMessageDelta()) {
            $event->broadcastNow(new Channel('copilot'));
        }
    });

    $session->sendAndWait(prompt: 'Tell me something about Laravel.');
}, config: new SessionConfig(streaming: true));
Pour les dernières informations, consultez le dépôt GitHub.
Dernière modification le 13 juillet 2026