diff --git a/backend/open_webui/routers/models.py b/backend/open_webui/routers/models.py index a8ae4545c2..517d3e76e3 100644 --- a/backend/open_webui/routers/models.py +++ b/backend/open_webui/routers/models.py @@ -119,7 +119,11 @@ async def _verify_knowledge_file_access( PAGE_ITEM_COUNT = 30 -@router.get('/list', response_model=ModelAccessListResponse) # do NOT use "/" as path, conflicts with main.py +@router.get( + '/list', + response_model=ModelAccessListResponse, + response_model_exclude={'items': {'__all__': {'meta': {'profile_image_url'}}}}, +) # do NOT use "/" as path, conflicts with main.py async def get_models( query: str | None = None, view_option: str | None = None, @@ -415,7 +419,10 @@ async def import_models( continue # Update existing model - model_data['meta'] = model_data.get('meta', {}) + model_data['meta'] = { + **existing_model.meta.model_dump(), + **(model_data.get('meta') or {}), + } model_data['params'] = model_data.get('params', {}) updated_model = ModelForm(**{**existing_model.model_dump(), **model_data}) diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index 22765a151e..f2c7ac681a 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -7,12 +7,13 @@ import { onMount, onDestroy, getContext, tick } from 'svelte'; const i18n = getContext('i18n'); - import { config, models as _models, settings, user } from '$lib/stores'; + import { config, models as _models, settings, showSettings, user } from '$lib/stores'; import { createNewModel, deleteAllModels, getBaseModelTags, getBaseModels, + getModelById, toggleModelById, updateModelById, updateModelAccessGrants, @@ -228,6 +229,7 @@ }; const downloadModels = async (models) => { + models = await Promise.all(models.map(getFullModel)); let blob = new Blob([JSON.stringify(models)], { type: 'application/json' }); @@ -483,22 +485,30 @@ }; const hideModelHandler = async (model) => { - model.meta = { - ...model.meta, - hidden: !(model?.meta?.hidden ?? false) + const updatedModel = { + ...model, + meta: { + ...model.meta, + hidden: !(model?.meta?.hidden ?? false) + } }; - console.debug(model); - - upsertModelHandler(model, { meta: model.meta }, false); + await upsertModelHandler(updatedModel, { meta: updatedModel.meta }, false); + models = models.map((model) => (model.id === updatedModel.id ? updatedModel : model)); + _models.set( + await getModels( + localStorage.token, + $config?.features?.enable_direct_connections && ($settings?.directConnections ?? null) + ) + ); toast.success( - model.meta.hidden + updatedModel.meta.hidden ? $i18n.t(`Model {{name}} is now hidden`, { - name: model.id + name: updatedModel.id }) : $i18n.t(`Model {{name}} is now visible`, { - name: model.id + name: updatedModel.id }) ); }; @@ -551,17 +561,25 @@ } }; + const getFullModel = async (model) => + workspaceModels.some((workspaceModel) => workspaceModel.id === model.id) + ? ((await getModelById(localStorage.token, model.id).catch(() => null)) ?? model) + : model; + const cloneHandler = async (model) => { + model = await getFullModel(model); sessionStorage.model = JSON.stringify({ ...model, base_model_id: model.id, id: `${model.id}-clone`, name: `${model.name} (Clone)` }); - goto('/workspace/models/create'); + showSettings.set(false); + await goto('/workspace/models/create'); }; const exportModelHandler = async (model) => { + model = await getFullModel(model); let blob = new Blob([JSON.stringify([model])], { type: 'application/json' }); diff --git a/src/lib/components/admin/Settings/Models/ModelMenu.svelte b/src/lib/components/admin/Settings/Models/ModelMenu.svelte index ae4cec4421..19f91dda9d 100644 --- a/src/lib/components/admin/Settings/Models/ModelMenu.svelte +++ b/src/lib/components/admin/Settings/Models/ModelMenu.svelte @@ -41,6 +41,11 @@ let show = false; + const runAndClose = async (handler: Function) => { + show = false; + await handler(); + }; + const isPublicModel = (model) => (model?.access_grants ?? []).some( (g) => g.principal_type === 'user' && g.principal_id === '*' && g.permission === 'read' @@ -63,9 +68,7 @@