diff --git a/backend/apps/rag/main.py b/backend/apps/rag/main.py index 6e4f5c09..0d6cc732 100644 --- a/backend/apps/rag/main.py +++ b/backend/apps/rag/main.py @@ -119,7 +119,11 @@ def store_web(form_data: StoreWebForm, user=Depends(get_current_user)): loader = WebBaseLoader(form_data.url) data = loader.load() store_data_in_vector_db(data, form_data.collection_name) - return {"status": True, "collection_name": form_data.collection_name} + return { + "status": True, + "collection_name": form_data.collection_name, + "filename": form_data.url, + } except Exception as e: print(e) raise HTTPException( @@ -176,7 +180,11 @@ def store_doc( result = store_data_in_vector_db(data, collection_name) if result: - return {"status": True, "collection_name": collection_name} + return { + "status": True, + "collection_name": collection_name, + "filename": filename, + } else: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index c264592e..39ae0eea 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -13,13 +13,22 @@ import { getOpenAIModels } from '$lib/apis/openai'; - import { user, showSettings, settings, models, modelfiles, prompts } from '$lib/stores'; + import { + user, + showSettings, + settings, + models, + modelfiles, + prompts, + documents + } from '$lib/stores'; import { REQUIRED_OLLAMA_VERSION, WEBUI_API_BASE_URL } from '$lib/constants'; import SettingsModal from '$lib/components/chat/SettingsModal.svelte'; import Sidebar from '$lib/components/layout/Sidebar.svelte'; import { checkVersion } from '$lib/utils'; import ShortcutsModal from '$lib/components/chat/ShortcutsModal.svelte'; + import { getDocs } from '$lib/apis/documents'; let ollamaVersion = ''; let loaded = false; @@ -93,11 +102,10 @@ console.log(); await settings.set(JSON.parse(localStorage.getItem('settings') ?? '{}')); + await modelfiles.set(await getModelfiles(localStorage.token)); - await prompts.set(await getPrompts(localStorage.token)); - - console.log($modelfiles); + await documents.set(await getDocs(localStorage.token)); modelfiles.subscribe(async () => { // should fetch models diff --git a/src/routes/(app)/documents/+page.svelte b/src/routes/(app)/documents/+page.svelte index c28390f1..747adec8 100644 --- a/src/routes/(app)/documents/+page.svelte +++ b/src/routes/(app)/documents/+page.svelte @@ -6,10 +6,13 @@ import { onMount } from 'svelte'; import { documents } from '$lib/stores'; import { createNewDoc, deleteDocByName, getDocs } from '$lib/apis/documents'; - import AddFilesPlaceholder from '$lib/components/AddFilesPlaceholder.svelte'; + import { SUPPORTED_FILE_TYPE } from '$lib/constants'; + import { uploadDocToVectorDB } from '$lib/apis/rag'; let importFiles = ''; + + let inputFiles = ''; let query = ''; let dragged = false; @@ -19,40 +22,51 @@ await documents.set(await getDocs(localStorage.token)); }; - onMount(() => { - // const dropZone = document.querySelector('body'); - const dropZone = document.getElementById('dropzone'); + const uploadDoc = async (file) => { + const res = await uploadDocToVectorDB(localStorage.token, '', file); - dropZone?.addEventListener('dragover', (e) => { - e.preventDefault(); - dragged = true; - }); + if (res) { + await createNewDoc( + localStorage.token, + res.collection_name, + res.filename, + res.filename, + res.filename + ); + await documents.set(await getDocs(localStorage.token)); + } + }; - dropZone?.addEventListener('drop', async (e) => { - e.preventDefault(); - console.log(e); + const onDragOver = (e) => { + e.preventDefault(); + dragged = true; + }; - if (e.dataTransfer?.files) { - const inputFiles = e.dataTransfer?.files; + const onDragLeave = () => { + dragged = false; + }; - if (inputFiles && inputFiles.length > 0) { - const file = inputFiles[0]; - if (SUPPORTED_FILE_TYPE.includes(file['type'])) { - console.log(file); - // uploadDoc(file); - } else { - toast.error(`Unsupported File Type '${file['type']}'.`); - } + const onDrop = async (e) => { + e.preventDefault(); + console.log(e); + + if (e.dataTransfer?.files) { + const inputFiles = e.dataTransfer?.files; + + if (inputFiles && inputFiles.length > 0) { + const file = inputFiles[0]; + if (SUPPORTED_FILE_TYPE.includes(file['type'])) { + uploadDoc(file); } else { - toast.error(`File not found.`); + toast.error(`Unsupported File Type '${file['type']}'.`); } + } else { + toast.error(`File not found.`); } - }); + } - dropZone?.addEventListener('dragleave', () => { - dragged = false; - }); - }); + dragged = false; + };
@@ -86,9 +100,11 @@
- { + document.getElementById('upload-doc-input')?.click(); + }} > - +
-
- {#if $documents.length === 0 || dragged} -
- + { + if (inputFiles && inputFiles.length > 0) { + const file = inputFiles[0]; + if (SUPPORTED_FILE_TYPE.includes(file['type'])) { + uploadDoc(file); + } else { + toast.error(`Unsupported File Type '${file['type']}'.`); + } + + inputFiles = null; + e.target.value = ''; + } else { + toast.error(`File not found.`); + } + }} + /> + +
+
+
+
Add Files
+ +
+ Drop any files here to add to the conversation +
- {:else} - {#each $documents.filter((p) => query === '' || p.name.includes(query)) as doc} -
- + + {#each $documents.filter((p) => query === '' || p.name.includes(query)) as doc} +
+
+
+ +
+
#{doc.name} ({doc.filename})
+
+ {doc.title} +
-
- - - - - - - + + + - -
-
- {/each} - {/if} -
+ --> + +
+
+ {/each} {#if $documents.length != 0}