Skip to main content
Skip to content

Eventos de sessão de streaming

Cada ação que o agente do Copilot realiza — pensar, escrever código e executar ferramentas — é registrada como um evento de sessão que você pode acompanhar. Este guia é uma referência de nível de campo para cada tipo de evento para que você saiba exatamente quais dados esperar sem ler a fonte do SDK.

Overview

Quando streaming: true é definido em uma sessão, o SDK emite eventos efêmeros em tempo real (deltas, atualizações de progresso) junto com eventos persistentes (mensagens completas, resultados da ferramenta). Todos os eventos compartilham um envelope comum e carregam uma data carga cuja forma depende do evento type.

Diagrama: diagrama de sequência mostrando o processo descrito.

ConceitoDescription
Evento efêmeroTransitório; transmitido em tempo real, mas não persistido no log de sessão. Não reproduzido na retomada da sessão.
Evento persistenteSalvo no log de eventos da sessão no disco. Reiniciado ao retomar uma sessão.
Evento DeltaUma parte efêmera de streaming (texto ou raciocínio). Acumule deltas para construir o conteúdo completo.
parentId cadeiaCada parentId do evento aponta para o evento anterior, formando uma lista encadeada que você pode percorrer.

Envelope de evento

Cada evento de sessão, independentemente do tipo, inclui estes campos:

CampoTipoDescription
id
string (UUID v4)Identificador de evento exclusivo
timestamp
string (ISO 8601)Quando o evento foi criado
parentIdstring | nullID do evento anterior na cadeia; null para o primeiro evento
agentIdstring?ID da instância do subagente para eventos originados pelo subagente; ausente para o agente raiz ou principal e para eventos no nível da sessão
ephemeralboolean?
true para eventos transitórios; ausente ou false para eventos persistentes
typestringDiscriminador de tipo de evento (confira tabelas abaixo)
dataobjectCarga útil específica do evento

Inscrevendo-se para eventos

Idiomas de código 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);
});

Dica

(Python/Go) Esses SDKs usam tipos de dados separados por evento (por exemplo, ), portanto, AssistantMessageDeltaDatasomente os campos relevantes existem em cada tipo.

(.NET) O SDK do .NET usa classes de dados separadas e fortemente tipados por evento (por exemplo, AssistantMessageDeltaData), portanto, somente os campos relevantes existem em cada tipo.

(TypeScript) O SDK do TypeScript usa uma união discriminada — quando você faz a correspondência com event.type, o payload data é automaticamente refinado para o formato correto.

Assinatura antes do início de uma sessão

Uma sessão pode emitir eventos antes que sua chamada de criação ou retomada seja retornada. O agente pode já estar em execução — especialmente na retomada com continuePendingWork — e eventos efêmeros, como session.idle, nunca são gravados no log de sessão; portanto, getMessages não consegue recuperá-los depois. Uma assinatura instalada depois que o identificador de sessão existe perde essa janela de inicialização.

Dica

(Rust)Client::prepare_session e Client::prepare_resume_session retornam um PreparedSession que detém o canal de eventos da sessão antes que qualquer atividade do protocolo ocorra. Inscreva-se primeiro e, em seguida, chame 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_* é síncrono e inerte: valida a capacidade do buffer, aloca um canal local e não faz mais nada. Nenhuma sessão fica registrada e nada chega à CLI até que start() seja sondado pela primeira vez. Descartar uma sessão preparada que nunca foi iniciada não deixa nenhum estado para trás e fecha suas assinaturas; descartar o start() future cancela a inicialização em andamento e remove o registro da sessão, de modo que uma nova tentativa com o mesmo ID de sessão seja bem-sucedida. A limpeza é restrita ao registro específico que a inicialização abandonada detinha; portanto, ela não pode remover uma tentativa de reexecução que já tenha assumido o mesmo ID de sessão.

Vale a pena planejar o buffer de inicialização para:

  • O buffer de eventos é finito— 512 eventos, a menos que event_buffer_capacity o substitua. Uma capacidade de 0 é rejeitada com um erro de configuração inválida em vez de fixada.
  • Assinantes lentos observam um Lagged erro relatando quantos eventos foram ignorados. Eles nunca aplicam contrapressão ao loop de eventos da sessão.
  • Os consumidores que necessitam de uma visualização sem perdas de um grande pico de inicialização devem configurar uma capacidade que o comporte ou esvaziar a assinatura simultaneamente ao start().

Observação

Para sessões de nuvem em que o servidor atribui a ID da sessão, o SDK não pode rotear notificações até que a resposta de criação chegue e a ID seja conhecida. Os eventos emitidos antes desse ponto não são roteáveis para nenhuma sessão. A garantia é mais limitada: os eventos roteados nunca são descartados por falta de um receptor instalado. Fixe session_id na configuração para obter roteamento (e cobertura total de pré-resposta) desde o primeiro byte.

Renderize somente a resposta do agente principal

Os eventos do subagente compartilham o fluxo da sessão principal e incluem o nível de envelope agentId. Os eventos do agente raiz/principal e os eventos de nível de sessão omitem agentId, portanto, os renderizadores do chat principal podem ignorar os eventos do assistente onde agentId está definido e encaminhar esses eventos para rastreamentos ou para a interface de progresso.

Idiomas de código 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);
        }
    });
}

Eventos do assistente

Esses eventos acompanham o ciclo de vida de resposta do agente, desde o início da vez, passando pelos fragmentos de streaming até a mensagem final.

assistant.turn_start

Emitido quando o agente começa a processar uma rodada.

Campo de dadosTipoObrigatórioDescription
turnIdstring✅Identificador de turno (normalmente um número de turno em cadeia de caracteres)
interactionIdstringID de interação CAPI para correlação de telemetria

assistant.intent

Efêmero. Breve descrição do que o agente está fazendo no momento, atualizada conforme funciona.

Campo de dadosTipoObrigatórioDescription
intentstring✅Intenção legível por humanos (por exemplo, "Explorando a base de código")

assistant.reasoning

Conclua o bloco de pensamento estendido do modelo. Emitido após a conclusão do raciocínio.

Campo de dadosTipoObrigatórioDescription
reasoningIdstring✅Identificador exclusivo para esse bloco de raciocínio
contentstring✅O texto de pensamento estendido completo

assistant.reasoning_delta

Efêmero. Bloco incremental do pensamento estendido do modelo, transmitido em tempo real.

Campo de dadosTipoObrigatórioDescription
reasoningIdstring✅Corresponde ao evento correspondente assistant.reasoning
deltaContentstring✅Parte de texto a ser acrescentada ao conteúdo de raciocínio

assistant.message

Resposta completa do assistente para esta chamada LLM. Pode incluir solicitações de invocação de ferramentas.

Campo de dadosTipoObrigatórioDescription
messageIdstring✅Identificador exclusivo para esta mensagem
contentstring✅Resposta de texto do assistente
toolRequestsToolRequest[]Chamadas de ferramenta que o assistente deseja fazer (veja abaixo)
reasoningOpaquestringPensamento estendido criptografado (modelos antrópicos); associado à sessão
reasoningTextstringTexto claro de raciocínio a partir de pensamento aprofundado
encryptedContentstringConteúdo de raciocínio criptografado (modelos OpenAI); associado à sessão
phasestringFase de geração (por exemplo, "thinking" vs "response")
outputTokensnumberContagem real de tokens de saída na resposta da API
interactionIdstringID de interação CAPI para telemetria
parentToolCallIdstringPreterido. Usar o nível agentId do envelope para atribuição de subagente

** ToolRequest Campos:**

CampoTipoObrigatórioDescription
toolCallIdstring✅Identificação única para esta chamada de método
namestring✅Nome da ferramenta (por exemplo, , "bash", "edit") "grep"
argumentsobjectArgumentos analisados para a ferramenta
type"function" | "custom"Tipo de chamada; é definido como "function" caso esteja ausente

assistant.message_delta

Efêmero. Porção incremental da resposta de texto do assistente, transmitida em tempo real.

Campo de dadosTipoObrigatórioDescription
messageIdstring✅Corresponde ao evento correspondente assistant.message
deltaContentstring✅Parte de texto a ser acrescentada à mensagem
parentToolCallIdstringPreterido. Usar o nível agentId do envelope para atribuição de subagente

assistant.turn_end

Emitido quando o agente conclui um turno (todas as execuções de ferramentas são concluídas, resposta final fornecida).

Campo de dadosTipoObrigatórioDescription
turnIdstring✅Corresponde ao evento correspondente assistant.turn_start

assistant.usage

Efêmero. Informações de uso e custo de token para uma chamada de API individual.

Campo de dadosTipoObrigatórioDescription
modelstring✅Identificador de modelo (por exemplo, "gpt-5.4")
inputTokensnumberTokens de entrada consumidos
outputTokensnumberTokens de saída produzidos
reasoningTokensnumberTokens de saída usados para raciocínio/cadeia de pensamento (subconjunto de outputTokens)
cacheReadTokensnumberTokens lidos do cache de prompt
cacheWriteTokensnumberTokens gravados no cache de prompt
cacheExpiresAtstringCarimbo de data e hora ISO 8601 em que o cache de prompts para esta chamada de modelo expira
contentFilterTriggeredbooleanSe a resposta foi bloqueada ou truncada pela filtragem de conteúdo (finish_reason === 'content_filter')
finishReasonstringMotivo de término do modelo (por exemplo, , "stop", "length", "tool_calls", "content_filter")
costnumberCusto do multiplicador de modelo para cobrança
durationnumberDuração da chamada à API em milissegundos
timeToFirstTokenMsnumberHora da expedição de solicitação para o primeiro token recebido (latência de streaming)
interTokenLatencyMsnumberLatência média entre tokens consecutivos (taxa de transferência de streaming)
reasoningEffortstringNível de esforço de raciocínio usado para essa chamada (por exemplo, , "low", "medium") "high"
initiatorstringO que acionou esta chamada (por exemplo, "sub-agent"); ausente para chamadas iniciadas pelo usuário
apiCallIdstringID de conclusão do provedor (por exemplo, chatcmpl-abc123)
serviceRequestIdstringID da solicitação de serviço do Copilot (x-copilot-service-request-id) para correlação de logs do CAPI
apiEndpoint"/chat/completions" | "/v1/messages" | "/responses" | "ws:/responses"
Endpoint da API usado para a chamada ao modelo; útil para observabilidade e atribuição de custos.
ws:/responses é a variante websocket da API de respostas
providerCallIdstringID de rastreamento da solicitação do GitHub (x-github-request-id)
parentToolCallIdstringPreterido. Usar o nível agentId do envelope para atribuição de subagente
quotaSnapshotsRecord<string, QuotaSnapshot>Uso de recursos por cota, chaveado pelo identificador de cota
copilotUsageCopilotUsageDetalhamento do custo detalhado do token da API

assistant.streaming_delta

Efêmero. Indicador de progresso de rede de baixo nível – total de bytes recebidos da resposta da API de streaming.

Campo de dadosTipoObrigatórioDescription
totalResponseSizeBytesnumber✅Bytes cumulativos recebidos até agora

Eventos de execução de ferramentas

Esses eventos acompanham o ciclo de vida completo de cada invocação de ferramenta, desde o modelo que solicita uma chamada de ferramenta até a execução até a conclusão.

tool.execution_start

Emitido quando uma ferramenta começa a ser executada.

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Identificador exclusivo para esta chamada de ferramenta
toolNamestring✅Nome da ferramenta (por exemplo, , "bash", "edit") "grep"
argumentsobjectArgumentos analisados passados para a ferramenta
mcpServerNamestringNome do servidor MCP, quando a ferramenta é fornecida por um servidor MCP
mcpToolNamestringNome da ferramenta original no servidor MCP
parentToolCallIdstringPreterido. Usar o nível agentId do envelope para atribuição de subagente

tool.execution_partial_result

Preterido. Use tool.shell_output para saída do terminal em tempo real. Esse evento efêmero permanece emitido junto com a substituição durante a migração; Assine apenas uma representação para evitar exibir a mesma saída duas vezes.

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Corresponde ao correspondente tool.execution_start
partialOutputstring✅Instantâneo de substituição cumulativo delimitado com stdout e stderr mesclados; não é um bloco apenas de acréscimo

tool.shell_output

Efêmero. Saída somente para acréscimo de um comando de terminal anexado ou de um comando de terminal solicitado pelo usuário. Cada evento contém texto recentemente observado, com segredos filtrados, sem os separadores ou marcadores usados para formatar os resultados finais da ferramenta para o modelo.

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Identifica a chamada de ferramenta de origem
textstring✅Novo texto a ser acrescentado, não uma captura de substituição
stream"stdout" | "stderr" | "terminal"
Fonte de saída; omitido significa "stdout".
"terminal" identifica a saída PTY inerentemente mesclada, cuja origem stdout/stderr não pode ser recuperada
sequencenumber✅Inicia em zero e aumenta em todos os fluxos para esta chamada de ferramenta, em ordem de publicação observada

text Acumular separadamente por toolCallId estream, ou unir as partes em ordem de sequência para uma exibição combinada. Um número de sequência identifica duplicatas e partes ausentes; ele não estabelece a ordenação exata entre gravações independentes do sistema operacional. Um assinante tardio pode receber uma primeira sequência maior que zero.

Esses eventos são somente ao vivo: eles não são persistidos ou reproduzidos após a retomada. Os resultados finais tool.execution_complete, a formatação voltada para o modelo e a captura de comando desanexada permanecem inalterados. O texto pode conter sequências de controle de terminal; os renderizadores devem aplicar sua manipulação normal de texto de terminal.

Um comando de terminal anexado pode continuar em execução depois de tool.execution_complete quando é executado de forma assíncrona ou continuar em execução além de initial_wait. A saída recebida ao continuar usa o toolCallId original e continua o mesmo sequence, em vez de reiniciar em zero. Os consumidores que exibem apenas chamadas ativas devem ignorar partes recebidas após a conclusão, em vez de recriar o estado de chamada concluída.

A filtragem de segredos opera em cada parte decodificada. O runtime não divide artificialmente as linhas, mas as leituras do sistema operacional podem dividir uma linha ou segredo entre partes; a reconstrução do segredo entre partes não é fornecida.

tool.execution_progress

Efêmero. Status de progresso legível por humanos de uma ferramenta em execução (por exemplo, notificações de progresso do servidor MCP).

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Corresponde ao correspondente tool.execution_start
progressMessagestring✅Mensagem de status de progresso

tool.execution_complete

Emitido quando uma ferramenta termina de executar— com êxito ou com um erro.

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Corresponde ao correspondente tool.execution_start
successboolean✅Se a execução foi bem-sucedida
modelstringModelo que gerou essa chamada de ferramenta
interactionIdstringID de interação CAPI
isUserRequestedboolean
true quando o usuário solicitou explicitamente essa chamada de ferramenta
resultResultPresente no êxito e em caso de falha quando a ferramenta retornou o conteúdo com seu erro (veja abaixo)
error{ message, code? }Apresentar em caso de falha
toolTelemetryobjectTelemetria específica da ferramenta (por exemplo, contagem de verificações do CodeQL)
parentToolCallIdstringPreterido. Usar o nível agentId do envelope para atribuição de subagente

** Result Campos:**

CampoTipoObrigatórioDescription
contentstring✅Resultado conciso enviado para a LLM (pode ser truncado para eficiência de token)
detailedContentstringResultado completo para exibição, preservando conteúdo completo como diffs
contentsContentBlock[]Blocos de conteúdo estruturados (texto, terminal, imagem, áudio, recurso)

tool.user_requested

Emitido quando o usuário solicita explicitamente uma invocação de ferramenta (em vez do modelo optando por chamar uma).

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Identificador exclusivo para esta chamada de ferramenta
toolNamestring✅Nome da ferramenta que o usuário deseja invocar
argumentsobjectArgumentos para a invocação

Eventos de ciclo de vida da sessão

session.idle

Efêmero. O agente concluiu todo o processamento e está pronto para a próxima mensagem. Esse é o sinal de que uma curva está totalmente concluída.

Campo de dadosTipoObrigatórioDescription
abortedbooleanVerdadeiro quando a rodada anterior foi cancelada por meio de um sinal de anulação

session.error

Ocorreu um erro durante o processamento da sessão.

Campo de dadosTipoObrigatórioDescription
errorTypestring✅Categoria de erro (por exemplo, , "authentication", "quota") "rate_limit"
messagestring✅Mensagem de erro legível por humanos
stackstringRastreamento de pilha de erros
statusCodenumberCódigo de status HTTP da solicitação upstream
providerCallIdstringID de rastreamento da solicitação do GitHub para correlação de logs do lado do servidor

session.compaction_start

A compactação da janela de contexto começou. A carga de dados está vazia ({}).

session.compaction_complete

Compactação da janela de contexto concluída.

Campo de dadosTipoObrigatórioDescription
successboolean✅Se a compactação foi bem-sucedida
errorstringMensagem de erro se a compactação falhou
preCompactionTokensnumberTokens anteriores à compactação
postCompactionTokensnumberTokens após a compactação
preCompactionMessagesLengthnumberContagem de mensagens antes da compactação
messagesRemovednumberMensagens removidas
tokensRemovednumberTokens removidos
summaryContentstringResumo do histórico compactado gerado por LLM
checkpointNumbernumberNúmero de instantâneo de ponto de verificação criado para recuperação
checkpointPathstringCaminho do arquivo onde o ponto de verificação foi armazenado
compactionTokensUsed{ input, output, cachedInput }Uso de token para a chamada LLM de compactação
requestIdstringID de rastreamento da solicitação do GitHub para a chamada de compactação

session.title_changed

Efêmero. O título gerado automaticamente da sessão foi atualizado.

Campo de dadosTipoObrigatórioDescription
titlestring✅Novo título da sessão

session.context_changed

O diretório de trabalho ou o contexto do repositório da sessão foi alterado.

Campo de dadosTipoObrigatórioDescription
cwdstring✅Diretório de trabalho atual
gitRootstringRaiz do repositório Git
repositorystringRepositório em "owner/name" formato
branchstringBranch atual do Git

session.usage_info

Efêmero. Instantâneo de utilização da janela de contexto.

Campo de dadosTipoObrigatórioDescription
tokenLimitnumber✅Tokens máximos para a janela de contexto do modelo
currentTokensnumber✅Tokens atuais na janela de contexto
messagesLengthnumber✅Contagem de mensagens atual na conversa

session.session_limits_changed

Os limites da sessão foram alterados para o período contábil atual. Um null``sessionLimits valor significa que nenhum limite está ativo.

Campo de dadosTipoObrigatórioDescription
sessionLimitsSessionLimitsConfig | null✅Limites de sessão atuais ou null quando nenhum limite está ativo
sessionLimits.maxAiCreditsnumberMáximo de créditos de IA permitidos durante a janela de contabilização atual da sessão

session.usage_checkpoint

Ponto de verificação durável do uso agregado usado para reconstruir a contabilização quando uma sessão é retomada.

Campo de dadosTipoObrigatórioDescription
totalNanoAiunumber✅Custo das unidades de nano-IA acumuladas ao longo da sessão no ponto de verificação
totalPremiumRequestsnumberNúmero total de solicitações de API premium usadas no momento do ponto de verificação

session.task_complete

O agente concluiu sua tarefa atribuída.

Campo de dadosTipoObrigatórioDescription
summarystringResumo da tarefa concluída

session.shutdown

A sessão foi encerrada.

Campo de dadosTipoObrigatórioDescription
shutdownType"routine" | "error"✅Desligamento normal ou falha
errorReasonstringDescrição do erro quando shutdownType é "error"
totalPremiumRequestsnumber✅Total de solicitações de API Premium usadas
totalApiDurationMsnumber✅Tempo de chamada da API cumulativa em milissegundos
sessionStartTimenumber✅Timestamp Unix (ms) quando a sessão começou
codeChanges{ linesAdded, linesRemoved, filesModified }✅Métricas agregadas de alteração de código
modelMetricsRecord<string, ModelMetric>✅Detalhamento de uso por modelo
currentModelstringModelo selecionado durante o desligamento

Eventos de permissão e de interação do usuário

Esses eventos são emitidos quando o agente precisa de aprovação ou entrada do usuário antes de continuar.

permission.requested

O agente precisa de permissão para executar uma ação (executar um comando, gravar um arquivo etc.).

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Use isso para responder via session.respondToPermission()
permissionRequestPermissionRequest✅Detalhes da permissão que está sendo solicitada

A permissionRequest é uma união discriminada de kind:

kindCampos importantesDescription
"shell"
fullCommandText, intention, , commands[]``possiblePaths[]Executar um comando de shell
"write"
fileName, diff, intention, , newFileContents?``fileEdits?Gravar/modificar um arquivo
"read"
path, intentionLer um arquivo ou diretório
"mcp"
serverName, toolName, toolTitle, , args?``readOnlyChamar uma ferramenta MCP
"url"
url, intentionRecuperar uma URL
"memory"
subject, fact, citationsArmazenar uma memória
"custom-tool"
toolName, toolDescription, args?Chamar uma ferramenta personalizada

Todas as variantes kind também incluem uma vinculação opcional toolCallId de volta à chamada de ferramenta que disparou a solicitação.

Solicitações de gravação também podem incluir fileEdits em permissionRequest e promptRequest. Cada entrada contém instantâneos opcionais before e after, cada um com um path absoluto no namespace do sistema de arquivos da sessão e content UTF-8 completo. A ausência de before significa criação; a ausência de after significa exclusão. Uma cadeia de caracteres vazia content representa um arquivo vazio, não uma visualização indisponível. Um movimento pode ter caminhos diferentes em seus dois lados. Quando um movimento substitui um destino existente, entradas separadas descrevem a exclusão de origem e a substituição de destino.

Esses instantâneos descrevem a operação planejada, não uma leitura posterior do sistema de arquivos ativo. O runtime omite fileEdits quando não pode fornecer uma visualização de texto completa, incluindo solicitações feitas antes de ler um arquivo protegido por área restrita, conteúdo não UTF-8 ou um destino de movimentação ilegível ou não regular, como um pipe nomeado. Não infera uma exclusão de um valor herdado newFileContents vazio. Os campos existentes e as opções de aprovação permanecem disponíveis para consumidores que não usam visualizações.

permission.completed

Uma solicitação de permissão foi resolvida.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Corresponde ao correspondente permission.requested
result.kindstring✅Um de: "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

Efêmero. O agente está fazendo uma pergunta ao usuário.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Use isso para responder via session.respondToUserInput()
questionstring✅A pergunta a ser apresentada ao usuário
choicesstring[]Opções predefinidas para o usuário
allowFreeformbooleanSe a entrada de texto de forma livre é permitida

user_input.completed

Efêmero. Uma solicitação de entrada do usuário foi resolvida.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Corresponde ao correspondente user_input.requested

elicitation.requested

Efêmero. O agente precisa de entrada estruturada de dados do usuário (protocolo de elicitação MCP).

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Use isso para responder via session.respondToElicitation()
messagestring✅Descrição de quais informações são necessárias
mode"form"Modo de elicitação (no momento, somente "form")
requestedSchema{ type: "object", properties, required? }✅Esquema JSON que descreve os campos de formulário

elicitation.completed

Efêmero. Uma solicitação de elicitação foi resolvida.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Corresponde ao correspondente elicitation.requested

Eventos de subagente e habilidade

subagent.started

Um agente personalizado foi invocado como um subagente.

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Chamada de ferramenta-mãe que gerou este subagente
agentNamestring✅Nome interno do subagente
agentDisplayNamestring✅Nome de exibição legível por humanos
agentDescriptionstring✅Descrição do que o subagente faz
modelstringModelo com o qual o subagente será executado, quando isso for conhecido desde o início

subagent.completed

Um subagente concluiu com sucesso.

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Corresponde ao correspondente subagent.started
agentNamestring✅Nome interno
agentDisplayNamestring✅Nome de exibição
modelstringModelo usado pelo subagente
durationMsnumberDuração da execução em milissegundos (tempo real)
totalTokensnumberTotal de tokens de entrada e saída consumidos
totalToolCallsnumberTotal de chamadas de ferramenta realizadas

subagent.failed

Um subagente encontrou um erro.

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Corresponde ao correspondente subagent.started
agentNamestring✅Nome interno
agentDisplayNamestring✅Nome de exibição
errorstring✅Mensagem de erro
modelstringModelo selecionado para o subagente, quando conhecido
durationMsnumberDuração da execução em milissegundos (tempo real)
totalTokensnumberTotal de tokens de entrada e saída consumidos antes da falha
totalToolCallsnumberTotal de chamadas de ferramenta feitas antes da falha

subagent.selected

Um agente personalizado foi selecionado (inferido) para lidar com a solicitação atual.

Campo de dadosTipoObrigatórioDescription
agentNamestring✅Nome interno do agente selecionado
agentDisplayNamestring✅Nome de exibição
toolsstring[] | null✅Nomes de ferramentas disponíveis para este agente; null para todas as ferramentas

subagent.deselected

Um agente personalizado foi desselecionado, retornando ao agente padrão. A carga de dados está vazia ({}).

skill.invoked

Uma habilidade foi ativada para a conversa atual.

Campo de dadosTipoObrigatórioDescription
namestring✅Nome da habilidade
pathstring✅Caminho do arquivo para a definição de SKILL.md
contentstring✅Conteúdo completo da habilidade injetado na conversa
allowedToolsstring[]Ferramentas listadas no frontmatter da allowed-tools skill. O SDK não os aprova automaticamente; o manipulador de permissões ainda decide. A CLI Copilot os aprova automaticamente enquanto a habilidade está ativa.
pluginNamestringPlugin da habilidade de origem
pluginVersionstringVersão do plug-in

Outros eventos

abort

O turno atual foi abortado.

Campo de dadosTipoObrigatórioDescription
reasonstring✅Por que o turno foi abortado (por exemplo, "user initiated")

user.message

O usuário enviou uma mensagem. Gravado na linha do tempo da sessão.

Campo de dadosTipoObrigatórioDescription
contentstring✅O texto da mensagem do usuário
transformedContentstringVersão transformada após o pré-processamento
attachmentsAttachment[]Anexos de arquivo, diretório, seleção, blob ou referência do GitHub
sourcestringIdentificador de origem da mensagem
agentModestringModo de agente: "interactive", , "plan", "autopilot"ou "shell"
interactionIdstringID de interação CAPI

system.message

Um prompt do sistema ou do desenvolvedor foi injetado na conversa.

Campo de dadosTipoObrigatórioDescription
contentstring✅O texto do prompt
role"system" | "developer"✅Função de mensagem
namestringIdentificador de origem
metadata{ promptVersion?, variables? }Metadados do modelo de prompt

external_tool.requested

O agente deseja invocar uma ferramenta externa (uma fornecida pelo consumidor do SDK).

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Use isso para responder via session.respondToExternalTool()
sessionIdstring✅Sessão à qual esta solicitação pertence
toolCallIdstring✅ID de chamada de ferramenta para essa invocação
toolNamestring✅Nome da ferramenta externa
argumentsobjectArgumentos para a ferramenta

external_tool.completed

Uma solicitação de ferramenta externa foi resolvida.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Corresponde ao correspondente external_tool.requested

exit_plan_mode.requested

Efêmero. O agente criou um plano e deseja sair do modo de plano.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Use isso para responder via session.respondToExitPlanMode()
summarystring✅Resumo do plano
planContentstring✅Conteúdo completo do arquivo de plano
actionsstring[]✅Ações de usuário disponíveis (por exemplo, aprovar, editar, rejeitar)
recommendedActionstring✅Ação sugerida

exit_plan_mode.completed

Efêmero. Uma solicitação de modo de plano de saída foi resolvida.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Corresponde ao correspondente exit_plan_mode.requested

command.queued

Efêmero. Um comando barra "/" foi colocado na fila para execução.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Use isso para responder via session.respondToQueuedCommand()
commandstring✅O texto do comando de barra (por exemplo, /help, /clear)

command.completed

Efêmero. Um comando enfileirado foi resolvido.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Corresponde ao correspondente command.queued

session_limits_exhausted.requested

Efêmero. O orçamento atual da sessão foi esgotado e o runtime precisa de uma decisão do usuário antes de continuar.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Use este ID ao responder à solicitação pendente de limite esgotado
maxAiCreditsnumber✅Créditos máximos de IA configurados para a janela de contabilidade atual
usedAiCreditsnumber✅Créditos de IA já consumidos na janela de contabilidade atual

session_limits_exhausted.completed

Efêmero. Uma solicitação pendente de limite esgotado foi resolvida.

Campo de dadosTipoObrigatórioDescription
requestIdstring✅Corresponde ao evento correspondente session_limits_exhausted.requested
response.action"add" | "set" | "unset" | "cancel"✅Ação selecionada para a solicitação de limite esgotado
response.additionalAiCreditsnumberCréditos de IA a serem adicionados ao máximo atual quando response.action estiver "add"
response.maxAiCreditsnumberNovos créditos absolutos máximos de IA quando response.action é "set"

Referência rápida: fluxo de agentes em turnos

Uma rodada de agente típica emite eventos nesta ordem:

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)

Todos os tipos de evento em um relance

Esta tabela lista os principais data campos de conteúdo. Campos de envelope comuns estão documentados acima.

Tipo de eventoEfêmeroCategoriaCampos de dados de chave
assistant.turn_start
Assistente
turnId, interactionId?
assistant.intent✅Assistenteintent
assistant.reasoning
Assistente
reasoningId, content
assistant.reasoning_delta✅Assistente
reasoningId, deltaContent
assistant.streaming_delta✅AssistentetotalResponseSizeBytes
assistant.message
Assistente
messageId, content, toolRequests?, , outputTokens?``phase?
assistant.message_delta✅Assistente
messageId, deltaContent
assistant.turn_endAssistenteturnId
assistant.usage✅Assistente
model, apiEndpoint?, inputTokens?, outputTokens?, , cost?``duration?
tool.user_requested
Tool
toolCallId, toolName, arguments?
tool.execution_start
Tool
toolCallId, toolName, , arguments?``mcpServerName?
tool.execution_partial_result✅Tool
toolCallId, partialOutput
tool.shell_output✅Tool
toolCallId, text, , stream?``sequence
tool.execution_progress✅Tool
toolCallId, progressMessage
tool.execution_complete
Tool
toolCallId, success, , result?``error?
session.idle✅Sessionaborted?
session.error
Session
errorType, message, statusCode?
session.compaction_start
Session
(vazio)
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
Permissão
requestId, permissionRequest
permission.completed
Permissão
requestId, result.kind
user_input.requested✅Entrada do usuário
requestId, question, choices?
user_input.completed✅Entrada do usuáriorequestId
elicitation.requested✅Entrada do usuário
requestId, message, requestedSchema
elicitation.completed✅Entrada do usuáriorequestId
subagent.started
Subagente
toolCallId, agentName, , agentDisplayName``model?
subagent.completed
Subagente
toolCallId, agentName, agentDisplayName, model?, , durationMs?, totalTokens?, totalToolCalls?
subagent.failed
Subagente
toolCallId, agentName, error, model?, , durationMs?, totalTokens?, totalToolCalls?
subagent.selected
Subagente
agentName, agentDisplayName, tools
subagent.deselected
Subagente
(vazio)
skill.invoked
Habilidade
name, path, , content``allowedTools?
abortControlereason
user.message
Usuário
content, attachments?, agentMode?
system.message
System
content, role
external_tool.requested
Ferramenta Externa
requestId, toolName, arguments?
external_tool.completedFerramenta ExternarequestId
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✅Modo Planejamento
requestId, summary, , planContent``actions
exit_plan_mode.completed✅Modo PlanejamentorequestId