summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--htroot/yacychat.html62
-rw-r--r--source/net/yacy/http/servlets/RAGProxyServlet.java4
2 files changed, 35 insertions, 31 deletions
diff --git a/htroot/yacychat.html b/htroot/yacychat.html
index 120efb8bc..d8fc210dc 100644
--- a/htroot/yacychat.html
+++ b/htroot/yacychat.html
@@ -1155,40 +1155,42 @@
}
};
+ const processLine = line => {
+ const trimmed = (line || '').trim();
+ if (!trimmed) return false;
+ if (trimmed === 'data: [DONE]' || trimmed === '[DONE]') return true;
+ if (!trimmed.startsWith('data:')) return false;
+ const clean = trimmed.replace(/^data:\s*/i, '');
+ if (!clean) return false;
+ try {
+ const parsed = JSON.parse(clean);
+ applySearchAttachment(parsed);
+ const delta = parsed?.choices?.[0]?.delta?.content;
+ if (delta) {
+ if (!sawFirstDelta) {
+ sawFirstDelta = true;
+ applyMessageContent(assistantNode, 'assistant', '');
+ if (!focusShown && typeof onFirstToken === 'function') {
+ focusShown = true;
+ onFirstToken();
+ }
+ }
+ assistantText += delta;
+ applyMessageContent(assistantNode, 'assistant', assistantText);
+ performAutoScroll();
+ }
+ } catch (err) {
+ console.warn('Failed to parse line', trimmed, err);
+ }
+ return false;
+ };
+
const parseChunk = chunk => {
pending += chunk;
const lines = pending.split(/\r?\n/);
pending = lines.pop() || '';
- for (const raw of lines) {
- const fragments = raw.split(/(?=data:\s*)/).map(f => f.trim()).filter(Boolean);
- for (const line of fragments) {
- if (line === 'data: [DONE]' || line === '[DONE]') {
- return true;
- }
- if (!line.startsWith('data:')) continue;
- const clean = line.replace(/^data:\s*/i, '');
- if (!clean) continue;
- try {
- const parsed = JSON.parse(clean);
- applySearchAttachment(parsed);
- const delta = parsed?.choices?.[0]?.delta?.content;
- if (delta) {
- if (!sawFirstDelta) {
- sawFirstDelta = true;
- applyMessageContent(assistantNode, 'assistant', '');
- if (!focusShown && typeof onFirstToken === 'function') {
- focusShown = true;
- onFirstToken();
- }
- }
- assistantText += delta;
- applyMessageContent(assistantNode, 'assistant', assistantText);
- performAutoScroll();
- }
- } catch (err) {
- console.warn('Failed to parse line', line, err);
- }
- }
+ for (const line of lines) {
+ if (processLine(line)) return true;
}
return false;
};
diff --git a/source/net/yacy/http/servlets/RAGProxyServlet.java b/source/net/yacy/http/servlets/RAGProxyServlet.java
index 0f37915e6..f45d3b7c1 100644
--- a/source/net/yacy/http/servlets/RAGProxyServlet.java
+++ b/source/net/yacy/http/servlets/RAGProxyServlet.java
@@ -207,6 +207,8 @@ public class RAGProxyServlet extends HttpServlet {
in.close();
inputQueue.put(POISON);
} catch (IOException | InterruptedException e) {
+ } finally {
+ try {inputQueue.put(POISON);} catch (InterruptedException e) {}
}
});
readerThread.start();
@@ -226,7 +228,7 @@ public class RAGProxyServlet extends HttpServlet {
inputLine = inputLine.substring(0, p) + j.toString();
}
}
- out.print(inputLine); // i.e. data: {"id":"chatcmpl-69","object":"chat.completion.chunk","created":1715908287,"model":"llama3:8b","system_fingerprint":"fp_ollama","choices":[{"index":0,"delta":{"role":"assistant","content":"ߘŠ"},"finish_reason":null}]}
+ out.println(inputLine); // i.e. data: {"id":"chatcmpl-69","object":"chat.completion.chunk","created":1715908287,"model":"llama3:8b","system_fingerprint":"fp_ollama","choices":[{"index":0,"delta":{"role":"assistant","content":"ߘŠ"},"finish_reason":null}]}
out.flush();
count++;
}