diff --git a/backend/open_webui/routers/configs.py b/backend/open_webui/routers/configs.py index 063c06e6b..e206ea32d 100644 --- a/backend/open_webui/routers/configs.py +++ b/backend/open_webui/routers/configs.py @@ -489,6 +489,13 @@ class ModelsConfigForm(BaseModel): DEFAULT_MODEL_PARAMS: Optional[dict] = None +@router.get('/models/defaults') +async def get_models_defaults(request: Request, user=Depends(get_verified_user)): + return { + 'DEFAULT_MODEL_METADATA': request.app.state.config.DEFAULT_MODEL_METADATA, + } + + @router.get('/models', response_model=ModelsConfigForm) async def get_models_config(request: Request, user=Depends(get_admin_user)): return { diff --git a/src/lib/apis/configs/index.ts b/src/lib/apis/configs/index.ts index fb3a33469..d2abfe186 100644 --- a/src/lib/apis/configs/index.ts +++ b/src/lib/apis/configs/index.ts @@ -442,6 +442,33 @@ export const setCodeExecutionConfig = async (token: string, config: object) => { return res; }; +export const getModelsDefaults = async (token: string) => { + let error = null; + + const res = await fetch(`${WEBUI_API_BASE_URL}/configs/models/defaults`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + } + }) + .then(async (res) => { + if (!res.ok) throw await res.json(); + return res.json(); + }) + .catch((err) => { + console.error(err); + error = err.detail; + return null; + }); + + if (error) { + throw error; + } + + return res; +}; + export const getModelsConfig = async (token: string) => { let error = null; diff --git a/src/lib/components/workspace/Models/ModelEditor.svelte b/src/lib/components/workspace/Models/ModelEditor.svelte index 9deeff102..5b5bd83ca 100644 --- a/src/lib/components/workspace/Models/ModelEditor.svelte +++ b/src/lib/components/workspace/Models/ModelEditor.svelte @@ -7,6 +7,7 @@ import { getTools } from '$lib/apis/tools'; import { getFunctions } from '$lib/apis/functions'; + import { getModelsDefaults } from '$lib/apis/configs'; import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte'; import Tags from '$lib/components/common/Tags.svelte'; @@ -239,6 +240,16 @@ await tools.set(await getTools(localStorage.token)); await functions.set(await getFunctions(localStorage.token)); + // Fetch admin-configured default model metadata so the editor + // reflects the actual defaults rather than hardcoded values + const modelsConfig = await getModelsDefaults(localStorage.token).catch(() => null); + const defaultMeta = modelsConfig?.DEFAULT_MODEL_METADATA ?? {}; + + // Use admin defaults as base, falling back to hardcoded defaults + capabilities = { ...DEFAULT_CAPABILITIES, ...(defaultMeta.capabilities ?? {}) }; + defaultFeatureIds = defaultMeta.defaultFeatureIds ?? []; + builtinTools = defaultMeta.builtinTools ?? {}; + // Scroll to top 'workspace-container' element const workspaceContainer = document.getElementById('workspace-container'); if (workspaceContainer) { @@ -301,9 +312,10 @@ defaultFilterIds = model?.meta?.defaultFilterIds ?? []; actionIds = model?.meta?.actionIds ?? []; + // Per-model overrides take precedence over admin defaults capabilities = { ...capabilities, ...(model?.meta?.capabilities ?? {}) }; - defaultFeatureIds = model?.meta?.defaultFeatureIds ?? []; - builtinTools = model?.meta?.builtinTools ?? {}; + defaultFeatureIds = model?.meta?.defaultFeatureIds ?? defaultFeatureIds; + builtinTools = model?.meta?.builtinTools ?? builtinTools; tts = { voice: model?.meta?.tts?.voice ?? '' }; accessGrants = model?.access_grants ?? [];