{$i18n.t('Image Generation Engine')}
+
+
{$i18n.t('Image Prompt Generation Prompt')}
+
+
+
+
+
+
diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte
index 580f3dcfd..d1d6d2c79 100644
--- a/src/lib/components/admin/Settings/Models.svelte
+++ b/src/lib/components/admin/Settings/Models.svelte
@@ -26,6 +26,9 @@
import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
import Cog6 from '$lib/components/icons/Cog6.svelte';
import ConfigureModelsModal from './Models/ConfigureModelsModal.svelte';
+ import Wrench from '$lib/components/icons/Wrench.svelte';
+ import ArrowDownTray from '$lib/components/icons/ArrowDownTray.svelte';
+ import ManageModelsModal from './Models/ManageModelsModal.svelte';
let importFiles;
let modelsImportInputElement: HTMLInputElement;
@@ -39,6 +42,7 @@
let selectedModelId = null;
let showConfigModal = false;
+ let showManageModal = false;
$: if (models) {
filteredModels = models
@@ -138,6 +142,7 @@
+
{#if models !== null}
{#if selectedModelId === null}
@@ -151,10 +156,22 @@
>
-
-
+
+
+
+
+
+
diff --git a/src/lib/components/admin/Settings/Models/Manage/ManageMultipleOllama.svelte b/src/lib/components/admin/Settings/Models/Manage/ManageMultipleOllama.svelte
new file mode 100644
index 000000000..04cabdd9a
--- /dev/null
+++ b/src/lib/components/admin/Settings/Models/Manage/ManageMultipleOllama.svelte
@@ -0,0 +1,26 @@
+
+
+{#if ollamaConfig}
+
+
+
+
+
+{/if}
diff --git a/src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte b/src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte
new file mode 100644
index 000000000..3420b669d
--- /dev/null
+++ b/src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte
@@ -0,0 +1,1042 @@
+
+
+
{
+ deleteModelHandler();
+ }}
+/>
+
+{#if !loading}
+
+
+
+
+
+
+ {$i18n.t('Pull a model from Ollama.com')}
+
+
+
+
+ {
+ updateModelsHandler();
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
{
+ pullModelHandler();
+ }}
+ disabled={modelTransferring}
+ >
+ {#if modelTransferring}
+
+ {:else}
+
+ {/if}
+
+
+
+
+ {$i18n.t('To access the available model names for downloading,')}
+
{$i18n.t('click here.')}
+
+
+ {#if updateModelId}
+
+ Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''}
+
+ {/if}
+
+ {#if Object.keys($MODEL_DOWNLOAD_POOL).length > 0}
+ {#each Object.keys($MODEL_DOWNLOAD_POOL) as model}
+ {#if 'pullProgress' in $MODEL_DOWNLOAD_POOL[model]}
+
+
{model}
+
+
+
+
+ {$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0}%
+
+
+
+
+ {
+ cancelModelPullHandler(model);
+ }}
+ >
+
+
+
+
+ {#if 'digest' in $MODEL_DOWNLOAD_POOL[model]}
+
+ {$MODEL_DOWNLOAD_POOL[model].digest}
+
+ {/if}
+
+
+ {/if}
+ {/each}
+ {/if}
+
+
+
+
{$i18n.t('Delete a model')}
+
+
+
+
+
{
+ showModelDeleteConfirm = true;
+ }}
+ >
+
+
+
+
+
+
+
{$i18n.t('Create a model')}
+
+
+
+
+
+
+
+
+
{
+ createModelHandler();
+ }}
+ disabled={createModelLoading}
+ >
+
+
+
+
+
+ {#if createModelDigest !== ''}
+
+
{createModelTag}
+
+
+
+
+ {createModelPullProgress ?? 0}%
+
+
+
+ {#if createModelDigest}
+
+ {createModelDigest}
+
+ {/if}
+
+
+ {/if}
+
+
+
+
+
{$i18n.t('Experimental')}
+
{
+ showExperimentalOllama = !showExperimentalOllama;
+ }}>{showExperimentalOllama ? $i18n.t('Hide') : $i18n.t('Show')}
+
+
+
+ {#if showExperimentalOllama}
+
+ {/if}
+
+
+
+{:else if ollamaModels === null}
+
+ {$i18n.t('Failed to fetch models')}
+
+{:else}
+
+
+
+{/if}
diff --git a/src/lib/components/admin/Settings/Models/ManageModelsModal.svelte b/src/lib/components/admin/Settings/Models/ManageModelsModal.svelte
new file mode 100644
index 000000000..6b53952e1
--- /dev/null
+++ b/src/lib/components/admin/Settings/Models/ManageModelsModal.svelte
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+ {$i18n.t('Manage Models')}
+
+
{
+ show = false;
+ }}
+ >
+
+
+
+
+
+
+ {#if selected === ''}
+
+
+ {$i18n.t('No inference engine with management support found')}
+
+
+ {:else if selected !== null}
+
+
+ {
+ selected = 'ollama';
+ }}>{$i18n.t('Ollama')}
+
+
+
+
+
+ {#if selected === 'ollama'}
+
+ {/if}
+
+
+ {:else}
+
+
+
+ {/if}
+
+
+
+
diff --git a/src/lib/components/admin/Settings/Pipelines.svelte b/src/lib/components/admin/Settings/Pipelines.svelte
index 605a15aab..e296d9bbc 100644
--- a/src/lib/components/admin/Settings/Pipelines.svelte
+++ b/src/lib/components/admin/Settings/Pipelines.svelte
@@ -57,7 +57,7 @@
valves,
selectedPipelinesUrlIdx
).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
});
if (res) {
@@ -118,7 +118,7 @@
pipelineDownloadUrl,
selectedPipelinesUrlIdx
).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
});
@@ -172,7 +172,7 @@
pipelines[selectedPipelineIdx].id,
selectedPipelinesUrlIdx
).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
});
diff --git a/src/lib/components/admin/Users/Groups.svelte b/src/lib/components/admin/Users/Groups.svelte
index 5911718ba..bbc7bab44 100644
--- a/src/lib/components/admin/Users/Groups.svelte
+++ b/src/lib/components/admin/Users/Groups.svelte
@@ -53,10 +53,15 @@
tools: false
},
chat: {
+ controls: true,
file_upload: true,
delete: true,
edit: true,
temporary: true
+ },
+ features: {
+ web_search: true,
+ image_generation: true
}
};
@@ -69,7 +74,7 @@
const addGroupHandler = async (group) => {
const res = await createNewGroup(localStorage.token, group).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
});
@@ -84,7 +89,7 @@
const res = await updateUserDefaultPermissions(localStorage.token, group.permissions).catch(
(error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
}
);
diff --git a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte
index 6d28db992..9558dbcad 100644
--- a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte
+++ b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte
@@ -37,10 +37,15 @@
tools: false
},
chat: {
+ controls: true,
file_upload: true,
delete: true,
edit: true,
temporary: true
+ },
+ features: {
+ web_search: true,
+ image_generation: true
}
};
export let userIds = [];
@@ -65,20 +70,8 @@
if (group) {
name = group.name;
description = group.description;
- permissions = group?.permissions ?? {
- workspace: {
- models: false,
- knowledge: false,
- prompts: false,
- tools: false
- },
- chat: {
- file_upload: true,
- delete: true,
- edit: true,
- temporary: true
- }
- };
+ permissions = group?.permissions ?? {};
+
userIds = group?.user_ids ?? [];
}
};
diff --git a/src/lib/components/admin/Users/Groups/GroupItem.svelte b/src/lib/components/admin/Users/Groups/GroupItem.svelte
index dd2b8c311..68586f4e5 100644
--- a/src/lib/components/admin/Users/Groups/GroupItem.svelte
+++ b/src/lib/components/admin/Users/Groups/GroupItem.svelte
@@ -23,7 +23,7 @@
const updateHandler = async (_group) => {
const res = await updateGroupById(localStorage.token, group.id, _group).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
});
@@ -35,7 +35,7 @@
const deleteHandler = async () => {
const res = await deleteGroupById(localStorage.token, group.id).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
});
diff --git a/src/lib/components/admin/Users/Groups/Permissions.svelte b/src/lib/components/admin/Users/Groups/Permissions.svelte
index 5d67ff768..430fabaac 100644
--- a/src/lib/components/admin/Users/Groups/Permissions.svelte
+++ b/src/lib/components/admin/Users/Groups/Permissions.svelte
@@ -1,11 +1,12 @@
@@ -169,6 +196,14 @@
{$i18n.t('Chat Permissions')}
+
+
+ {$i18n.t('Allow Chat Controls')}
+
+
+
+
+
{$i18n.t('Allow File Upload')}
@@ -201,4 +236,26 @@
+
+
+
+
+
{$i18n.t('Features Permissions')}
+
+
+
+ {$i18n.t('Web Search')}
+
+
+
+
+
+
+
+ {$i18n.t('Image Generation')}
+
+
+
+
+
diff --git a/src/lib/components/admin/Users/UserList.svelte b/src/lib/components/admin/Users/UserList.svelte
index bbf6fb25e..2ee4297a4 100644
--- a/src/lib/components/admin/Users/UserList.svelte
+++ b/src/lib/components/admin/Users/UserList.svelte
@@ -44,7 +44,7 @@
const updateRoleHandler = async (id, role) => {
const res = await updateUserRole(localStorage.token, id, role).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
});
@@ -55,7 +55,7 @@
const deleteUserHandler = async (id) => {
const res = await deleteUserById(localStorage.token, id).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
return null;
});
if (res) {
diff --git a/src/lib/components/admin/Users/UserList/AddUserModal.svelte b/src/lib/components/admin/Users/UserList/AddUserModal.svelte
index 10200eee1..99cc5d0c6 100644
--- a/src/lib/components/admin/Users/UserList/AddUserModal.svelte
+++ b/src/lib/components/admin/Users/UserList/AddUserModal.svelte
@@ -49,7 +49,7 @@
_user.password,
_user.role
).catch((error) => {
- toast.error(error);
+ toast.error(`${error}`);
});
if (res) {
@@ -150,9 +150,13 @@
submitHandler();
}}
>
-
+
{
tab = '';
@@ -160,15 +164,16 @@
>
{
tab = 'import';
}}>{$i18n.t('CSV Import')}
+
{#if tab === ''}
@@ -176,7 +181,7 @@