Vai al contenuto principale

SessionEvent

Tutti i messaggi provenienti da Copilot sono istanze di Revolution\Copilot\Types\SessionEvent. Poiché questa classe è la più utilizzata, sono state aggiunte funzionalità comode in stile Laravel.

content()

Recupera il messaggio di risposta più importante dell’AI.
$response = Copilot::run('1 + 1');
echo $response->content(); // '2'
// content() può essere null
Anche la conversione implicita tramite __toString() restituisce il contenuto del messaggio.
echo (string) $response; // '2'
// In questo caso non è null

Verifica del tipo di evento

Sono disponibili isAssistantMessage(), isUserMessage(), isIdle(), isAssistantMessageDelta(). Per i tipi di evento più usati potrebbero essere aggiunti ulteriori helper. Con is() puoi verificare qualsiasi EventType.
use Revolution\Copilot\Enums\SessionEventType;

if ($response->is(SessionEventType::HOOK_START)) {
    // Gestisci l'evento di avvio hook
}
type() restituisce il valore stringa dell’enum SessionEventType.
echo $response->type(); // 'assistant.message'

failed() / successful()

failed() è true quando il tipo di evento è SESSION_ERROR. successful() è l’opposto. Per allinearsi alle convenzioni di naming di Laravel, è stato rinominato da isError().

throw()

Come nelle API HTTP e Process di Laravel, gli errori sono conservati e puoi sollevarli come eccezione con throw(). Se non ci sono errori non fa nulla, quindi puoi scrivere così.
$content = $response->throw()->content();
Se il tipo di evento è SESSION_ERROR, viene sollevata Revolution\Copilot\Exceptions\SessionErrorException. In caso di timeout viene sollevata Revolution\Copilot\Exceptions\SessionTimeoutException. Per errori JSON-RPC viene sollevata Revolution\Copilot\Exceptions\JsonRpcException.

Conditionable

Sono disponibili when() e unless().
$response->when($response->isAssistantMessage(), function (SessionEvent $event) {
    // Gestisci l'evento assistant message
});

Dumpable

Sono disponibili dump() e dd().
$response->dump();

Tappable

È disponibile tap().
return $response->tap(function (SessionEvent $event) {
    // Qualche elaborazione
    info($event->content());
});

InteractsWithData

Questa funzionalità si applica solo alla proprietà $data di SessionEvent. Puoi usare helper familiari come all(), has(), only(), collect(). Per i dettagli consulta InteractsWithData. Poiché $data di SessionEvent ha struttura diversa per EventType, è comodo per l’accesso ai valori dei singoli eventi. Anche content() usa internamente InteractsWithData.
return $this->data('content', $default);

// Specificando un default, content() non è null
echo $response->content('');

toArray() / toJson()

Puoi convertire l’intero SessionEvent in array o JSON.
$array = $response->toArray();
$json = $response->toJson();
Non esiste un metodo collect() per l’intero evento. Il motivo è che $data dispone del collect() di InteractsWithData. Se vuoi operare sull’intero evento come collezione, usa l’helper collect() di Laravel.
$collect = collect($response->toArray());

broadcast() / broadcastNow()

Puoi effettuare il broadcast con la stessa interfaccia di StreamEvent di Laravel AI SDK. Nell’AI SDK si usa durante lo streaming, mentre in SessionEvent è utilizzabile per qualsiasi EventType.
use Illuminate\Broadcasting\Channel;

$event->broadcast(new Channel('channel-name'));
broadcastNow() effettua il broadcast immediato senza passare per la coda.
$event->broadcastNow(new Channel('channel-name'));
Esempio d’uso in 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));
Per le informazioni più recenti fai riferimento al repository GitHub.
Ultima modifica il 13 luglio 2026