Skip to main content
Skip to content

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

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

Обзор

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

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

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

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

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

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

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

Языки кода navigation

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 / Go) Эти пакеты SDK используют отдельные типы данных для каждого события (например, AssistantMessageDeltaDataпоэтому только соответствующие поля существуют в каждом типе).

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

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

Подписка перед началом сеанса

Сеанс может выдавать события до возврата вызова создания или возобновления. Агент может уже работать , особенно в возобновлении с continuePendingWorkсобытиями и временными событиями, такими как session.idle никогда не записываются в журнал сеансов, поэтому getMessages их невозможно восстановить после этого. Подписка, установленная после того, как дескриптор сеанса отсутствует в этом окне запуска.

Совет

(Rust)Client::prepare_session и Client::prepare_resume_session возвращает PreparedSession канал событий сеанса перед выполнением любого действия протокола. Сначала подпишитесь, а затем вызовите start().

use github_copilot_sdk::{Client, SessionConfig};

async fn create_without_missing_startup_events(
    client: &Client,
) -> Result<(), github_copilot_sdk::Error> {
    let prepared = client.prepare_session(
        SessionConfig::default().with_event_buffer_capacity(2048),
    )?;

    // Installed before any wire activity: nothing is dropped for lack of a receiver.
    let mut events = prepared.subscribe();
    tokio::spawn(async move {
        while let Ok(event) = events.recv().await {
            println!("{}", event.event_type);
        }
    });

    let session = prepared.start().await?;
    let _ = session;
    Ok(())
}

prepare_* является синхронным и инертным: он проверяет емкость буфера, выделяет локальный канал и не делает ничего другого. Сеанс не зарегистрирован и ничего не достигает интерфейса командной строки до start() первого опроса. Удаление подготовленного сеанса, которое никогда не было запущено, не оставляет состояния позади и закрывает свои подписки; start() удаление будущего отменяет запуск во время полета и отменяет регистрацию сеанса, поэтому повторная попытка с тем же идентификатором сеанса успешно выполнена. Очистка ограничена точной регистрацией заброшенного запуска, поэтому она не может вытеснить повторную попытку, которая уже взяла на себя тот же идентификатор сеанса.

Буферизация запуска стоит планировать для:

  • Буфер событий является конечным — 512 событий, если event_buffer_capacity он не переопределяется. Емкость 0 отклоняется с ошибкой недопустимой конфигурации, а не зажатой.
  • Медленные подписчики наблюдают за ошибкой, сообщая Lagged о количестве пропущенных событий. Они никогда не применяют обратную прессу к циклу событий сеанса.
  • Потребители, которые нуждаются в потере представления большого запуска при запуске, должны настроить емкость, которая охватывает ее или слив подписку одновременно с start().

Примечание.

Для облачных сеансов, где сервер назначает идентификатор сеанса, пакет SDK не может направлять уведомления до тех пор, пока не появится ответ создания, и идентификатор будет известен. События, создаваемые до этой точки, не могут быть перенаправлены в любой сеанс. Гарантия является более узкой: перенаправленные события никогда не удаляются из-за отсутствия установленного приемника. Закрепление session_id конфигурации для получения маршрутизации (и полного покрытия до отклика) из первого байта.

Отрисовка только ответа родительского агента

События субагентов совместно используют родительский поток сеансов и включают уровень agentIdконверта. События корневого или основного агента и события уровня сеанса опущены agentId, поэтому отрисовщики основного чата могут игнорировать события помощника, где agentId задано и перенаправляйте эти события в трассировку или пользовательский интерфейс выполнения.

Языки кода navigation

TypeScript
import type { CopilotSession } from "@github/copilot-sdk";

export function subscribeParentResponse(session: CopilotSession): void {
    session.on("assistant.message_delta", (event) => {
        if (!event.agentId) {
            process.stdout.write(event.data.deltaContent);
        }
    });
}

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

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

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 для телеметрии
parentToolCallIdstringDeprecated. Использование уровня agentId конверта для присвоения субагентов

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

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

assistant.message_delta

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

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

assistant.turn_end

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

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

assistant.usage

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

Поле данныхТипОбязательныйDescription
modelstring✅Идентификатор модели (например, "gpt-5.4")
inputTokensnumberРасходуемые входные токены
outputTokensnumberВыпускные токены
reasoningTokensnumberВыходные маркеры, используемые для рассудка или цепочки мысли (подмножество outputTokens)
cacheReadTokensnumberТокены, читаемые из кэша prompt
cacheWriteTokensnumberТокены, записываемые для кэша prompt
cacheExpiresAtstringМетка времени ISO 8601 при истечении срока действия кэша запросов для вызова модели
contentFilterTriggeredbooleanЗаблокировано или усечено ли ответ с помощью фильтрации содержимого (finish_reason === 'content_filter')
finishReasonstringПричина завершения модели (например, , "stop"``"length", , ) "tool_calls"``"content_filter"
costnumberСтоимость мультипликатора модели для выставления счетов
durationnumberДлительность вызова API в миллисекундах
timeToFirstTokenMsnumberВремя от отправки запроса к первому маркеру (задержка потоковой передачи)
interTokenLatencyMsnumberСредняя задержка между последовательными маркерами (пропускная способность потоковой передачи)
reasoningEffortstringУровень усилий, используемый для этого вызова (например, , "low", "medium") "high"
initiatorstringЧто спровоцировало этот вызов (например, "sub-agent"); отсутствует для инициированного пользователем
apiCallIdstringИдентификатор завершения от провайдера (например, chatcmpl-abc123)
serviceRequestIdstringCopilot идентификатор запроса службы (x-copilot-service-request-id) для корреляции журнала CAPI
apiEndpoint"/chat/completions" | "/v1/messages" | "/responses" | "ws:/responses"
API-конечная точка, используемая для вызова модели; Полезно для атрибуции наблюдаемости и стоимости.
ws:/responses является вариантом websocket API ответов
providerCallIdstringGitHub запросить трассировочный идентификатор (x-github-request-id)
parentToolCallIdstringDeprecated. Использование уровня agentId конверта для присвоения субагентов
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
parentToolCallIdstringDeprecated. Использование уровня agentId конверта для присвоения субагентов

tool.execution_partial_result

Deprecated. Используется tool.shell_output для выходных данных динамического терминала. Это эфемерное событие по-прежнему создается вместе с заменой во время миграции; подписывайтесь только на одно представление, чтобы не отображать одинаковые выходные данные дважды.

Поле данныхТипОбязательныйDescription
toolCallIdstring✅Совпадает с соответствующими tool.execution_start
partialOutputstring✅Ограниченный, накопительный моментальный снимок замены со stdout и stderr объединены; не блок только для добавления

tool.shell_output

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

Поле данныхТипОбязательныйDescription
toolCallIdstring✅Идентифицирует вызов исходного средства
textstring✅Новый текст для добавления, а не моментальный снимок замены
stream"stdout" | "stderr" | "terminal"
Источник выходных данных; опущенные средства "stdout".
"terminal" идентифицирует по сути объединенные выходные данные PTY, источник stdout/stderr не может быть восстановлен
sequencenumber✅Начинается с нуля и увеличивается во всех потоках для вызова этого средства в наблюдаемом порядке публикации

Накапливайте по toolCallId отдельности и streamприсоединяйте text блоки в порядке последовательности для объединенного дисплея. Порядковый номер идентифицирует повторяющиеся и отсутствующие блоки; Он не устанавливает точное упорядочение между независимыми операционными системами записи. Поздний подписчик может получить первую последовательность больше нуля.

Эти события доступны только в режиме реального времени: они не сохраняются или повторяются после возобновления. Окончательные tool.execution_complete результаты, форматирование и отсоединение команды не изменяются. Текст может содержать последовательности элементов управления терминалом; Отрисовщики должны применять обычную обработку текста терминала.

Команда подключенного терминала может выполняться после tool.execution_complete выполнения асинхронно или продолжается дальше initial_wait. Выходные данные, полученные в то время как он продолжает использовать исходный toolCallId и продолжается одинаково sequence, а не перезапускается на нуле. Потребители, которые отображают только активные вызовы, должны игнорировать блоки, полученные после завершения, а не воссоздать состояние завершенного вызова.

Фильтрация секретов работает с каждой декодируемой блокой. Среда выполнения не выполняет искусственное разделение строк, но операции чтения операционной системы могут разделить линию или секрет между блоками; Перекрестная перекрестная реконструкция секрета не предоставляется.

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)
parentToolCallIdstringDeprecated. Использование уровня agentId конверта для присвоения субагентов

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

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

tool.user_requested

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

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

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

session.idle

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

Поле данныхТипОбязательныйDescription
abortedbooleanЗначение true, когда предыдущий поворот был отменен через сигнал прерывания

session.error

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

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

session.compaction_start

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

session.compaction_complete

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

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

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.session_limits_changed

Лимиты сессий изменились для текущего бухгалтерского окна. Значение null``sessionLimits означает, что ограничения не активны.

Поле данныхТипОбязательныйDescription
sessionLimitsSessionLimitsConfig | null✅Текущие ограничения сессий, или null когда ограничения не активны
sessionLimits.maxAiCreditsnumberМаксимальное количество кредитов ИИ, разрешенное в течение текущего бухгалтерского окна сессии

session.usage_checkpoint

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

Поле данныхТипОбязательныйDescription
totalNanoAiunumber✅Накопленные нано-ИИ единицы на протяжении всей сессии стоят во время контрольной точки
totalPremiumRequestsnumberОбщее количество премиум-запросов API, используемых на момент контрольной точки

session.task_complete

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

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

session.shutdown

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

Поле данныхТипОбязательныйDescription
shutdownType"routine" | "error"✅Обычное отключение или сбой
errorReasonstringОписание ошибки, когда shutdownType равна "error"
totalPremiumRequestsnumber✅Общее количество используемых премиум-запросов API
totalApiDurationMsnumber✅Кумулятивное время вызова API в миллисекундах
sessionStartTimenumber✅Unix 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?``fileEdits?Запись/изменение файла
"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 связь с вызовом инструмента, который инициировал запрос.

Запросы на запись также могут включать fileEdits в себя как permissionRequest , так и promptRequest. Каждая запись содержит необязательный и моментальный before снимок, каждый из которых является абсолютным path в пространстве имен файловой системы сеанса и завершает UTF-8content.after before Отсутствие означает создание; отсутствует after означает удаление. Пустая строка представляет пустой content файл, а не недоступную предварительную версию. Перемещение может иметь разные пути на двух сторонах. При перезаписи перемещения существующего назначения отдельные записи описывают замену источника и назначения.

Эти моментальные снимки описывают плановую операцию, а не более позднюю чтение динамической файловой системы. Среда выполнения не может fileEdits предоставить полную предварительную версию текста, включая запросы, сделанные перед чтением изолированного файла, содержимого, отличного от UTF-8, или нечитаемого или нестандартного назначения перемещения, например именованного канала. Не выводите удаление из пустого устаревшего newFileContents значения. Существующие поля и варианты утверждения остаются доступными для потребителей, которые не используют предварительные версии.

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✅Описание того, что делает субагент
modelstringМодель субагентов будет выполняться с, когда известно при запуске

subagent.completed

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

Поле данныхТипОбязательныйDescription
toolCallIdstring✅Совпадает с соответствующими subagent.started
agentNamestring✅Внутреннее имя
agentDisplayNamestring✅Показать имя
modelstringМодель, используемая вложенным агентом
durationMsnumberДлительность выполнения стенных часов в миллисекундах
totalTokensnumberОбщее количество используемых входных и выходных маркеров
totalToolCallsnumberВсего вызовов инструментов

subagent.failed

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

Поле данныхТипОбязательныйDescription
toolCallIdstring✅Совпадает с соответствующими subagent.started
agentNamestring✅Внутреннее имя
agentDisplayNamestring✅Показать имя
errorstring✅Сообщение об ошибке
modelstringМодель, выбранная для субагентов, когда известная
durationMsnumberДлительность выполнения стенных часов в миллисекундах
totalTokensnumberОбщее количество входных и выходных маркеров, потребляемых до сбоя
totalToolCallsnumberВсего вызовов инструментов, выполненных до сбоя

subagent.selected

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

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

subagent.deselected

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

skill.invoked

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

Поле данныхТипОбязательныйDescription
namestring✅Название навыка
pathstring✅Путь файла к определению SKILL.md
contentstring✅В разговор добавляется полный контент по навыкам
allowedToolsstring[]Средства, перечисленные в интерфейсе навыка allowed-tools . Пакет SDK не утверждает их автоматически; Обработчик разрешений по-прежнему решает. Copilot CLI автоматически утверждает их, пока навык активен.
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

session_limits_exhausted.requested

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

Поле данныхТипОбязательныйDescription
requestIdstring✅Используйте этот идентификатор при ответе на ожидающий запрос с исчерпанным лимитом
maxAiCreditsnumber✅Настроен максимальный AI Credits для текущего бухгалтерского окна
usedAiCreditsnumber✅Кредиты ИИ, уже использованные в текущем бухгалтерском окне

session_limits_exhausted.completed

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

Поле данныхТипОбязательныйDescription
requestIdstring✅Совпадает с соответствующим session_limits_exhausted.requested событием
response.action"add" | "set" | "unset" | "cancel"✅Выбрано действие для запроса с исчерпанным лимитом
response.additionalAiCreditsnumberКредиты ИИ, которые можно добавить к текущему максимуму, когда response.action``"add"
response.maxAiCreditsnumberНовые абсолютные максимальные ИИ-кредиты, когда response.action это "set"

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

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

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
│   ├── permission.completed  → Approval result
│   ├── tool.execution_start  → Tool begins
│   ├── tool.shell_output              → Stream-tagged terminal 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)

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

В этой таблице перечислены ключевые data полезные поля. Общие поля конверта описаны выше.

Тип событияЭфемерныйКатегорияКлючевые поля данных
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
assistant.turn_endПомощникturnId
assistant.usage✅Помощник
model, , apiEndpoint?``inputTokens?``outputTokens?``cost?,duration?
tool.user_requested
инструмент
toolCallId, , toolName``arguments?
tool.execution_start
инструмент
toolCallId, , toolName``arguments?``mcpServerName?
tool.execution_partial_result✅инструмент
toolCallId, partialOutput
tool.shell_output✅инструмент
toolCallId, , text``stream?``sequence
tool.execution_progress✅инструмент
toolCallId, progressMessage
tool.execution_complete
инструмент
toolCallId, , success``result?``error?
session.idle✅Sessionaborted?
session.error
Session
errorType, , message``statusCode?
session.compaction_start
Session
(пусто)
session.compaction_complete
Session
success, , preCompactionTokens?``summaryContent?
session.title_changed✅Sessiontitle
session.context_changed
Session
cwd, , gitRoot?``repository?``branch?
session.usage_info✅Session
tokenLimit, , currentTokens``messagesLength
session.session_limits_changedSessionsessionLimits
session.usage_checkpoint
Session
totalNanoAiu, totalPremiumRequests?
session.task_completeSessionsummary?
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``model?
subagent.completed
Sub-Agent
toolCallId, agentName, agentDisplayName``model?, durationMs?, totalTokens?, totalToolCalls?
subagent.failed
Sub-Agent
toolCallId, agentName, error``model?, durationMs?, totalTokens?, totalToolCalls?
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✅CommandrequestId
session_limits_exhausted.requested✅Session
requestId, , maxAiCredits``usedAiCredits
session_limits_exhausted.completed✅Session
requestId, response.action
exit_plan_mode.requested✅Режим планирования
requestId, , summary``planContent``actions
exit_plan_mode.completed✅Режим планированияrequestId