Skip to content

Commit 98d9eaa

Browse files
committed
perf: skip deep clone per streaming token in ResponseMessage
1 parent 809f591 commit 98d9eaa

2 files changed

Lines changed: 9 additions & 7 deletions

File tree

src/lib/components/chat/Chat.svelte

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -475,12 +475,8 @@
475475
const type = event?.data?.type ?? null;
476476
const data = event?.data?.data ?? null;
477477
478-
if (type === 'status') {
479-
if (message?.statusHistory) {
480-
message.statusHistory.push(data);
481-
} else {
482-
message.statusHistory = [data];
483-
}
478+
if (type === 'status') {
479+
message.statusHistory = [...(message?.statusHistory ?? []), data];
484480
} else if (type === 'chat:completion') {
485481
chatCompletionEventHandler(data, message, event.chat_id);
486482
} else if (type === 'chat:tasks:cancel') {

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,13 @@
133133
message.done !== source.done ||
134134
message.output?.length !== source.output?.length
135135
) {
136-
message = structuredClone(source);
136+
if (!message.done && source.done) {
137+
// done just flipped: full clone to snapshot final state (info, usage, etc.)
138+
message = structuredClone(source);
139+
} else {
140+
// mid-stream: shallow copy keeps all fields fresh without deep recursion
141+
message = { ...source };
142+
}
137143
} else if (!equal(message, source)) {
138144
// Slow path: full comparison for infrequent changes (sources, annotations, status, etc.)
139145
message = structuredClone(source);

0 commit comments

Comments
 (0)