diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 113992a03..2d4dc740e 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -121,8 +121,16 @@ let message: MessageType = JSON.parse(JSON.stringify(history.messages[messageId])); $: if (history.messages) { - if (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) { - message = JSON.parse(JSON.stringify(history.messages[messageId])); + const source = history.messages[messageId]; + if (source) { + // Fast path: O(1) check on the fields that change most often (content during streaming, done at end) + // Avoids 2x O(n) JSON.stringify calls that are always true during streaming anyway + if (message.content !== source.content || message.done !== source.done) { + message = JSON.parse(JSON.stringify(source)); + } else if (JSON.stringify(message) !== JSON.stringify(source)) { + // Slow path: full comparison for infrequent changes (sources, annotations, status, etc.) + message = JSON.parse(JSON.stringify(source)); + } } }