背景
当前 opencode-a2a-server 在流式请求中,会在 /session/{id}/message HTTP 返回后立即结束本次 A2A 流,并取消 /event SSE 订阅。
但上游 opencode serve 的 bus event 语义里,真正可确认本轮会话处理完成的信号是 session.idle;assistant 正文相关的 message.part.updated / message.part.delta 可能晚于 /session/{id}/message 返回才到达。
这会导致服务端在 assistant 正文尚未送达时就输出 final=true completed,下游最终表现为 Content unavailable。
复现步骤
- 启动
opencode-a2a-server,指向一个正常工作的 opencode serve。
- 发起
message/stream 请求。
- 观察日志:
message.updated 已创建 assistant message,但在 session.idle 到达前,A2A 已发送 completed 并取消 SSE。
- 下游未收到 assistant 正文 artifact。
期望行为
- 流式请求应持续消费
/event,直到收到与目标 sessionID 对应的明确结束信号。
- 成功完成应以
session.idle 为准。
- 失败完成应以
session.error 为准。
- 不应仅凭
/session/{id}/message 返回 200 就结束 A2A 流。
实际行为
/session/{id}/message 返回后立即发出 final=true completed。
- 紧接着取消
/event 的 SSE 读取。
- assistant 正文事件尚未来得及到达,导致输出为空。
验收标准
message/stream 在成功路径上以 session.idle 作为完成信号。
message/stream 在失败路径上以 session.error 作为失败信号。
- 增加回归测试,覆盖“send_message 先返回,assistant part / session.idle 后到”的场景。
- 修复后,下游可稳定收到 assistant 正文 artifact,而不是空完成。
HEAD 快照
git rev-parse HEAD: 5bfa1d2e719a2986e7da3657e133b742cc5bc58d
背景
当前
opencode-a2a-server在流式请求中,会在/session/{id}/messageHTTP 返回后立即结束本次 A2A 流,并取消/eventSSE 订阅。但上游
opencode serve的 bus event 语义里,真正可确认本轮会话处理完成的信号是session.idle;assistant 正文相关的message.part.updated/message.part.delta可能晚于/session/{id}/message返回才到达。这会导致服务端在 assistant 正文尚未送达时就输出
final=true completed,下游最终表现为Content unavailable。复现步骤
opencode-a2a-server,指向一个正常工作的opencode serve。message/stream请求。message.updated已创建 assistant message,但在session.idle到达前,A2A 已发送completed并取消 SSE。期望行为
/event,直到收到与目标sessionID对应的明确结束信号。session.idle为准。session.error为准。/session/{id}/message返回 200 就结束 A2A 流。实际行为
/session/{id}/message返回后立即发出final=true completed。/event的 SSE 读取。验收标准
message/stream在成功路径上以session.idle作为完成信号。message/stream在失败路径上以session.error作为失败信号。HEAD 快照
git rev-parse HEAD:5bfa1d2e719a2986e7da3657e133b742cc5bc58d