From abe17ab4b50eba79d8435fe32b0396754dff624e Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Thu, 22 Aug 2024 14:12:18 +0200 Subject: [PATCH 1/2] feat: show rag status when using models with knowledge collections --- src/lib/components/chat/Chat.svelte | 85 ++++++++++++++++----- src/lib/i18n/locales/de-DE/translation.json | 3 +- src/lib/i18n/locales/en-US/translation.json | 1 + 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 543b7b77d..fd05f2276 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -601,8 +601,8 @@ let selectedModelIds = modelId ? [modelId] : atSelectedModel !== undefined - ? [atSelectedModel.id] - : selectedModels; + ? [atSelectedModel.id] + : selectedModels; // Create response messages for each selected model const responseMessageIds = {}; @@ -763,11 +763,11 @@ ? await getAndUpdateUserLocation(localStorage.token) : undefined )}${ - (responseMessage?.userContext ?? null) + responseMessage?.userContext ?? null ? `\n\nUser Context:\n${responseMessage?.userContext ?? ''}` : '' }` - } + } : undefined, ...messages ] @@ -809,7 +809,18 @@ let files = JSON.parse(JSON.stringify(chatFiles)); if (model?.info?.meta?.knowledge ?? false) { + // Only initialize and add status if knowledge exists + responseMessage.statusHistory = [ + { + done: false, + action: 'rag_search', + description: $i18n.t(`Searching in Knowledge for "{{searchQuery}}"`, { + searchQuery: userMessage.content + }) + } + ]; files.push(...model.info.meta.knowledge); + messages = messages; // Trigger Svelte update } files.push( ...(userMessage?.files ?? []).filter((item) => @@ -818,6 +829,8 @@ ...(responseMessage?.files ?? []).filter((item) => ['web_search_results'].includes(item.type)) ); + scrollToBottom(); + eventTarget.dispatchEvent( new CustomEvent('chat:start', { detail: { @@ -835,10 +848,10 @@ options: { ...(params ?? $settings.params ?? {}), stop: - (params?.stop ?? $settings?.params?.stop ?? undefined) + params?.stop ?? $settings?.params?.stop ?? undefined ? (params?.stop.split(',').map((token) => token.trim()) ?? $settings.params.stop).map( (str) => decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"')) - ) + ) : undefined, num_predict: params?.max_tokens ?? $settings?.params?.max_tokens ?? undefined, repeat_penalty: @@ -888,6 +901,12 @@ if ('citations' in data) { responseMessage.citations = data.citations; + // Only remove status if it was initially set + if (responseMessage.statusHistory) { + responseMessage.statusHistory = responseMessage.statusHistory.filter( + (status) => status.action !== 'rag_search' + ); + } continue; } @@ -977,7 +996,20 @@ } } - await saveChatHandler(_chatId); + if ($chatId == _chatId) { + if ($settings.saveChatHistory ?? true) { + chat = await updateChatById(localStorage.token, _chatId, { + messages: messages, + history: history, + models: selectedModels, + params: params, + files: chatFiles + }); + + currentChatPage.set(1); + await chats.set(await getChatList(localStorage.token, $currentChatPage)); + } + } } else { if (res !== null) { const error = await res.json(); @@ -1044,7 +1076,18 @@ let files = JSON.parse(JSON.stringify(chatFiles)); if (model?.info?.meta?.knowledge ?? false) { + // Only initialize and add status if knowledge exists + responseMessage.statusHistory = [ + { + done: false, + action: 'rag_search', + description: $i18n.t(`Searching in Knowledge for "{{searchQuery}}"`, { + searchQuery: userMessage.content + }) + } + ]; files.push(...model.info.meta.knowledge); + messages = messages; // Trigger Svelte update } files.push( ...(userMessage?.files ?? []).filter((item) => @@ -1071,10 +1114,10 @@ stream: true, model: model.id, stream_options: - (model.info?.meta?.capabilities?.usage ?? false) + model.info?.meta?.capabilities?.usage ?? false ? { include_usage: true - } + } : undefined, messages: [ params?.system || $settings.system || (responseMessage?.userContext ?? null) @@ -1087,11 +1130,11 @@ ? await getAndUpdateUserLocation(localStorage.token) : undefined )}${ - (responseMessage?.userContext ?? null) + responseMessage?.userContext ?? null ? `\n\nUser Context:\n${responseMessage?.userContext ?? ''}` : '' }` - } + } : undefined, ...messages ] @@ -1107,7 +1150,7 @@ text: arr.length - 1 !== idx ? message.content - : (message?.raContent ?? message.content) + : message?.raContent ?? message.content }, ...message.files .filter((file) => file.type === 'image') @@ -1118,20 +1161,20 @@ } })) ] - } + } : { content: arr.length - 1 !== idx ? message.content - : (message?.raContent ?? message.content) - }) + : message?.raContent ?? message.content + }) })), seed: params?.seed ?? $settings?.params?.seed ?? undefined, stop: - (params?.stop ?? $settings?.params?.stop ?? undefined) + params?.stop ?? $settings?.params?.stop ?? undefined ? (params?.stop.split(',').map((token) => token.trim()) ?? $settings.params.stop).map( (str) => decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"')) - ) + ) : undefined, temperature: params?.temperature ?? $settings?.params?.temperature ?? undefined, top_p: params?.top_p ?? $settings?.params?.top_p ?? undefined, @@ -1184,6 +1227,12 @@ if (citations) { responseMessage.citations = citations; + // Only remove status if it was initially set + if (responseMessage.statusHistory) { + responseMessage.statusHistory = responseMessage.statusHistory.filter( + (status) => status.action !== 'rag_search' + ); + } continue; } @@ -1238,7 +1287,7 @@ } if ($chatId == _chatId) { - if (!$temporaryChatEnabled) { + if ($settings.saveChatHistory ?? true) { chat = await updateChatById(localStorage.token, _chatId, { models: selectedModels, messages: messages, diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index ae46e1700..24ed98280 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -473,8 +473,8 @@ "Playground": "Testumgebung", "Please carefully review the following warnings:": "", "Positive attitude": "Positive Einstellung", - "Previous 30 days": "Vorherige 30 Tage", "Previous 7 days": "Vorherige 7 Tage", + "Previous 30 days": "Vorherige 30 Tage", "Profile Image": "Profilbild", "Prompt": "Prompt", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (z. B. \"Erzähle mir eine interessante Tatsache über das Römische Reich\")", @@ -535,6 +535,7 @@ "Searched {{count}} sites_one": "{{count}} Seite durchsucht", "Searched {{count}} sites_other": "{{count}} Seiten durchsucht", "Searching \"{{searchQuery}}\"": "Suche nach \"{{searchQuery}}\"", + "Searching in Knowledge for \"{{searchQuery}}\"": "Suche in Wissen nach \"{{searchQuery}}\"", "Searxng Query URL": "Searxng-Abfrage-URL", "See readme.md for instructions": "Anleitung in readme.md anzeigen", "See what's new": "Entdecken Sie die Neuigkeiten", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index d1765eda2..af07bd857 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -543,6 +543,7 @@ "Select a engine": "", "Select a function": "", "Select a model": "", + "Searching in Knowledge for \"{{searchQuery}}\"": "", "Select a pipeline": "", "Select a pipeline url": "", "Select a tool": "", From 85f8a80389164acab6dd5fe978cd426ab034ac43 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Thu, 22 Aug 2024 16:31:33 +0200 Subject: [PATCH 2/2] refac --- src/lib/components/chat/Chat.svelte | 56 ++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index fd05f2276..31a076b7e 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -601,8 +601,8 @@ let selectedModelIds = modelId ? [modelId] : atSelectedModel !== undefined - ? [atSelectedModel.id] - : selectedModels; + ? [atSelectedModel.id] + : selectedModels; // Create response messages for each selected model const responseMessageIds = {}; @@ -763,11 +763,11 @@ ? await getAndUpdateUserLocation(localStorage.token) : undefined )}${ - responseMessage?.userContext ?? null + (responseMessage?.userContext ?? null) ? `\n\nUser Context:\n${responseMessage?.userContext ?? ''}` : '' }` - } + } : undefined, ...messages ] @@ -812,11 +812,11 @@ // Only initialize and add status if knowledge exists responseMessage.statusHistory = [ { - done: false, - action: 'rag_search', - description: $i18n.t(`Searching in Knowledge for "{{searchQuery}}"`, { + action: 'knowledge_search', + description: $i18n.t(`Searching Knowledge for "{{searchQuery}}"`, { searchQuery: userMessage.content - }) + }), + done: false } ]; files.push(...model.info.meta.knowledge); @@ -848,10 +848,10 @@ options: { ...(params ?? $settings.params ?? {}), stop: - params?.stop ?? $settings?.params?.stop ?? undefined + (params?.stop ?? $settings?.params?.stop ?? undefined) ? (params?.stop.split(',').map((token) => token.trim()) ?? $settings.params.stop).map( (str) => decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"')) - ) + ) : undefined, num_predict: params?.max_tokens ?? $settings?.params?.max_tokens ?? undefined, repeat_penalty: @@ -902,9 +902,9 @@ if ('citations' in data) { responseMessage.citations = data.citations; // Only remove status if it was initially set - if (responseMessage.statusHistory) { + if (model?.info?.meta?.knowledge ?? false) { responseMessage.statusHistory = responseMessage.statusHistory.filter( - (status) => status.action !== 'rag_search' + (status) => status.action !== 'knowledge_search' ); } continue; @@ -1079,11 +1079,11 @@ // Only initialize and add status if knowledge exists responseMessage.statusHistory = [ { - done: false, - action: 'rag_search', - description: $i18n.t(`Searching in Knowledge for "{{searchQuery}}"`, { + action: 'knowledge_search', + description: $i18n.t(`Searching Knowledge for "{{searchQuery}}"`, { searchQuery: userMessage.content - }) + }), + done: false } ]; files.push(...model.info.meta.knowledge); @@ -1114,10 +1114,10 @@ stream: true, model: model.id, stream_options: - model.info?.meta?.capabilities?.usage ?? false + (model.info?.meta?.capabilities?.usage ?? false) ? { include_usage: true - } + } : undefined, messages: [ params?.system || $settings.system || (responseMessage?.userContext ?? null) @@ -1130,11 +1130,11 @@ ? await getAndUpdateUserLocation(localStorage.token) : undefined )}${ - responseMessage?.userContext ?? null + (responseMessage?.userContext ?? null) ? `\n\nUser Context:\n${responseMessage?.userContext ?? ''}` : '' }` - } + } : undefined, ...messages ] @@ -1150,7 +1150,7 @@ text: arr.length - 1 !== idx ? message.content - : message?.raContent ?? message.content + : (message?.raContent ?? message.content) }, ...message.files .filter((file) => file.type === 'image') @@ -1161,20 +1161,20 @@ } })) ] - } + } : { content: arr.length - 1 !== idx ? message.content - : message?.raContent ?? message.content - }) + : (message?.raContent ?? message.content) + }) })), seed: params?.seed ?? $settings?.params?.seed ?? undefined, stop: - params?.stop ?? $settings?.params?.stop ?? undefined + (params?.stop ?? $settings?.params?.stop ?? undefined) ? (params?.stop.split(',').map((token) => token.trim()) ?? $settings.params.stop).map( (str) => decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"')) - ) + ) : undefined, temperature: params?.temperature ?? $settings?.params?.temperature ?? undefined, top_p: params?.top_p ?? $settings?.params?.top_p ?? undefined, @@ -1228,9 +1228,9 @@ if (citations) { responseMessage.citations = citations; // Only remove status if it was initially set - if (responseMessage.statusHistory) { + if (model?.info?.meta?.knowledge ?? false) { responseMessage.statusHistory = responseMessage.statusHistory.filter( - (status) => status.action !== 'rag_search' + (status) => status.action !== 'knowledge_search' ); } continue;