diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte
index 84e9d0e5a..84729117b 100644
--- a/src/lib/components/admin/Settings/WebSearch.svelte
+++ b/src/lib/components/admin/Settings/WebSearch.svelte
@@ -130,6 +130,19 @@
+
{#if webConfig.search.engine === 'searxng'}
diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte
index fcd5177d7..2388af70b 100644
--- a/src/lib/components/chat/Chat.svelte
+++ b/src/lib/components/chat/Chat.svelte
@@ -187,15 +187,20 @@
setToolIds();
}
+ $: if (atSelectedModel || selectedModels) {
+ setToolIds();
+ }
+
const setToolIds = async () => {
if (!$tools) {
tools.set(await getTools(localStorage.token));
}
- if (selectedModels.length !== 1) {
+ if (selectedModels.length !== 1 && !atSelectedModel) {
return;
}
- const model = $models.find((m) => m.id === selectedModels[0]);
+
+ const model = atSelectedModel ?? $models.find((m) => m.id === selectedModels[0]);
if (model) {
selectedToolIds = (model?.info?.meta?.toolIds ?? []).filter((id) =>
$tools.find((t) => t.id === id)
@@ -836,6 +841,7 @@
content: m.content,
info: m.info ? m.info : undefined,
timestamp: m.timestamp,
+ ...(m.usage ? { usage: m.usage } : {}),
...(m.sources ? { sources: m.sources } : {})
})),
model_item: $models.find((m) => m.id === modelId),
@@ -1273,7 +1279,9 @@
const chatInputElement = document.getElementById('chat-input');
if (chatInputElement) {
+ await tick();
chatInputElement.style.height = '';
+ chatInputElement.style.height = Math.min(chatInputElement.scrollHeight, 320) + 'px';
}
const _files = JSON.parse(JSON.stringify(files));
@@ -1488,7 +1496,10 @@
params?.system ?? $settings?.system ?? '',
$user.name,
$settings?.userLocation
- ? await getAndUpdateUserLocation(localStorage.token)
+ ? await getAndUpdateUserLocation(localStorage.token).catch((err) => {
+ console.error(err);
+ return undefined;
+ })
: undefined
)}${
(responseMessage?.userContext ?? null)
@@ -1573,7 +1584,12 @@
variables: {
...getPromptVariables(
$user.name,
- $settings?.userLocation ? await getAndUpdateUserLocation(localStorage.token) : undefined
+ $settings?.userLocation
+ ? await getAndUpdateUserLocation(localStorage.token).catch((err) => {
+ console.error(err);
+ return undefined;
+ })
+ : undefined
)
},
model_item: $models.find((m) => m.id === model.id),
@@ -1965,6 +1981,7 @@
bind:autoScroll
bind:prompt
{selectedModels}
+ {atSelectedModel}
{sendPrompt}
{showMessage}
{submitMessage}
diff --git a/src/lib/components/chat/ChatPlaceholder.svelte b/src/lib/components/chat/ChatPlaceholder.svelte
index e30213ebb..0dfaec968 100644
--- a/src/lib/components/chat/ChatPlaceholder.svelte
+++ b/src/lib/components/chat/ChatPlaceholder.svelte
@@ -16,6 +16,7 @@
export let modelIds = [];
export let models = [];
+ export let atSelectedModel;
export let submitPrompt;
@@ -126,7 +127,8 @@
{
diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte
index 5cde963ee..df07cb493 100644
--- a/src/lib/components/chat/MessageInput.svelte
+++ b/src/lib/components/chat/MessageInput.svelte
@@ -2,6 +2,7 @@
import { toast } from 'svelte-sonner';
import { v4 as uuidv4 } from 'uuid';
import { createPicker, getAuthToken } from '$lib/utils/google-drive-picker';
+ import { pickAndDownloadFile } from '$lib/utils/onedrive-file-picker';
import { onMount, tick, getContext, createEventDispatcher, onDestroy } from 'svelte';
const dispatch = createEventDispatcher();
@@ -827,7 +828,11 @@
}
// Submit the prompt when Enter key is pressed
- if (prompt !== '' && e.keyCode === 13 && !e.shiftKey) {
+ if (
+ (prompt !== '' || files.length > 0) &&
+ e.keyCode === 13 &&
+ !e.shiftKey
+ ) {
dispatch('submit', prompt);
}
}
@@ -906,7 +911,11 @@
}
// Submit the prompt when Enter key is pressed
- if (prompt !== '' && e.key === 'Enter' && !e.shiftKey) {
+ if (
+ (prompt !== '' || files.length > 0) &&
+ e.key === 'Enter' &&
+ !e.shiftKey
+ ) {
dispatch('submit', prompt);
}
}
@@ -1108,6 +1117,21 @@
);
}
}}
+ uploadOneDriveHandler={async () => {
+ try {
+ const fileData = await pickAndDownloadFile();
+ if (fileData) {
+ const file = new File([fileData.blob], fileData.name, {
+ type: fileData.blob.type || 'application/octet-stream'
+ });
+ await uploadFileHandler(file);
+ } else {
+ console.log('No file was selected from OneDrive');
+ }
+ } catch (error) {
+ console.error('OneDrive Error:', error);
+ }
+ }}
onClose={async () => {
await tick();
@@ -1285,14 +1309,17 @@
stream = null;
- if (!$TTSWorker) {
- await TTSWorker.set(
- new KokoroWorker({
- dtype: $settings.audio?.tts?.engineConfig?.dtype ?? 'fp32'
- })
- );
+ if ($settings.audio?.tts?.engine === 'browser-kokoro') {
+ // If the user has not initialized the TTS worker, initialize it
+ if (!$TTSWorker) {
+ await TTSWorker.set(
+ new KokoroWorker({
+ dtype: $settings.audio?.tts?.engineConfig?.dtype ?? 'fp32'
+ })
+ );
- await $TTSWorker.init();
+ await $TTSWorker.init();
+ }
}
showCallOverlay.set(true);
diff --git a/src/lib/components/chat/MessageInput/Commands/Prompts.svelte b/src/lib/components/chat/MessageInput/Commands/Prompts.svelte
index 76809e6d1..bb91e00a8 100644
--- a/src/lib/components/chat/MessageInput/Commands/Prompts.svelte
+++ b/src/lib/components/chat/MessageInput/Commands/Prompts.svelte
@@ -74,7 +74,13 @@
}
if (command.content.includes('{{USER_LOCATION}}')) {
- const location = await getUserPosition();
+ let location;
+ try {
+ location = await getUserPosition();
+ } catch (error) {
+ toast.error($i18n.t('Location access not allowed'));
+ location = 'LOCATION_UNKNOWN';
+ }
text = text.replaceAll('{{USER_LOCATION}}', String(location));
}
diff --git a/src/lib/components/chat/MessageInput/InputMenu.svelte b/src/lib/components/chat/MessageInput/InputMenu.svelte
index 801093d8f..ff97f0076 100644
--- a/src/lib/components/chat/MessageInput/InputMenu.svelte
+++ b/src/lib/components/chat/MessageInput/InputMenu.svelte
@@ -5,6 +5,7 @@
import { config, user, tools as _tools, mobile } from '$lib/stores';
import { createPicker } from '$lib/utils/google-drive-picker';
+
import { getTools } from '$lib/apis/tools';
import Dropdown from '$lib/components/common/Dropdown.svelte';
@@ -24,6 +25,7 @@
export let inputFilesHandler: Function;
export let uploadGoogleDriveHandler: Function;
+ export let uploadOneDriveHandler: Function;
export let selectedToolIds: string[] = [];
@@ -225,6 +227,97 @@
{$i18n.t('Google Drive')}
{/if}
+
+ {#if $config?.features?.enable_onedrive_integration}
+ {
+ uploadOneDriveHandler();
+ }}
+ >
+
+ {$i18n.t('OneDrive')}
+
+ {/if}
diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte
index 7c1c57a3f..72ed2a462 100644
--- a/src/lib/components/chat/Messages.svelte
+++ b/src/lib/components/chat/Messages.svelte
@@ -32,6 +32,7 @@
export let prompt;
export let history = {};
export let selectedModels;
+ export let atSelectedModel;
let messages = [];
@@ -349,6 +350,7 @@
{#if Object.keys(history?.messages ?? {}).length == 0}
{
let text = p;
diff --git a/src/lib/components/chat/Messages/CodeBlock.svelte b/src/lib/components/chat/Messages/CodeBlock.svelte
index a5d08356f..f92c66210 100644
--- a/src/lib/components/chat/Messages/CodeBlock.svelte
+++ b/src/lib/components/chat/Messages/CodeBlock.svelte
@@ -1,18 +1,9 @@
@@ -802,10 +815,11 @@
{#if !edit}
- {#if message.done || siblings.length > 1}
-