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

# Événements de streaming

> Récapitulatif des types d'événements de session et de leur payload lorsque streaming est activé dans SessionConfig.

## Événements de streaming

Lorsque `streaming: true` est activé dans `SessionConfig`, les opérations de la session sont diffusées sous forme d'événements séquentiels.
Cette page est une version française, rendue plus lisible pour Laravel, du `streaming-events.md` officiel.

> La page [SessionEvent](/fr/packages/laravel-copilot-sdk/session-event) décrit la classe `SessionEvent` étendue côté Laravel.
> Cette page est une référence de « quels types d'événements existent et quelles données ils transportent ».

## Vue d'ensemble

Toutes les opérations de l'agent Copilot (raisonnement, génération de messages, exécution d'outils, demandes de permission, etc.) transitent sous forme d'événements de session.

* **Événement éphémère** : diffusé en temps réel uniquement. Non persisté dans le journal de session (non rejoué à la reprise)
* **Événement persisté** : sauvegardé dans le journal de session (rejoué à la reprise)
* **Événement delta** : événement de différentiel arrivant par fragments (`deltaContent`, etc.). À concaténer pour reconstituer le texte complet
* **Chaîne `parentId`** : chaque événement référence l'ID de l'événement précédent

## Enveloppe d'événement (champs communs)

Chaque événement possède la structure commune suivante.

| Champ       | Type             | Description                                          |
| ----------- | ---------------- | ---------------------------------------------------- |
| `id`        | `string`         | ID unique de l'événement (UUID v4)                   |
| `timestamp` | `string`         | Instant de création (ISO 8601)                       |
| `parentId`  | `string \| null` | ID de l'événement précédent (`null` pour le premier) |
| `ephemeral` | `boolean?`       | `true` pour un événement éphémère                    |
| `type`      | `string`         | Type d'événement                                     |
| `data`      | `object`         | Payload spécifique à l'événement                     |

## Exemple d'abonnement dans Laravel

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

Copilot::start(function (CopilotSession $session): void {
    // Tous les événements
    $session->on(function (SessionEvent $event): void {
        info($event->type(), $event->toArray());
    });

    // Un événement spécifique
    $session->on(SessionEventType::ASSISTANT_MESSAGE_DELTA, function (SessionEvent $event): void {
        echo $event->deltaContent();
    });

    $session->sendAndWait(prompt: 'Laravelの特徴を教えて');
}, config: new SessionConfig(streaming: true));
```

## Principales catégories d'événements

## Assistant events

### `assistant.turn_start`

Début de tour.

* `turnId` (requis)
* `interactionId` (optionnel)

### `assistant.intent` (éphémère)

Intention d'exécution en cours (ex. `Exploring codebase`).

* `intent` (requis)

### `assistant.reasoning`

Version finalisée du bloc de raisonnement.

* `reasoningId` (requis)
* `content` (requis)

### `assistant.reasoning_delta` (éphémère)

Delta du texte de raisonnement.

* `reasoningId` (requis)
* `deltaContent` (requis)

### `assistant.message`

Message finalisé de l'assistant.

Principaux champs :

* `messageId` (requis)
* `content` (requis)
* `toolRequests` (optionnel)
* `reasoningOpaque` / `reasoningText` / `encryptedContent` (optionnels)
* `phase` / `outputTokens` / `interactionId` (optionnels)
* `parentToolCallId` (optionnel, quand issu d'un sous-agent)

### `assistant.message_delta` (éphémère)

Delta du corps de message.

* `messageId` (requis)
* `deltaContent` (requis)
* `parentToolCallId` (optionnel)

### `assistant.turn_end`

Fin de tour.

* `turnId` (requis)

### `assistant.usage` (éphémère)

Informations de consommation par appel d'API.

Principaux champs :

* `model` (requis)
* `inputTokens` / `outputTokens` / `cost` / `duration` (optionnels)
* `apiCallId` / `providerCallId` (optionnels)
* `quotaSnapshots` / `copilotUsage` (optionnels)

### `assistant.streaming_delta` (éphémère)

Progression bas niveau de réception.

* `totalResponseSizeBytes` (requis)

## Événements d'exécution d'outil

### `tool.execution_start`

Début d'exécution d'un outil.

* `toolCallId` (requis)
* `toolName` (requis)
* `arguments` / `mcpServerName` / `mcpToolName` / `parentToolCallId` (optionnels)

### `tool.execution_partial_result` (éphémère)

Sortie partielle pendant l'exécution.

* `toolCallId` (requis)
* `partialOutput` (requis)

### `tool.execution_progress` (éphémère)

Message de progression.

* `toolCallId` (requis)
* `progressMessage` (requis)

### `tool.execution_complete`

Fin d'exécution (succès/échec).

* `toolCallId` (requis)
* `success` (requis)
* `result` (en cas de succès)
* `error` (en cas d'échec)
* `toolTelemetry` / `parentToolCallId` (optionnels)

### `tool.user_requested`

Appel d'outil demandé explicitement par l'utilisateur.

* `toolCallId` (requis)
* `toolName` (requis)
* `arguments` (optionnel)

## Cycle de vie de session

### `session.start`

Début de session. En Cloud Sessions, il est plus sûr d'attendre un `session.start` dont le `producer` est `copilot-agent` avant d'envoyer le premier prompt.

* `producer` (optionnel)

### `session.idle` (éphémère)

Le traitement en cours est terminé, en attente du prochain input.

* `backgroundTasks` (optionnel)

### `session.error`

Erreur pendant le traitement.

* `errorType` (requis)
* `message` (requis)
* `stack` / `statusCode` / `providerCallId` (optionnels)

### `session.compaction_start`

Début de la compaction de contexte (`data` est un objet vide).

### `session.compaction_complete`

Fin de la compaction de contexte.

Principaux champs :

* `success` (requis)
* `error` (optionnel)
* `preCompactionTokens` / `postCompactionTokens` (optionnels)
* `summaryContent` / `checkpointPath` (optionnels)

### `session.title_changed` (éphémère)

Mise à jour automatique du titre.

* `title` (requis)

### `session.context_changed`

Changement de contexte de travail.

* `cwd` (requis)
* `gitRoot` / `repository` / `branch` (optionnels)

### `session.info`

Informations de session (URL distante, etc.).

* `infoType` (requis)
* `url` (optionnel, ex. si `infoType` vaut `remote`)

### `session.remote_steerable_changed`

Indique un changement d'éligibilité au pilotage distant depuis Mission Control.

* `remoteSteerable` (optionnel)

### `session.usage_info` (éphémère)

État d'utilisation de la fenêtre de contexte.

* `tokenLimit` (requis)
* `currentTokens` (requis)
* `messagesLength` (requis)

### `session.task_complete`

Notification d'achèvement de tâche.

* `summary` (optionnel)

### `session.shutdown`

Fin de session.

Principaux champs :

* `shutdownType` (requis)
* `errorReason` (optionnel)
* `totalPremiumRequests` / `totalApiDurationMs` (requis)
* `codeChanges` / `modelMetrics` (requis)

## Événements permission / entrée utilisateur

### `permission.requested` (éphémère)

Demande de confirmation de permission.

* `requestId` (requis)
* `permissionRequest` (requis)

`permissionRequest.kind` :

* `shell`
* `write`
* `read`
* `mcp`
* `url`
* `memory`
* `custom-tool`

### `permission.completed` (éphémère)

Résolution de la demande de permission.

* `requestId` (requis)
* `result.kind` (requis)

### `user_input.requested` (éphémère)

Question posée à l'utilisateur.

* `requestId` (requis)
* `question` (requis)
* `choices` / `allowFreeform` (optionnels)

### `user_input.completed` (éphémère)

Fin de la saisie utilisateur.

* `requestId` (requis)

### `elicitation.requested` (éphémère)

Demande de saisie structurée (formulaire).

* `requestId` (requis)
* `message` (requis)
* `requestedSchema` (requis)

### `elicitation.completed` (éphémère)

Fin de la saisie structurée.

* `requestId` (requis)

## Sous-agents / skills

### `subagent.started`

* `toolCallId` (requis)
* `agentName` / `agentDisplayName` / `agentDescription` (requis)

### `subagent.completed`

* `toolCallId` (requis)
* `agentName` / `agentDisplayName` (requis)

### `subagent.failed`

* `toolCallId` (requis)
* `agentName` / `agentDisplayName` (requis)
* `error` (requis)

### `subagent.selected`

* `agentName` (requis)
* `agentDisplayName` (requis)
* `tools` (requis, `null` autorisé)

### `subagent.deselected`

Retour à l'agent par défaut (`data` est un objet vide).

### `skill.invoked`

* `name` / `path` / `content` (requis)
* `allowedTools` / `pluginName` / `pluginVersion` (optionnels)

## Autres événements

### `abort`

* `reason` (requis)

### `user.message`

* `content` (requis)
* `transformedContent` / `attachments` / `source` / `agentMode` / `interactionId` (optionnels)

### `system.message`

* `content` (requis)
* `role` (requis)
* `name` / `metadata` (optionnels)

### `external_tool.requested` (éphémère)

* `requestId` / `sessionId` / `toolCallId` / `toolName` (requis)
* `arguments` (optionnel)

### `external_tool.completed` (éphémère)

* `requestId` (requis)

### `exit_plan_mode.requested` (éphémère)

* `requestId` / `summary` / `planContent` / `actions` / `recommendedAction` (requis)

### `exit_plan_mode.completed` (éphémère)

* `requestId` (requis)

### `command.queued` (éphémère)

* `requestId` (requis)
* `command` (requis)

### `command.completed` (éphémère)

* `requestId` (requis)

## Ordre typique des événements

```text theme={null}
assistant.turn_start
├── assistant.intent (éphémère)
├── assistant.reasoning_delta (éphémère, plusieurs fois)
├── assistant.reasoning
├── assistant.message_delta (éphémère, plusieurs fois)
├── assistant.message
├── assistant.usage (éphémère)
├── [boucle permission / tool.* si nécessaire]
assistant.turn_end
session.idle (éphémère)
```

## Liste complète (référence rapide)

| Type d'événement                   | Éphémère | Catégorie     |
| ---------------------------------- | -------- | ------------- |
| `session.start`                    |          | Session       |
| `assistant.turn_start`             |          | Assistant     |
| `assistant.intent`                 | ✅        | Assistant     |
| `assistant.reasoning`              |          | Assistant     |
| `assistant.reasoning_delta`        | ✅        | Assistant     |
| `assistant.streaming_delta`        | ✅        | Assistant     |
| `assistant.message`                |          | Assistant     |
| `assistant.message_delta`          | ✅        | Assistant     |
| `assistant.turn_end`               |          | Assistant     |
| `assistant.usage`                  | ✅        | Assistant     |
| `tool.user_requested`              |          | Tool          |
| `tool.execution_start`             |          | Tool          |
| `tool.execution_partial_result`    | ✅        | Tool          |
| `tool.execution_progress`          | ✅        | Tool          |
| `tool.execution_complete`          |          | Tool          |
| `session.idle`                     | ✅        | Session       |
| `session.error`                    |          | Session       |
| `session.compaction_start`         |          | Session       |
| `session.compaction_complete`      |          | Session       |
| `session.title_changed`            | ✅        | Session       |
| `session.context_changed`          |          | Session       |
| `session.info`                     |          | Session       |
| `session.remote_steerable_changed` |          | Session       |
| `session.usage_info`               | ✅        | Session       |
| `session.task_complete`            |          | Session       |
| `session.shutdown`                 |          | Session       |
| `permission.requested`             | ✅        | Permission    |
| `permission.completed`             | ✅        | Permission    |
| `user_input.requested`             | ✅        | User Input    |
| `user_input.completed`             | ✅        | User Input    |
| `elicitation.requested`            | ✅        | User Input    |
| `elicitation.completed`            | ✅        | User Input    |
| `subagent.started`                 |          | Sub-Agent     |
| `subagent.completed`               |          | Sub-Agent     |
| `subagent.failed`                  |          | Sub-Agent     |
| `subagent.selected`                |          | Sub-Agent     |
| `subagent.deselected`              |          | Sub-Agent     |
| `skill.invoked`                    |          | Skill         |
| `abort`                            |          | Control       |
| `user.message`                     |          | User          |
| `system.message`                   |          | System        |
| `external_tool.requested`          | ✅        | External Tool |
| `external_tool.completed`          | ✅        | External Tool |
| `command.queued`                   | ✅        | Command       |
| `command.completed`                | ✅        | Command       |
| `exit_plan_mode.requested`         | ✅        | Plan Mode     |
| `exit_plan_mode.completed`         | ✅        | Plan Mode     |

## Documents associés

* [Référence officielle des Streaming Events](https://github.com/github/copilot-sdk/blob/main/docs/features/streaming-events.md)
* Description côté Laravel de la classe d'événement : [SessionEvent](/fr/packages/laravel-copilot-sdk/session-event)
* Motifs d'implémentation du streaming : [Streaming](/fr/packages/laravel-copilot-sdk/streaming)


## Related topics

- [Événements de cycle de vie de session](/fr/packages/laravel-copilot-sdk/session-lifecycle-event.md)
- [Observateurs Eloquent et événements de modèle](/fr/advanced/eloquent-observers.md)
- [Techniques pratiques de Laravel Telescope](/fr/blog/telescope-introduction.md)
- [Seeding de base de données](/fr/seeding.md)
- [Guide de mise à niveau de Laravel 12 vers 13](/fr/blog/upgrade-12-to-13.md)
