diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index b99ebc172..1a9ca373f 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 (model) => { + regenerateResponse(model); + 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 731af8edf..0b1038bd9 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.model); + }} > 0 ? files : undefined, + models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx), timestamp: Math.floor(Date.now() / 1000) // Unix epoch }; @@ -250,48 +251,50 @@ } }; - const sendPrompt = async (prompt, parentId) => { + const sendPrompt = async (prompt, parentId, modelId = null) => { const _chatId = JSON.parse(JSON.stringify($chatId)); await Promise.all( - (atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(async (modelId) => { - console.log('modelId', modelId); - const model = $models.filter((m) => m.id === modelId).at(0); + (modelId ? [modelId] : atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map( + async (modelId) => { + console.log('modelId', modelId); + const model = $models.filter((m) => m.id === modelId).at(0); - if (model) { - // Create response message - let responseMessageId = uuidv4(); - let responseMessage = { - parentId: parentId, - id: responseMessageId, - childrenIds: [], - role: 'assistant', - content: '', - model: model.id, - timestamp: Math.floor(Date.now() / 1000) // Unix epoch - }; + if (model) { + // Create response message + let responseMessageId = uuidv4(); + let responseMessage = { + parentId: parentId, + id: responseMessageId, + childrenIds: [], + role: 'assistant', + content: '', + model: model.id, + timestamp: Math.floor(Date.now() / 1000) // Unix epoch + }; - // Add message to history and Set currentId to messageId - history.messages[responseMessageId] = responseMessage; - history.currentId = responseMessageId; + // Add message to history and Set currentId to messageId + history.messages[responseMessageId] = responseMessage; + history.currentId = responseMessageId; - // Append messageId to childrenIds of parent message - if (parentId !== null) { - history.messages[parentId].childrenIds = [ - ...history.messages[parentId].childrenIds, - responseMessageId - ]; + // Append messageId to childrenIds of parent message + if (parentId !== null) { + history.messages[parentId].childrenIds = [ + ...history.messages[parentId].childrenIds, + responseMessageId + ]; + } + + if (model?.external) { + await sendPromptOpenAI(model, prompt, responseMessageId, _chatId); + } else if (model) { + await sendPromptOllama(model, prompt, responseMessageId, _chatId); + } + } else { + toast.error($i18n.t(`Model {{modelId}} not found`, { modelId })); } - - if (model?.external) { - await sendPromptOpenAI(model, prompt, responseMessageId, _chatId); - } else if (model) { - await sendPromptOllama(model, prompt, responseMessageId, _chatId); - } - } else { - toast.error($i18n.t(`Model {{modelId}} not found`, { modelId })); } - }) + ) ); await chats.set(await getChatList(localStorage.token)); @@ -756,7 +759,7 @@ console.log('stopResponse'); }; - const regenerateResponse = async () => { + const regenerateResponse = async (modelId) => { console.log('regenerateResponse'); if (messages.length != 0 && messages.at(-1).done == true) { messages.splice(messages.length - 1, 1); @@ -765,7 +768,7 @@ let userMessage = messages.at(-1); let userPrompt = userMessage.content; - await sendPrompt(userPrompt, userMessage.id); + await sendPrompt(userPrompt, userMessage.id, modelId); } }; diff --git a/src/routes/(app)/c/[id]/+page.svelte b/src/routes/(app)/c/[id]/+page.svelte index 1cf05aa7d..996d37047 100644 --- a/src/routes/(app)/c/[id]/+page.svelte +++ b/src/routes/(app)/c/[id]/+page.svelte @@ -210,7 +210,8 @@ user: _user ?? undefined, content: userPrompt, files: files.length > 0 ? files : undefined, - timestamp: Math.floor(Date.now() / 1000) // Unix epoch + timestamp: Math.floor(Date.now() / 1000), // Unix epoch + models: selectedModels }; // Add message to history and Set currentId to messageId @@ -255,47 +256,51 @@ await sendPrompt(userPrompt, userMessageId); } }; - const sendPrompt = async (prompt, parentId) => { + + const sendPrompt = async (prompt, parentId, modelId = null) => { const _chatId = JSON.parse(JSON.stringify($chatId)); await Promise.all( - (atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(async (modelId) => { - const model = $models.filter((m) => m.id === modelId).at(0); + (modelId ? [modelId] : atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map( + async (modelId) => { + console.log('modelId', modelId); + const model = $models.filter((m) => m.id === modelId).at(0); - if (model) { - // Create response message - let responseMessageId = uuidv4(); - let responseMessage = { - parentId: parentId, - id: responseMessageId, - childrenIds: [], - role: 'assistant', - content: '', - model: model.id, - timestamp: Math.floor(Date.now() / 1000) // Unix epoch - }; + if (model) { + // Create response message + let responseMessageId = uuidv4(); + let responseMessage = { + parentId: parentId, + id: responseMessageId, + childrenIds: [], + role: 'assistant', + content: '', + model: model.id, + timestamp: Math.floor(Date.now() / 1000) // Unix epoch + }; - // Add message to history and Set currentId to messageId - history.messages[responseMessageId] = responseMessage; - history.currentId = responseMessageId; + // Add message to history and Set currentId to messageId + history.messages[responseMessageId] = responseMessage; + history.currentId = responseMessageId; - // Append messageId to childrenIds of parent message - if (parentId !== null) { - history.messages[parentId].childrenIds = [ - ...history.messages[parentId].childrenIds, - responseMessageId - ]; + // Append messageId to childrenIds of parent message + if (parentId !== null) { + history.messages[parentId].childrenIds = [ + ...history.messages[parentId].childrenIds, + responseMessageId + ]; + } + + if (model?.external) { + await sendPromptOpenAI(model, prompt, responseMessageId, _chatId); + } else if (model) { + await sendPromptOllama(model, prompt, responseMessageId, _chatId); + } + } else { + toast.error($i18n.t(`Model {{modelId}} not found`, { modelId })); } - - if (model?.external) { - await sendPromptOpenAI(model, prompt, responseMessageId, _chatId); - } else if (model) { - await sendPromptOllama(model, prompt, responseMessageId, _chatId); - } - } else { - toast.error($i18n.t(`Model {{modelId}} not found`, { modelId })); } - }) + ) ); await chats.set(await getChatList(localStorage.token)); @@ -759,7 +764,7 @@ console.log('stopResponse'); }; - const regenerateResponse = async () => { + const regenerateResponse = async (modelId = null) => { console.log('regenerateResponse'); if (messages.length != 0 && messages.at(-1).done == true) { messages.splice(messages.length - 1, 1); @@ -768,7 +773,7 @@ let userMessage = messages.at(-1); let userPrompt = userMessage.content; - await sendPrompt(userPrompt, userMessage.id); + await sendPrompt(userPrompt, userMessage.id, modelId); } };