Zum Hauptinhalt springen

SessionEvent

Alle Nachrichten von Copilot sind Instanzen der Klasse Revolution\Copilot\Types\SessionEvent. Da sie am häufigsten verwendet wird, wurden Laravel-typische Komfortfunktionen ergänzt.

content()

Ruft die wichtigste Antwortnachricht der KI ab.
$response = Copilot::run('1 + 1');
echo $response->content(); // '2'
// content() kann null sein
Auch die implizite Typumwandlung via __toString() liefert den Nachrichteninhalt zurück.
echo (string) $response; // '2'
// Dieser Weg liefert kein null

Event-Typ prüfen

isAssistantMessage(), isUserMessage(), isIdle(), isAssistantMessageDelta() stehen zur Verfügung. Für häufig genutzte Event-Typen können weitere Helper hinzugefügt werden. Mit is() können Sie einen beliebigen EventType prüfen.
use Revolution\Copilot\Enums\SessionEventType;

if ($response->is(SessionEventType::HOOK_START)) {
    // Verarbeitung beim Hook-Start-Event
}
type() gibt den String-Wert des Enums SessionEventType zurück.
echo $response->type(); // 'assistant.message'

failed() / successful()

Wenn der Event-Typ SESSION_ERROR ist, wird failed() zu true. successful() ist die Negation. Zur Ausrichtung an Laravel-Konventionen wurde die Methode von isError() umbenannt.

throw()

Wie bei Laravels HTTP- und Process-API wird der Fehler beibehalten und kann via throw() als Exception geworfen werden. Da bei fehlerfreiem Zustand nichts passiert, lässt sich schreiben:
$content = $response->throw()->content();
Bei Event-Typ SESSION_ERROR wird Revolution\Copilot\Exceptions\SessionErrorException geworfen. Bei Timeout wird Revolution\Copilot\Exceptions\SessionTimeoutException geworfen. Bei JSON-RPC-Fehlern wird Revolution\Copilot\Exceptions\JsonRpcException geworfen.

Conditionable

when() und unless() sind verfügbar.
$response->when($response->isAssistantMessage(), function (SessionEvent $event) {
    // Verarbeitung bei einer Assistenten-Nachricht
});

Dumpable

dump() und dd() sind verfügbar.
$response->dump();

Tappable

tap() ist verfügbar.
return $response->tap(function (SessionEvent $event) {
    // Irgendeine Verarbeitung
    info($event->content());
});

InteractsWithData

Diese Funktion bezieht sich ausschließlich auf die Eigenschaft $data von SessionEvent. Sie können vertraute Helper wie all(), has(), only(), collect() verwenden. Details siehe InteractsWithData. Da die Struktur von $data je nach EventType unterschiedlich ist, ist dies für den ereignisspezifischen Zugriff auf Werte hilfreich. Auch content() verwendet intern InteractsWithData.
return $this->data('content', $default);

// Wenn Sie einen Default angeben, wird content() nicht null
echo $response->content('');

toArray() / toJson()

Sie können den gesamten SessionEvent in ein Array oder JSON umwandeln.
$array = $response->toArray();
$json = $response->toJson();
Eine collect()-Methode für das gesamte Event existiert nicht. Grund: $data hat bereits collect() aus InteractsWithData. Wenn Sie das gesamte Event mit Collection-Operationen bearbeiten möchten, nutzen Sie den Laravel-Helper collect().
$collect = collect($response->toArray());

broadcast() / broadcastNow()

Sie können mit derselben Schnittstelle wie beim StreamEvent des Laravel AI SDK broadcasten. Beim AI SDK wird es beim Streaming verwendet, beim SessionEvent aber für beliebige EventTypes.
use Illuminate\Broadcasting\Channel;

$event->broadcast(new Channel('channel-name'));
broadcastNow() broadcastet sofort, ohne den Weg über die Queue.
$event->broadcastNow(new Channel('channel-name'));
Anwendungsbeispiel beim 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));
Aktuelle Informationen finden Sie im GitHub-Repository.
Zuletzt geändert am 13. Juli 2026