Skip to content

Commit f4ae514

Browse files
committed
perf: skip deep clone of message during streaming
During streaming, use a direct reference to the source message instead of JSON.stringify comparison + JSON.parse deep clone on every token. All mutation controls (edit, rate, feedback) are gated behind message.done, so direct reference is safe during active streaming. A deep clone is performed once when streaming completes.
1 parent f1899da commit f4ae514

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

src/lib/components/chat/Messages/ResponseMessage.svelte

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,18 @@
120120
export let selectedModels = [];
121121
122122
let message: MessageType = JSON.parse(JSON.stringify(history.messages[messageId]));
123+
let streaming = false;
124+
123125
$: if (history.messages) {
124-
if (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {
125-
message = JSON.parse(JSON.stringify(history.messages[messageId]));
126+
const source = history.messages[messageId];
127+
if (source && !source.done) {
128+
// During streaming: use direct reference to avoid costly serialization.
129+
// All mutation controls (edit, rate, feedback) are gated behind message.done.
130+
message = source;
131+
streaming = true;
132+
} else if (streaming || JSON.stringify(message) !== JSON.stringify(source)) {
133+
message = JSON.parse(JSON.stringify(source));
134+
streaming = false;
126135
}
127136
}
128137

0 commit comments

Comments
 (0)