diff --git a/packages/react-headless/src/stream/processStreamedMessage.ts b/packages/react-headless/src/stream/processStreamedMessage.ts index 5c59da1d..567e358b 100644 --- a/packages/react-headless/src/stream/processStreamedMessage.ts +++ b/packages/react-headless/src/stream/processStreamedMessage.ts @@ -35,6 +35,15 @@ export const processStreamedMessage = async ({ let isFirst = true; + let rafId: number | null = null; + const debouncedUpdate = (msg: AssistantMessage) => { + if (rafId !== null) cancelAnimationFrame(rafId); + rafId = requestAnimationFrame(() => { + updateMessage(msg); + rafId = null; + }); + }; + for await (const event of adapter.parse(response)) { switch (event.type) { case EventType.TEXT_MESSAGE_CONTENT: @@ -101,9 +110,16 @@ export const processStreamedMessage = async ({ createMessage(currentMessage); isFirst = false; } else { - updateMessage(currentMessage); + // debounce the message update using raf + debouncedUpdate(currentMessage); } } + if (rafId !== null) { + // flush any update + cancelAnimationFrame(rafId); + updateMessage(currentMessage); + } + return currentMessage; };