Skip to main content

Трансляционные события в Copilot SDK

Эталонные события сессии, исходящие Второй пилот SDK от них, и поля данных, содержащие каждое событие.

Кто может использовать эту функцию?

GitHub Copilot SDK Доступна со всеми Copilot тарифными планами.

Примечание.

          Второй пилот SDK в настоящее время находится в Technical Preview. Функциональность и доступность могут меняться.

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

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

КонцепцияОписание
          **Эфемерное событие** | Transient; Транслировался в реальном времени, но **не** сохранялся в журнале сессии. Не повторяется в резюме сессии. |

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

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

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

ПолеТипОписание
id
          `string` (UUID v4) | Уникальный идентификатор события |

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

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

// 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, Go и .NET см. репозиторийgithub/copilot-sdk.

Совет

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

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

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

assistant.turn_start

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

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

assistant.intent

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

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

assistant.reasoning

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

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

assistant.reasoning_delta

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

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

assistant.message

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

Поле данныхТипОбязательныйОписание
messageIdstringУникальный идентификатор для этого сообщения
contentstringОтвет ассистента в тексте
toolRequestsToolRequest[]
Вызовы инструментов, которые хочет сделать ассистент (см. ниже)
reasoningOpaquestring
Зашифрованное расширенное мышление (антропные модели); Привязанный к сеансам
reasoningTextstring
Читаемый текст рассуждений из расширенного мышления
encryptedContentstring
Зашифрованное рассуждение (модели OpenAI); Привязанный к сеансам
phasestring
Фаза генерации (например, "thinking" против "response")
outputTokensnumber
Фактическое количество токенов вывода из ответа API
interactionIdstring
Идентификатор взаимодействия для телеметрии
parentToolCallIdstring
Устанавливается, когда это сообщение исходит от субагента
          **
          `ToolRequest` Области:**
ПолеТипОбязательныйОписание
toolCallIdstringУникальный идентификатор для этого вызова инструмента
namestringИмя инструмента (например, "bash", "edit", "grep")
argumentsobject
Проанализированные аргументы в пользу инструмента
type"function" | "custom"
Тип вызова; по "function" умолчанию — когда отсутствует

assistant.message_delta

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

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

assistant.turn_end

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

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

assistant.usage

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

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

| parentToolCallId | string | | Устанавливается, когда использование исходит от субагента | | quotaSnapshots | Record<string, QuotaSnapshot> | | Использование ресурсов по квотам, определяемое идентификатором квоты | | copilotUsage | CopilotUsage | | Детализированная разбивка стоимости токена из API |

assistant.streaming_delta

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

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

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

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

tool.execution_start

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

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

tool.execution_partial_result

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

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

tool.execution_progress

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

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

tool.execution_complete

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

Поле данныхТипОбязательныйОписание
toolCallIdstringСовпадает с соответствующими tool.execution_start
successbooleanБыла ли казнь успешной
modelstring
Модель, которая сгенерировала этот вызов инструмента
interactionIdstring
Идентификатор взаимодействия
isUserRequestedboolean
          `true` когда пользователь явно запросил этот вызов инструмента |

| result | Result | | Представление об успехе (см. ниже) | | error | { message, code? } | | Присутствует при неисправности | | toolTelemetry | object | | Телеметрия, специфичная для инструмента | | parentToolCallId | string | | Устанавливается при вызове субагентом |

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

tool.user_requested

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

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

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

session.idle

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

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

session.error

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

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

session.compaction_start

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

session.compaction_complete

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

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

session.title_changed

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

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

session.context_changed

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

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

session.usage_info

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

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

session.task_complete

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

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

session.shutdown

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

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

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

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

permission.requested

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

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

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

kindКлючевые поляОписание
"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

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

Поле данныхТипОбязательныйОписание
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

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

Поле данныхТипОбязательныйОписание
requestIdstringИспользуйте это, чтобы ответить через session.respondToUserInput()
questionstringВопрос, который стоит задать пользователю
choicesstring[]
Предопределённые варианты для пользователя
allowFreeformboolean
Разрешен ли ввод свободного текста

user_input.completed

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

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

elicitation.requested

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

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

elicitation.completed

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

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

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

subagent.started

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

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

subagent.completed

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

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

subagent.failed

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

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

subagent.selected

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

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

subagent.deselected

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

skill.invoked

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

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

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

abort

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

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

user.message

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

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

system.message

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

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

external_tool.requested

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

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

external_tool.completed

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

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

exit_plan_mode.requested

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

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

exit_plan_mode.completed

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

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

command.queued

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

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

command.completed

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

Поле данныхТипОбязательныйОписание
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.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 | | User | content, , attachments?``agentMode? | | system.message | | Система | 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 |