> ## 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 Copilot SDK의 SessionEvent를 Laravel다운 헬퍼, 타입 판정, 브로드캐스트로 다룹니다.

## 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)) {
    // 훅 시작 이벤트 시의 처리
}
```

`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) {
    // 어시스턴트 메시지 시의 처리
});
```

## 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](/ko/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()`가 있기 때문입니다.
이벤트 전체를 컬렉션 조작하려면 Laravel의 `collect()` 헬퍼를 사용합니다.

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

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

Laravel AI SDK의 `StreamEvent`와 같은 인터페이스로 브로드캐스트할 수 있습니다.
AI SDK에서는 스트리밍 시에 사용되지만, SessionEvent에서는 임의의 `EventType`에서 사용할 수 있습니다.

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

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

`broadcastNow()`는 큐를 거치지 않고 즉시 브로드캐스트합니다.

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

스트리밍 시의 이용 예:

```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

- [세션 라이프사이클 이벤트](/ko/packages/laravel-copilot-sdk/session-lifecycle-event.md)
- [스트리밍 이벤트](/ko/packages/laravel-copilot-sdk/streaming-events.md)
- [커스텀 에이전트](/ko/packages/laravel-copilot-sdk/custom-agents.md)
- [시작하기 - GitHub Copilot SDK for Laravel](/ko/packages/laravel-copilot-sdk/getting-started.md)
- [Concurrency](/ko/packages/laravel-copilot-sdk/concurrency.md)
