> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# SessionEvent

> 以 Laravel 風格的輔助方法、型別判斷與廣播來處理 Laravel Copilot SDK 的 SessionEvent。

## SessionEvent

來自 Copilot 的訊息全部都是 `Revolution\Copilot\Types\SessionEvent` 類別。
由於這個類別最常被使用,因此加入了 Laravel 風格的便利功能。

## `content()`

取得 AI 最重要的回應訊息。

```php theme={null}
$response = Copilot::run('1 + 1');
echo $response->content(); // '2'
// content() 可能為 null
```

透過 `__toString()` 的隱式型別轉換也會回傳訊息內容。

```php theme={null}
echo (string) $response; // '2'
// 這裡不會為 null
```

## Event type 判斷

可使用 `isAssistantMessage()`、`isUserMessage()`、`isIdle()`、`isAssistantMessageDelta()`。
若有常用的 Event type,可能會再新增輔助方法。

可用 `is()` 判斷任意 `EventType`。

```php theme={null}
use Revolution\Copilot\Enums\SessionEventType;

if ($response->is(SessionEventType::HOOK_START)) {
    // Hook 開始事件時的處理
}
```

`type()` 會回傳 `SessionEventType` enum 的字串值。

```php theme={null}
echo $response->type(); // 'assistant.message'
```

## `failed()` / `successful()`

當事件類型為 `SESSION_ERROR` 時,`failed()` 為 true。
`successful()` 則相反。

為配合 Laravel 的命名慣例,由 `isError()` 改名而來。

## `throw()`

與 Laravel 的 HTTP API 或 Process API 一樣,錯誤會被保留,可透過 `throw()` 拋出例外。
沒有錯誤時不會做任何事,因此可以這樣寫。

```php theme={null}
$content = $response->throw()->content();
```

事件類型為 `SESSION_ERROR` 時會拋出 `Revolution\Copilot\Exceptions\SessionErrorException`。
逾時會拋出 `Revolution\Copilot\Exceptions\SessionTimeoutException`。

JSON-RPC 錯誤會拋出 `Revolution\Copilot\Exceptions\JsonRpcException`。

## Conditionable

可使用 `when()` 與 `unless()`。

```php theme={null}
$response->when($response->isAssistantMessage(), function (SessionEvent $event) {
    // Assistant message 時的處理
});
```

## Dumpable

可使用 `dump()` 與 `dd()`。

```php theme={null}
$response->dump();
```

## Tappable

可使用 `tap()`。

```php theme={null}
return $response->tap(function (SessionEvent $event) {
    // 進行某些處理
    info($event->content());
});
```

## InteractsWithData

此功能僅適用於 SessionEvent 的 `$data` 屬性。

可使用熟悉的輔助方法,例如 `all()`、`has()`、`only()`、`collect()`。
詳細請參閱 [InteractsWithData](/zh-TW/advanced/interacts-with-data)。

SessionEvent 的 `$data` 會依 `EventType` 有不同結構,方便針對各事件存取其值。

`content()` 內部也是使用 InteractsWithData。

```php theme={null}
return $this->data('content', $default);

// 指定 default 時 content() 就不會為 null
echo $response->content('');
```

## `toArray()` / `toJson()`

可將整個 SessionEvent 轉為陣列或 JSON。

```php theme={null}
$array = $response->toArray();
$json = $response->toJson();
```

沒有針對整個事件的 `collect()` 方法。
因為 `$data` 已經有 InteractsWithData 的 `collect()`。
若要對整個事件進行 collection 操作,請使用 Laravel 的 `collect()` 輔助函式。

```php theme={null}
$collect = collect($response->toArray());
```

## `broadcast()` / `broadcastNow()`

可以與 Laravel AI SDK 的 `StreamEvent` 相同介面進行廣播。
AI SDK 中用於 streaming,但在 SessionEvent 中可用於任意 `EventType`。

```php theme={null}
use Illuminate\Broadcasting\Channel;

$event->broadcast(new Channel('channel-name'));
```

`broadcastNow()` 不經由 queue,而是立即廣播。

```php theme={null}
$event->broadcastNow(new Channel('channel-name'));
```

Streaming 時的使用範例:

```php theme={null}
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));
```

<Info>
  最新資訊請參閱 [GitHub 儲存庫](https://github.com/invokable/laravel-copilot-sdk)。
</Info>


## Related topics

- [Session 生命週期事件](/zh-TW/packages/laravel-copilot-sdk/session-lifecycle-event.md)
- [Streaming Events](/zh-TW/packages/laravel-copilot-sdk/streaming-events.md)
- [自訂 Agent](/zh-TW/packages/laravel-copilot-sdk/custom-agents.md)
- [開始使用 - GitHub Copilot SDK for Laravel](/zh-TW/packages/laravel-copilot-sdk/getting-started.md)
- [Concurrency](/zh-TW/packages/laravel-copilot-sdk/concurrency.md)
