From d93107d1d6b61109b104792c1532451b22ece3ea Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 24 Dec 2024 22:16:22 -0700 Subject: [PATCH] refac --- src/lib/components/chat/Chat.svelte | 30 ++++++++++++++++++++++++++--- src/lib/utils/index.ts | 3 +++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index c3fbefab8..0dc76b0e7 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -43,7 +43,8 @@ getMessageContentParts, extractSentencesForAudio, promptTemplate, - splitStream + splitStream, + sleep } from '$lib/utils'; import { generateChatCompletion } from '$lib/apis/ollama'; @@ -1063,11 +1064,33 @@ } if (choices) { - const value = choices[0]?.delta?.content ?? ''; + let value = choices[0]?.delta?.content ?? ''; if (message.content == '' && value == '\n') { console.log('Empty response'); } else { - message.content += value; + if ($settings?.splitLargeDeltas ?? false) { + if (value.length < 5) { + message.content += value; + } else { + while (value != '') { + const chunkSize = Math.min(Math.floor(Math.random() * 3) + 1, value.length); + const chunk = value.slice(0, chunkSize); + + message.content += chunk; + history.messages[message.id] = message; + + // Do not sleep if the tab is hidden + // Timers are throttled to 1s in hidden tabs + if (document?.visibilityState !== 'hidden') { + await sleep(5); + } + + value = value.slice(chunkSize); + } + } + } else { + message.content += value; + } if (navigator.vibrate && ($settings?.hapticFeedback ?? false)) { navigator.vibrate(5); @@ -1079,6 +1102,7 @@ $config?.audio?.tts?.split_on ?? 'punctuation' ); messageContentParts.pop(); + // dispatch only last sentence and make sure it hasn't been dispatched before if ( messageContentParts.length > 0 && diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 6621db8a4..e4c833723 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -8,6 +8,9 @@ import { TTS_RESPONSE_SPLIT } from '$lib/types'; // Helper functions ////////////////////////// +export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + + function escapeRegExp(string: string): string { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }