From 6df87fe3991da851ffaef600072c8a021819e9f4 Mon Sep 17 00:00:00 2001 From: oudecheng <13802883547@139.com> Date: Tue, 7 Jul 2026 11:22:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AD=90=E6=99=BA=E8=83=BD=E4=BD=93?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=B6=88=E6=81=AF=E5=8E=BB=E9=87=8D=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=8C=89=20id+type,=E4=BF=AE=E5=A4=8D=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=8A=B6=E6=80=81=E5=8D=A1=E5=9C=A8=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端为同一次工具调用的 tool_call/tool_result/tool_pending 生成相同的 id(= tool_call_id),上一提交的去重逻辑仅按 id 判断,导致 tool_result 被 tool_call 误判为重复而跳过,App.tsx 合并逻辑收不到 tool_result,工具永远停留在 calling 状态。 改为按 id + type 去重:同类型消息不会重复(解决 load_task_messages 并发重复),不同类型消息(tool_call vs tool_result)不会被误伤(修复工具状态卡死)。 同时修复 appendToSubAgentViewMessage 和 appendToSubAgentLayerMessage 两处。 --- web/src/hooks/useChat.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/web/src/hooks/useChat.ts b/web/src/hooks/useChat.ts index 703dbe6..12468d6 100644 --- a/web/src/hooks/useChat.ts +++ b/web/src/hooks/useChat.ts @@ -387,8 +387,10 @@ export function useChat(): UseChatReturn { return newStack } } else if (message.type === 'tool_call' || message.type === 'tool_result' || message.type === 'tool_pending') { - // 按 id 去重,避免 load_task_messages 并发调用导致重复 - const exists = top.messages.some(m => m.id === chatMsg.id) + // 按 id + type 去重,避免 load_task_messages 并发调用导致重复。 + // 注意:后端为同一次工具调用的 tool_call/tool_result/tool_pending 生成相同的 id(= tool_call_id), + // 仅按 id 去重会误伤 tool_result,导致工具永远停留在 calling 状态。 + const exists = top.messages.some(m => m.id === chatMsg.id && m.type === chatMsg.type) if (exists) return prev } const newStack = [...prev] @@ -464,7 +466,8 @@ export function useChat(): UseChatReturn { return newStack } } else if (message.type === 'tool_call' || message.type === 'tool_result' || message.type === 'tool_pending') { - const exists = layer.messages.some(m => m.id === chatMsg.id) + // 按 id + type 去重(同上,三者共享 id,必须加 type 区分) + const exists = layer.messages.some(m => m.id === chatMsg.id && m.type === chatMsg.type) if (exists) return prev } const newStack = [...prev]