fix(botops): resolve duplicate AI response rendering in ChatView
Root cause: aibox.py think_and_respond recursively calls itself after tool execution, and each recursive call's complete callback carries only the final-round full_response. The old finish_ai logic treated complete as a full-text alignment signal — when full_text != self._ai_text (which always happened after recursive tool calls because _ai_text accumulated all chunks while complete only held the last round), it triggered remove+remount, causing visible duplicate/flash of AI responses. A secondary issue was dialogue_ended arriving before complete, which made a second finish_ai call remount the message a second time. Changes: - Remove the full-text replacement branch in finish_ai; chunk streaming is now the authoritative content source, complete is a finalization signal only - Add _ai_finalized flag: start_ai resets it, finish_ai sets it; repeated finish_ai calls (dialogue_ended + complete) return early to prevent remount - append_ai drops late chunks after finalization to avoid dirty appends - Empty pre-built widget without chunks still gets filled via w.update(full_text) - Full lost-frame fallback (no widget + full_text) is preserved - Update BotOps/README.md protocol section to reflect new complete semantics
This commit is contained in:
1 parent
f003b4dfaa
commit
1b9e6f6b3a
2 files changed
+40
-17
No files matched your search
+6
-1
@@ -58,4 +58,9 @@ BotOps/
|
||||
|
||||
与 aibox 服务端协议完全兼容(详见 aibox/client.py 注释):
|
||||
- 发送:`{"type":"message","content":...}` / `{"type":"command","command":"/..."}` / `{"type":"interrupt",...}`
|
||||
- 接收:`chunk`(**增量片段**,服务端 `chunk_buffer` 发送后即清零,前端直接拼接)/ `complete`(**完整全文**,用于对齐已显示内容)/ `line`(过程行:🔧 工具调用提示、工具输出、💬 助手前缀,路由到任务侧栏)/ `reasoning`(思考流,仅服务端 debug_level≥3 发送)/ `dialogue_ended` / `dialogue_reset` / `task_added` / `task_process` / `task_status` / `task_error` / `interrupt_ack` / `error` / `info` / `command_result` / `connection_ack` / `notification` / `pong`
|
||||
- 接收:
|
||||
- `chunk`(**增量片段**):服务端 `chunk_buffer` 发送后即清零,前端直接 `append_ai` 拼接,为内容权威来源
|
||||
- `complete`(**收尾信号**):chunk 流式已完整渲染,complete 仅用于收尾;仅在完全丢帧(未收到任何 chunk)时用 full_text 补建消息,**不再做全文替换对齐**(避免服务端递归调用工具后 complete 只含最后一轮内容导致重复渲染)
|
||||
- `line`(过程行):🔧 工具调用提示、工具输出、💬 助手前缀,路由到任务侧栏;助手前缀/思考提示在聊天区已由 AI 消息框承载,不重复展示
|
||||
- `reasoning`(思考流):仅服务端 debug_level≥3 发送,记入任务侧栏
|
||||
- `dialogue_ended` / `dialogue_reset` / `task_added` / `task_process` / `task_status` / `task_error` / `interrupt_ack` / `error` / `info` / `command_result` / `connection_ack` / `notification` / `pong`
|
||||
Reference in new issue
Block a user