diff --git a/modules/api/server.py b/modules/api/server.py index a01fb744d..408da7883 100644 --- a/modules/api/server.py +++ b/modules/api/server.py @@ -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(): diff --git a/modules/options_handler.py b/modules/options_handler.py index 6d7ae67c6..1c84f7b85 100644 --- a/modules/options_handler.py +++ b/modules/options_handler.py @@ -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) diff --git a/modules/postprocess/yolo.py b/modules/postprocess/yolo.py index 5ff8b1441..01da6a0e5 100644 --- a/modules/postprocess/yolo.py +++ b/modules/postprocess/yolo.py @@ -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}') diff --git a/modules/shared.py b/modules/shared.py index 369810b5b..c9d85a19d 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -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 diff --git a/modules/ui_caption.py b/modules/ui_caption.py index aad6deddb..d27b76ce6 100644 --- a/modules/ui_caption.py +++ b/modules/ui_caption.py @@ -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() diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 7d2eccae2..c35830cc7 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -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 diff --git a/modules/ui_sections.py b/modules/ui_sections.py index 0d57eccb2..ffd0f0ec1 100644 --- a/modules/ui_sections.py +++ b/modules/ui_sections.py @@ -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): diff --git a/modules/ui_settings.py b/modules/ui_settings.py index fc6bfa1e2..345077ec9 100644 --- a/modules/ui_settings.py +++ b/modules/ui_settings.py @@ -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() diff --git a/webui.py b/webui.py index 9cc17df28..7606f187a 100644 --- a/webui.py +++ b/webui.py @@ -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():