> ## 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() y on()

> Explica cómo combinar send() / sendAndWait() y on() de Laravel Copilot SDK para manejar eventos intermedios y la respuesta final.

## Session `send()` y `on()`

`sendAndWait()` devuelve la respuesta directamente y es cómodo, pero solo recibe **el último mensaje del assistant**.

```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());
});
```

Si también quieres recibir los mensajes intermedios, registra un listener de eventos con `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.');

    // Espera con un bucle a que lleguen los mensajes
    $session->wait(timeout: 60.0);
});
```

Como en PHP esto resulta poco intuitivo, se recomienda combinar `on()` con `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.');

    // La espera en bucle se maneja dentro de sendAndWait(), así que en este punto ya ha llegado el último mensaje.
    // Los mensajes intermedios se reciben en el on() de arriba.

    // El último mensaje devuelto por sendAndWait no es necesario.
    // dump($response->content());
});
```

## Especificar un tipo de evento concreto en `on()`

Si indicas el tipo de evento con el enum `SessionEventType` o como cadena, te suscribes solo a ese evento.

```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());
});
```

## Suscribirse a todos los tipos de evento

Si no indicas ningún tipo de evento, se suscribe a todos.

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

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

// También puedes usar argumentos con nombre:
$session->on(handler: function (SessionEvent $event): void {
});

// Es posible una asignación dinámica de tipo que admita null:
$type = null;
$session->on(type: $type, handler: function (SessionEvent $event): void {
});
```

<Info>
  Consulta la información más reciente en el [repositorio de GitHub](https://github.com/invokable/laravel-copilot-sdk).
</Info>


## Related topics

- [Patrón Pipeline](/es/advanced/pipeline.md)
- [Steering y queueing](/es/packages/laravel-copilot-sdk/steering.md)
- [FAQ de la nueva estructura de aplicación de Laravel 11 y posteriores](/es/advanced/app-structure-faq.md)
- [Restablecimiento de contraseña](/es/passwords.md)
- [Estructura de aplicación en Laravel 11 y posteriores](/es/advanced/app-structure.md)
