Skip to content

[Agent Runtime] 修复 Pi RPC 控制响应串入活跃 Prompt 事件流 #91

Description

@yetuge

问题描述

PiRpcClient 在仅有一个活跃 Prompt 时,会将未命中 Prompt 请求 ID 的事件回退关联到该 Prompt。当前标准输出分流逻辑又先查找 Prompt、后查找控制请求,因此 abortget_stateset_model 等控制命令的 RPC 响应会同时被当作 Prompt 流事件处理。

这会导致内部控制响应泄漏到事件流与 trace 中;对于携带未知请求 ID 的过期或乱序 RPC 响应,还可能错误影响当前 Prompt,破坏请求之间的隔离。

最小复现

  1. 通过 promptStreaming() 启动一个 Prompt,并让运行时先返回 message_update
  2. 在 Prompt 仍处于活跃状态时调用 stream.abort()
  3. 让运行时返回带独立控制请求 ID 的响应:
{ type: 'response', command: 'abort', id: controlRequestId, success: true }
  1. 遍历 Prompt 事件流。

实际结果

事件流中除 message_update 外,还出现了内部控制响应 response/abort,并会被写入 Prompt trace。

期望结果

  • 与控制请求 ID 匹配的响应只结算对应的 pendingControls,不得进入 Prompt 事件流或 trace。
  • 携带未知显式请求 ID 的 type: 'response' 事件不得回退关联到唯一活跃 Prompt。
  • 无请求 ID 的普通 Agent 流事件仍应保留单 Prompt 回退兼容行为。

影响

  • 污染上层消费的 Prompt 事件流和 trace。
  • UI 或适配层可能误解内部控制响应。
  • 过期、乱序或未知 ID 的 RPC 响应可能错误地拒绝或污染当前 Prompt。

建议修复

  1. 在 Prompt 分流前优先识别并结算匹配的控制响应,处理后立即返回。
  2. 对未命中 Prompt ID 的 type: 'response' 禁止唯一 Prompt 回退。
  3. 增加 abort 控制响应隔离、未知 ID 响应隔离及无 ID Agent 事件兼容的回归测试。

非目标

  • 不修改 Stream Event v1 公共协议。
  • 不修改 renderer/UI 或取消传输协议。
  • 不引入新的公共 API。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

claimedClaimed by a contributor and currently in progress

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions