diff --git a/backend/apps/rag/main.py b/backend/apps/rag/main.py
index 1e354c874..6837d9635 100644
--- a/backend/apps/rag/main.py
+++ b/backend/apps/rag/main.py
@@ -28,6 +28,7 @@ from langchain_community.document_loaders import (
UnstructuredXMLLoader,
UnstructuredRSTLoader,
UnstructuredExcelLoader,
+ UnstructuredPowerPointLoader,
YoutubeLoader,
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
@@ -823,6 +824,11 @@ def get_loader(filename: str, file_content_type: str, file_path: str):
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
] or file_ext in ["xls", "xlsx"]:
loader = UnstructuredExcelLoader(file_path)
+ elif file_content_type in [
+ "application/vnd.ms-powerpoint",
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+ ] or file_ext in ["ppt", "pptx"]:
+ loader = UnstructuredPowerPointLoader(file_path)
elif file_ext in known_source_ext or (
file_content_type and file_content_type.find("text/") >= 0
):
diff --git a/backend/requirements.txt b/backend/requirements.txt
index c8b699447..a82da1966 100644
--- a/backend/requirements.txt
+++ b/backend/requirements.txt
@@ -35,6 +35,7 @@ chromadb==0.4.24
sentence-transformers==2.7.0
pypdf==4.2.0
docx2txt==0.8
+python-pptx==0.6.23
unstructured==0.11.8
Markdown==3.6
pypandoc==1.13
diff --git a/src/lib/components/chat/Messages/CodeBlock.svelte b/src/lib/components/chat/Messages/CodeBlock.svelte
index 4131fbd85..b9f6382ab 100644
--- a/src/lib/components/chat/Messages/CodeBlock.svelte
+++ b/src/lib/components/chat/Messages/CodeBlock.svelte
@@ -213,7 +213,7 @@ __builtins__.input = input`);
- {#if ['', 'python'].includes(lang) && (lang === 'python' || checkPythonCode(code))}
+ {#if lang === 'python' || (lang === '' && checkPythonCode(code))}
{#if executing}
Running
{:else}
diff --git a/src/lib/components/chat/Messages/CompareMessages.svelte b/src/lib/components/chat/Messages/CompareMessages.svelte
index 87c3c88d9..60efdb2ab 100644
--- a/src/lib/components/chat/Messages/CompareMessages.svelte
+++ b/src/lib/components/chat/Messages/CompareMessages.svelte
@@ -41,6 +41,44 @@
};
}, {});
+ const showPreviousMessage = (model) => {
+ 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');
+ };
+
+ const showNextMessage = (model) => {
+ 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');
+ };
+
onMount(async () => {
await tick();
currentMessageId = messages[messageIdx].id;
@@ -97,42 +135,8 @@
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');
- }}
+ showPreviousMessage={() => showPreviousMessage(model)}
+ showNextMessage={() => showNextMessage(model)}
{rateMessage}
{copyToClipboard}
{continueGeneration}
diff --git a/src/lib/components/chat/Messages/ProfileImage.svelte b/src/lib/components/chat/Messages/ProfileImage.svelte
index 80bdea2c7..44f3b5fce 100644
--- a/src/lib/components/chat/Messages/ProfileImage.svelte
+++ b/src/lib/components/chat/Messages/ProfileImage.svelte
@@ -10,7 +10,8 @@
crossorigin="anonymous"
src={src.startsWith(WEBUI_BASE_URL) ||
src.startsWith('https://www.gravatar.com/avatar/') ||
- src.startsWith('data:')
+ src.startsWith('data:') ||
+ src.startsWith('/')
? src
: `/user.png`}
class=" w-8 object-cover rounded-full"
diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index 62ac2b8c3..a305bea7c 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -86,7 +86,9 @@ export const SUPPORTED_FILE_EXTENSIONS = [
'csv',
'txt',
'xls',
- 'xlsx'
+ 'xlsx',
+ 'pptx',
+ 'ppt'
];
// Source: https://kit.svelte.dev/docs/modules#$env-static-public
diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte
index 728f4510c..e6bc53d6c 100644
--- a/src/routes/(app)/+page.svelte
+++ b/src/routes/(app)/+page.svelte
@@ -261,28 +261,6 @@
const sendPrompt = async (prompt, parentId, modelId = null) => {
const _chatId = JSON.parse(JSON.stringify($chatId));
- let userContext = null;
-
- if ($settings?.memory ?? false) {
- const res = await queryMemory(localStorage.token, prompt).catch((error) => {
- toast.error(error);
- return null;
- });
-
- if (res) {
- if (res.documents[0].length > 0) {
- userContext = res.documents.reduce((acc, doc, index) => {
- const createdAtTimestamp = res.metadatas[index][0].created_at;
- const createdAtDate = new Date(createdAtTimestamp * 1000).toISOString().split('T')[0];
- acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
- return acc;
- }, []);
- }
-
- console.log(userContext);
- }
- }
-
await Promise.all(
(modelId ? [modelId] : atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(
async (modelId) => {
@@ -299,7 +277,7 @@
role: 'assistant',
content: '',
model: model.id,
- userContext: userContext,
+ userContext: null,
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
};
@@ -315,6 +293,34 @@
];
}
+ await tick();
+
+ let userContext = null;
+ if ($settings?.memory ?? false) {
+ if (userContext === null) {
+ const res = await queryMemory(localStorage.token, prompt).catch((error) => {
+ toast.error(error);
+ return null;
+ });
+
+ if (res) {
+ if (res.documents[0].length > 0) {
+ userContext = res.documents.reduce((acc, doc, index) => {
+ const createdAtTimestamp = res.metadatas[index][0].created_at;
+ const createdAtDate = new Date(createdAtTimestamp * 1000)
+ .toISOString()
+ .split('T')[0];
+ acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
+ return acc;
+ }, []);
+ }
+
+ console.log(userContext);
+ }
+ }
+ }
+ responseMessage.userContext = userContext;
+
if (useWebSearch) {
await runWebSearchForPrompt(model.id, parentId, responseMessageId);
}
@@ -383,10 +389,11 @@
$settings.system || (responseMessage?.userContext ?? null)
? {
role: 'system',
- content:
- $settings.system + (responseMessage?.userContext ?? null)
- ? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+ content: `${$settings?.system ?? ''}${
+ responseMessage?.userContext ?? null
+ ? `\n\nUser Context:\n${(responseMessage?.userContext ?? []).join('\n')}`
: ''
+ }`
}
: undefined,
...messages
@@ -642,10 +649,11 @@
$settings.system || (responseMessage?.userContext ?? null)
? {
role: 'system',
- content:
- $settings.system + (responseMessage?.userContext ?? null)
- ? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+ content: `${$settings?.system ?? ''}${
+ responseMessage?.userContext ?? null
+ ? `\n\nUser Context:\n${(responseMessage?.userContext ?? []).join('\n')}`
: ''
+ }`
}
: undefined,
...messages
diff --git a/src/routes/(app)/c/[id]/+page.svelte b/src/routes/(app)/c/[id]/+page.svelte
index 8fbd786e4..f4c581ffc 100644
--- a/src/routes/(app)/c/[id]/+page.svelte
+++ b/src/routes/(app)/c/[id]/+page.svelte
@@ -268,28 +268,6 @@
const sendPrompt = async (prompt, parentId, modelId = null) => {
const _chatId = JSON.parse(JSON.stringify($chatId));
- let userContext = null;
-
- if ($settings?.memory ?? false) {
- const res = await queryMemory(localStorage.token, prompt).catch((error) => {
- toast.error(error);
- return null;
- });
-
- if (res) {
- if (res.documents[0].length > 0) {
- userContext = res.documents.reduce((acc, doc, index) => {
- const createdAtTimestamp = res.metadatas[index][0].created_at;
- const createdAtDate = new Date(createdAtTimestamp * 1000).toISOString().split('T')[0];
- acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
- return acc;
- }, []);
- }
-
- console.log(userContext);
- }
- }
-
await Promise.all(
(modelId ? [modelId] : atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(
async (modelId) => {
@@ -306,7 +284,7 @@
role: 'assistant',
content: '',
model: model.id,
- userContext: userContext,
+ userContext: null,
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
};
@@ -322,6 +300,34 @@
];
}
+ await tick();
+
+ let userContext = null;
+ if ($settings?.memory ?? false) {
+ if (userContext === null) {
+ const res = await queryMemory(localStorage.token, prompt).catch((error) => {
+ toast.error(error);
+ return null;
+ });
+
+ if (res) {
+ if (res.documents[0].length > 0) {
+ userContext = res.documents.reduce((acc, doc, index) => {
+ const createdAtTimestamp = res.metadatas[index][0].created_at;
+ const createdAtDate = new Date(createdAtTimestamp * 1000)
+ .toISOString()
+ .split('T')[0];
+ acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
+ return acc;
+ }, []);
+ }
+
+ console.log(userContext);
+ }
+ }
+ }
+ responseMessage.userContext = userContext;
+
if (useWebSearch) {
await runWebSearchForPrompt(model.id, parentId, responseMessageId);
}
@@ -390,10 +396,11 @@
$settings.system || (responseMessage?.userContext ?? null)
? {
role: 'system',
- content:
- $settings.system + (responseMessage?.userContext ?? null)
- ? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+ content: `${$settings?.system ?? ''}${
+ responseMessage?.userContext ?? null
+ ? `\n\nUser Context:\n${(responseMessage?.userContext ?? []).join('\n')}`
: ''
+ }`
}
: undefined,
...messages
@@ -649,10 +656,11 @@
$settings.system || (responseMessage?.userContext ?? null)
? {
role: 'system',
- content:
- $settings.system + (responseMessage?.userContext ?? null)
- ? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+ content: `${$settings?.system ?? ''}${
+ responseMessage?.userContext ?? null
+ ? `\n\nUser Context:\n${(responseMessage?.userContext ?? []).join('\n')}`
: ''
+ }`
}
: undefined,
...messages