# События потоковых сессий

Каждое действие агент Copilot — мышление, написание кода, запуск инструментов — исполняется в виде session event на которое вы можете подписаться. Это руководство служит справочником на уровне поля для каждого типа событий, чтобы вы точно знали, какие данные ожидать, не читая исходный код SDK.

<!-- markdownlint-disable GHD046 GHD005 -->

<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

## Обзор

Когда `streaming: true` он настроен на сессию, SDK в реальном времени **излучает эфемерные** события (дельты, обновления прогресса) вместе **с сохраненными** событиями (полные сообщения, результаты инструментов). Все события имеют общую оболочку и несут полезную `data` нагрузку, форма которой зависит от события `type`.

![Диаграмма: диаграмма последовательностей, показывающая описанный процесс.](/assets/images/help/copilot/copilot-sdk/features-streaming-events-diagram-0.png)

| Концепция                 | Description                                                                                                          |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| **Эфемерное событие**     | Transient; Транслировался в реальном времени, но **не** сохранялся в журнале сессии. Не повторяется в резюме сессии. |
| **Сохраняющееся событие** | Сохранено в журнале событий сессии на диске. Повторяется при возобновлении сессии.                                   |
| **Событие Delta**         | Эфемерный потоковой фрагмент (текст или рассуждение). Накапливайте дельты для создания полного контента.             |
| **`parentId` Цепь**       | Каждое событие `parentId` указывает на предыдущее, образуя связанный список, по которому можно пройтись.             |

## Оболочка событий

Каждое событие сессии, независимо от типа, включает следующие поля:

| Поле                                                                              | Тип                              | Description                                                |
| --------------------------------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------- |
| `id`                                                                              |                                  |                                                            |
| `string` (UUID v4)                                                                | Уникальный идентификатор события |                                                            |
| `timestamp`                                                                       |                                  |                                                            |
| `string` (ISO 8601)                                                               | Когда было создано событие       |                                                            |
| `parentId`                                                                        | `string \| null`                 | ID предыдущего события в цепочке; `null` для первого этапа |
| `ephemeral`                                                                       | `boolean?`                       |                                                            |
| `true` для временных событий; отсутствует или `false` из-за сохраняющихся событий |                                  |                                                            |
| `type`                                                                            | `string`                         | Дискриминатор типа события (см. таблицы ниже)              |
| `data`                                                                            | `object`                         | Полезная нагрузка, специфичная для конкретного события     |

## Подписка на события

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
// All events
session.on((event) => {
    console.log(event.type, event.data);
});

// Specific event type — data is narrowed automatically
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot import CopilotClient
from copilot.generated.session_events import SessionEventType

client = CopilotClient()

session = None  # assume session is created elsewhere

def handle(event):
    if event.type == SessionEventType.ASSISTANT_MESSAGE_DELTA:
        print(event.data.delta_content, end="", flush=True)

# session.on(handle)
```

```python
from copilot.generated.session_events import SessionEventType

def handle(event):
    if event.type == SessionEventType.ASSISTANT_MESSAGE_DELTA:
        print(event.data.delta_content, end="", flush=True)

session.on(handle)
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
package main

import (
    "context"
    "fmt"
    copilot "github.com/github/copilot-sdk/go"
    "github.com/github/copilot-sdk/go/rpc"
)

func main() {
    ctx := context.Background()
    client := copilot.NewClient(nil)

    session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
        Model:     "gpt-4.1",
        Streaming: copilot.Bool(true),
        OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
            return &rpc.PermissionDecisionApproveOnce{}, nil
        },
    })

    session.On(func(event copilot.SessionEvent) {
        if d, ok := event.Data.(*copilot.AssistantMessageDeltaData); ok {
            fmt.Print(d.DeltaContent)
        }
    })
    _ = session
}
```

```golang
session.On(func(event copilot.SessionEvent) {
    if d, ok := event.Data.(*copilot.AssistantMessageDeltaData); ok {
        fmt.Print(d.DeltaContent)
    }
})
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using GitHub.Copilot;

public static class StreamingEventsExample
{
    public static async Task Example(CopilotSession session)
    {
        session.On<SessionEvent>(evt =>
        {
            if (evt is AssistantMessageDeltaEvent delta)
            {
                Console.Write(delta.Data.DeltaContent);
            }
        });
    }
}
```

```csharp
session.On<SessionEvent>(evt =>
{
    if (evt is AssistantMessageDeltaEvent delta)
    {
        Console.Write(delta.Data.DeltaContent);
    }
});
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

<!-- docs-validate: skip -->

```java
// All events
session.on(event -> System.out.println(event.getType()));

// Specific event type — data is narrowed to the matching class
session.on(AssistantMessageDeltaEvent.class, event ->
    System.out.print(event.getData().deltaContent())
);
```

</div>

</div>

> \[!TIP]
> **(Python / Go)** Эти SDK используют один класс/структуру `Data` со всеми возможными полями как опциональные/нулируемые. Для каждого типа события заполнены только поля, указанные в таблицах ниже — остальные будут `None` / `nil`.
>
> \[!TIP]
> **(.NET)** SDK .NET использует отдельные, сильно типированные классы данных для каждого события (например, `AssistantMessageDeltaData`), поэтому для каждого типа существуют только соответствующие поля.
>
> \[!TIP]
> **(TypeScript)** SDK TypeScript использует дискриминированное объединение — при совпадении на `event.type`, `data` полезная нагрузка автоматически сужается до нужной формы.

## Соревнования ассистентов

Эти события отслеживают жизненный цикл реакции агента — от запуска ходов через потоковые фрагменты до финального сообщения.

### `assistant.turn_start`

Излучается, когда агент начинает обрабатывать ход.

| Поле данных                                                 | Тип      | Обязательный | Description                                         |
| ----------------------------------------------------------- | -------- | ------------ | --------------------------------------------------- |
| `turnId`                                                    | `string` | ✅            | Идентификатор поворота (обычно строчный номер хода) |
| `interactionId`                                             | `string` |              |                                                     |
| Идентификатор взаимодействия CAPI для корреляции телеметрии |          |              |                                                     |

### `assistant.intent`

Эфемерно. Краткое описание того, чем сейчас занимается агент, обновляется по мере работы.

| Поле данных | Тип      | Обязательный | Description                                                        |
| ----------- | -------- | ------------ | ------------------------------------------------------------------ |
| `intent`    | `string` | ✅            | Человекочитаемый намерение (например, «Исследование кодовой базы») |

### `assistant.reasoning`

Полный расширенный размышленный блок из модели. Выпущено после завершения рассуждений.

| Поле данных   | Тип      | Обязательный | Description                                          |
| ------------- | -------- | ------------ | ---------------------------------------------------- |
| `reasoningId` | `string` | ✅            | Уникальный идентификатор для этого блока рассуждения |
| `content`     | `string` | ✅            | Полный расширенный текст мышления                    |

### `assistant.reasoning_delta`

Эфемерно. Постепенная часть расширенного мышления модели, транслируемая в реальном времени.

| Поле данных    | Тип      | Обязательный | Description                                                |
| -------------- | -------- | ------------ | ---------------------------------------------------------- |
| `reasoningId`  | `string` | ✅            | Совпадает с соответствующим `assistant.reasoning` событием |
| `deltaContent` | `string` | ✅            | Текст для добавления к содержанию рассуждения              |

### `assistant.message`

Полный ответ ассистента на этот звонок LLM. Может содержать запросы на вызов инструментов.

| Поле данных                                                                  | Тип             | Обязательный | Description                                  |
| ---------------------------------------------------------------------------- | --------------- | ------------ | -------------------------------------------- |
| `messageId`                                                                  | `string`        | ✅            | Уникальный идентификатор для этого сообщения |
| `content`                                                                    | `string`        | ✅            | Ответ ассистента в тексте                    |
| `toolRequests`                                                               | `ToolRequest[]` |              |                                              |
| Вызовы инструментов, которые хочет сделать ассистент (см. ниже)              |                 |              |                                              |
| `reasoningOpaque`                                                            | `string`        |              |                                              |
| Зашифрованное расширенное мышление (антропные модели); Привязанный к сеансам |                 |              |                                              |
| `reasoningText`                                                              | `string`        |              |                                              |
| Читаемый текст рассуждений из расширенного мышления                          |                 |              |                                              |
| `encryptedContent`                                                           | `string`        |              |                                              |
| Зашифрованное рассуждение (модели OpenAI); Привязанный к сеансам             |                 |              |                                              |
| `phase`                                                                      | `string`        |              |                                              |
| Фаза генерации (например, `"thinking"` против `"response"`)                  |                 |              |                                              |
| `outputTokens`                                                               | `number`        |              |                                              |
| Фактическое количество токенов вывода из ответа API                          |                 |              |                                              |
| `interactionId`                                                              | `string`        |              |                                              |
| Идентификатор взаимодействия CAPI для телеметрии                             |                 |              |                                              |
| `parentToolCallId`                                                           | `string`        |              |                                              |
| Устанавливается, когда это сообщение исходит от субагента                    |                 |              |                                              |

\*\*
`ToolRequest` Области:\*\*

| Поле                                                      | Тип                      | Обязательный | Description                                                   |
| --------------------------------------------------------- | ------------------------ | ------------ | ------------------------------------------------------------- |
| `toolCallId`                                              | `string`                 | ✅            | Уникальный идентификатор для этого вызова инструмента         |
| `name`                                                    | `string`                 | ✅            | Название инструмента (например, `"bash"`, `"edit"`, `"grep"`) |
| `arguments`                                               | `object`                 |              |                                                               |
| Проанализированные аргументы в пользу инструмента         |                          |              |                                                               |
| `type`                                                    | `"function" \| "custom"` |              |                                                               |
| Тип вызова; по `"function"` умолчанию — когда отсутствует |                          |              |                                                               |

### `assistant.message_delta`

Эфемерно. Постепенный фрагмент ответа ассистента в реальном времени.

| Поле данных                        | Тип      | Обязательный | Description                                              |
| ---------------------------------- | -------- | ------------ | -------------------------------------------------------- |
| `messageId`                        | `string` | ✅            | Совпадает с соответствующим `assistant.message` событием |
| `deltaContent`                     | `string` | ✅            | Текстовый фрагмент для добавления к сообщению            |
| `parentToolCallId`                 | `string` |              |                                                          |
| Set при возникновении от субагента |          |              |                                                          |

### `assistant.turn_end`

Издаётся после завершения хода агентом (выполнение всех инструментов завершено, финальный ответ получен).

| Поле данных | Тип      | Обязательный | Description                                                 |
| ----------- | -------- | ------------ | ----------------------------------------------------------- |
| `turnId`    | `string` | ✅            | Совпадает с соответствующим `assistant.turn_start` событием |

### `assistant.usage`

Эфемерно. Информация об использовании токена и стоимости для отдельного вызова API.

| Поле данных                                                                                            | Тип                                                                        | Обязательный | Description                                  |
| ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------- | ------------ | -------------------------------------------- |
| `model`                                                                                                | `string`                                                                   | ✅            | Идентификатор модели (например, `"gpt-4.1"`) |
| `inputTokens`                                                                                          | `number`                                                                   |              |                                              |
| Расходуемые входные токены                                                                             |                                                                            |              |                                              |
| `outputTokens`                                                                                         | `number`                                                                   |              |                                              |
| Выпускные токены                                                                                       |                                                                            |              |                                              |
| `cacheReadTokens`                                                                                      | `number`                                                                   |              |                                              |
| Токены, читаемые из кэша prompt                                                                        |                                                                            |              |                                              |
| `cacheWriteTokens`                                                                                     | `number`                                                                   |              |                                              |
| Токены, записываемые для кэша prompt                                                                   |                                                                            |              |                                              |
| `cost`                                                                                                 | `number`                                                                   |              |                                              |
| Стоимость мультипликатора модели для выставления счетов                                                |                                                                            |              |                                              |
| `duration`                                                                                             | `number`                                                                   |              |                                              |
| Длительность вызова API в миллисекундах                                                                |                                                                            |              |                                              |
| `initiator`                                                                                            | `string`                                                                   |              |                                              |
| Что спровоцировало этот вызов (например, `"sub-agent"`); отсутствует для инициированного пользователем |                                                                            |              |                                              |
| `apiCallId`                                                                                            | `string`                                                                   |              |                                              |
| Идентификатор завершения от провайдера (например, `chatcmpl-abc123`)                                   |                                                                            |              |                                              |
| `apiEndpoint`                                                                                          | `"/chat/completions" \| "/v1/messages" \| "/responses" \| "ws:/responses"` |              |                                              |
| API-конечная точка, используемая для вызова модели; Полезно для атрибуции наблюдаемости и стоимости.   |                                                                            |              |                                              |
| `ws:/responses` является вариантом websocket API ответов                                               |                                                                            |              |                                              |
| `providerCallId`                                                                                       | `string`                                                                   |              |                                              |
| GitHub запросить трассировочный идентификатор (`x-github-request-id`)                                  |                                                                            |              |                                              |
| `parentToolCallId`                                                                                     | `string`                                                                   |              |                                              |
| Устанавливается, когда использование исходит от субагента                                              |                                                                            |              |                                              |
| `quotaSnapshots`                                                                                       | `Record<string, QuotaSnapshot>`                                            |              |                                              |
| Использование ресурсов по квотам, определяемое идентификатором квоты                                   |                                                                            |              |                                              |
| `copilotUsage`                                                                                         | `CopilotUsage`                                                             |              |                                              |
| Детализированная разбивка стоимости токена из API                                                      |                                                                            |              |                                              |

### `assistant.streaming_delta`

Эфемерно. Низкоуровневый индикатор прогресса сети — общее количество байт, полученных от ответа потокового API.

| Поле данных              | Тип      | Обязательный | Description                                   |
| ------------------------ | -------- | ------------ | --------------------------------------------- |
| `totalResponseSizeBytes` | `number` | ✅            | Совокупные байты, полученные на данный момент |

## События выполнения инструментов

Эти события отслеживают полный жизненный цикл каждого вызова инструмента — от запроса вызова инструмента моделью до его выполнения.

### `tool.execution_start`

Испускается, когда инструмент начинает работать.

| Поле данных                                                    | Тип      | Обязательный | Description                                                   |
| -------------------------------------------------------------- | -------- | ------------ | ------------------------------------------------------------- |
| `toolCallId`                                                   | `string` | ✅            | Уникальный идентификатор для этого вызова инструмента         |
| `toolName`                                                     | `string` | ✅            | Название инструмента (например, `"bash"`, `"edit"`, `"grep"`) |
| `arguments`                                                    | `object` |              |                                                               |
| Анализированные аргументы, передаваемые инструменту            |          |              |                                                               |
| `mcpServerName`                                                | `string` |              |                                                               |
| Имя сервера MCP, когда инструмент предоставляется сервером MCP |          |              |                                                               |
| `mcpToolName`                                                  | `string` |              |                                                               |
| Оригинальное имя инструмента на сервере MCP                    |          |              |                                                               |
| `parentToolCallId`                                             | `string` |              |                                                               |
| Устанавливается при вызове субагентом                          |          |              |                                                               |

### `tool.execution_partial_result`

Эфемерно. Инкрементальный вывод от запускающегося инструмента (например, потоковой выход bash).

| Поле данных     | Тип      | Обязательный | Description                                         |
| --------------- | -------- | ------------ | --------------------------------------------------- |
| `toolCallId`    | `string` | ✅            | Совпадает с соответствующими `tool.execution_start` |
| `partialOutput` | `string` | ✅            | Инкрементальный выходной блок                       |

### `tool.execution_progress`

Эфемерно. Читаемый человеком статус прогресса из запускаемого инструмента (например, уведомления о прогрессе сервера MCP).

| Поле данных       | Тип      | Обязательный | Description                                         |
| ----------------- | -------- | ------------ | --------------------------------------------------- |
| `toolCallId`      | `string` | ✅            | Совпадает с соответствующими `tool.execution_start` |
| `progressMessage` | `string` | ✅            | Сообщение о статусе прогресса                       |

### `tool.execution_complete`

Издаётся, когда инструмент завершает выполнение — успешно или с ошибкой.

| Поле данных                                                                 | Тип                  | Обязательный | Description                                         |
| --------------------------------------------------------------------------- | -------------------- | ------------ | --------------------------------------------------- |
| `toolCallId`                                                                | `string`             | ✅            | Совпадает с соответствующими `tool.execution_start` |
| `success`                                                                   | `boolean`            | ✅            | Была ли казнь успешной                              |
| `model`                                                                     | `string`             |              |                                                     |
| Модель, которая сгенерировала этот вызов инструмента                        |                      |              |                                                     |
| `interactionId`                                                             | `string`             |              |                                                     |
| Идентификатор взаимодействия CAPI                                           |                      |              |                                                     |
| `isUserRequested`                                                           | `boolean`            |              |                                                     |
|                                                                             |                      |              |                                                     |
| `true` когда пользователь явно запросил этот вызов инструмента              |                      |              |                                                     |
| `result`                                                                    | `Result`             |              |                                                     |
| Представление об успехе (см. ниже)                                          |                      |              |                                                     |
| `error`                                                                     | `{ message, code? }` |              |                                                     |
| Присутствует при неисправности                                              |                      |              |                                                     |
| `toolTelemetry`                                                             | `object`             |              |                                                     |
| Телеметрия, специфичная для инструмента (например, подсчёт проверок CodeQL) |                      |              |                                                     |
| `parentToolCallId`                                                          | `string`             |              |                                                     |
| Устанавливается при вызове субагентом                                       |                      |              |                                                     |

\*\*
`Result` Области:\*\*

| Поле                                                                           | Тип              | Обязательный | Description                                                                                  |
| ------------------------------------------------------------------------------ | ---------------- | ------------ | -------------------------------------------------------------------------------------------- |
| `content`                                                                      | `string`         | ✅            | Краткий результат отправляется в LLM (может быть урезан для повышения эффективности токенов) |
| `detailedContent`                                                              | `string`         |              |                                                                                              |
| Полный результат для отображения, сохраняя полный контент, например, diff      |                  |              |                                                                                              |
| `contents`                                                                     | `ContentBlock[]` |              |                                                                                              |
| Структурированные блоки контента (текст, терминал, изображение, аудио, ресурс) |                  |              |                                                                                              |

### `tool.user_requested`

Издаётся, когда пользователь явно запрашивает вызов инструмента (вместо того чтобы модель выбирает вызов инструмента).

| Поле данных                | Тип      | Обязательный | Description                                              |
| -------------------------- | -------- | ------------ | -------------------------------------------------------- |
| `toolCallId`               | `string` | ✅            | Уникальный идентификатор для этого вызова инструмента    |
| `toolName`                 | `string` | ✅            | Название инструмента, который пользователь хочет вызвать |
| `arguments`                | `object` |              |                                                          |
| Аргументы в пользу призыва |          |              |                                                          |

## События жизненного цикла сессии

### `session.idle`

Эфемерно. Агент завершил всю обработку и готов к следующему сообщению. Это сигнал о полном завершении поворота.

| Поле данных                                                         | Тип               | Обязательный | Description |
| ------------------------------------------------------------------- | ----------------- | ------------ | ----------- |
| `backgroundTasks`                                                   | `BackgroundTasks` |              |             |
| Фоновые агенты/оболочки всё ещё работали, когда агент стал простоем |                   |              |             |

### `session.error`

Во время обработки сессии произошла ошибка.

| Поле данных                                                                | Тип      | Обязательный | Description                                                                |
| -------------------------------------------------------------------------- | -------- | ------------ | -------------------------------------------------------------------------- |
| `errorType`                                                                | `string` | ✅            | Категория ошибок (например, `"authentication"`, `"quota"`, `"rate_limit"`) |
| `message`                                                                  | `string` | ✅            | Сообщение об ошибке, читаемое человеком                                    |
| `stack`                                                                    | `string` |              |                                                                            |
| Трассировка стека ошибок                                                   |          |              |                                                                            |
| `statusCode`                                                               | `number` |              |                                                                            |
| Статус HTTP-кода из восходящего запроса                                    |          |              |                                                                            |
| `providerCallId`                                                           | `string` |              |                                                                            |
| GitHub трассирующий идентификатор запросов для корреляции логов на сервере |          |              |                                                                            |

### `session.compaction_start`

Началось уплотнение контекстного окна.
**Полезная нагрузка данных пуста (`{}`)**.

### `session.compaction_complete`

Уплотнение контекстного окна завершено.

| Поле данных                                                    | Тип                              | Обязательный | Description           |
| -------------------------------------------------------------- | -------------------------------- | ------------ | --------------------- |
| `success`                                                      | `boolean`                        | ✅            | Удалось ли уплотнение |
| `error`                                                        | `string`                         |              |                       |
| Сообщение об ошибке при неудачном уплотнении                   |                                  |              |                       |
| `preCompactionTokens`                                          | `number`                         |              |                       |
| Токены до уплотнения                                           |                                  |              |                       |
| `postCompactionTokens`                                         | `number`                         |              |                       |
| Токены после уплотнения                                        |                                  |              |                       |
| `preCompactionMessagesLength`                                  | `number`                         |              |                       |
| Количество сообщений до уплотнения                             |                                  |              |                       |
| `messagesRemoved`                                              | `number`                         |              |                       |
| Сообщения удалены                                              |                                  |              |                       |
| `tokensRemoved`                                                | `number`                         |              |                       |
| Жетоны удалены                                                 |                                  |              |                       |
| `summaryContent`                                               | `string`                         |              |                       |
| LLM-генерируемое резюме компактной истории                     |                                  |              |                       |
| `checkpointNumber`                                             | `number`                         |              |                       |
| Номер снимка контрольной точки для восстановления              |                                  |              |                       |
| `checkpointPath`                                               | `string`                         |              |                       |
| Путь файла, где хранился контрольный пункт                     |                                  |              |                       |
| `compactionTokensUsed`                                         | `{ input, output, cachedInput }` |              |                       |
| Использование токена для вызова компрессионного LLM            |                                  |              |                       |
| `requestId`                                                    | `string`                         |              |                       |
| GitHub запрос идентификатора трассировки для вызова компрессии |                                  |              |                       |

### `session.title_changed`

Эфемерно. Автоматически сгенерированное название сессии было обновлено.

| Поле данных | Тип      | Обязательный | Description           |
| ----------- | -------- | ------------ | --------------------- |
| `title`     | `string` | ✅            | Новое название сессии |

### `session.context_changed`

Рабочий каталог или контекст репозитория сессии изменились.

| Поле данных                          | Тип      | Обязательный | Description                |
| ------------------------------------ | -------- | ------------ | -------------------------- |
| `cwd`                                | `string` | ✅            | Текущий рабочий справочник |
| `gitRoot`                            | `string` |              |                            |
| Корень репозитория Git               |          |              |                            |
| `repository`                         | `string` |              |                            |
| Репозиторий в `"owner/name"` формате |          |              |                            |
| `branch`                             | `string` |              |                            |
| Текущая ветка git                    |          |              |                            |

### `session.usage_info`

Эфемерно. Снимок использования контекстного окна.

| Поле данных      | Тип      | Обязательный | Description                                                  |
| ---------------- | -------- | ------------ | ------------------------------------------------------------ |
| `tokenLimit`     | `number` | ✅            | Максимальное количество токенов для контекстного окна модели |
| `currentTokens`  | `number` | ✅            | Текущие токены в контекстном окне                            |
| `messagesLength` | `number` | ✅            | Текущее количество сообщений в разговоре                     |

### `session.task_complete`

Агент выполнил назначенную задачу.

| Поле данных                           | Тип      | Обязательный | Description |
| ------------------------------------- | -------- | ------------ | ----------- |
| `summary`                             | `string` |              |             |
| Краткое содержание выполненной задачи |          |              |             |

### `session.shutdown`

Сессия закончилась.

| Поле данных                                           | Тип                                           | Обязательный | Description                                        |
| ----------------------------------------------------- | --------------------------------------------- | ------------ | -------------------------------------------------- |
| `shutdownType`                                        | `"routine" \| "error"`                        | ✅            | Обычное отключение или сбой                        |
| `errorReason`                                         | `string`                                      |              |                                                    |
| Описание ошибки, когда `shutdownType` равна `"error"` |                                               |              |                                                    |
| `totalPremiumRequests`                                | `number`                                      | ✅            | Общее количество используемых премиум-запросов API |
| `totalApiDurationMs`                                  | `number`                                      | ✅            | Кумулятивное время вызова API в миллисекундах      |
| `sessionStartTime`                                    | `number`                                      | ✅            | Unix timestamp (ms) при начале сессии              |
| `codeChanges`                                         | `{ linesAdded, linesRemoved, filesModified }` | ✅            | Метрики агрегированных изменений кода              |
| `modelMetrics`                                        | `Record<string, ModelMetric>`                 | ✅            | Распределение использования по моделям             |
| `currentModel`                                        | `string`                                      |              |                                                    |
| Модель выбрана во время отключения                    |                                               |              |                                                    |

## Разрешения и события ввода пользователя

Эти события возникают, когда агенту требуется одобрение или ввод от пользователя перед продолжением.

### `permission.requested`

Эфемерно. Агенту требуется разрешение на выполнение действия (запуск команды, записи файла и т.д.).

| Поле данных         | Тип                 | Обязательный | Description                                                           |
| ------------------- | ------------------- | ------------ | --------------------------------------------------------------------- |
| `requestId`         | `string`            | ✅            | Используйте это, чтобы ответить через `session.respondToPermission()` |
| `permissionRequest` | `PermissionRequest` | ✅            | Детали запрашиваемого разрешения                                      |

Это `permissionRequest` дискриминационный союз на `kind`:

| `kind`                                                        | Поля ключа                           | Description |
| ------------------------------------------------------------- | ------------------------------------ | ----------- |
| `"shell"`                                                     |                                      |             |
| `fullCommandText`, , `intention``commands[]``possiblePaths[]` | Выполните команду shell              |             |
| `"write"`                                                     |                                      |             |
| `fileName`, , `diff``intention``newFileContents?`             | Запись/изменение файла               |             |
| `"read"`                                                      |                                      |             |
| `path`, `intention`                                           | Прочитайте файл или каталог          |             |
| `"mcp"`                                                       |                                      |             |
| `serverName`, , `toolName``toolTitle`, `args?``readOnly`      | Вызовите инструмент MCP              |             |
| `"url"`                                                       |                                      |             |
| `url`, `intention`                                            | Получить URL                         |             |
| `"memory"`                                                    |                                      |             |
| `subject`, , `fact``citations`                                | Сохранить память                     |             |
| `"custom-tool"`                                               |                                      |             |
| `toolName`, , `toolDescription``args?`                        | Вызовите пользовательский инструмент |             |

Все `kind` варианты также включают опциональную `toolCallId` связь с вызовом инструмента, который инициировал запрос.

### `permission.completed`

Эфемерно. Запрос на разрешение был урегулирован.

| Поле данных   | Тип      | Обязательный | Description                                                                                                                                                                       |
| ------------- | -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `requestId`   | `string` | ✅            | Совпадает с соответствующими `permission.requested`                                                                                                                               |
| `result.kind` | `string` | ✅            | Один из: `"approved"`, `"denied-by-rules"`, `"denied-interactively-by-user"`, `"denied-no-approval-rule-and-could-not-request-from-user"`, `"denied-by-content-exclusion-policy"` |

### `user_input.requested`

Эфемерно. Агент задаёт пользователю вопрос.

| Поле данных                                | Тип        | Обязательный | Description                                                          |
| ------------------------------------------ | ---------- | ------------ | -------------------------------------------------------------------- |
| `requestId`                                | `string`   | ✅            | Используйте это, чтобы ответить через `session.respondToUserInput()` |
| `question`                                 | `string`   | ✅            | Вопрос, который стоит задать пользователю                            |
| `choices`                                  | `string[]` |              |                                                                      |
| Предопределённые варианты для пользователя |            |              |                                                                      |
| `allowFreeform`                            | `boolean`  |              |                                                                      |
| Разрешен ли ввод свободного текста         |            |              |                                                                      |

### `user_input.completed`

Эфемерно. Запрос пользователя был решен.

| Поле данных | Тип      | Обязательный | Description                                         |
| ----------- | -------- | ------------ | --------------------------------------------------- |
| `requestId` | `string` | ✅            | Совпадает с соответствующими `user_input.requested` |

### `elicitation.requested`

Эфемерно. Агенту нужен структурированный ввод формы от пользователя (протокол идентификации MCP).

| Поле данных                         | Тип                                         | Обязательный | Description                                                            |
| ----------------------------------- | ------------------------------------------- | ------------ | ---------------------------------------------------------------------- |
| `requestId`                         | `string`                                    | ✅            | Используйте это, чтобы ответить через `session.respondToElicitation()` |
| `message`                           | `string`                                    | ✅            | Описание необходимой информации                                        |
| `mode`                              | `"form"`                                    |              |                                                                        |
| Режим вызова (пока только `"form"`) |                                             |              |                                                                        |
| `requestedSchema`                   | `{ type: "object", properties, required? }` | ✅            | Схема JSON, описывающая поля формы                                     |

### `elicitation.completed`

Эфемерно. Запрос на расследование был урегулирован.

| Поле данных | Тип      | Обязательный | Description                                          |
| ----------- | -------- | ------------ | ---------------------------------------------------- |
| `requestId` | `string` | ✅            | Совпадает с соответствующими `elicitation.requested` |

## События субагентов и навыков

### `subagent.started`

Был вызван таможенный агент как субагент.

| Поле данных        | Тип      | Обязательный | Description                                                   |
| ------------------ | -------- | ------------ | ------------------------------------------------------------- |
| `toolCallId`       | `string` | ✅            | Родительский вызов инструмента, который породил этот подагент |
| `agentName`        | `string` | ✅            | Внутреннее имя субагента                                      |
| `agentDisplayName` | `string` | ✅            | Отображение, читаемое человеком                               |
| `agentDescription` | `string` | ✅            | Описание того, что делает субагент                            |

### `subagent.completed`

Субагент успешно закончил.

| Поле данных        | Тип      | Обязательный | Description                                     |
| ------------------ | -------- | ------------ | ----------------------------------------------- |
| `toolCallId`       | `string` | ✅            | Совпадает с соответствующими `subagent.started` |
| `agentName`        | `string` | ✅            | Внутреннее имя                                  |
| `agentDisplayName` | `string` | ✅            | Показать имя                                    |

### `subagent.failed`

Субагент столкнулся с ошибкой.

| Поле данных        | Тип      | Обязательный | Description                                     |
| ------------------ | -------- | ------------ | ----------------------------------------------- |
| `toolCallId`       | `string` | ✅            | Совпадает с соответствующими `subagent.started` |
| `agentName`        | `string` | ✅            | Внутреннее имя                                  |
| `agentDisplayName` | `string` | ✅            | Показать имя                                    |
| `error`            | `string` | ✅            | Сообщение об ошибке                             |

### `subagent.selected`

Был выбран (вывод) пользовательский агент для обработки текущего запроса.

| Поле данных        | Тип                | Обязательный | Description                                                              |
| ------------------ | ------------------ | ------------ | ------------------------------------------------------------------------ |
| `agentName`        | `string`           | ✅            | Внутреннее имя выбранного агента                                         |
| `agentDisplayName` | `string`           | ✅            | Показать имя                                                             |
| `tools`            | `string[] \| null` | ✅            | Имена инструментов, доступные этому агенту; `null` для всех инструментов |

### `subagent.deselected`

Пользовательский агент был снят с выбора и вернулся к стандартному агенту.
**Полезная нагрузка данных пуста (`{}`)**.

### `skill.invoked`

Для текущего разговора был активирован навык.

| Поле данных                                                   | Тип        | Обязательный | Description                                      |
| ------------------------------------------------------------- | ---------- | ------------ | ------------------------------------------------ |
| `name`                                                        | `string`   | ✅            | Название навыка                                  |
| `path`                                                        | `string`   | ✅            | Путь файла к определению SKILL.md                |
| `content`                                                     | `string`   | ✅            | В разговор добавляется полный контент по навыкам |
| `allowedTools`                                                | `string[]` |              |                                                  |
| Инструменты автоматически одобряются, пока этот навык активен |            |              |                                                  |
| `pluginName`                                                  | `string`   |              |                                                  |
| Плагин, из которого возник навык                              |            |              |                                                  |
| `pluginVersion`                                               | `string`   |              |                                                  |
| Версия плагина                                                |            |              |                                                  |

## Другие события

### `abort`

Текущий поворот был прерван.

| Поле данных | Тип      | Обязательный | Description                                           |
| ----------- | -------- | ------------ | ----------------------------------------------------- |
| `reason`    | `string` | ✅            | Почему ход был прерван (например, `"user initiated"`) |

### `user.message`

Пользователь отправил сообщение. Записано для хронологии сессии.

| Поле данных                                                           | Тип            | Обязательный | Description                  |
| --------------------------------------------------------------------- | -------------- | ------------ | ---------------------------- |
| `content`                                                             | `string`       | ✅            | Текст сообщения пользователя |
| `transformedContent`                                                  | `string`       |              |                              |
| Трансформированная версия после предварительной обработки             |                |              |                              |
| `attachments`                                                         | `Attachment[]` |              |                              |
| Файлы, каталоги, выбор, blob или вложения на GitHub                   |                |              |                              |
| `source`                                                              | `string`       |              |                              |
| Идентификатор источника сообщения                                     |                |              |                              |
| `agentMode`                                                           | `string`       |              |                              |
| Режим агента: `"interactive"`, `"plan"`, `"autopilot"`, или `"shell"` |                |              |                              |
| `interactionId`                                                       | `string`       |              |                              |
| Идентификатор взаимодействия CAPI                                     |                |              |                              |

### `system.message`

В разговор вводился подсказка системы или разработчика.

| Поле данных                 | Тип                              | Обязательный | Description    |
| --------------------------- | -------------------------------- | ------------ | -------------- |
| `content`                   | `string`                         | ✅            | Текст запроса  |
| `role`                      | `"system" \| "developer"`        | ✅            | Роль сообщения |
| `name`                      | `string`                         |              |                |
| Идентификатор источника     |                                  |              |                |
| `metadata`                  | `{ promptVersion?, variables? }` |              |                |
| Метаданные шаблона запросов |                                  |              |                |

### `external_tool.requested`

Эфемерно. Агент хочет вызвать внешний инструмент (предоставленный потребителем SDK).

| Поле данных                    | Тип      | Обязательный | Description                                                             |
| ------------------------------ | -------- | ------------ | ----------------------------------------------------------------------- |
| `requestId`                    | `string` | ✅            | Используйте это, чтобы ответить через `session.respondToExternalTool()` |
| `sessionId`                    | `string` | ✅            | Сессия, к которой принадлежит этот запрос                               |
| `toolCallId`                   | `string` | ✅            | Идентификатор вызова инструмента для этого вызова                       |
| `toolName`                     | `string` | ✅            | Название внешнего инструмента                                           |
| `arguments`                    | `object` |              |                                                                         |
| Аргументы в пользу инструмента |          |              |                                                                         |

### `external_tool.completed`

Эфемерно. Запрос на внешний инструмент был урегулирован.

| Поле данных | Тип      | Обязательный | Description                                            |
| ----------- | -------- | ------------ | ------------------------------------------------------ |
| `requestId` | `string` | ✅            | Совпадает с соответствующими `external_tool.requested` |

### `exit_plan_mode.requested`

Эфемерно. Агент составил план и хочет выйти из режима плана.

| Поле данных         | Тип        | Обязательный | Description                                                                      |
| ------------------- | ---------- | ------------ | -------------------------------------------------------------------------------- |
| `requestId`         | `string`   | ✅            | Используйте это, чтобы ответить через `session.respondToExitPlanMode()`          |
| `summary`           | `string`   | ✅            | Краткое содержание плана                                                         |
| `planContent`       | `string`   | ✅            | Полный файл плана                                                                |
| `actions`           | `string[]` | ✅            | Доступные действия пользователя (например, одобрить, отредактировать, отклонить) |
| `recommendedAction` | `string`   | ✅            | Рекомендуемое действие                                                           |

### `exit_plan_mode.completed`

Эфемерно. Запрос на режим выхода был урегулирован.

| Поле данных | Тип      | Обязательный | Description                                             |
| ----------- | -------- | ------------ | ------------------------------------------------------- |
| `requestId` | `string` | ✅            | Совпадает с соответствующими `exit_plan_mode.requested` |

### `command.queued`

Эфемерно. Для выполнения была поставлена слэш-команда.

| Поле данных | Тип      | Обязательный | Description                                                              |
| ----------- | -------- | ------------ | ------------------------------------------------------------------------ |
| `requestId` | `string` | ✅            | Используйте это, чтобы ответить через `session.respondToQueuedCommand()` |
| `command`   | `string` | ✅            | Текст команды по косой черте (например, `/help`, `/clear`)               |

### `command.completed`

Эфемерно. Была решена очередная команда.

| Поле данных | Тип      | Обязательный | Description                                   |
| ----------- | -------- | ------------ | --------------------------------------------- |
| `requestId` | `string` | ✅            | Совпадает с соответствующими `command.queued` |

## Краткая справка: агентный поток поворотов

Типичный агентный ход генерирует события в следующем порядке:

```text
assistant.turn_start          → Turn begins
├── assistant.intent          → What the agent plans to do (ephemeral)
├── assistant.reasoning_delta → Streaming thinking chunks (ephemeral, repeated)
├── assistant.reasoning       → Complete thinking block
├── assistant.message_delta   → Streaming response chunks (ephemeral, repeated)
├── assistant.message         → Complete response (may include toolRequests)
├── assistant.usage           → Token usage for this API call (ephemeral)
│
├── [If tools were requested:]
│   ├── permission.requested  → Needs user approval (ephemeral)
│   ├── permission.completed  → Approval result (ephemeral)
│   ├── tool.execution_start  → Tool begins
│   ├── tool.execution_partial_result  → Streaming tool output (ephemeral, repeated)
│   ├── tool.execution_progress        → Progress updates (ephemeral, repeated)
│   ├── tool.execution_complete        → Tool finished
│   │
│   └── [Agent loops: more reasoning → message → tool calls...]
│
assistant.turn_end            → Turn complete
session.idle                  → Ready for next message (ephemeral)
```

## Все типы событий одним взглядом

| Тип события                                                               | Эфемерный  | Категория                   | Ключевые поля данных     |
| ------------------------------------------------------------------------- | ---------- | --------------------------- | ------------------------ |
| `assistant.turn_start`                                                    |            |                             |                          |
| Помощник                                                                  |            |                             |                          |
| `turnId`, `interactionId?`                                                |            |                             |                          |
| `assistant.intent`                                                        | ✅          | Помощник                    | `intent`                 |
| `assistant.reasoning`                                                     |            |                             |                          |
| Помощник                                                                  |            |                             |                          |
| `reasoningId`, `content`                                                  |            |                             |                          |
| `assistant.reasoning_delta`                                               | ✅          | Помощник                    |                          |
| `reasoningId`, `deltaContent`                                             |            |                             |                          |
| `assistant.streaming_delta`                                               | ✅          | Помощник                    | `totalResponseSizeBytes` |
| `assistant.message`                                                       |            |                             |                          |
| Помощник                                                                  |            |                             |                          |
| `messageId`, , `content``toolRequests?`, `outputTokens?``phase?`          |            |                             |                          |
| `assistant.message_delta`                                                 | ✅          | Помощник                    |                          |
| `messageId`, , `deltaContent``parentToolCallId?`                          |            |                             |                          |
| `assistant.turn_end`                                                      |            |                             |                          |
| Помощник                                                                  | `turnId`   |                             |                          |
| `assistant.usage`                                                         | ✅          | Помощник                    |                          |
| `model`, , `apiEndpoint?``outputTokens?``inputTokens?``cost?`,`duration?` |            |                             |                          |
| `tool.user_requested`                                                     |            |                             |                          |
| инструмент                                                                |            |                             |                          |
| `toolCallId`, , `toolName``arguments?`                                    |            |                             |                          |
| `tool.execution_start`                                                    |            |                             |                          |
| инструмент                                                                |            |                             |                          |
| `toolCallId`, , `toolName``arguments?``mcpServerName?`                    |            |                             |                          |
| `tool.execution_partial_result`                                           | ✅          | инструмент                  |                          |
| `toolCallId`, `partialOutput`                                             |            |                             |                          |
| `tool.execution_progress`                                                 | ✅          | инструмент                  |                          |
| `toolCallId`, `progressMessage`                                           |            |                             |                          |
| `tool.execution_complete`                                                 |            |                             |                          |
| инструмент                                                                |            |                             |                          |
| `toolCallId`, , `success``result?``error?`                                |            |                             |                          |
| `session.idle`                                                            | ✅          | Session                     | `backgroundTasks?`       |
| `session.error`                                                           |            |                             |                          |
| Session                                                                   |            |                             |                          |
| `errorType`, , `message``statusCode?`                                     |            |                             |                          |
| `session.compaction_start`                                                |            |                             |                          |
| Session                                                                   |            |                             |                          |
| *(пусто)*                                                                 |            |                             |                          |
| `session.compaction_complete`                                             |            |                             |                          |
| Session                                                                   |            |                             |                          |
| `success`, , `preCompactionTokens?``summaryContent?`                      |            |                             |                          |
| `session.title_changed`                                                   | ✅          | Session                     | `title`                  |
| `session.context_changed`                                                 |            |                             |                          |
| Session                                                                   |            |                             |                          |
| `cwd`, , `gitRoot?``repository?``branch?`                                 |            |                             |                          |
| `session.usage_info`                                                      | ✅          | Session                     |                          |
| `tokenLimit`, , `currentTokens``messagesLength`                           |            |                             |                          |
| `session.task_complete`                                                   |            |                             |                          |
| Session                                                                   | `summary?` |                             |                          |
| `session.shutdown`                                                        |            |                             |                          |
| Session                                                                   |            |                             |                          |
| `shutdownType`, , `codeChanges``modelMetrics`                             |            |                             |                          |
| `permission.requested`                                                    | ✅          | Разрешение                  |                          |
| `requestId`, `permissionRequest`                                          |            |                             |                          |
| `permission.completed`                                                    | ✅          | Разрешение                  |                          |
| `requestId`, `result.kind`                                                |            |                             |                          |
| `user_input.requested`                                                    | ✅          | Входные данные пользователя |                          |
| `requestId`, , `question``choices?`                                       |            |                             |                          |
| `user_input.completed`                                                    | ✅          | Входные данные пользователя | `requestId`              |
| `elicitation.requested`                                                   | ✅          | Входные данные пользователя |                          |
| `requestId`, , `message``requestedSchema`                                 |            |                             |                          |
| `elicitation.completed`                                                   | ✅          | Входные данные пользователя | `requestId`              |
| `subagent.started`                                                        |            |                             |                          |
| Sub-Agent                                                                 |            |                             |                          |
| `toolCallId`, , `agentName``agentDisplayName`                             |            |                             |                          |
| `subagent.completed`                                                      |            |                             |                          |
| Sub-Agent                                                                 |            |                             |                          |
| `toolCallId`, , `agentName``agentDisplayName`                             |            |                             |                          |
| `subagent.failed`                                                         |            |                             |                          |
| Sub-Agent                                                                 |            |                             |                          |
| `toolCallId`, , `agentName``error`                                        |            |                             |                          |
| `subagent.selected`                                                       |            |                             |                          |
| Sub-Agent                                                                 |            |                             |                          |
| `agentName`, , `agentDisplayName``tools`                                  |            |                             |                          |
| `subagent.deselected`                                                     |            |                             |                          |
| Sub-Agent                                                                 |            |                             |                          |
| *(пусто)*                                                                 |            |                             |                          |
| `skill.invoked`                                                           |            |                             |                          |
| Skill                                                                     |            |                             |                          |
| `name`, , `path``content``allowedTools?`                                  |            |                             |                          |
| `abort`                                                                   |            |                             |                          |
| Управление                                                                | `reason`   |                             |                          |
| `user.message`                                                            |            |                             |                          |
| Пользователь                                                              |            |                             |                          |
| `content`, , `attachments?``agentMode?`                                   |            |                             |                          |
| `system.message`                                                          |            |                             |                          |
| System                                                                    |            |                             |                          |
| `content`, `role`                                                         |            |                             |                          |
| `external_tool.requested`                                                 | ✅          | Внешний инструмент          |                          |
| `requestId`, , `toolName``arguments?`                                     |            |                             |                          |
| `external_tool.completed`                                                 | ✅          | Внешний инструмент          | `requestId`              |
| `command.queued`                                                          | ✅          | Command                     |                          |
| `requestId`, `command`                                                    |            |                             |                          |
| `command.completed`                                                       | ✅          | Command                     | `requestId`              |
| `exit_plan_mode.requested`                                                | ✅          | Режим планирования          |                          |
| `requestId`, , `summary``planContent``actions`                            |            |                             |                          |
| `exit_plan_mode.completed`                                                | ✅          | Режим планирования          | `requestId`              |