背景
当前 opencode-a2a-server 在流式请求里,如果上游 opencode serve 通过 session.error 事件或最终 /session/{id}/message 响应中的 info.error 返回业务失败,服务端仍可能输出 final=true 且 status.state=completed 的 A2A 状态事件。
这会把真实的上游错误伪装成“成功完成但没有正文”,下游通常只会显示 Content unavailable,无法看到实际失败原因。
复现步骤
- 启动
opencode-a2a-server,指向一个可返回上游业务错误的 opencode serve。
- 发起
message/stream 请求。
- 让上游在流中产生
session.error,或让最终 /session/{id}/message 返回 info.error。
- 观察 A2A 输出事件。
期望行为
- 当上游出现
session.error 或最终 info.error 时,A2A 任务应进入失败态,而不是 completed。
- 下游应能看到可读的错误摘要,而不是空内容完成。
- 如果上游已经失败,不应再输出误导性的成功完成事件。
实际行为
- A2A 输出
working 后直接输出 final=true 的 completed 状态。
- 输出中没有正文 artifact。
usage 通常为全 0。
- 下游最终显示
Content unavailable,掩盖了上游真实错误。
验收标准
session.error 能被记录并影响最终状态决策。
/session/{id}/message 返回 info.error 时,服务端输出失败态而不是成功完成态。
- 失败输出包含简明的上游错误摘要。
- 补充覆盖
session.error 和最终 info.error 的回归测试。
HEAD 快照
git rev-parse HEAD: aa72fd297029ab53c6b4c7ec010dded3c4b4c938
背景
当前
opencode-a2a-server在流式请求里,如果上游opencode serve通过session.error事件或最终/session/{id}/message响应中的info.error返回业务失败,服务端仍可能输出final=true且status.state=completed的 A2A 状态事件。这会把真实的上游错误伪装成“成功完成但没有正文”,下游通常只会显示
Content unavailable,无法看到实际失败原因。复现步骤
opencode-a2a-server,指向一个可返回上游业务错误的opencode serve。message/stream请求。session.error,或让最终/session/{id}/message返回info.error。期望行为
session.error或最终info.error时,A2A 任务应进入失败态,而不是completed。实际行为
working后直接输出final=true的completed状态。usage通常为全 0。Content unavailable,掩盖了上游真实错误。验收标准
session.error能被记录并影响最终状态决策。/session/{id}/message返回info.error时,服务端输出失败态而不是成功完成态。session.error和最终info.error的回归测试。HEAD 快照
git rev-parse HEAD:aa72fd297029ab53c6b4c7ec010dded3c4b4c938