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 se limita ao registro exato que a inicialização abandonada possuía, portanto não pode descartar uma nova tentativa que já tenha assumido o mesmo ID da 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 impõem controle de pressão ao loop de eventos da sessão.
  • Os consumidores que precisam de uma exibição sem perdas de uma grande intermitência de inicialização devem configurar uma capacidade que a cobre ou esvaziar a assinatura simultaneamente.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 à configuração para ter roteamento — e cobertura completa antes da 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)
interactionIdstring
ID 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)
reasoningOpaquestring
Pensamento estendido criptografado (modelos antrópicos); associado à sessão
reasoningTextstring
Texto claro de raciocínio a partir de pensamento aprofundado
encryptedContentstring
Conteúdo de raciocínio criptografado (modelos OpenAI); associado à sessão
phasestring
Fase de geração (por exemplo, "thinking" vs "response")
outputTokensnumber
Contagem real de tokens de saída na resposta da API
interactionIdstring
ID de interação CAPI para telemetria
parentToolCallIdstring
Preterido. 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"
argumentsobject
Argumentos 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
parentToolCallIdstring
Preterido. 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")
inputTokensnumber
Tokens de entrada consumidos
outputTokensnumber
Tokens de saída produzidos
reasoningTokensnumber
Tokens de saída usados para raciocínio/cadeia de pensamento (subconjunto de outputTokens)
cacheReadTokensnumber
Tokens lidos do cache de prompt
cacheWriteTokensnumber
Tokens gravados no cache de prompt
cacheExpiresAtstring
Carimbo de data e hora ISO 8601 em que o cache de prompts para esta chamada de modelo expira
contentFilterTriggeredboolean
Se a resposta foi bloqueada ou truncada pela filtragem de conteúdo (finish_reason === 'content_filter')
finishReasonstring
Motivo de término do modelo (por exemplo, , "stop", "length", "tool_calls", "content_filter")
costnumber
Custo do multiplicador de modelo para cobrança
durationnumber
Duração da chamada à API em milissegundos
timeToFirstTokenMsnumber
Hora da expedição de solicitação para o primeiro token recebido (latência de streaming)
interTokenLatencyMsnumber
Latência média entre tokens consecutivos (taxa de transferência de streaming)
reasoningEffortstring
Nível de esforço de raciocínio usado para essa chamada (por exemplo, , "low", "medium") "high"
initiatorstring
O que acionou esta chamada (por exemplo, "sub-agent"); ausente para chamadas iniciadas pelo usuário
apiCallIdstring
ID de conclusão do provedor (por exemplo, chatcmpl-abc123)
serviceRequestIdstring
ID 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
providerCallIdstring
ID de rastreamento da solicitação do GitHub (x-github-request-id)
parentToolCallIdstring
Preterido. 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
copilotUsageCopilotUsage
Detalhamento 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"
argumentsobject
Argumentos analisados passados para a ferramenta
mcpServerNamestring
Nome do servidor MCP, quando a ferramenta é fornecida por um servidor MCP
mcpToolNamestring
Nome da ferramenta original no servidor MCP
parentToolCallIdstring
Preterido. Usar o nível agentId do envelope para atribuição de subagente

tool.execution_partial_result

Efêmero. Saída incremental de uma ferramenta em execução (por exemplo, saída de bash em streaming).

Campo de dadosTipoObrigatórioDescription
toolCallIdstring✅Corresponde ao correspondente tool.execution_start
partialOutputstring✅Bloco de saída incremental

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
modelstring
Modelo que gerou essa chamada de ferramenta
interactionIdstring
ID de interação CAPI
isUserRequestedboolean
true quando o usuário solicitou explicitamente essa chamada de ferramenta
resultResult
Apresentar em caso de sucesso (veja abaixo)
error{ message, code? }
Apresentar em caso de falha
toolTelemetryobject
Telemetria específica da ferramenta (por exemplo, contagem de verificações do CodeQL)
parentToolCallIdstring
Preterido. 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)
detailedContentstring
Resultado 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
argumentsobject
Argumentos 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
abortedboolean
Verdadeiro 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
stackstring
Rastreamento de pilha de erros
statusCodenumber
Código de status HTTP da solicitação upstream
providerCallIdstring
ID 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
errorstring
Mensagem de erro se a compactação falhou
preCompactionTokensnumber
Tokens anteriores à compactação
postCompactionTokensnumber
Tokens após a compactação
preCompactionMessagesLengthnumber
Contagem de mensagens antes da compactação
messagesRemovednumber
Mensagens removidas
tokensRemovednumber
Tokens removidos
summaryContentstring
Resumo do histórico compactado gerado por LLM
checkpointNumbernumber
Número de instantâneo de ponto de verificação criado para recuperação
checkpointPathstring
Caminho do arquivo onde o ponto de verificação foi armazenado
compactionTokensUsed{ input, output, cachedInput }
Uso de token para a chamada LLM de compactação
requestIdstring
ID 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
gitRootstring
Raiz do repositório Git
repositorystring
Repositório em "owner/name" formato
branchstring
Branch 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.maxAiCreditsnumber
Má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
totalPremiumRequestsnumber
Nú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
summarystring
Resumo da tarefa concluída

session.shutdown

A sessão foi encerrada.

Campo de dadosTipoObrigatórioDescription
shutdownType"routine" | "error"✅Desligamento normal ou falha
errorReasonstring
Descriçã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
currentModelstring
Modelo 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?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.

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
allowFreeformboolean
Se 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
modelstring
Modelo 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
modelstring
Modelo usado pelo subagente
durationMsnumber
Duração da execução em milissegundos (tempo real)
totalTokensnumber
Total de tokens de entrada e saída consumidos
totalToolCallsnumber
Total 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
modelstring
Modelo selecionado para o subagente, quando conhecido
durationMsnumber
Duração da execução em milissegundos (tempo real)
totalTokensnumber
Total de tokens de entrada e saída consumidos antes da falha
totalToolCallsnumber
Total 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 aprovadas automaticamente enquanto essa habilidade está ativa
pluginNamestring
Plugin da habilidade de origem
pluginVersionstring
Versã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
transformedContentstring
Versão transformada após o pré-processamento
attachmentsAttachment[]
Anexos de arquivo, diretório, seleção, blob ou referência do GitHub
sourcestring
Identificador de origem da mensagem
agentModestring
Modo de agente: "interactive", , "plan", "autopilot"ou "shell"
interactionIdstring
ID 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
namestring
Identificador 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
argumentsobject
Argumentos 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.additionalAiCreditsnumber
Créditos de IA a serem adicionados ao máximo atual quando response.action estiver "add"
response.maxAiCreditsnumber
Novos 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.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)

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_end
AssistenteturnId
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.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_changed
SessionsessionLimits
session.usage_checkpoint
Session
totalNanoAiu, totalPremiumRequests?
session.task_complete
Sessionsummary?
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?
abort
Controlereason
user.message
Usuário
content, attachments?, agentMode?
system.message
System
content, role
external_tool.requested
Ferramenta Externa
requestId, toolName, arguments?
external_tool.completed
Ferramenta 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