跳至主要内容

Copilot SDK 中的流式事件

参考 Copilot SDK 发出的会话事件以及每个事件包含的数据字段。

谁可以使用此功能?

GitHub Copilot SDK 在所有 Copilot 计划中均可使用。

注意

Copilot SDK 目前处于公开预览阶段。功能和可用性可能会更改。

Copilot 代理执行的每一个操作——思考、编写代码、运行工具——都会以 会话事件 的形式发出,您可以对其进行订阅。本文提供每种事件类型的字段级参考,帮助您准确了解会返回哪些数据。

当会话设置了 streaming: true 时,SDK 会实时发出 短暂的 事件(增量、进度更新),以及 持久化的 事件(完整消息、工具结果)。所有事件共享通用的信封,并携带一个 data 负载,其形状取决于事件的 type。关于完整事件流的时序图,请参阅 github/copilot-sdk 仓库

概念描述
短暂事件瞬时的;实时流式传输,但 会持久化到会话日志。会话恢复时不会重放。
持久化事件保存到磁盘上的会话事件日志。会话恢复时会重放。
增量事件短暂的流式块(文本或推理)。累计增量以构建完整内容。
parentId每个事件的 parentId 指向前一个事件,形成可遍历的链表。

事件信封

每个会话事件,无论类型如何,都包含以下字段

字段类型描述
idstring (UUID v4)唯一事件标识符
时间戳string (ISO 8601)事件创建时间
parentIdstring | null链中前一个事件的 ID;首个事件为 null
ephemeralboolean?true 对短暂事件为 true;如果缺失或为 false 则表示持久化事件
typestring事件类型判别标识(见下表)
dataobject事件特定负载

订阅事件

// All events
session.on((event) => {
    console.log(event.type, event.data);
});

// Specific event type — data is narrowed automatically
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

Python、Go 和 .NET 示例请参阅 github/copilot-sdk 仓库。Java 示例请参阅 github/copilot-sdk-java 仓库

提示

Python / Go:这些 SDK 使用单一的 Data 类/结构体,所有可能的字段均为可选/可为空。仅表中列出的字段会在对应事件类型中填充——其余字段为 None / nil

.NET:.NET SDK 为每种事件使用独立的强类型数据类(例如 AssistantMessageDeltaData),因此每种类型仅包含相关字段。

TypeScript:TypeScript SDK 使用判别联合——在匹配 event.type 时,data 负载会自动缩小为对应的结构。

Java:Java SDK 使用带有类型化数据访问器的事件类(例如 AssistantMessageEventSessionIdleEvent)。

助理事件

这些事件跟踪代理的响应生命周期——从回合开始、流式块到最终消息。

assistant.turn_start

在代理开始处理一次回合时发出。

数据字段类型是否必填描述
turnIdstring回合标识符(通常为字符串化的回合编号)
interactionIdstring用于遥测关联的交互标识符

assistant.intent

短暂的。对代理当前正在做的事情进行简短描述,随工作进度更新。

数据字段类型是否必填描述
intentstring可读的意图(例如,“探索代码库”)

assistant.reasoning

模型完整的扩展思考块。推理完成后发出。

数据字段类型是否必填描述
reasoningIdstring此推理块的唯一标识符
contentstring完整的扩展思考文本

assistant.reasoning_delta

短暂的。模型扩展思考的增量块,实时流式传输。

数据字段类型是否必填描述
reasoningIdstring对应 assistant.reasoning 事件的增量
deltaContentstring用于追加到推理内容的文本块

assistant.message

助理对本次 LLM 调用的完整响应。可能包含工具调用请求。

数据字段类型是否必填描述
messageIdstring此消息的唯一标识符
contentstring助理的文本响应
toolRequestsToolRequest[]助理想要发起的工具调用(见下文)
reasoningOpaquestring加密的扩展思考(Anthropic 模型);会话绑定
reasoningTextstring来自扩展思考的可读推理文本
encryptedContentstring加密的推理内容(OpenAI 模型);会话绑定
phasestring生成阶段(例如 "thinking""response"
outputTokensnumberAPI 响应的实际输出 token 数量
interactionIdstring遥测的交互标识符
parentToolCallIdstring当此消息来源于子代理时设置

ToolRequest 字段

字段类型是否必填描述
toolCallIdstring此工具调用的唯一 ID
namestring工具名称(例如 "bash""edit""grep"
argumentsobject工具的已解析参数
type"function" | "custom"调用类型;若缺失则默认 "function"

assistant.message_delta

短暂的。助理文本响应的增量块,实时流式传输。

数据字段类型是否必填描述
messageIdstring对应 assistant.message 事件的增量
deltaContentstring用于追加到消息的文本块
parentToolCallIdstring当来源于子代理时设置

assistant.turn_end

在代理完成一次回合(所有工具执行完毕,最终响应已交付)时发出。

数据字段类型是否必填描述
turnIdstring对应 assistant.turn_start 事件

assistant.usage

短暂的。单次 API 调用的 token 使用量和费用信息。

数据字段类型是否必填描述
modelstring模型标识符(例如 "gpt-4.1"
inputTokensnumber消耗的输入 tokens
outputTokensnumber生成的输出 tokens
cacheReadTokensnumber从提示缓存读取的 tokens
cacheWriteTokensnumber写入提示缓存的 tokens
costnumber计费用的模型倍率费用
durationnumberAPI 调用时长(毫秒)
initiatorstring触发此调用的原因(例如 "sub-agent");用户发起时缺失
apiCallIdstring提供者返回的完成 ID(例如 chatcmpl-abc123
providerCallIdstringGitHub 请求追踪 ID(x-github-request-id
parentToolCallIdstring当使用来源于子代理时设置
quotaSnapshotsRecord<string, QuotaSnapshot>按配额标识符键入的每个配额资源使用情况
copilotUsageCopilotUsageAPI 返回的分项 token 成本细分

assistant.streaming_delta

短暂的。低层网络进度指示器——从流式 API 响应接收的总字节数。

数据字段类型是否必填描述
totalResponseSizeBytesnumber截至目前累计接收的字节数

工具执行事件

这些事件追踪每次工具调用的完整生命周期——从模型请求工具调用到执行完成。

tool.execution_start

在工具开始执行时发出。

数据字段类型是否必填描述
toolCallIdstring此工具调用的唯一标识符
toolNamestring工具名称(例如 "bash""edit""grep"
argumentsobject传递给工具的已解析参数
mcpServerNamestring当工具由 MCP 服务器提供时的 MCP 服务器名称
mcpToolNamestringMCP 服务器上的原始工具名称
parentToolCallIdstring当由子代理调用时设置

tool.execution_partial_result

短暂的。正在运行的工具的增量输出(例如,流式 bash 输出)。

数据字段类型是否必填描述
toolCallIdstring对应 tool.execution_start 事件的增量
partialOutputstring增量输出块

tool.execution_progress

短暂的。正在运行的工具返回的人类可读进度状态(例如 MCP 服务器的进度通知)。

数据字段类型是否必填描述
toolCallIdstring对应 tool.execution_start 事件的增量
progressMessagestring进度状态信息

tool.execution_complete

在工具执行完毕时发出——成功或出错。

数据字段类型是否必填描述
toolCallIdstring对应 tool.execution_start 事件的增量
成功boolean执行是否成功
modelstring生成此工具调用的模型
interactionIdstring交互标识符
isUserRequestedboolean当用户明确请求此工具调用时为 true
result结果成功时存在(见下文)
error{ message, code? }失败时存在
toolTelemetryobject工具特定的遥测
parentToolCallIdstring当由子代理调用时设置

Result 字段

字段类型是否必填描述
contentstring发送给 LLM 的简要结果(可能为节省 token 而截断)
detailedContentstring用于展示的完整结果,保留完整内容如 diff
contentsContentBlock[]结构化内容块(文本、终端、图像、音频、资源)

tool.user_requested

当用户明确请求工具调用时发出(而非模型自行选择调用)。

数据字段类型是否必填描述
toolCallIdstring此工具调用的唯一标识符
toolNamestring用户想要调用的工具名称
argumentsobject调用的参数

会话生命周期事件

session.idle

短暂的。代理已完成所有处理并准备好接收下一条消息。这是回合完全完成的信号。

数据字段类型是否必填描述
backgroundTasksBackgroundTasks代理变为闲置时仍在运行的后台代理/shell

session.error

会话处理期间出现错误。

数据字段类型是否必填描述
errorTypestring错误分类(例如 "authentication""quota""rate_limit"
messagestring可读的错误信息
stackstring错误堆栈追踪
statusCodenumber上游请求的 HTTP 状态码
providerCallIdstring用于服务器端日志关联的 GitHub 请求追踪 ID

session.compaction_start

上下文窗口压缩已开始。数据负载为空({})。

session.compaction_complete

上下文窗口压缩完成。

数据字段类型是否必填描述
成功boolean压缩是否成功
errorstring压缩失败时的错误信息
preCompactionTokensnumber压缩前的 token 数量
postCompactionTokensnumber压缩后的 token 数量
preCompactionMessagesLengthnumber压缩前的消息数量
messagesRemovednumber被移除的消息
tokensRemovednumber被移除的 token
summaryContentstringLLM 生成的压缩历史摘要
checkpointNumbernumber用于恢复的检查点快照编号
checkpointPathstring检查点存储的文件路径
compactionTokensUsed{ input, output, cachedInput }压缩 LLM 调用的 token 使用情况
requestIdstring压缩调用的 GitHub 请求追踪 ID

session.title_changed

短暂的。会话自动生成的标题已更新。

数据字段类型是否必填描述
titlestring新的会话标题

session.context_changed

会话的工作目录或仓库上下文已更改。

数据字段类型是否必填描述
cwdstring当前工作目录
gitRootstringGit 仓库根目录
repositorystring"owner/name" 格式的仓库
branchstring当前 Git 分支

session.usage_info

短暂的。上下文窗口使用快照。

数据字段类型是否必填描述
tokenLimitnumber模型上下文窗口的最大 token 数
currentTokensnumber当前上下文窗口中的 token 数
messagesLengthnumber对话中当前的消息数量

session.task_complete

代理已完成其分配的任务。

数据字段类型是否必填描述
summarystring已完成任务的摘要

session.shutdown

会话已结束。

数据字段类型是否必填描述
shutdownType"routine" | "error"正常关闭或崩溃
errorReasonstringshutdownType"error" 时的错误描述
totalPremiumRequestsnumber已使用的高级 API 请求总数
totalApiDurationMsnumberC累计 API 调用时长(毫秒)
sessionStartTimenumber会话开始时的 Unix 时间戳(毫秒)
codeChanges{ linesAdded, linesRemoved, filesModified }代码更改的整体指标
modelMetricsRecord<string, ModelMetric>按模型划分的使用情况
currentModelstring关闭时选中的模型

权限和用户输入事件

当代理在继续之前需要用户批准或输入时会发出这些事件。

permission.requested

短暂的。代理需要权限才能执行某个操作(运行命令、写文件等)。

数据字段类型是否必填描述
requestIdstring使用此方式通过 session.respondToPermission() 响应
permissionRequestPermissionRequest被请求权限的细节

permissionRequest 是基于 kind 的判别联合

kind关键字段描述
"shell"fullCommandText, intention, commands[], possiblePaths[]执行 shell 命令
"write"fileName, diff, intention, newFileContents?写入/修改文件
"read"path, intention读取文件或目录
"mcp"serverName, toolName, toolTitle, args?, readOnly调用 MCP 工具
"url"url, intention获取 URL
"memory"subject, fact, citations存储记忆
"custom-tool"toolName, toolDescription, args?调用自定义工具

所有 kind 变体还包括一个可选的 toolCallId,用于关联触发请求的工具调用。

permission.completed

短暂的。权限请求已解决。

数据字段类型是否必填描述
requestIdstring对应 permission.requested 事件
result.kindstring以下之一:"approved""denied-by-rules""denied-interactively-by-user""denied-no-approval-rule-and-could-not-request-from-user""denied-by-content-exclusion-policy"

user_input.requested

短暂的。代理向用户提出问题。

数据字段类型是否必填描述
requestIdstring使用此方式通过 session.respondToUserInput() 响应
questionstring向用户展示的问题
choicesstring[]为用户预定义的选择项
allowFreeformboolean是否允许自由文本输入

user_input.completed

短暂的。用户输入请求已解决。

数据字段类型是否必填描述
requestIdstring对应 user_input.requested 事件

elicitation.requested

短暂的。代理需要结构化表单输入(MCP 诱导协议)。

数据字段类型是否必填描述
requestIdstring使用此方式通过 session.respondToElicitation() 响应
messagestring需要哪些信息的描述
mode"form"诱导模式(当前仅 "form"
requestedSchema{ type: "object", properties, required? }描述表单字段的 JSON Schema

elicitation.completed

短暂的。诱导请求已解决。

数据字段类型是否必填描述
requestIdstring对应 elicitation.requested 事件

子代理和技能事件

subagent.started

自定义代理被作为子代理调用。

数据字段类型是否必填描述
toolCallIdstring生成此子代理的父工具调用
agentNamestring子代理的内部名称
agentDisplayNamestring可读的显示名称
agentDescriptionstring子代理的功能描述

subagent.completed

子代理成功完成。

数据字段类型是否必填描述
toolCallIdstring对应 subagent.started 事件
agentNamestring内部名称
agentDisplayNamestring显示名称

subagent.failed

子代理遇到错误。

数据字段类型是否必填描述
toolCallIdstring对应 subagent.started 事件
agentNamestring内部名称
agentDisplayNamestring显示名称
errorstring错误信息

subagent.selected

已选择(推断)一个自定义代理来处理当前请求。

数据字段类型是否必填描述
agentNamestring所选代理的内部名称
agentDisplayNamestring显示名称
toolsstring[] | null该代理可用的工具名称;null 表示全部工具

subagent.deselected

自定义代理被取消选择,返回默认代理。响应负载将为空({})。

skill.invoked

当前对话激活了一个技能。

数据字段类型是否必填描述
namestringSkill name
pathstringSKILL.md 定义文件的路径
contentstring注入对话的完整技能内容
allowedToolsstring[]技能激活期间自动批准的工具
pluginNamestring技能来源的插件
pluginVersionstring插件版本

其他事件

abort

当前回合被中止。

数据字段类型是否必填描述
reasonstring回合被中止的原因(例如 "user initiated"

user.message

用户发送了一条消息。已记录在会话时间线中。

数据字段类型是否必填描述
contentstring用户的消息文本
transformedContentstring预处理后的转换版本
attachmentsAttachment[]文件、目录、选区、blob 或 GitHub 引用附件
来源string消息来源标识符
agentModestring代理模式:"interactive""plan""autopilot""shell"
interactionIdstring交互标识符

system.message

系统或开发者提示被注入对话中。

数据字段类型是否必填描述
contentstring提示文本
role"system" | "developer"消息角色
namestring来源标识符
metadata{ promptVersion?, variables? }提示模板元数据

external_tool.requested

短暂的。代理想要调用外部工具(由 SDK 使用方提供)。

数据字段类型是否必填描述
requestIdstring使用此方式通过 session.respondToExternalTool() 响应
sessionIdstring此请求所属的会话
toolCallIdstringTool call ID for this invocation
toolNamestringName of the external tool
argumentsobjectArguments for the tool

external_tool.completed

短暂的。外部工具请求已解决。

数据字段类型是否必填描述
requestIdstring对应 external_tool.requested 事件

exit_plan_mode.requested

短暂的。代理已创建计划并希望退出计划模式。

数据字段类型是否必填描述
requestIdstring使用此方式通过 session.respondToExitPlanMode() 响应
summarystring计划摘要
planContentstring完整的计划文件内容
actionsstring[]可用的用户操作(例如 approve、edit、reject)
recommendedActionstring建议的操作

exit_plan_mode.completed

短暂的。退出计划模式请求已解决。

数据字段类型是否必填描述
requestIdstring对应 exit_plan_mode.requested 事件

command.queued

短暂的。斜杠命令已排队等待执行。

数据字段类型是否必填描述
requestIdstring使用此方式通过 session.respondToQueuedCommand() 响应
commandstring斜杠命令文本(例如 /help/clear

command.completed

短暂的。排队的命令已解决。

数据字段类型是否必填描述
requestIdstring对应 command.queued 事件

快速参考:代理轮次流程

典型的代理轮次按以下顺序发出事件

assistant.turn_start          → Turn begins
├── assistant.intent          → What the agent plans to do (ephemeral)
├── assistant.reasoning_delta → Streaming thinking chunks (ephemeral, repeated)
├── assistant.reasoning       → Complete thinking block
├── assistant.message_delta   → Streaming response chunks (ephemeral, repeated)
├── assistant.message         → Complete response (may include toolRequests)
├── assistant.usage           → Token usage for this API call (ephemeral)
│
├── [If tools were requested:]
│   ├── permission.requested  → Needs user approval (ephemeral)
│   ├── permission.completed  → Approval result (ephemeral)
│   ├── tool.execution_start  → Tool begins
│   ├── tool.execution_partial_result  → Streaming tool output (ephemeral, repeated)
│   ├── tool.execution_progress        → Progress updates (ephemeral, repeated)
│   ├── tool.execution_complete        → Tool finished
│   │
│   └── [Agent loops: more reasoning → message → tool calls...]
│
assistant.turn_end            → Turn complete
session.idle                  → Ready for next message (ephemeral)

一览所有事件类型

事件类型短暂分类关键数据字段
assistant.turn_start助理turnId, interactionId?
assistant.intent助理intent
assistant.reasoning助理reasoningId, content
assistant.reasoning_delta助理reasoningId, deltaContent
assistant.streaming_delta助理totalResponseSizeBytes
assistant.message助理messageId, content, toolRequests?, outputTokens?, phase?
assistant.message_delta助理messageId, deltaContent, parentToolCallId?
assistant.turn_end助理turnId
assistant.usage助理model, inputTokens?, outputTokens?, cost?, duration?
tool.user_requested工具toolCallId, toolName, arguments?
tool.execution_start工具toolCallId, toolName, arguments?, mcpServerName?
tool.execution_partial_result工具toolCallId, partialOutput
tool.execution_progress工具toolCallId, progressMessage
tool.execution_complete工具toolCallId, success, result?, error?
session.idle会话backgroundTasks?
session.error会话errorType, message, statusCode?
session.compaction_start会话(空)
session.compaction_complete会话success, preCompactionTokens?, summaryContent?
session.title_changed会话title
session.context_changed会话cwd, gitRoot?, repository?, branch?
session.usage_info会话tokenLimit, currentTokens, messagesLength
session.task_complete会话summary?
session.shutdown会话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子代理toolCallId, agentName, agentDisplayName
subagent.completed子代理toolCallId, agentName, agentDisplayName
subagent.failed子代理toolCallId, agentName, error
subagent.selected子代理agentName, agentDisplayName, tools
subagent.deselected子代理(空)
skill.invoked技能name, path, content, allowedTools?
abort控制reason
user.message用户content, attachments?, agentMode?
system.message系统content, role
external_tool.requested外部工具requestId, toolName, arguments?
external_tool.completed外部工具requestId
command.queued命令requestId, command
command.completed命令requestId
exit_plan_mode.requested计划模式requestId, summary, planContent, actions
exit_plan_mode.completed计划模式requestId
© . This site is unofficial and not affiliated with GitHub, Inc.