diff --git a/web/pages/Assistants.tsx b/web/pages/Assistants.tsx index 73bac32..3b3eb3b 100644 --- a/web/pages/Assistants.tsx +++ b/web/pages/Assistants.tsx @@ -2007,7 +2007,19 @@ export const DebugDrawer: React.FC<{ const delta = String(payload.text || ''); if (!delta) return; setMessages((prev) => { - const idx = assistantDraftIndexRef.current; + let idx = assistantDraftIndexRef.current; + if (idx === null || !prev[idx] || prev[idx].role !== 'model') { + // Tool records can be appended between assistant chunks; recover the + // latest model row instead of creating a duplicate assistant row. + for (let i = prev.length - 1; i >= 0; i -= 1) { + if (prev[i]?.role === 'model') { + idx = i; + assistantDraftIndexRef.current = i; + break; + } + if (prev[i]?.role === 'user') break; + } + } if (idx === null || !prev[idx] || prev[idx].role !== 'model') { const last = prev[prev.length - 1]; if (last?.role === 'model' && last.text === delta) { @@ -2027,8 +2039,17 @@ export const DebugDrawer: React.FC<{ if (type === 'assistant.response.final') { const finalText = String(payload.text || ''); setMessages((prev) => { - const idx = assistantDraftIndexRef.current; + let idx = assistantDraftIndexRef.current; assistantDraftIndexRef.current = null; + if (idx === null || !prev[idx] || prev[idx].role !== 'model') { + for (let i = prev.length - 1; i >= 0; i -= 1) { + if (prev[i]?.role === 'model') { + idx = i; + break; + } + if (prev[i]?.role === 'user') break; + } + } if (idx !== null && prev[idx] && prev[idx].role === 'model') { const next = [...prev]; next[idx] = { ...next[idx], text: finalText || next[idx].text };