SessionEvent
来自 Copilot 的所有消息都是Revolution\Copilot\Types\SessionEvent 类。
由于该类使用频率最高,因此加入了 Laravel 风格的便利功能。
content()
获取来自 AI 的最重要的响应消息。
__toString() 的隐式类型转换也返回消息内容。
Event type 的判定
可以使用isAssistantMessage()、isUserMessage()、isIdle()、isAssistantMessageDelta()。
如果有经常使用的 Event type,将来可能还会加入更多辅助函数。
用 is() 可以判定任意 EventType。
type() 返回 SessionEventType enum 的字符串值。
session.autopilot_stopped
SessionEventType::SESSION_AUTOPILOT_STOPPED(session.autopilot_stopped)会在 Autopilot 停止继续处理某个特定请求时触发。
可以通过 $event->data['requestId'] 获取目标消息 ID,通过 $event->data['reason'] 获取停止原因。
此事件并不表示整个会话已进入空闲状态。
failed() / successful()
当事件类型为 SESSION_ERROR 时,failed() 为 true。
successful() 则相反。
为了与 Laravel 的命名保持一致,已从 isError() 改名。
throw()
与 Laravel 的 HTTP API 和 Process API 一样,会保留错误,并可以通过 throw() 抛出异常。
没有错误时不做任何事,因此可以这样写。
SESSION_ERROR 时会抛出 Revolution\Copilot\Exceptions\SessionErrorException。
超时时会抛出 Revolution\Copilot\Exceptions\SessionTimeoutException。
JSON-RPC 的错误会抛出 Revolution\Copilot\Exceptions\JsonRpcException。
Conditionable
可以使用when() 与 unless()。
Dumpable
可以使用dump() 与 dd()。
Tappable
可以使用tap()。
InteractsWithData
此功能仅应用于 SessionEvent 的$data 属性。
可以使用 all()、has()、only()、collect() 等常见辅助函数。
详情请参考 InteractsWithData。
由于 SessionEvent 的 $data 会因 EventType 而结构不同,因此便于按事件访问值。
content() 内部也使用 InteractsWithData。
toArray() / toJson()
可以将整个 SessionEvent 转换为数组或 JSON。
collect() 方法。
因为 $data 已有 InteractsWithData 的 collect()。
如果想对整个事件进行 collection 操作,请使用 Laravel 的 collect() 辅助函数。
broadcast() / broadcastNow()
可以以与 Laravel AI SDK 的 StreamEvent 相同的接口进行广播。
AI SDK 在流式输出时使用它,但在 SessionEvent 中可以用于任意 EventType。
broadcastNow() 不经过队列,立即广播。
事件元数据
从 Copilot CLI 1.0.99 开始,部分事件包含额外的元数据。 SDK 会将这些值原样保存在$data 中,因此你可以通过 $event->data 或 InteractsWithData 的辅助方法访问它们。
Compaction 事件
session.compaction_start 和 session.compaction_complete 中的 data.compactionAttemptId 是用于关联开始事件与完成事件的 ID。
如果涉及模型切换,还会包含 switchTargetModel。
如果切换目标的提示词令牌预算不同,还会包含 targetPromptTokenLimit。
完成事件可能包含 initialModel、model、outcome、outcomeReason、failureReason、tokenAccountingBasis 等字段。
outcome 及各原因字段是将来可能新增取值的字符串。
不要将它们当作固定的 Enum 处理,未知的值也请原样保留。
字段缺失表示未提供该值。请勿推测默认值。
工具执行用量
tool.execution_complete 中的 data.toolUsage 是提供商针对运行时所拥有的工具操作报告的用量。
它与对话模型的 assistant.usage 是分开的用量。
即使工具执行失败,也可能包含已报告的用量。
toolUsage.model 是工具操作所请求的模型,而不是对话模型。
令牌数和计费信息可能只提供一部分。
字段缺失表示不可用,并不表示 0 个令牌。
inputTokensDetails 和 outputTokensDetails 中按模态划分的令牌数是各自合计值中包含的明细。请勿将它们加到合计值上。
toolUsage.requestId 是运行时用于排除重复投递和重放的 ID,并不是上游的计费标识符。
session.usage_checkpoint 和 session.shutdown 中的 data.toolUsageRequestIds 同样是运行时内部的去重元数据,用于标识会计快照中包含的工具操作。
请勿将其当作上游计费 ID。
Fusion 解析事件
当服务器端路由选择了与本地规则不同的工作流时,session.fusion_resolved 中的 data.selectedRuleId 用于标识该服务器规则。
没有替换时会被省略。
MCP 服务器工具加载事件
SessionEventType::SESSION_MCP_SERVER_TOOLS_LOADED(session.mcp_server_tools_loaded)会在 MCP 服务器的工具列表可用时触发。
这是每个连接只触发一次的 ephemeral 事件,不会被持久化。
它包含 data.serverName 和 data.toolCount。
MCP 服务器变为 connected 并不代表工具已加载完成。
离开连接状态后,在下次收到此事件之前,请将其视为加载中。
使用缓存工具时,此事件可能会先于 connected 到达。
指令更新事件
SessionEventType::INSTRUCTION_UPDATE(instruction.update)会在运行时更新权威的开发者指令时触发。该事件从 Copilot CLI 1.0.103 开始新增。
persistent 更新会按事件顺序保留,并在 replay、resume、rewind、fork 和 compaction 之后恢复。
turn 更新是临时的,其 ephemeral 为 true。
这些值以通用数组形式保存,因此未知的 Enum 值会原样传递。
最新信息请参考 GitHub 仓库。