diff --git a/app/frontend/src/components/TextChat.jsx b/app/frontend/src/components/TextChat.jsx
index 59e53f8..abf5a43 100644
--- a/app/frontend/src/components/TextChat.jsx
+++ b/app/frontend/src/components/TextChat.jsx
@@ -909,17 +909,17 @@ export function MarkdownRenderer({ content }) {
return
{parseInlineMarkdown(block.content)}
;
case "ul":
return (
-
+
{block.items.map((item, itemIdx) => (
- - {parseInlineMarkdown(item)}
+ - {parseInlineMarkdown(item)}
))}
);
case "ol":
return (
-
+
{block.items.map((item, itemIdx) => (
- - {parseInlineMarkdown(item)}
+ - {parseInlineMarkdown(item)}
))}
);
diff --git a/app/frontend/src/services/api.js b/app/frontend/src/services/api.js
index b1f7858..71ab822 100644
--- a/app/frontend/src/services/api.js
+++ b/app/frontend/src/services/api.js
@@ -405,23 +405,28 @@ export async function streamChatWithLlm(messages, options = {}, onToken = () =>
let timings = null;
const consumeEvent = (eventText) => {
- const data = eventText
- .split(/\r?\n/)
- .filter((line) => line.startsWith("data:"))
- .map((line) => line.slice(5).trimStart())
- .join("\n")
- .trim();
- if (!data || data === "[DONE]") return data === "[DONE]";
+ try {
+ const data = eventText
+ .split(/\r?\n/)
+ .filter((line) => line.startsWith("data:"))
+ .map((line) => line.slice(5).trimStart())
+ .join("\n")
+ .trim();
+ if (!data || data === "[DONE]") return data === "[DONE]";
- const parsed = JSON.parse(data);
- const token = parsed.choices?.[0]?.delta?.content || "";
- if (token) {
- content += token;
- onToken(token, content);
+ const parsed = JSON.parse(data);
+ const token = parsed.choices?.[0]?.delta?.content || "";
+ if (token) {
+ content += token;
+ onToken(token, content);
+ }
+ if (parsed.usage) usage = parsed.usage;
+ if (parsed.timings) timings = parsed.timings;
+ return false;
+ } catch (err) {
+ console.warn("Failed to parse EventStream JSON:", eventText, err);
+ return false;
}
- if (parsed.usage) usage = parsed.usage;
- if (parsed.timings) timings = parsed.timings;
- return false;
};
let finished = false;
diff --git a/scripts/serve.cjs b/scripts/serve.cjs
index c5f492d..017522a 100644
--- a/scripts/serve.cjs
+++ b/scripts/serve.cjs
@@ -3440,7 +3440,10 @@ async function doLlmChat(req, res, body, retryCount = 0) {
"Cache-Control": "no-cache, no-transform",
"Connection": "keep-alive",
"X-Accel-Buffering": "no",
+ "X-Content-Type-Options": "nosniff",
});
+ const socket = res.socket || res.connection;
+ socket?.setNoDelay?.(true);
res.flushHeaders?.();
clientRes.on("data", (chunk) => res.write(chunk));
clientRes.on("end", () => res.end());