fix sse js event

This commit is contained in:
team 1
2026-04-26 20:48:19 +02:00
parent 308e980b4a
commit edf6720940
2 changed files with 27 additions and 5 deletions

View File

@@ -0,0 +1,16 @@
# RetrieX SSE final think cleanup fix
This patch fixes a frontend finalization issue where the SSE stream could receive
`event: done` / `[DONE]`, but the last transient `.think` status such as
"Denke nach..." stayed visible.
The streaming renderer still keeps the latest `.think` block while the answer is
running. On final `done`, it now removes all transient `.think` blocks and also
removes the loader CSS class. This is a UI-only fix and does not change retrieval,
prompting, shop search, scoring, or SSE job logic.
Changed files:
- public/assets/js/base.js
After applying the patch, clear Symfony/browser asset cache as appropriate.

View File

@@ -232,11 +232,16 @@ document.addEventListener('DOMContentLoaded', () => {
return false; return false;
} }
function cleanupThinkSpans(container) { function cleanupThinkSpans(container, final = false) {
if (!container) { if (!container) {
return; return;
} }
if (final) {
removeThinkSpansOnly(container);
return;
}
const thinkSpans = Array.from(container.querySelectorAll('.think')); const thinkSpans = Array.from(container.querySelectorAll('.think'));
if (thinkSpans.length === 0) { if (thinkSpans.length === 0) {
@@ -254,9 +259,9 @@ document.addEventListener('DOMContentLoaded', () => {
removeThinkSpansOnly(container); removeThinkSpansOnly(container);
} }
function renderBubbleContent(bubble, raw) { function renderBubbleContent(bubble, raw, final = false) {
bubble.innerHTML = renderMarkdown(raw); bubble.innerHTML = renderMarkdown(raw);
cleanupThinkSpans(bubble); cleanupThinkSpans(bubble, final);
enhanceChatLinks(bubble); enhanceChatLinks(bubble);
scrollChatToBottom(); scrollChatToBottom();
} }
@@ -333,7 +338,8 @@ document.addEventListener('DOMContentLoaded', () => {
function finalizeStream(bubble, raw) { function finalizeStream(bubble, raw) {
clearScheduledRender(); clearScheduledRender();
renderBubbleContent(bubble, raw); bubble.classList.remove('loader');
renderBubbleContent(bubble, raw, true);
} }
async function releaseStreamResources() { async function releaseStreamResources() {
@@ -567,7 +573,7 @@ document.addEventListener('DOMContentLoaded', () => {
if (raw.trim() !== '') { if (raw.trim() !== '') {
const formattedMessage = `<em>${userMessage}</em>`; const formattedMessage = `<em>${userMessage}</em>`;
raw += raw.trim() === '' ? formattedMessage : `\n\n${formattedMessage}`; raw += raw.trim() === '' ? formattedMessage : `\n\n${formattedMessage}`;
renderBubbleContent(bubble, raw); renderBubbleContent(bubble, raw, true);
} else { } else {
bubble.innerHTML = `<em>${userMessage}</em>`; bubble.innerHTML = `<em>${userMessage}</em>`;
enhanceChatLinks(bubble); enhanceChatLinks(bubble);