From b7c4f47e90a7d0b208001d644be92e74eccd01bc Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Sun, 7 Jun 2026 18:02:42 +0200 Subject: [PATCH] feat: add auto-fill base model toggle to control default search behavior Adds a new 'Auto-fill model filter' setting under Search Defaults that controls whether new searches default to 'Auto' (detecting the workflow base model) or 'none' (Any model). The preference is persisted in localStorage as ModelResolver.autoFillBaseModel and is respected across search panel initialization, base model dropdown defaults, workflow state cloning, and dirty-state checks. --- .../search/download_target_methods.js | 3 ++ web/resolver/search/search_panel.js | 20 ++++++--- web/resolver/shell/workflow_state_methods.js | 5 ++- web/resolver/views/options_methods.js | 42 +++++++++++++++++-- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/web/resolver/search/download_target_methods.js b/web/resolver/search/download_target_methods.js index 2a90564..1edb583 100644 --- a/web/resolver/search/download_target_methods.js +++ b/web/resolver/search/download_target_methods.js @@ -588,6 +588,7 @@ export const downloadTargetMethods = { hf_use_api_search: localStorage.getItem('ModelResolver.hfUseApiSearch') !== 'false', hf_use_comfy_org_fallback: localStorage.getItem('ModelResolver.hfUseComfyOrgFallback') !== 'false', hf_use_brave_fallback: localStorage.getItem('ModelResolver.hfUseBraveFallback') !== 'false', + auto_fill_base_model: localStorage.getItem('ModelResolver.autoFillBaseModel') !== 'false', civitai_candidate_limit, search_source_enabled }; @@ -628,6 +629,8 @@ export const downloadTargetMethods = { localStorage.setItem('ModelResolver.hfUseComfyOrgFallback', data.hf_use_comfy_org_fallback ? 'true' : 'false'); if (data.hf_use_brave_fallback !== undefined) localStorage.setItem('ModelResolver.hfUseBraveFallback', data.hf_use_brave_fallback ? 'true' : 'false'); + if (data.auto_fill_base_model !== undefined) + localStorage.setItem('ModelResolver.autoFillBaseModel', data.auto_fill_base_model ? 'true' : 'false'); if (data.civitai_candidate_limit !== undefined) localStorage.setItem('ModelResolver.civitaiCandidateLimit', `${data.civitai_candidate_limit}`); diff --git a/web/resolver/search/search_panel.js b/web/resolver/search/search_panel.js index c8b8c4f..06afc91 100644 --- a/web/resolver/search/search_panel.js +++ b/web/resolver/search/search_panel.js @@ -29,7 +29,7 @@ export const searchPanelMethods = { createEmptySearchState() { return { selectedSource: 'all', - selectedBaseModel: 'auto', + selectedBaseModel: this.getDefaultSearchBaseModel(), results: { popular: null, model_list: null, @@ -47,6 +47,14 @@ export const searchPanelMethods = { }; }, + isAutoFillBaseModelEnabled() { + return localStorage.getItem('ModelResolver.autoFillBaseModel') !== 'false'; + }, + + getDefaultSearchBaseModel() { + return this.isAutoFillBaseModelEnabled() ? 'auto' : 'none'; + }, + getKnownBaseModelOptions() { const baseModelsList = this.baseModels?.base_models; if (Array.isArray(baseModelsList) && baseModelsList.length > 0) { @@ -250,7 +258,7 @@ export const searchPanelMethods = { getSearchBaseModelContext(missing = {}) { const state = this.getSearchState(missing); - const selected = state.selectedBaseModel || 'auto'; + const selected = state.selectedBaseModel || this.getDefaultSearchBaseModel(); if (selected === 'none') return ''; if (selected === 'auto') return this.getDominantWorkflowBaseModel(); return selected; @@ -852,7 +860,7 @@ export const searchPanelMethods = { if (baseEl) { const options = this.getKnownBaseModelOptions(); if (!options.some(option => option.value === state.selectedBaseModel)) { - state.selectedBaseModel = 'auto'; + state.selectedBaseModel = this.getDefaultSearchBaseModel(); } this.setDropdownValue(baseEl, state.selectedBaseModel, this.getSearchBaseModelLabel(state.selectedBaseModel)); } @@ -870,8 +878,8 @@ export const searchPanelMethods = { setSearchBaseModel(missing, baseModel, container) { const state = this.getSearchState(missing); - const nextBaseModel = baseModel || 'auto'; - const changed = (state.selectedBaseModel || 'auto') !== nextBaseModel; + const nextBaseModel = baseModel || this.getDefaultSearchBaseModel(); + const changed = (state.selectedBaseModel || this.getDefaultSearchBaseModel()) !== nextBaseModel; if (changed) { this.clearSearchProgressTimers(state.activeSearchRunId); state.results = this.createEmptySearchState().results; @@ -1250,7 +1258,7 @@ export const searchPanelMethods = { const searchBaseListId = `search-base-list-${missing.node_id}-${missing.widget_index}`; const state = this.getSearchState(missing); const selectedSource = state.selectedSource || 'all'; - const selectedBaseModel = state.selectedBaseModel || 'auto'; + const selectedBaseModel = state.selectedBaseModel || this.getDefaultSearchBaseModel(); const buttonText = options.buttonText || (this.hasSearchResultsForMissing(missing) ? 'Search Again' : 'Search'); diff --git a/web/resolver/shell/workflow_state_methods.js b/web/resolver/shell/workflow_state_methods.js index b2c4e64..3d4279b 100644 --- a/web/resolver/shell/workflow_state_methods.js +++ b/web/resolver/shell/workflow_state_methods.js @@ -186,7 +186,7 @@ export const workflowStateMethods = { } clone.selectedSource = clone.selectedSource || 'all'; - clone.selectedBaseModel = clone.selectedBaseModel || 'auto'; + clone.selectedBaseModel = clone.selectedBaseModel || this.getDefaultSearchBaseModel?.() || 'auto'; clone.results = this.mergeSearchResults({}, clone.results || {}); clone.lastAttemptSources = Array.isArray(clone.lastAttemptSources) ? clone.lastAttemptSources @@ -231,7 +231,8 @@ export const workflowStateMethods = { isPersistableSearchState(state = {}) { if ((state?.selectedSource || 'all') !== 'all') return true; - if ((state?.selectedBaseModel || 'auto') !== 'auto') return true; + const defaultBaseModel = this.getDefaultSearchBaseModel?.() || 'auto'; + if ((state?.selectedBaseModel || defaultBaseModel) !== defaultBaseModel) return true; if (state?.lastAttemptError) return true; if (this.hasSearchResults(state?.results || {})) return true; diff --git a/web/resolver/views/options_methods.js b/web/resolver/views/options_methods.js index 69548a8..b99c1f2 100644 --- a/web/resolver/views/options_methods.js +++ b/web/resolver/views/options_methods.js @@ -57,6 +57,18 @@ export const optionsMethods = { +
+
Search
+
+ +
+
Providers
@@ -65,14 +77,14 @@ export const optionsMethods = { CivitAI - 03 + 04
@@ -84,7 +96,7 @@ export const optionsMethods = { Maintenance - 05 + 06 @@ -106,6 +118,26 @@ export const optionsMethods = { +