fix sse js event
This commit is contained in:
16
RETRIEX_SSE_FINAL_THINK_CLEANUP_FIX_README.md
Normal file
16
RETRIEX_SSE_FINAL_THINK_CLEANUP_FIX_README.md
Normal 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.
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user