diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 98277867b..eca811444 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -403,7 +403,7 @@ if (inputFiles && inputFiles.length > 0) { inputFiles.forEach((file) => { console.log(file, file.name.split('.').at(-1)); - if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) { + if (['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])) { if (visionCapableState == 'none') { toast.error($i18n.t('Selected models do not support image inputs')); return; @@ -599,7 +599,9 @@ if (inputFiles && inputFiles.length > 0) { const _inputFiles = Array.from(inputFiles); _inputFiles.forEach((file) => { - if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) { + if ( + ['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type']) + ) { if (visionCapableState === 'none') { toast.error($i18n.t('Selected models do not support image inputs')); inputFiles = null; @@ -1079,7 +1081,7 @@ id="send-message-button" class="{prompt !== '' ? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 ' - : 'text-white bg-gray-100 dark:text-gray-900 dark:bg-gray-800 disabled'} transition rounded-full p-1.5 self-center" + : 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center" type="submit" disabled={prompt === ''} > diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index b99ebc172..f805c83e3 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -1,7 +1,7 @@ + +
+
+ {#each Object.keys(groupedMessages) as model} + {#if groupedMessagesIdx[model] !== undefined && groupedMessages[model].messages.length > 0} + + + +
{ + currentMessageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id; + + let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id; + + console.log(messageId); + let messageChildrenIds = history.messages[messageId].childrenIds; + + while (messageChildrenIds.length !== 0) { + messageId = messageChildrenIds.at(-1); + messageChildrenIds = history.messages[messageId].childrenIds; + } + + history.currentId = messageId; + dispatch('change'); + }} + > + m.id)} + isLastMessage={true} + {updateChatMessages} + {confirmEditResponseMessage} + showPreviousMessage={() => { + groupedMessagesIdx[model] = Math.max(0, groupedMessagesIdx[model] - 1); + let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id; + + console.log(messageId); + let messageChildrenIds = history.messages[messageId].childrenIds; + + while (messageChildrenIds.length !== 0) { + messageId = messageChildrenIds.at(-1); + messageChildrenIds = history.messages[messageId].childrenIds; + } + + history.currentId = messageId; + + dispatch('change'); + }} + showNextMessage={() => { + groupedMessagesIdx[model] = Math.min( + groupedMessages[model].messages.length - 1, + groupedMessagesIdx[model] + 1 + ); + + let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id; + console.log(messageId); + + let messageChildrenIds = history.messages[messageId].childrenIds; + + while (messageChildrenIds.length !== 0) { + messageId = messageChildrenIds.at(-1); + messageChildrenIds = history.messages[messageId].childrenIds; + } + + history.currentId = messageId; + + dispatch('change'); + }} + {rateMessage} + {copyToClipboard} + {continueGeneration} + regenerateResponse={async (message) => { + regenerateResponse(message); + await tick(); + groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1; + }} + on:save={async (e) => { + console.log('save', e); + + const message = e.detail; + history.messages[message.id] = message; + await updateChatById(localStorage.token, chatId, { + messages: messages, + history: history + }); + }} + /> +
+ {/if} + {/each} +
+
diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index b3e23e3f2..581441977 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -69,7 +69,7 @@ let selectedCitation = null; - $: tokens = marked.lexer(sanitizeResponseContent(message.content)); + $: tokens = marked.lexer(sanitizeResponseContent(message?.content)); const renderer = new marked.Renderer(); @@ -499,7 +499,7 @@ class=" flex justify-start overflow-x-auto buttons text-gray-600 dark:text-gray-500" > {#if siblings.length > 1} -
+
{siblings.indexOf(message.id) + 1}/{siblings.length}
@@ -894,7 +894,9 @@ class="{isLastMessage ? 'visible' : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button" - on:click={regenerateResponse} + on:click={() => { + regenerateResponse(message); + }} > {/if} -
+
{#if !($settings?.chatBubble ?? true)}
diff --git a/src/lib/components/chat/Settings/Account.svelte b/src/lib/components/chat/Settings/Account.svelte index 978c1b9b6..4b02f082c 100644 --- a/src/lib/components/chat/Settings/Account.svelte +++ b/src/lib/components/chat/Settings/Account.svelte @@ -127,7 +127,7 @@ if ( files.length > 0 && - ['image/gif', 'image/jpeg', 'image/png'].includes(files[0]['type']) + ['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(files[0]['type']) ) { reader.readAsDataURL(files[0]); } diff --git a/src/lib/components/chat/Settings/Personalization.svelte b/src/lib/components/chat/Settings/Personalization.svelte index 2a339407e..d2528d743 100644 --- a/src/lib/components/chat/Settings/Personalization.svelte +++ b/src/lib/components/chat/Settings/Personalization.svelte @@ -5,12 +5,16 @@ import { config, models, settings, user } from '$lib/stores'; import { createEventDispatcher, onMount, getContext, tick } from 'svelte'; import { toast } from 'svelte-sonner'; + import ManageModal from './Personalization/ManageModal.svelte'; + import Tooltip from '$lib/components/common/Tooltip.svelte'; const dispatch = createEventDispatcher(); const i18n = getContext('i18n'); export let saveSettings: Function; + let showManageModal = false; + // Addons let enableMemory = true; @@ -20,6 +24,8 @@ }); + +
{ @@ -29,9 +35,15 @@
-
- {$i18n.t('Memory')} ({$i18n.t('Beta')}) -
+ +
+ {$i18n.t('Memory')} + + ({$i18n.t('Experimental')}) +
+
{ + showManageModal = true; + }} > Manage diff --git a/src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte b/src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte new file mode 100644 index 000000000..a3a74c19b --- /dev/null +++ b/src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte @@ -0,0 +1,105 @@ + + + +
+
+
{$i18n.t('Add Memory')}
+ +
+ +
+
+ { + submitHandler(); + }} + > +
+