From 199490eadb128a7feb0263067e20d5b364db4f23 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 12 Sep 2026 18:16:19 -0400 Subject: [PATCH] refac --- backend/open_webui/routers/models.py | 5 +++ src/lib/apis/models/index.ts | 12 +++++++ .../components/admin/Settings/Models.svelte | 31 ++++++++++--------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/backend/open_webui/routers/models.py b/backend/open_webui/routers/models.py index 1f506b438d..aa05926a04 100644 --- a/backend/open_webui/routers/models.py +++ b/backend/open_webui/routers/models.py @@ -215,6 +215,11 @@ async def get_models( ########################### +@router.get('/all', response_model=list[ModelResponse]) +async def get_all_model_records(user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): + return await Models.get_all_models(db=db) + + @router.get('/base/tags', response_model=list[str]) async def get_base_model_tags(user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): tags = await Models.get_all_tags(user_id=user.id, is_admin=True, is_base_model=True, db=db) diff --git a/src/lib/apis/models/index.ts b/src/lib/apis/models/index.ts index 11866e1fb6..79803e3fb2 100644 --- a/src/lib/apis/models/index.ts +++ b/src/lib/apis/models/index.ts @@ -149,6 +149,18 @@ export const importModels = async (token: string, models: object[]) => { return res; }; +export const getAllModels = async (token: string = '') => { + const res = await fetch(`${WEBUI_API_BASE_URL}/models/all`, { + method: 'GET', + headers: { + Accept: 'application/json', + authorization: `Bearer ${token}` + } + }); + if (!res.ok) throw await res.json(); + return res.json(); +}; + export const getBaseModels = async (token: string = '', tag: string = '') => { let error = null; diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index 64f71e0611..4cbfe93011 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -18,8 +18,7 @@ import { createNewModel, deleteAllModels, - getBaseModelTags, - getBaseModels, + getAllModels, getModelById, toggleModelById, updateModelById, @@ -88,7 +87,7 @@ let defaultModelIdSet = new Set(); let defaultPinnedModelIdSet = new Set(); - let baseModels: ModelListItem[] = []; + let savedModels: ModelListItem[] = []; let allModels: ModelListItem[] = []; let filteredModels = []; @@ -121,6 +120,10 @@ const isPresetModel = (model: any) => !!(model?.preset || model?.base_model_id || model?.info?.base_model_id); + const modelTags = (model: any): string[] => + (model?.meta?.tags ?? []) + .map((tag) => (typeof tag === 'string' ? tag : tag?.name)) + .filter(Boolean); const modelAccessLabel = (model) => { if (isPublicModel(model)) { @@ -264,12 +267,12 @@ .split(',') .filter((id) => id); - tags = await getBaseModelTags(localStorage.token); + savedModels = await getAllModels(localStorage.token); + tags = [...new Set(savedModels.flatMap(modelTags))].sort(); if (selectedTag && !tags.includes(selectedTag)) { selectedTag = ''; } - baseModels = await getBaseModels(localStorage.token, selectedTag); allModels = await getModels(localStorage.token); const providerModels = await getModels(localStorage.token, null, true); @@ -278,18 +281,17 @@ ...allModels, ...providerModels.filter((model: ModelListItem) => !allModelIds.has(model.id)) ]; - - const baseModelIds = new Set(baseModels.map((model: ModelListItem) => model.id)); + const listedModelIds = new Set(allModels.map((model) => model.id)); + allModels.push(...savedModels.filter((model) => !listedModelIds.has(model.id))); models = allModels - .filter((m: ModelListItem) => !selectedTag || baseModelIds.has(m.id)) .map((m: ModelListItem) => { - const baseModel = baseModels.find((model: ModelListItem) => model.id === m.id); + const savedModel = savedModels.find((model: ModelListItem) => model.id === m.id); - if (baseModel) { + if (savedModel) { return { ...m, - ...baseModel + ...savedModel }; } else { return { @@ -300,7 +302,8 @@ is_active: true }; } - }); + }) + .filter((model) => !selectedTag || modelTags(model).includes(selectedTag)); modelOrderList = [ ...modelOrderList.filter((id) => models.some((model) => model.id === id)), @@ -470,7 +473,7 @@ const upsertModelHandler = async (model, overrides = {}, showToast = true) => { model = { ...model, ...(isPresetModel(model) ? {} : { base_model_id: null }), ...overrides }; - if (baseModels.find((m: ModelListItem) => m.id === model.id) || isPresetModel(model)) { + if (savedModels.find((m: ModelListItem) => m.id === model.id) || isPresetModel(model)) { const res = await updateModelById(localStorage.token, model.id, model).catch((error) => { return null; }); @@ -602,7 +605,7 @@ }; const getFullModel = async (model: any) => - baseModels.some((baseModel) => baseModel.id === model.id) || isPresetModel(model) + savedModels.some((savedModel) => savedModel.id === model.id) || isPresetModel(model) ? ((await getModelById(localStorage.token, model.id).catch(() => null)) ?? model) : model;