diff --git a/wwwroot/js/chat.js b/wwwroot/js/chat.js index 19c8767..547e272 100644 --- a/wwwroot/js/chat.js +++ b/wwwroot/js/chat.js @@ -139,6 +139,7 @@ async function sendMessage() { let fullText = ''; let currentToolBox = null; + let _afterWebSearch = false; // true wenn gerade eine Web-Search beendet wurde _chatAbandoned = false; @@ -166,8 +167,14 @@ async function sendMessage() { switch (eventType) { case 'text_start': - endStreamBubble(); - startStreamBubble(); + if (_afterWebSearch) { + // Nach Web-Search: letzte Bubble wiederverwenden statt neue + _afterWebSearch = false; + resumeStreamBubble(); + } else { + endStreamBubble(); + startStreamBubble(); + } break; case 'text_delta': @@ -180,6 +187,7 @@ async function sendMessage() { break; case 'tool_start': + _afterWebSearch = false; endStreamBubble(); if (isToolVisible(data.name)) { currentToolBox = addToolBoxLoading(data.name); @@ -196,7 +204,7 @@ async function sendMessage() { break; case 'web_search_start': - endStreamBubble(); + // Bubble NICHT beenden – Text wird nach Search fortgesetzt currentToolBox = addToolBoxLoading('web_search'); break; @@ -205,9 +213,11 @@ async function sendMessage() { finishToolBox(currentToolBox, { name: 'web_search', result: 'Suche abgeschlossen', isError: false }); } currentToolBox = null; + _afterWebSearch = true; break; case 'review_start': + _afterWebSearch = false; endStreamBubble(); addReviewBubble('start', data); break; @@ -229,6 +239,7 @@ async function sendMessage() { break; case 'finalizer_start': + _afterWebSearch = false; endStreamBubble(); addReviewBubble('start', data, 'finalizer'); break; @@ -246,11 +257,13 @@ async function sendMessage() { break; case 'error': + _afterWebSearch = false; endStreamBubble(); addErrorBubble(data.error, true); break; case 'done': + _afterWebSearch = false; endStreamBubble(); if (data.stopReason === 'max_tokens') { addWarningBubble('Antwort wurde abgeschnitten (max_tokens erreicht). Bitte frage nach dem Rest.', true); diff --git a/wwwroot/js/ui.js b/wwwroot/js/ui.js index 158af23..f72b972 100644 --- a/wwwroot/js/ui.js +++ b/wwwroot/js/ui.js @@ -749,12 +749,16 @@ function finalizeReviewBubble(type, data, agentType) { let _streamDiv = null; let _streamText = ''; +let _lastStreamDiv = null; +let _lastStreamText = ''; function startStreamBubble() { _streamDiv = document.createElement('div'); _streamDiv.className = 'msg assistant markdown streamed'; _streamDiv.innerHTML = '
'; _streamText = ''; + _lastStreamDiv = null; + _lastStreamText = ''; chatEl().appendChild(_streamDiv); scrollDown(); } @@ -786,10 +790,24 @@ function endStreamBubble() { wrapKreaGalleries(_streamDiv); } } + _lastStreamDiv = _streamDiv; + _lastStreamText = _streamText; _streamDiv = null; _streamText = ''; } +function resumeStreamBubble() { + // Letzte finalisierte Bubble wiederverwenden (z.B. nach Web-Search) + if (_lastStreamDiv && _lastStreamDiv.parentNode) { + _streamDiv = _lastStreamDiv; + _streamText = _lastStreamText; + } else { + startStreamBubble(); + } + _lastStreamDiv = null; + _lastStreamText = ''; +} + // ── Tool Call Visibility ── const MODIFICATION_TOOLS = ['write_file', 'edit_file', 'delete_file', 'memory_write'];