summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Peter Christen <mc@yacy.net>2025-11-30 15:40:22 +0100
committerMichael Peter Christen <mc@yacy.net>2025-11-30 15:40:22 +0100
commit88b495ba7a1ecd4a48c95642427dde14be91aa4d (patch)
treeaa4910715cd0244808144c30904254677ac614a3
parent150537c3af4326a7093862a457508e63f1fefad8 (diff)
enable focus on composer during token streaming.
-rw-r--r--htroot/yacychat.html32
1 files changed, 22 insertions, 10 deletions
diff --git a/htroot/yacychat.html b/htroot/yacychat.html
index 509ef7cbe..0fbf64131 100644
--- a/htroot/yacychat.html
+++ b/htroot/yacychat.html
@@ -1090,7 +1090,12 @@
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8');
let assistantText = '';
- let sawFirstToken = false;
+ let sawFirstDelta = false;
+ let focusShown = false;
+ if (typeof onFirstToken === 'function' && !focusShown) {
+ focusShown = true;
+ onFirstToken();
+ }
let autoScroll = true;
const performAutoScroll = () => {
@@ -1117,16 +1122,19 @@
try {
const parsed = JSON.parse(clean);
const delta = parsed?.choices?.[0]?.delta?.content;
- if (delta) {
- if (!sawFirstToken && typeof onFirstToken === 'function') {
- sawFirstToken = true;
- applyMessageContent(assistantNode, 'assistant', '');
+ if (delta) {
+ if (!sawFirstDelta) {
+ sawFirstDelta = true;
+ applyMessageContent(assistantNode, 'assistant', '');
+ if (!focusShown && typeof onFirstToken === 'function') {
+ focusShown = true;
onFirstToken();
}
- assistantText += delta;
- applyMessageContent(assistantNode, 'assistant', assistantText);
- performAutoScroll();
}
+ assistantText += delta;
+ applyMessageContent(assistantNode, 'assistant', assistantText);
+ performAutoScroll();
+ }
} catch (err) {
console.warn('Failed to parse line', line, err);
}
@@ -1138,9 +1146,14 @@
const { value, done: readerDone } = await reader.read();
if (readerDone) break;
const chunk = decoder.decode(value, { stream: true });
+ if (!focusShown && chunk && chunk.trim() && typeof onFirstToken === 'function') {
+ focusShown = true;
+ onFirstToken();
+ }
done = parseChunk(chunk);
}
- if (!sawFirstToken && typeof onFirstToken === 'function') {
+ if (!focusShown && typeof onFirstToken === 'function') {
+ focusShown = true;
onFirstToken();
}
if (pushUserToState) {
@@ -1743,7 +1756,6 @@
clearAttachment();
resizeComposer();
const assistantNode = appendMessage('assistant', 'waiting for an answer...');
- hideComposer();
try {
await streamChat(userMessage, assistantNode, { onFirstToken: showComposer, includeUserInPayload: false, pushUserToState: false });
} catch (err) {