fix: abort creation chat sse on result page
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
# 创作 Agent 结果页 SSE 断开修复
|
||||
|
||||
日期:`2026-04-24`
|
||||
|
||||
## 1. 问题
|
||||
|
||||
RPG 世界共创草稿进入生成结果页后,前端仍可能保留上一条聊天消息的 `/messages/stream` 连接。该连接继续接收 `reply_delta` 时,会让结果页阶段仍表现为“聊天还在连着 SSE”。
|
||||
|
||||
## 2. 原因
|
||||
|
||||
当前聊天流式请求由 `streamRpgCreationMessage` 发起,底层使用 `fetch` 读取 SSE `ReadableStream`。旧实现只在请求自然结束后清理 `isStreamingAgentReply`,没有在以下 UI 生命周期主动中止网络流:
|
||||
|
||||
1. 从 `agent-workspace` 跳到 `custom-world-result`。
|
||||
2. 清空或切换 `activeAgentSessionId`。
|
||||
3. 当前入口组件卸载。
|
||||
|
||||
因此,结果页虽然不再展示聊天工作区,但浏览器侧仍可能持有未完成的流读取器。
|
||||
|
||||
## 3. 修复设计
|
||||
|
||||
1. `TextStreamOptions` 增加 `signal?: AbortSignal`,让所有创作 Agent 流式读取都具备统一取消入口。
|
||||
2. RPG 共创 `/messages/stream` 的 `fetch` 透传该 `signal`。
|
||||
3. `useRpgCreationSessionController` 持有当前聊天流的 `AbortController`。
|
||||
4. 当 `selectionStage` 离开 `agent-workspace` / `custom-world-generating`,立即 `abort()` 当前聊天 SSE,并清空临时流式文本。
|
||||
5. session 切换、未登录清理、组件卸载时同样中止旧 SSE,避免慢响应回写旧工作区状态。
|
||||
|
||||
## 4. 验收
|
||||
|
||||
1. 聊天中触发草稿生成并进入结果页后,浏览器 Network 中旧 `/messages/stream` 请求应变为 canceled/aborted 或结束。
|
||||
2. 结果页不再继续追加聊天 `reply_delta`。
|
||||
3. 回到 Agent 工作区后,新的聊天消息会创建新的 SSE,不复用已中止连接。
|
||||
Reference in New Issue
Block a user