Simplify options init/save/load

pull/4541/head
awsr 2026-01-10 13:27:38 -08:00
parent d7e5c97c89
commit 0faabffc14
No known key found for this signature in database
9 changed files with 22 additions and 24 deletions

View File

@ -99,7 +99,7 @@ def set_config(req: Dict[str, Any]):
updated = []
for k, v in req.items():
updated.append({ k: shared.opts.set(k, v) })
shared.opts.save(shared.config_filename)
shared.opts.save()
return { "updated": updated }
def get_cmd_flags():

View File

@ -20,17 +20,18 @@ compatibility_opts = ['clip_skip', 'uni_pc_lower_order_final', 'uni_pc_order']
class Options():
data = None
data_labels = None
filename = None
typemap = {int: float}
debug = os.environ.get('SD_CONFIG_DEBUG', None) is not None
def __init__(self, options_templates: dict[str, OptionInfo | LegacyOption] = {}, restricted_opts: set[str] | None = None):
def __init__(self, options_templates: dict[str, OptionInfo | LegacyOption] = {}, restricted_opts: set[str] | None = None, *, filename = "config.json"):
if restricted_opts is None:
restricted_opts = set()
self.filename = filename
self.data_labels = options_templates
self.restricted_opts = restricted_opts
self.data = {k: v.default for k, v in self.data_labels.items()}
self.legacy = [k for k, v in self.data_labels.items() if isinstance(v, LegacyOption)]
self.load()
def __setattr__(self, key, value): # pylint: disable=inconsistent-return-statements
if self.data is not None:
@ -103,8 +104,6 @@ class Options():
def save_atomic(self, filename=None, silent=False):
if self.debug:
log.debug(f'Settings: save settings="{self.filename}" override="{filename}" cmd="{cmd_opts.config}" cwd="{os.getcwd()}"')
if self.filename is None:
self.filename = cmd_opts.config
if filename is None:
filename = self.filename
filename = os.path.abspath(filename)

View File

@ -490,7 +490,7 @@ class YoloRestorer(Detailer):
shared.opts.detailer_sort = sort
shared.opts.detailer_seg = seg
# shared.opts.detailer_resolution = resolution
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
shared.log.debug(f'Detailer settings: models={detailers} classes={classes} strength={strength} conf={min_confidence} max={max_detected} iou={iou} size={min_size}-{max_size} padding={padding} steps={steps} resolution={resolution} save={save} sort={sort} seg={seg}')
if not self.ui_mode:
shared.log.debug(f'Detailer expert: {text}')

View File

@ -831,9 +831,8 @@ options_templates.update(options_section(('hidden_options', "Hidden options"), {
from modules.shared_legacy import get_legacy_options
options_templates.update(get_legacy_options())
from modules.options_handler import Options
opts = Options(options_templates, restricted_opts)
config_filename = cmd_opts.config
opts.load(config_filename)
opts = Options(options_templates, restricted_opts, filename=config_filename)
cmd_opts = cmd_args.settings_args(opts, cmd_opts)
if cmd_opts.locale is not None:
opts.data['ui_locale'] = cmd_opts.locale

View File

@ -40,7 +40,7 @@ def update_vlm_params(*args):
shared.opts.interrogate_vlm_keep_prefill = bool(vlm_keep_prefill)
shared.opts.interrogate_vlm_keep_thinking = bool(vlm_keep_thinking)
shared.opts.interrogate_vlm_thinking_mode = bool(vlm_thinking_mode)
shared.opts.save(shared.config_filename)
shared.opts.save()
def update_clip_params(*args):
@ -52,7 +52,7 @@ def update_clip_params(*args):
shared.opts.interrogate_clip_num_beams = int(clip_num_beams)
shared.opts.interrogate_clip_flavor_count = int(clip_flavor_count)
shared.opts.interrogate_clip_chunk_size = int(clip_chunk_size)
shared.opts.save(shared.config_filename)
shared.opts.save()
openclip.update_interrogate_params()

View File

@ -1071,7 +1071,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False):
def ui_sort_cards(sort_order):
if shared.opts.extra_networks_sort != sort_order:
shared.opts.extra_networks_sort = sort_order
shared.opts.save(shared.config_filename)
shared.opts.save()
return f'Networks: sort={sort_order}'
dummy = gr.State(value=False) # pylint: disable=abstract-class-instantiated

View File

@ -200,51 +200,51 @@ def create_sampler_options(tabname):
shared.opts.data['schedulers_use_loworder'] = 'low order' in sampler_options
shared.opts.data['schedulers_rescale_betas'] = 'rescale' in sampler_options
shared.log.debug(f'Sampler set options: {sampler_options}')
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sampler_timesteps(timesteps):
shared.log.debug(f'Sampler set options: timesteps={timesteps}')
shared.opts.schedulers_timesteps = timesteps
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sampler_spacing(spacing):
shared.log.debug(f'Sampler set options: spacing={spacing}')
shared.opts.schedulers_timestep_spacing = spacing
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sampler_sigma(sampler_sigma):
shared.log.debug(f'Sampler set options: sigma={sampler_sigma}')
shared.opts.schedulers_sigma = sampler_sigma
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sampler_order(sampler_order):
shared.log.debug(f'Sampler set options: order={sampler_order}')
shared.opts.schedulers_solver_order = sampler_order
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sampler_prediction(sampler_prediction):
shared.log.debug(f'Sampler set options: prediction={sampler_prediction}')
shared.opts.schedulers_prediction_type = sampler_prediction
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sampler_beta(sampler_beta):
shared.log.debug(f'Sampler set options: beta={sampler_beta}')
shared.opts.schedulers_beta_schedule = sampler_beta
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sampler_shift(sampler_shift, sampler_base_shift, sampler_max_shift):
shared.log.debug(f'Sampler set options: shift={sampler_shift} base={sampler_base_shift} max={sampler_max_shift}')
shared.opts.schedulers_shift = sampler_shift
shared.opts.schedulers_base_shift = sampler_base_shift
shared.opts.schedulers_max_shift = sampler_max_shift
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
def set_sigma_adjust(val, start, end):
shared.log.debug(f'Sampler set options: sigma={val} min={start} max={end}')
shared.opts.schedulers_sigma_adjust = val
shared.opts.schedulers_sigma_adjust_min = start
shared.opts.schedulers_sigma_adjust_max = end
shared.opts.save(shared.config_filename, silent=True)
shared.opts.save(silent=True)
# 'linear', 'scaled_linear', 'squaredcos_cap_v2'
def set_sampler_preset(preset):

View File

@ -37,7 +37,7 @@ def apply_setting(key, value):
shared.opts.data[key] = valtype(value) if valtype != type(None) else value
if oldval != value and shared.opts.data_labels[key].onchange is not None:
shared.opts.data_labels[key].onchange()
shared.opts.save(shared.config_filename)
shared.opts.save()
return getattr(shared.opts, key)
@ -149,7 +149,7 @@ def run_settings(*args):
shared.opts.sd_backend = "diffusers"
try:
if len(changed) > 0:
shared.opts.save(shared.config_filename)
shared.opts.save()
shared.log.info(f'Settings: changed={len(changed)} {changed}')
except RuntimeError:
shared.log.error(f'Settings failed: change={len(changed)} {changed}')
@ -167,7 +167,7 @@ def run_settings_single(value, key, progress=False):
if shared.cmd_opts.use_directml:
from modules.dml import directml_override_opts
directml_override_opts()
shared.opts.save(shared.config_filename)
shared.opts.save()
if key not in ['sd_model_checkpoint', 'sd_model_refiner', 'sd_vae', 'sd_te', 'sd_unet']:
shared.log.debug(f'Setting changed: {key}={value} progress={progress}')
return get_value_for_setting(key), shared.opts.dumpjson()

View File

@ -378,7 +378,7 @@ def webui(restart=False):
load_model()
mount_subpath(app)
shared.opts.save(shared.config_filename)
shared.opts.save()
if shared.cmd_opts.profile:
for k, v in modules.script_callbacks.callback_map.items():