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

# send()와 on()

> Laravel Copilot SDK의 send() / sendAndWait()와 on()을 조합해서 중간 이벤트와 최종 응답을 다루는 방법을 설명합니다.

## Session `send()`와 `on()`

`sendAndWait()`은 응답이 바로 돌아와서 알기 쉽지만 **마지막 어시스턴트 메시지**만 받을 수 있습니다.

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;

Copilot::start(function (CopilotSession $session) {
    $response = $session->sendAndWait(prompt: 'Tell me something about Laravel.');
    dump($response->content());
});
```

도중의 메시지도 받고 싶은 경우에는 `on()`으로 이벤트 리스너를 등록합니다.

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionEvent;

Copilot::start(function (CopilotSession $session) {
    $session->on(function (SessionEvent $event): void {
        if ($event->isAssistantMessage()) {
            dump($event->content());
        } else {
            dump($event);
        }
    });

    $message_id = $session->send(prompt: 'Tell me something about Laravel.');

    // 루프로 메시지 수신을 대기
    $session->wait(timeout: 60.0);
});
```

PHP에서는 이것이 이해하기 어려우므로 `on()`과 `sendAndWait()`의 조합을 추천합니다.

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionEvent;

Copilot::start(function (CopilotSession $session) {
    $session->on(function (SessionEvent $event): void {
        if ($event->isAssistantMessage()) {
            dump($event->content());
        } else {
            dump($event);
        }
    });

    $response = $session->sendAndWait(prompt: 'Tell me something about Laravel.');

    // 루프로 대기하는 부분은 sendAndWait() 내에서 처리되므로 이 시점에서 마지막 메시지까지 도착해 있음.
    // 도중의 메시지는 위의 on()에서 받고 있음.

    // sendAndWait로부터의 마지막 메시지는 불필요.
    // dump($response->content());
});
```

## `on()`으로 특정 이벤트 타입 지정

`SessionEventType` enum이나 문자열로 이벤트 타입을 지정하면 해당 이벤트만 구독할 수 있습니다.

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

$session->on(SessionEventType::ASSISTANT_MESSAGE, function (SessionEvent $event): void {
    dump($event->content());
});

$session->on('assistant.message', function (SessionEvent $event): void {
    dump($event->content());
});
```

## 모든 이벤트 타입 구독

이벤트 타입을 지정하지 않으면 모두 구독합니다.

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

$session->on(function (SessionEvent $event): void {
});

// 명명된 인자로 지정할 수도 있음
$session->on(handler: function (SessionEvent $event): void {
});

// null을 허용하는 동적인 타입 지정도 가능.
$type = null;
$session->on(type: $type, handler: function (SessionEvent $event): void {
});
```

<Info>
  최신 정보는 [GitHub 저장소](https://github.com/invokable/laravel-copilot-sdk)를 참고하세요.
</Info>


## Related topics

- [BlueskyManager와 HasShortHand](/ko/packages/laravel-bluesky/bluesky-manager.md)
- [튜토리얼 - Laravel Console Starter](/ko/packages/laravel-console-starter/tutorial.md)
- [Socialite - Laravel Bluesky](/ko/packages/laravel-bluesky/socialite.md)
- [WSL로 PHP와 Composer와 Node.js 설치하기 (Windows)](/ko/blog/windows-setup.md)
- [Homebrew로 PHP와 Composer와 Node.js 설치하기 (macOS)](/ko/blog/mac-setup.md)
