Skip to main content

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

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

Обзор

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

Диаграмма: диаграмма последовательностей, показывающая описанный процесс.

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

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

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

ПолеТипDescription
id
string (UUID v4)Уникальный идентификатор события
timestamp
string (ISO 8601)Когда было создано событие
parentIdstring | nullID предыдущего события в цепочке; null для первого этапа
ephemeralboolean?
true для временных событий; отсутствует или false из-за сохраняющихся событий
typestringДискриминатор типа события (см. таблицы ниже)
dataobjectПолезная нагрузка, специфичная для конкретного события

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

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);
});
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)
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)
Go
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
}
session.On(func(event copilot.SessionEvent) {
    if d, ok := event.Data.(*copilot.AssistantMessageDeltaData); ok {
        fmt.Print(d.DeltaContent)
    }
})
.NET
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);
            }
        });
    }
}
session.On<SessionEvent>(evt =>
{
    if (evt is AssistantMessageDeltaEvent delta)
    {
        Console.Write(delta.Data.DeltaContent);
    }
});
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())
);

Совет

(Python / Go) Эти SDK используют один класс/структуру Data со всеми возможными полями как опциональные/нулируемые. Для каждого типа события заполнены только поля, указанные в таблицах ниже — остальные будут None / nil.

(.NET) SDK .NET использует отдельные, сильно типированные классы данных для каждого события (например, AssistantMessageDeltaData), поэтому для каждого типа существуют только соответствующие поля.

(TypeScript) SDK TypeScript использует дискриминированное объединение — при совпадении на event.type, data полезная нагрузка автоматически сужается до нужной формы.

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

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

assistant.turn_start

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

Поле данныхТипОбязательныйDescription
turnIdstringИдентификатор поворота (обычно строчный номер хода)
interactionIdstring
Идентификатор взаимодействия CAPI для корреляции телеметрии

assistant.intent

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

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

assistant.reasoning

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

Поле данныхТипОбязательныйDescription
reasoningIdstringУникальный идентификатор для этого блока рассуждения
contentstringПолный расширенный текст мышления

assistant.reasoning_delta

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

Поле данныхТипОбязательныйDescription
reasoningIdstringСовпадает с соответствующим assistant.reasoning событием
deltaContentstringТекст для добавления к содержанию рассуждения

assistant.message

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

Поле данныхТипОбязательныйDescription
messageIdstringУникальный идентификатор для этого сообщения
contentstringОтвет ассистента в тексте
toolRequestsToolRequest[]
Вызовы инструментов, которые хочет сделать ассистент (см. ниже)
reasoningOpaquestring
Зашифрованное расширенное мышление (антропные модели); Привязанный к сеансам
reasoningTextstring
Читаемый текст рассуждений из расширенного мышления
encryptedContentstring
Зашифрованное рассуждение (модели OpenAI); Привязанный к сеансам
phasestring
Фаза генерации (например, "thinking" против "response")
outputTokensnumber
Фактическое количество токенов вывода из ответа API
interactionIdstring
Идентификатор взаимодействия CAPI для телеметрии
parentToolCallIdstring
Устанавливается, когда это сообщение исходит от субагента

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

ПолеТипОбязательныйDescription
toolCallIdstringУникальный идентификатор для этого вызова инструмента
namestringНазвание инструмента (например, "bash", "edit", "grep")
argumentsobject
Проанализированные аргументы в пользу инструмента
type"function" | "custom"
Тип вызова; по "function" умолчанию — когда отсутствует

assistant.message_delta

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

Поле данныхТипОбязательныйDescription
messageIdstringСовпадает с соответствующим assistant.message событием
deltaContentstringТекстовый фрагмент для добавления к сообщению
parentToolCallIdstring
Set при возникновении от субагента

assistant.turn_end

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

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

assistant.usage

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

Поле данныхТипОбязательныйDescription
modelstringИдентификатор модели (например, "gpt-4.1")
inputTokensnumber
Расходуемые входные токены
outputTokensnumber
Выпускные токены
cacheReadTokensnumber
Токены, читаемые из кэша prompt
cacheWriteTokensnumber
Токены, записываемые для кэша prompt
costnumber
Стоимость мультипликатора модели для выставления счетов
durationnumber
Длительность вызова API в миллисекундах
initiatorstring
Что спровоцировало этот вызов (например, "sub-agent"); отсутствует для инициированного пользователем
apiCallIdstring
Идентификатор завершения от провайдера (например, chatcmpl-abc123)
providerCallIdstring
GitHub запросить трассировочный идентификатор (x-github-request-id)
parentToolCallIdstring
Устанавливается, когда использование исходит от субагента
quotaSnapshotsRecord<string, QuotaSnapshot>
Использование ресурсов по квотам, определяемое идентификатором квоты
copilotUsageCopilotUsage
Детализированная разбивка стоимости токена из API

assistant.streaming_delta

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

Поле данныхТипОбязательныйDescription
totalResponseSizeBytesnumberСовокупные байты, полученные на данный момент

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

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

tool.execution_start

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

Поле данныхТипОбязательныйDescription
toolCallIdstringУникальный идентификатор для этого вызова инструмента
toolNamestringНазвание инструмента (например, "bash", "edit", "grep")
argumentsobject
Анализированные аргументы, передаваемые инструменту
mcpServerNamestring
Имя сервера MCP, когда инструмент предоставляется сервером MCP
mcpToolNamestring
Оригинальное имя инструмента на сервере MCP
parentToolCallIdstring
Устанавливается при вызове субагентом

tool.execution_partial_result

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

Поле данныхТипОбязательныйDescription
toolCallIdstringСовпадает с соответствующими tool.execution_start
partialOutputstringИнкрементальный выходной блок

tool.execution_progress

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

Поле данныхТипОбязательныйDescription
toolCallIdstringСовпадает с соответствующими tool.execution_start
progressMessagestringСообщение о статусе прогресса

tool.execution_complete

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

Поле данныхТипОбязательныйDescription
toolCallIdstringСовпадает с соответствующими tool.execution_start
successbooleanБыла ли казнь успешной
modelstring
Модель, которая сгенерировала этот вызов инструмента
interactionIdstring
Идентификатор взаимодействия CAPI
isUserRequestedboolean
true когда пользователь явно запросил этот вызов инструмента
resultResult
Представление об успехе (см. ниже)
error{ message, code? }
Присутствует при неисправности
toolTelemetryobject
Телеметрия, специфичная для инструмента (например, подсчёт проверок CodeQL)
parentToolCallIdstring
Устанавливается при вызове субагентом

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

ПолеТипОбязательныйDescription
contentstringКраткий результат отправляется в LLM (может быть урезан для повышения эффективности токенов)
detailedContentstring
Полный результат для отображения, сохраняя полный контент, например, diff
contentsContentBlock[]
Структурированные блоки контента (текст, терминал, изображение, аудио, ресурс)

tool.user_requested

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

Поле данныхТипОбязательныйDescription
toolCallIdstringУникальный идентификатор для этого вызова инструмента
toolNamestringНазвание инструмента, который пользователь хочет вызвать
argumentsobject
Аргументы в пользу призыва

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

session.idle

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

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

session.error

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

Поле данныхТипОбязательныйDescription
errorTypestringКатегория ошибок (например, "authentication", "quota", "rate_limit")
messagestringСообщение об ошибке, читаемое человеком
stackstring
Трассировка стека ошибок
statusCodenumber
Статус HTTP-кода из восходящего запроса
providerCallIdstring
GitHub трассирующий идентификатор запросов для корреляции логов на сервере

session.compaction_start

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

session.compaction_complete

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

Поле данныхТипОбязательныйDescription
successbooleanУдалось ли уплотнение
errorstring
Сообщение об ошибке при неудачном уплотнении
preCompactionTokensnumber
Токены до уплотнения
postCompactionTokensnumber
Токены после уплотнения
preCompactionMessagesLengthnumber
Количество сообщений до уплотнения
messagesRemovednumber
Сообщения удалены
tokensRemovednumber
Жетоны удалены
summaryContentstring
LLM-генерируемое резюме компактной истории
checkpointNumbernumber
Номер снимка контрольной точки для восстановления
checkpointPathstring
Путь файла, где хранился контрольный пункт
compactionTokensUsed{ input, output, cachedInput }
Использование токена для вызова компрессионного LLM
requestIdstring
GitHub запрос идентификатора трассировки для вызова компрессии

session.title_changed

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

Поле данныхТипОбязательныйDescription
titlestringНовое название сессии

session.context_changed

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

Поле данныхТипОбязательныйDescription
cwdstringТекущий рабочий справочник
gitRootstring
Корень репозитория Git
repositorystring
Репозиторий в "owner/name" формате
branchstring
Текущая ветка git

session.usage_info

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

Поле данныхТипОбязательныйDescription
tokenLimitnumberМаксимальное количество токенов для контекстного окна модели
currentTokensnumberТекущие токены в контекстном окне
messagesLengthnumberТекущее количество сообщений в разговоре

session.task_complete

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

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

session.shutdown

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

Поле данныхТипОбязательныйDescription
shutdownType"routine" | "error"Обычное отключение или сбой
errorReasonstring
Описание ошибки, когда shutdownType равна "error"
totalPremiumRequestsnumberОбщее количество используемых премиум-запросов API
totalApiDurationMsnumberКумулятивное время вызова API в миллисекундах
sessionStartTimenumberUnix timestamp (ms) при начале сессии
codeChanges{ linesAdded, linesRemoved, filesModified }Метрики агрегированных изменений кода
modelMetricsRecord<string, ModelMetric>Распределение использования по моделям
currentModelstring
Модель выбрана во время отключения

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

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

permission.requested

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

Поле данныхТипОбязательныйDescription
requestIdstringИспользуйте это, чтобы ответить через session.respondToPermission()
permissionRequestPermissionRequestДетали запрашиваемого разрешения

Это 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
requestIdstringСовпадает с соответствующими permission.requested
result.kindstringОдин из: "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
requestIdstringИспользуйте это, чтобы ответить через session.respondToUserInput()
questionstringВопрос, который стоит задать пользователю
choicesstring[]
Предопределённые варианты для пользователя
allowFreeformboolean
Разрешен ли ввод свободного текста

user_input.completed

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

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

elicitation.requested

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

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

elicitation.completed

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

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

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

subagent.started

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

Поле данныхТипОбязательныйDescription
toolCallIdstringРодительский вызов инструмента, который породил этот подагент
agentNamestringВнутреннее имя субагента
agentDisplayNamestringОтображение, читаемое человеком
agentDescriptionstringОписание того, что делает субагент

subagent.completed

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

Поле данныхТипОбязательныйDescription
toolCallIdstringСовпадает с соответствующими subagent.started
agentNamestringВнутреннее имя
agentDisplayNamestringПоказать имя

subagent.failed

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

Поле данныхТипОбязательныйDescription
toolCallIdstringСовпадает с соответствующими subagent.started
agentNamestringВнутреннее имя
agentDisplayNamestringПоказать имя
errorstringСообщение об ошибке

subagent.selected

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

Поле данныхТипОбязательныйDescription
agentNamestringВнутреннее имя выбранного агента
agentDisplayNamestringПоказать имя
toolsstring[] | nullИмена инструментов, доступные этому агенту; null для всех инструментов

subagent.deselected

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

skill.invoked

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

Поле данныхТипОбязательныйDescription
namestringНазвание навыка
pathstringПуть файла к определению SKILL.md
contentstringВ разговор добавляется полный контент по навыкам
allowedToolsstring[]
Инструменты автоматически одобряются, пока этот навык активен
pluginNamestring
Плагин, из которого возник навык
pluginVersionstring
Версия плагина

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

abort

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

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

user.message

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

Поле данныхТипОбязательныйDescription
contentstringТекст сообщения пользователя
transformedContentstring
Трансформированная версия после предварительной обработки
attachmentsAttachment[]
Файлы, каталоги, выбор, blob или вложения на GitHub
sourcestring
Идентификатор источника сообщения
agentModestring
Режим агента: "interactive", "plan", "autopilot", или "shell"
interactionIdstring
Идентификатор взаимодействия CAPI

system.message

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

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

external_tool.requested

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

Поле данныхТипОбязательныйDescription
requestIdstringИспользуйте это, чтобы ответить через session.respondToExternalTool()
sessionIdstringСессия, к которой принадлежит этот запрос
toolCallIdstringИдентификатор вызова инструмента для этого вызова
toolNamestringНазвание внешнего инструмента
argumentsobject
Аргументы в пользу инструмента

external_tool.completed

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

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

exit_plan_mode.requested

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

Поле данныхТипОбязательныйDescription
requestIdstringИспользуйте это, чтобы ответить через session.respondToExitPlanMode()
summarystringКраткое содержание плана
planContentstringПолный файл плана
actionsstring[]Доступные действия пользователя (например, одобрить, отредактировать, отклонить)
recommendedActionstringРекомендуемое действие

exit_plan_mode.completed

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

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

command.queued

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

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

command.completed

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

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

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

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

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, , inputTokens?``outputTokens?, 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.idleSessionbackgroundTasks?
session.error
Session
errorType, , message``statusCode?
session.compaction_start
Session
(пусто)
session.compaction_complete
Session
success, , preCompactionTokens?``summaryContent?
session.title_changedSessiontitle
session.context_changed
Session
cwd, , gitRoot?``repository?``branch?
session.usage_infoSession
tokenLimit, , currentTokens``messagesLength
session.task_complete
Sessionsummary?
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.queuedCommand
requestId, command
command.completedCommandrequestId
exit_plan_mode.requestedРежим планирования
requestId, , summary``planContent``actions
exit_plan_mode.completedРежим планированияrequestId