问题描述
PiRpcClient 在仅有一个活跃 Prompt 时,会将未命中 Prompt 请求 ID 的事件回退关联到该 Prompt。当前标准输出分流逻辑又先查找 Prompt、后查找控制请求,因此 abort、get_state、set_model 等控制命令的 RPC 响应会同时被当作 Prompt 流事件处理。
这会导致内部控制响应泄漏到事件流与 trace 中;对于携带未知请求 ID 的过期或乱序 RPC 响应,还可能错误影响当前 Prompt,破坏请求之间的隔离。
最小复现
- 通过
promptStreaming() 启动一个 Prompt,并让运行时先返回 message_update。
- 在 Prompt 仍处于活跃状态时调用
stream.abort()。
- 让运行时返回带独立控制请求 ID 的响应:
{ type: 'response', command: 'abort', id: controlRequestId, success: true }
- 遍历 Prompt 事件流。
实际结果
事件流中除 message_update 外,还出现了内部控制响应 response/abort,并会被写入 Prompt trace。
期望结果
- 与控制请求 ID 匹配的响应只结算对应的
pendingControls,不得进入 Prompt 事件流或 trace。
- 携带未知显式请求 ID 的
type: 'response' 事件不得回退关联到唯一活跃 Prompt。
- 无请求 ID 的普通 Agent 流事件仍应保留单 Prompt 回退兼容行为。
影响
- 污染上层消费的 Prompt 事件流和 trace。
- UI 或适配层可能误解内部控制响应。
- 过期、乱序或未知 ID 的 RPC 响应可能错误地拒绝或污染当前 Prompt。
建议修复
- 在 Prompt 分流前优先识别并结算匹配的控制响应,处理后立即返回。
- 对未命中 Prompt ID 的
type: 'response' 禁止唯一 Prompt 回退。
- 增加 abort 控制响应隔离、未知 ID 响应隔离及无 ID Agent 事件兼容的回归测试。
非目标
- 不修改 Stream Event v1 公共协议。
- 不修改 renderer/UI 或取消传输协议。
- 不引入新的公共 API。
问题描述
PiRpcClient在仅有一个活跃 Prompt 时,会将未命中 Prompt 请求 ID 的事件回退关联到该 Prompt。当前标准输出分流逻辑又先查找 Prompt、后查找控制请求,因此abort、get_state、set_model等控制命令的 RPC 响应会同时被当作 Prompt 流事件处理。这会导致内部控制响应泄漏到事件流与 trace 中;对于携带未知请求 ID 的过期或乱序 RPC 响应,还可能错误影响当前 Prompt,破坏请求之间的隔离。
最小复现
promptStreaming()启动一个 Prompt,并让运行时先返回message_update。stream.abort()。实际结果
事件流中除
message_update外,还出现了内部控制响应response/abort,并会被写入 Prompt trace。期望结果
pendingControls,不得进入 Prompt 事件流或 trace。type: 'response'事件不得回退关联到唯一活跃 Prompt。影响
建议修复
type: 'response'禁止唯一 Prompt 回退。非目标