- {#if $user?.role === 'admin' && item.model.loaded}
+ {#if !selectionOnly && $user?.role === 'admin' && item.model.loaded}
{/if}
- {
- copyLinkHandler(item.model);
- }}
- >
-
-
+
+
+ {/if}
{#if value === item.value}
diff --git a/src/lib/components/chat/ModelSelector/Selector.svelte b/src/lib/components/chat/ModelSelector/Selector.svelte
index 928bc14eac..62621689a7 100644
--- a/src/lib/components/chat/ModelSelector/Selector.svelte
+++ b/src/lib/components/chat/ModelSelector/Selector.svelte
@@ -42,10 +42,11 @@
const dispatch = createEventDispatcher();
export let id = '';
- export let value = '';
+ export let value: string | null = '';
export let placeholder = $i18n.t('Select a model');
export let searchEnabled = true;
export let searchPlaceholder = $i18n.t('Search a model');
+ export let selectionOnly = false;
export let items: {
label: string;
@@ -398,7 +399,7 @@
}
});
- $: if (show) {
+ $: if (show && !selectionOnly) {
setOllamaVersion();
}
@@ -742,6 +743,7 @@
{pinModelHandler}
{unloadModelHandler}
{deleteModelHandler}
+ {selectionOnly}
onClick={() => {
value = item.value;
selectedModelIdx = index;
@@ -754,7 +756,7 @@
{/if}
- {#if !(searchValue.trim() in $MODEL_DOWNLOAD_POOL) && searchValue && ollamaVersion && $user?.role === 'admin'}
+ {#if !selectionOnly && !(searchValue.trim() in $MODEL_DOWNLOAD_POOL) && searchValue && ollamaVersion && $user?.role === 'admin'}
{/if}
- {#each Object.keys($MODEL_DOWNLOAD_POOL) as model}
+ {#each selectionOnly ? [] : Object.keys($MODEL_DOWNLOAD_POOL) as model}
diff --git a/src/lib/components/workspace/Models/ModelEditor.svelte b/src/lib/components/workspace/Models/ModelEditor.svelte
index 35240af4b0..8be5346cbc 100644
--- a/src/lib/components/workspace/Models/ModelEditor.svelte
+++ b/src/lib/components/workspace/Models/ModelEditor.svelte
@@ -13,6 +13,7 @@
import { getVoices } from '$lib/apis/audio';
import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte';
+ import ModelSelector from '$lib/components/chat/ModelSelector/Selector.svelte';
import Tags from '$lib/components/common/Tags.svelte';
import Knowledge from '$lib/components/workspace/Models/Knowledge.svelte';
import ToolsSelector from '$lib/components/workspace/Models/ToolsSelector.svelte';
@@ -112,6 +113,25 @@
export let suggestionTags: { name: string }[] = [];
let voices: { id: string; name?: string }[] = [];
+ const getBaseModelItems = (models: any[] = []) => {
+ const currentModelId = (model as any)?.id;
+
+ return models
+ .filter(
+ (baseModel) =>
+ (!currentModelId || baseModel.id !== currentModelId) &&
+ !baseModel?.preset &&
+ baseModel?.owned_by !== 'arena' &&
+ !(baseModel?.direct ?? false) &&
+ (!(baseModel?.info?.meta?.hidden ?? false) || baseModel.id === info.base_model_id)
+ )
+ .map((baseModel) => ({
+ value: baseModel.id,
+ label: baseModel.name,
+ model: baseModel
+ }));
+ };
+
const loadSuggestionTags = async () => {
const res: string[] = await (preset ? getModelTags : getBaseModelTags)(
localStorage.token
@@ -144,6 +164,13 @@
return;
}
+ if (preset && !info.base_model_id) {
+ toast.error($i18n.t('Base Model is required.'));
+ loading = false;
+
+ return;
+ }
+
if (knowledge.some((item) => item.status === 'uploading')) {
toast.error($i18n.t('Please wait until all files are uploaded.'));
loading = false;
@@ -619,19 +646,16 @@
-
+ />