From 61b1a8fdabb4562c22678562519864f08cb362a2 Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:07:43 -0500 Subject: [PATCH 01/76] feat: Add Google Drive file picker integration to chat interface --- src/lib/components/chat/Chat.svelte | 48 +++++++++++++++++ src/lib/utils/google-drive-picker.ts | 80 ++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 src/lib/utils/google-drive-picker.ts diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index a0feda057..eda2cf86a 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -9,6 +9,7 @@ import { goto } from '$app/navigation'; import { page } from '$app/stores'; + import { loadGoogleAuthApi, loadGoogleDriveApi, createPicker } from '$lib/utils/google-drive-picker'; import { get, type Unsubscriber, type Writable } from 'svelte/store'; import type { i18n as i18nType } from 'i18next'; @@ -300,6 +301,12 @@ }; onMount(async () => { + // Initialize Google APIs + await Promise.all([ + loadGoogleAuthApi(), + loadGoogleDriveApi() + ]); + window.addEventListener('message', onMessageHandler); $socket?.on('chat-events', chatEventHandler); @@ -349,6 +356,47 @@ // File upload functions + const uploadGoogleDriveFile = async (fileData) => { + const fileItem = { + type: 'doc', + name: fileData.name, + collection_name: '', + status: 'uploading', + url: fileData.url, + error: '' + }; + + try { + files = [...files, fileItem]; + const res = await processWeb(localStorage.token, '', fileData.url); + + if (res) { + fileItem.status = 'uploaded'; + fileItem.collection_name = res.collection_name; + fileItem.file = { + ...res.file, + ...fileItem.file + }; + + files = files; + } + } catch (e) { + files = files.filter((f) => f.name !== fileData.name); + toast.error(JSON.stringify(e)); + } + }; + + const handleGoogleDrivePicker = async () => { + try { + const fileData = await createPicker(); + if (fileData) { + await uploadGoogleDriveFile(fileData); + } + } catch (error) { + toast.error('Error accessing Google Drive: ' + error.message); + } + }; + const uploadWeb = async (url) => { console.log(url); diff --git a/src/lib/utils/google-drive-picker.ts b/src/lib/utils/google-drive-picker.ts new file mode 100644 index 000000000..855f88592 --- /dev/null +++ b/src/lib/utils/google-drive-picker.ts @@ -0,0 +1,80 @@ +// Google Drive Picker API configuration +const API_KEY = 'YOUR_API_KEY'; +const CLIENT_ID = 'YOUR_CLIENT_ID'; +const SCOPE = ['https://www.googleapis.com/auth/drive.readonly']; + +let pickerApiLoaded = false; +let oauthToken: string | null = null; + +export const loadGoogleDriveApi = () => { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.src = 'https://apis.google.com/js/api.js'; + script.onload = () => { + gapi.load('picker', () => { + pickerApiLoaded = true; + resolve(true); + }); + }; + script.onerror = reject; + document.body.appendChild(script); + }); +}; + +export const loadGoogleAuthApi = () => { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.src = 'https://accounts.google.com/gsi/client'; + script.onload = resolve; + script.onerror = reject; + document.body.appendChild(script); + }); +}; + +export const getAuthToken = async () => { + if (!oauthToken) { + const tokenClient = google.accounts.oauth2.initTokenClient({ + client_id: CLIENT_ID, + scope: SCOPE.join(' '), + callback: (response: any) => { + if (response.access_token) { + oauthToken = response.access_token; + } + }, + }); + await tokenClient.requestAccessToken(); + } + return oauthToken; +}; + +export const createPicker = async () => { + if (!pickerApiLoaded) { + await loadGoogleDriveApi(); + } + + const token = await getAuthToken(); + if (!token) { + throw new Error('Unable to get OAuth token'); + } + + const picker = new google.picker.PickerBuilder() + .addView(google.picker.ViewId.DOCS) + .setOAuthToken(token) + .setDeveloperKey(API_KEY) + .setCallback((data: any) => { + if (data[google.picker.Response.ACTION] === google.picker.Action.PICKED) { + const doc = data[google.picker.Response.DOCUMENTS][0]; + const fileId = doc[google.picker.Document.ID]; + const fileName = doc[google.picker.Document.NAME]; + const fileUrl = doc[google.picker.Document.URL]; + + return { + id: fileId, + name: fileName, + url: fileUrl + }; + } + }) + .build(); + picker.setVisible(true); +}; From f566c5940a7606221d4953061d357f8aebbcae58 Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:08:32 -0500 Subject: [PATCH 02/76] feat: Add Google Drive picker button to MessageInput component --- src/lib/components/chat/Chat.svelte | 2 ++ src/lib/components/chat/MessageInput.svelte | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index eda2cf86a..102453dc0 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -2316,6 +2316,8 @@ await uploadWeb(data); } else if (type === 'youtube') { await uploadYoutubeTranscription(data); + } else if (type === 'google-drive') { + await uploadGoogleDriveFile(data); } }} on:submit={async (e) => { diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 6dd6ff258..1303cf373 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -496,6 +496,16 @@ uploadFilesHandler={() => { filesInputElement.click(); }} + uploadGoogleDriveHandler={async () => { + try { + const fileData = await createPicker(); + if (fileData) { + dispatch('upload', { type: 'google-drive', data: fileData }); + } + } catch (error) { + toast.error('Error accessing Google Drive: ' + error.message); + } + }} onClose={async () => { await tick(); From 90e70608b9ba5520309a846666fd691fab2f6b40 Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:25:18 -0500 Subject: [PATCH 03/76] feat: Add Google Drive upload option to InputMenu --- .../chat/MessageInput/InputMenu.svelte | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/MessageInput/InputMenu.svelte b/src/lib/components/chat/MessageInput/InputMenu.svelte index 9cb1b6198..513ad32d3 100644 --- a/src/lib/components/chat/MessageInput/InputMenu.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu.svelte @@ -14,6 +14,7 @@ const i18n = getContext('i18n'); export let uploadFilesHandler: Function; + export let uploadGoogleDriveHandler: Function; export let selectedToolIds: string[] = []; export let webSearchEnabled: boolean; @@ -104,13 +105,30 @@ {/if} { uploadFilesHandler(); }} > -
{$i18n.t('Upload Files')}
+
{$i18n.t('Upload Files')}
+
+ + { + uploadGoogleDriveHandler(); + }} + > + + + + + + + + +
{$i18n.t('Google Drive')}
From 7bc1876e37fc6aead331e436dafb39d5c0ee8f2d Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:31:30 -0500 Subject: [PATCH 04/76] fix: Resolve Google Drive picker promise with file data --- src/lib/utils/google-drive-picker.ts | 66 ++++++++++++++++------------ 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/src/lib/utils/google-drive-picker.ts b/src/lib/utils/google-drive-picker.ts index 855f88592..941b1fce3 100644 --- a/src/lib/utils/google-drive-picker.ts +++ b/src/lib/utils/google-drive-picker.ts @@ -47,34 +47,42 @@ export const getAuthToken = async () => { return oauthToken; }; -export const createPicker = async () => { - if (!pickerApiLoaded) { - await loadGoogleDriveApi(); - } - - const token = await getAuthToken(); - if (!token) { - throw new Error('Unable to get OAuth token'); - } - - const picker = new google.picker.PickerBuilder() - .addView(google.picker.ViewId.DOCS) - .setOAuthToken(token) - .setDeveloperKey(API_KEY) - .setCallback((data: any) => { - if (data[google.picker.Response.ACTION] === google.picker.Action.PICKED) { - const doc = data[google.picker.Response.DOCUMENTS][0]; - const fileId = doc[google.picker.Document.ID]; - const fileName = doc[google.picker.Document.NAME]; - const fileUrl = doc[google.picker.Document.URL]; - - return { - id: fileId, - name: fileName, - url: fileUrl - }; +export const createPicker = () => { + return new Promise(async (resolve, reject) => { + try { + if (!pickerApiLoaded) { + await loadGoogleDriveApi(); } - }) - .build(); - picker.setVisible(true); + + const token = await getAuthToken(); + if (!token) { + throw new Error('Unable to get OAuth token'); + } + + const picker = new google.picker.PickerBuilder() + .addView(google.picker.ViewId.DOCS) + .setOAuthToken(token) + .setDeveloperKey(API_KEY) + .setCallback((data: any) => { + if (data[google.picker.Response.ACTION] === google.picker.Action.PICKED) { + const doc = data[google.picker.Response.DOCUMENTS][0]; + const fileId = doc[google.picker.Document.ID]; + const fileName = doc[google.picker.Document.NAME]; + const fileUrl = doc[google.picker.Document.URL]; + + resolve({ + id: fileId, + name: fileName, + url: fileUrl + }); + } else if (data[google.picker.Response.ACTION] === google.picker.Action.CANCEL) { + resolve(null); + } + }) + .build(); + picker.setVisible(true); + } catch (error) { + reject(error); + } + }); }; From 1cd43b122bc92193933d40603661cc16d01f5b36 Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:31:58 -0500 Subject: [PATCH 05/76] feat: Import createPicker function in InputMenu component --- src/lib/components/chat/MessageInput/InputMenu.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/chat/MessageInput/InputMenu.svelte b/src/lib/components/chat/MessageInput/InputMenu.svelte index 513ad32d3..a0634a4a0 100644 --- a/src/lib/components/chat/MessageInput/InputMenu.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu.svelte @@ -2,6 +2,7 @@ import { DropdownMenu } from 'bits-ui'; import { flyAndScale } from '$lib/utils/transitions'; import { getContext } from 'svelte'; + import { createPicker } from '$lib/utils/google-drive-picker'; import Dropdown from '$lib/components/common/Dropdown.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; From b2dc6fef9fe4994fde8547730fb3b68d87266cee Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:33:15 -0500 Subject: [PATCH 06/76] fix: Improve Google Drive picker API loading and error handling --- src/lib/utils/google-drive-picker.ts | 47 ++++++++++++++++++---------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/src/lib/utils/google-drive-picker.ts b/src/lib/utils/google-drive-picker.ts index 941b1fce3..4a332c79a 100644 --- a/src/lib/utils/google-drive-picker.ts +++ b/src/lib/utils/google-drive-picker.ts @@ -1,6 +1,6 @@ // Google Drive Picker API configuration -const API_KEY = 'YOUR_API_KEY'; -const CLIENT_ID = 'YOUR_CLIENT_ID'; +const API_KEY = import.meta.env.VITE_GOOGLE_API_KEY; +const CLIENT_ID = import.meta.env.VITE_GOOGLE_CLIENT_ID; const SCOPE = ['https://www.googleapis.com/auth/drive.readonly']; let pickerApiLoaded = false; @@ -8,26 +8,41 @@ let oauthToken: string | null = null; export const loadGoogleDriveApi = () => { return new Promise((resolve, reject) => { - const script = document.createElement('script'); - script.src = 'https://apis.google.com/js/api.js'; - script.onload = () => { - gapi.load('picker', () => { - pickerApiLoaded = true; - resolve(true); + if (typeof gapi === 'undefined') { + const script = document.createElement('script'); + script.src = 'https://apis.google.com/js/api.js'; + script.onload = () => { + gapi.load('picker', { + callback: () => { + pickerApiLoaded = true; + resolve(true); + } + }); + }; + script.onerror = reject; + document.body.appendChild(script); + } else { + gapi.load('picker', { + callback: () => { + pickerApiLoaded = true; + resolve(true); + } }); - }; - script.onerror = reject; - document.body.appendChild(script); + } }); }; export const loadGoogleAuthApi = () => { return new Promise((resolve, reject) => { - const script = document.createElement('script'); - script.src = 'https://accounts.google.com/gsi/client'; - script.onload = resolve; - script.onerror = reject; - document.body.appendChild(script); + if (typeof google === 'undefined') { + const script = document.createElement('script'); + script.src = 'https://accounts.google.com/gsi/client'; + script.onload = resolve; + script.onerror = reject; + document.body.appendChild(script); + } else { + resolve(true); + } }); }; From eed7cfd2a298af9f760f9b09044695ec02744cd2 Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:34:26 -0500 Subject: [PATCH 07/76] refactor: Remove unused Google Drive picker imports from Chat.svelte --- src/lib/components/chat/Chat.svelte | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 102453dc0..1ef0c1a29 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -9,7 +9,6 @@ import { goto } from '$app/navigation'; import { page } from '$app/stores'; - import { loadGoogleAuthApi, loadGoogleDriveApi, createPicker } from '$lib/utils/google-drive-picker'; import { get, type Unsubscriber, type Writable } from 'svelte/store'; import type { i18n as i18nType } from 'i18next'; @@ -301,12 +300,6 @@ }; onMount(async () => { - // Initialize Google APIs - await Promise.all([ - loadGoogleAuthApi(), - loadGoogleDriveApi() - ]); - window.addEventListener('message', onMessageHandler); $socket?.on('chat-events', chatEventHandler); From 85508106a8ecbfde153404dc4e213b2cc8b367d8 Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:36:45 -0500 Subject: [PATCH 08/76] fix: Improve Google Drive picker initialization and error handling --- src/lib/components/chat/MessageInput.svelte | 4 ++++ src/lib/utils/google-drive-picker.ts | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 1303cf373..1789983fc 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -498,11 +498,15 @@ }} uploadGoogleDriveHandler={async () => { try { + if (!import.meta.env.VITE_GOOGLE_API_KEY || !import.meta.env.VITE_GOOGLE_CLIENT_ID) { + throw new Error('Google Drive API credentials not configured'); + } const fileData = await createPicker(); if (fileData) { dispatch('upload', { type: 'google-drive', data: fileData }); } } catch (error) { + console.error('Google Drive Error:', error); toast.error('Error accessing Google Drive: ' + error.message); } }} diff --git a/src/lib/utils/google-drive-picker.ts b/src/lib/utils/google-drive-picker.ts index 4a332c79a..cfd030c20 100644 --- a/src/lib/utils/google-drive-picker.ts +++ b/src/lib/utils/google-drive-picker.ts @@ -5,6 +5,7 @@ const SCOPE = ['https://www.googleapis.com/auth/drive.readonly']; let pickerApiLoaded = false; let oauthToken: string | null = null; +let initialized = false; export const loadGoogleDriveApi = () => { return new Promise((resolve, reject) => { @@ -62,13 +63,17 @@ export const getAuthToken = async () => { return oauthToken; }; +const initialize = async () => { + if (!initialized) { + await Promise.all([loadGoogleDriveApi(), loadGoogleAuthApi()]); + initialized = true; + } +}; + export const createPicker = () => { return new Promise(async (resolve, reject) => { try { - if (!pickerApiLoaded) { - await loadGoogleDriveApi(); - } - + await initialize(); const token = await getAuthToken(); if (!token) { throw new Error('Unable to get OAuth token'); From f29dc2f86547a41fe78d9887bbae5ed6c1a7e7fe Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Sun, 15 Dec 2024 16:53:07 -0500 Subject: [PATCH 09/76] fix: Add missing import for createPicker in MessageInput.svelte --- src/lib/components/chat/MessageInput.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 1789983fc..092c214e8 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1,6 +1,7 @@ @@ -571,7 +576,9 @@ - {#if showTikaServerUrl} +
+ + {#if showTikaServerUrl}
{/if}
+ +
+
+ +
{$i18n.t('Google Drive')}
+ +
+
+
{$i18n.t('Enable Google Drive')}
+
+ +
+
+
+

From 5c149c3aa23ab15e219fdf7d1aecf0cf0fe3b354 Mon Sep 17 00:00:00 2001 From: "Taylor Wilsdon (aider)" Date: Wed, 18 Dec 2024 13:24:13 -0500 Subject: [PATCH 73/76] style: Align Google Drive switch to the right side of text --- src/lib/components/admin/Settings/Documents.svelte | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 71bf5a80e..f802d4b7f 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -596,13 +596,13 @@
{$i18n.t('Google Drive')}
-
-
-
{$i18n.t('Enable Google Drive')}
-
- -
+
+
+
{$i18n.t('Enable Google Drive')}
+
+
+
From 0dc75363aa98c1f44781cc86e652a6534533ae5c Mon Sep 17 00:00:00 2001 From: Taylor Wilsdon Date: Wed, 18 Dec 2024 13:25:57 -0500 Subject: [PATCH 74/76] Add configurable Google Drive toggle in the Documents admin section along with necessary config scaffolding --- backend/open_webui/config.py | 7 +++++++ backend/open_webui/main.py | 5 +++-- backend/open_webui/routers/retrieval.py | 9 +++++++++ src/lib/apis/retrieval/index.ts | 1 + src/lib/components/admin/Settings/Documents.svelte | 2 -- src/lib/components/chat/MessageInput/InputMenu.svelte | 2 ++ src/lib/stores/index.ts | 1 + 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index a69af97ba..76b211fb1 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1438,6 +1438,13 @@ RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig( ], ) +# If configured, Google Drive will be available as an upload option. +ENABLE_GOOGLE_DRIVE = PersistentConfig( + "ENABLE_GOOGLE_DRIVE", + "rag.drive.enable", + os.getenv("ENABLE_GOOGLE_DRIVE", "False").lower() == "true", +) + SEARXNG_QUERY_URL = PersistentConfig( "SEARXNG_QUERY_URL", "rag.web.search.searxng_query_url", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 48e6268b5..3a47702f2 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -183,6 +183,7 @@ from open_webui.config import ( ENABLE_RAG_LOCAL_WEB_FETCH, ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, ENABLE_RAG_WEB_SEARCH, + ENABLE_GOOGLE_DRIVE, UPLOAD_DIR, # WebUI WEBUI_AUTH, @@ -234,8 +235,6 @@ from open_webui.config import ( CORS_ALLOW_ORIGIN, DEFAULT_LOCALE, OAUTH_PROVIDERS, - GOOGLE_DRIVE_CLIENT_ID, - GOOGLE_DRIVE_API_KEY, # Admin ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT, @@ -487,6 +486,7 @@ app.state.config.ENABLE_RAG_WEB_SEARCH = ENABLE_RAG_WEB_SEARCH app.state.config.RAG_WEB_SEARCH_ENGINE = RAG_WEB_SEARCH_ENGINE app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = RAG_WEB_SEARCH_DOMAIN_FILTER_LIST +app.state.config.ENABLE_GOOGLE_DRIVE = ENABLE_GOOGLE_DRIVE app.state.config.SEARXNG_QUERY_URL = SEARXNG_QUERY_URL app.state.config.GOOGLE_PSE_API_KEY = GOOGLE_PSE_API_KEY app.state.config.GOOGLE_PSE_ENGINE_ID = GOOGLE_PSE_ENGINE_ID @@ -939,6 +939,7 @@ async def get_app_config(request: Request): **( { "enable_web_search": app.state.config.ENABLE_RAG_WEB_SEARCH, + "enable_google_drive": app.state.config.ENABLE_GOOGLE_DRIVE, "enable_image_generation": app.state.config.ENABLE_IMAGE_GENERATION, "enable_community_sharing": app.state.config.ENABLE_COMMUNITY_SHARING, "enable_message_rating": app.state.config.ENABLE_MESSAGE_RATING, diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index c6a3a0cca..d19940197 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -347,6 +347,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): return { "status": True, "pdf_extract_images": request.app.state.config.PDF_EXTRACT_IMAGES, + "enable_google_drive": request.app.state.config.ENABLE_GOOGLE_DRIVE, "content_extraction": { "engine": request.app.state.config.CONTENT_EXTRACTION_ENGINE, "tika_server_url": request.app.state.config.TIKA_SERVER_URL, @@ -369,6 +370,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "web_loader_ssl_verification": request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, "search": { "enabled": request.app.state.config.ENABLE_RAG_WEB_SEARCH, + "drive": request.app.state.config.ENABLE_GOOGLE_DRIVE, "engine": request.app.state.config.RAG_WEB_SEARCH_ENGINE, "searxng_query_url": request.app.state.config.SEARXNG_QUERY_URL, "google_pse_api_key": request.app.state.config.GOOGLE_PSE_API_KEY, @@ -445,6 +447,7 @@ class WebConfig(BaseModel): class ConfigUpdateForm(BaseModel): pdf_extract_images: Optional[bool] = None + enable_google_drive: Optional[bool] = None file: Optional[FileConfig] = None content_extraction: Optional[ContentExtractionConfig] = None chunk: Optional[ChunkParamUpdateForm] = None @@ -462,6 +465,12 @@ async def update_rag_config( else request.app.state.config.PDF_EXTRACT_IMAGES ) + request.app.state.config.ENABLE_GOOGLE_DRIVE = ( + form_data.enable_google_drive + if form_data.enable_google_drive is not None + else request.app.state.config.ENABLE_GOOGLE_DRIVE + ) + if form_data.file is not None: request.app.state.config.FILE_MAX_SIZE = form_data.file.max_size request.app.state.config.FILE_MAX_COUNT = form_data.file.max_count diff --git a/src/lib/apis/retrieval/index.ts b/src/lib/apis/retrieval/index.ts index 21ae792fa..7b8d836ce 100644 --- a/src/lib/apis/retrieval/index.ts +++ b/src/lib/apis/retrieval/index.ts @@ -45,6 +45,7 @@ type YoutubeConfigForm = { type RAGConfigForm = { pdf_extract_images?: boolean; + enable_google_drive?: boolean; chunk?: ChunkConfigForm; content_extraction?: ContentExtractConfigForm; web_loader_ssl_verification?: boolean; diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index f802d4b7f..5ff48900a 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -592,7 +592,6 @@
-
{$i18n.t('Google Drive')}
@@ -604,7 +603,6 @@
-

diff --git a/src/lib/components/chat/MessageInput/InputMenu.svelte b/src/lib/components/chat/MessageInput/InputMenu.svelte index 299ebb6e3..9f861ec78 100644 --- a/src/lib/components/chat/MessageInput/InputMenu.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu.svelte @@ -154,6 +154,7 @@
{$i18n.t('Upload Files')}
+ {#if $config?.features?.enable_google_drive} { @@ -188,6 +189,7 @@
{$i18n.t('Google Drive')}
+ {/if} diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index 2e3976bf9..4e82ba966 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -176,6 +176,7 @@ type Config = { enable_signup: boolean; enable_login_form: boolean; enable_web_search?: boolean; + enable_google_drive: boolean; enable_image_generation: boolean; enable_admin_export: boolean; enable_admin_chat_access: boolean; From 1120f4d09ab33ba57e996f4225634bcbd6595cb4 Mon Sep 17 00:00:00 2001 From: Taylor Wilsdon Date: Wed, 18 Dec 2024 13:32:46 -0500 Subject: [PATCH 75/76] npm run format --- .../admin/Settings/Documents.svelte | 438 +++++++++--------- .../chat/MessageInput/InputMenu.svelte | 68 +-- 2 files changed, 255 insertions(+), 251 deletions(-) diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 5ff48900a..ff580a972 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -190,7 +190,7 @@ content_extraction: { engine: contentExtractionEngine, tika_server_url: tikaServerUrl - }, + } }); await updateQuerySettings(localStorage.token, querySettings); @@ -578,7 +578,7 @@
- {#if showTikaServerUrl} + {#if showTikaServerUrl}
{/if}
- -
+
{$i18n.t('Google Drive')}
@@ -604,251 +603,256 @@
-
+
-
-
{$i18n.t('Query Params')}
+
+
{$i18n.t('Query Params')}
-
-
-
{$i18n.t('Top K')}
- -
- -
-
- - {#if querySettings.hybrid === true} -
-
- {$i18n.t('Minimum Score')} -
+
+
+
{$i18n.t('Top K')}
+ + {#if querySettings.hybrid === true} +
+
+ {$i18n.t('Minimum Score')} +
+ +
+ +
+
+ {/if} +
+ + {#if querySettings.hybrid === true} +
+ {$i18n.t( + 'Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.' + )} +
{/if} -
- {#if querySettings.hybrid === true} -
- {$i18n.t( - 'Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.' - )} -
- {/if} - -
-
{$i18n.t('RAG Template')}
- -