From 94c6428ae2248b57ed0b92e6fc861032ec4ecac4 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 3 Feb 2025 19:06:15 -0800 Subject: [PATCH] refac: chat --- src/lib/components/chat/Chat.svelte | 92 +++++++++++++------------ src/lib/components/chat/Messages.svelte | 2 +- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 7fac140de..072a0140a 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -41,6 +41,7 @@ convertMessagesToHistory, copyToClipboard, getMessageContentParts, + createMessagesList, extractSentencesForAudio, promptTemplate, splitStream, @@ -226,7 +227,7 @@ } await tick(); - saveChatHandler(_chatId); + saveChatHandler(_chatId, history); }; const chatEventHandler = async (event, cb) => { @@ -826,20 +827,6 @@ messagesContainerElement.scrollTop = messagesContainerElement.scrollHeight; } }; - - const createMessagesList = (responseMessageId) => { - if (responseMessageId === null) { - return []; - } - - const message = history.messages[responseMessageId]; - if (message?.parentId) { - return [...createMessagesList(message.parentId), message]; - } else { - return [message]; - } - }; - const chatCompletedHandler = async (chatId, modelId, responseMessageId, messages) => { const res = await chatCompleted(localStorage.token, { model: modelId, @@ -896,7 +883,7 @@ }; const chatActionHandler = async (chatId, actionId, modelId, responseMessageId, event = null) => { - const messages = createMessagesList(responseMessageId); + const messages = createMessagesList(history, responseMessageId); const res = await chatAction(localStorage.token, actionId, { model: modelId, @@ -965,7 +952,7 @@ const modelId = selectedModels[0]; const model = $models.filter((m) => m.id === modelId).at(0); - const messages = createMessagesList(history.currentId); + const messages = createMessagesList(history, history.currentId); const parentMessage = messages.length !== 0 ? messages.at(-1) : null; const userMessageId = uuidv4(); @@ -1010,9 +997,9 @@ } if (messages.length === 0) { - await initChatHandler(); + await initChatHandler(history); } else { - await saveChatHandler($chatId); + await saveChatHandler($chatId, history); } } }; @@ -1074,9 +1061,9 @@ } if (messages.length === 0) { - await initChatHandler(); + await initChatHandler(history); } else { - await saveChatHandler($chatId); + await saveChatHandler($chatId, history); } }; @@ -1210,7 +1197,12 @@ ); history.messages[message.id] = message; - await chatCompletedHandler(chatId, message.model, message.id, createMessagesList(message.id)); + await chatCompletedHandler( + chatId, + message.model, + message.id, + createMessagesList(history, message.id) + ); } console.log(data); @@ -1226,7 +1218,7 @@ const submitPrompt = async (userPrompt, { _raw = false } = {}) => { console.log('submitPrompt', userPrompt, $chatId); - const messages = createMessagesList(history.currentId); + const messages = createMessagesList(history, history.currentId); const _selectedModels = selectedModels.map((modelId) => $models.map((m) => m.id).includes(modelId) ? modelId : '' ); @@ -1325,25 +1317,30 @@ saveSessionSelectedModels(); - await sendPrompt(userPrompt, userMessageId, { newChat: true }); + await sendPrompt(history, userPrompt, userMessageId, { newChat: true }); }; const sendPrompt = async ( + history, prompt: string, parentId: string, { modelId = null, modelIdx = null, newChat = false } = {} ) => { + let _chatId = JSON.parse(JSON.stringify($chatId)); + // Create new chat if newChat is true and first user message if ( newChat && history.messages[history.currentId].parentId === null && history.messages[history.currentId].role === 'user' ) { - await initChatHandler(); + _chatId = await initChatHandler(history); } else { - await saveChatHandler($chatId); + await saveChatHandler(_chatId, history); } + await tick(); + // If modelId is provided, use it, else use selected model let selectedModelIds = modelId ? [modelId] @@ -1390,16 +1387,15 @@ await tick(); // Save chat after all messages have been created - await saveChatHandler($chatId); + await saveChatHandler(_chatId, history); - const _chatId = JSON.parse(JSON.stringify($chatId)); await Promise.all( selectedModelIds.map(async (modelId, _modelIdx) => { console.log('modelId', modelId); const model = $models.filter((m) => m.id === modelId).at(0); if (model) { - const messages = createMessagesList(parentId); + const messages = createMessagesList(history, parentId); // If there are image files, check if model is vision capable const hasImages = messages.some((message) => message.files?.some((file) => file.type === 'image') @@ -1507,7 +1503,7 @@ }` } : undefined, - ...createMessagesList(responseMessageId).map((message) => ({ + ...createMessagesList(history, responseMessageId).map((message) => ({ ...message, content: removeDetails(message.content, ['reasoning', 'code_interpreter']) })) @@ -1704,7 +1700,7 @@ history.currentId = userMessageId; await tick(); - await sendPrompt(userPrompt, userMessageId); + await sendPrompt(history, userPrompt, userMessageId); }; const regenerateResponse = async (message) => { @@ -1716,11 +1712,11 @@ if ((userMessage?.models ?? [...selectedModels]).length == 1) { // If user message has only one model selected, sendPrompt automatically selects it for regeneration - await sendPrompt(userPrompt, userMessage.id); + await sendPrompt(history, userPrompt, userMessage.id); } else { // If there are multiple models selected, use the model of the response message for regeneration // e.g. many model chat - await sendPrompt(userPrompt, userMessage.id, { + await sendPrompt(history, userPrompt, userMessage.id, { modelId: message.model, modelIdx: message.modelIdx }); @@ -1785,7 +1781,7 @@ } } - await saveChatHandler(_chatId); + await saveChatHandler(_chatId, history); } else { console.error(res); } @@ -1794,42 +1790,48 @@ } }; - const initChatHandler = async () => { + const initChatHandler = async (history) => { + let _chatId = $chatId; + if (!$temporaryChatEnabled) { chat = await createNewChat(localStorage.token, { - id: $chatId, + id: _chatId, title: $i18n.t('New Chat'), models: selectedModels, system: $settings.system ?? undefined, params: params, history: history, - messages: createMessagesList(history.currentId), + messages: createMessagesList(history, history.currentId), tags: [], timestamp: Date.now() }); - currentChatPage.set(1); - await chats.set(await getChatList(localStorage.token, $currentChatPage)); - await chatId.set(chat.id); + _chatId = chat.id; + await chatId.set(_chatId); - window.history.replaceState(history.state, '', `/c/${chat.id}`); + await chats.set(await getChatList(localStorage.token, $currentChatPage)); + currentChatPage.set(1); + + window.history.replaceState(history.state, '', `/c/${_chatId}`); } else { + _chatId = 'local'; await chatId.set('local'); } await tick(); + + return _chatId; }; - const saveChatHandler = async (_chatId) => { + const saveChatHandler = async (_chatId, history) => { if ($chatId == _chatId) { if (!$temporaryChatEnabled) { chat = await updateChatById(localStorage.token, _chatId, { models: selectedModels, history: history, - messages: createMessagesList(history.currentId), + messages: createMessagesList(history, history.currentId), params: params, files: chatFiles }); - currentChatPage.set(1); await chats.set(await getChatList(localStorage.token, $currentChatPage)); } @@ -1933,7 +1935,7 @@ {/if}
- {#if $settings?.landingPageMode === 'chat' || createMessagesList(history.currentId).length > 0} + {#if $settings?.landingPageMode === 'chat' || createMessagesList(history, history.currentId).length > 0}