From f56e3eb3b007b819e55646416ea38cb8035d9683 Mon Sep 17 00:00:00 2001 From: Manuel Schmid Date: Sat, 23 Dec 2023 19:30:49 +0100 Subject: [PATCH 1/4] add preset selection uses meta parsing to set presets in user session (UI elements only) --- modules/config.py | 95 ++++++++++++++++++++++++++++-------------- modules/meta_parser.py | 11 +++++ webui.py | 35 ++++++++++++++++ 3 files changed, 109 insertions(+), 32 deletions(-) diff --git a/modules/config.py b/modules/config.py index 9cc61788..1097874f 100644 --- a/modules/config.py +++ b/modules/config.py @@ -79,21 +79,51 @@ def try_load_deprecated_user_path_config(): try_load_deprecated_user_path_config() +def list_presets(): + preset_folder = 'presets' + presets = ['None'] + if not os.path.exists(preset_folder): + print('No presets found.') + return presets; + + return presets + [f[:f.index(".json")] for f in os.listdir(preset_folder) if f.endswith('.json')] + +available_presets = list_presets() + + +def try_get_preset_content(preset): + if isinstance(preset, str): + preset_path = os.path.abspath(f'./presets/{preset}.json') + try: + if os.path.exists(preset_path): + with open(preset_path, "r", encoding="utf-8") as json_file: + json_content = json.load(json_file) + print(f'Loaded preset: {preset_path}') + return json_content + else: + raise FileNotFoundError + except Exception as e: + print(f'Load preset [{preset_path}] failed') + print(e) + +def try_load_preset_global(preset): + global config_dict + + if isinstance(preset, str): + preset_path = os.path.abspath(f'./presets/{preset}.json') + try: + if os.path.exists(preset_path): + with open(preset_path, "r", encoding="utf-8") as json_file: + config_dict.update(json.load(json_file)) + print(f'Loaded preset: {preset_path}') + else: + raise FileNotFoundError + except Exception as e: + print(f'Load preset [{preset_path}] failed') + print(e) + preset = args_manager.args.preset - -if isinstance(preset, str): - preset_path = os.path.abspath(f'./presets/{preset}.json') - try: - if os.path.exists(preset_path): - with open(preset_path, "r", encoding="utf-8") as json_file: - config_dict.update(json.load(json_file)) - print(f'Loaded preset: {preset_path}') - else: - raise FileNotFoundError - except Exception as e: - print(f'Load preset [{preset_path}] failed') - print(e) - +try_load_preset_global(preset) def get_dir_or_set_default(key, default_value): global config_dict, visited_keys, always_save_keys @@ -315,24 +345,25 @@ example_inpaint_prompts = [[x] for x in example_inpaint_prompts] config_dict["default_loras"] = default_loras = default_loras[:5] + [['None', 1.0] for _ in range(5 - len(default_loras))] -possible_preset_keys = [ - "default_model", - "default_refiner", - "default_refiner_switch", - "default_loras", - "default_cfg_scale", - "default_sample_sharpness", - "default_sampler", - "default_scheduler", - "default_performance", - "default_prompt", - "default_prompt_negative", - "default_styles", - "default_aspect_ratio", - "checkpoint_downloads", - "embeddings_downloads", - "lora_downloads", -] +# mapping config to meta parameter +possible_preset_keys = { + "default_model": "Base Model", + "default_refiner": "Refiner Model", + "default_refiner_switch": "Refiner Switch", + "default_loras": "TODO", + "default_cfg_scale": "Guidance Scale", + "default_sample_sharpness": "Sharpness", + "default_sampler": "Sampler", + "default_scheduler": "Scheduler", + "default_performance": "Performance", + "default_prompt": "Prompt", + "default_prompt_negative": "Negative Prompt", + "default_styles": "Styles", + "default_aspect_ratio": "Resolution", + "checkpoint_downloads": None, + "embeddings_downloads": None, + "lora_downloads": None, +} REWRITE_PRESET = False diff --git a/modules/meta_parser.py b/modules/meta_parser.py index 78d73978..f79323c8 100644 --- a/modules/meta_parser.py +++ b/modules/meta_parser.py @@ -142,3 +142,14 @@ def load_parameter_button_click(raw_prompt_txt): results.append(gr.update()) return results + +def parse_meta_from_preset(preset_content): + assert isinstance(preset_content, dict) + preset_prepared = {} + + for k, v in preset_content.items(): + if k in modules.config.possible_preset_keys: + if modules.config.possible_preset_keys[k] is not None: + preset_prepared[modules.config.possible_preset_keys[k]] = v + + return load_parameter_button_click(json.dumps(preset_prepared)) \ No newline at end of file diff --git a/webui.py b/webui.py index a5138abf..57ca89ac 100644 --- a/webui.py +++ b/webui.py @@ -220,6 +220,10 @@ with shared.gradio_root: with gr.Column(scale=1, visible=modules.config.default_advanced_checkbox) as advanced_column: with gr.Tab(label='Setting'): + preset_selection = gr.Radio(label='Preset', + choices=modules.config.available_presets, + value=args_manager.args.preset if args_manager.args.preset else "None", + interactive=True) performance_selection = gr.Radio(label='Performance', choices=modules.flags.performance_selections, value=modules.config.default_performance) @@ -456,6 +460,37 @@ with shared.gradio_root: model_refresh.click(model_refresh_clicked, [], [base_model, refiner_model] + lora_ctrls, queue=False, show_progress=False) + def preset_selection_change(preset): + preset_content = modules.config.try_get_preset_content(preset) + if preset_content is not None: + return modules.meta_parser.parse_meta_from_preset(preset_content) + + preset_selection.change(preset_selection_change, inputs=preset_selection, outputs=[ + advanced_checkbox, + image_number, + prompt, + negative_prompt, + style_selections, + performance_selection, + aspect_ratios_selection, + overwrite_width, + overwrite_height, + sharpness, + guidance_scale, + adm_scaler_positive, + adm_scaler_negative, + adm_scaler_end, + base_model, + refiner_model, + refiner_switch, + sampler_name, + scheduler_name, + seed_random, + image_seed, + generate_button, + load_parameter_button + ] + lora_ctrls, queue=False, show_progress=False) + performance_selection.change(lambda x: [gr.update(interactive=x != 'Extreme Speed')] * 11 + [gr.update(visible=x != 'Extreme Speed')] * 1, inputs=performance_selection, From 891a1acb6297432006e46c88f522a14cb47565d1 Mon Sep 17 00:00:00 2001 From: Manuel Schmid Date: Sat, 23 Dec 2023 19:57:56 +0100 Subject: [PATCH 2/4] add LoRA handling --- modules/config.py | 2 +- modules/meta_parser.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/config.py b/modules/config.py index 1097874f..952fc602 100644 --- a/modules/config.py +++ b/modules/config.py @@ -350,7 +350,7 @@ possible_preset_keys = { "default_model": "Base Model", "default_refiner": "Refiner Model", "default_refiner_switch": "Refiner Switch", - "default_loras": "TODO", + "default_loras": "", "default_cfg_scale": "Guidance Scale", "default_sample_sharpness": "Sharpness", "default_sampler": "Sampler", diff --git a/modules/meta_parser.py b/modules/meta_parser.py index f79323c8..b9ee47de 100644 --- a/modules/meta_parser.py +++ b/modules/meta_parser.py @@ -150,6 +150,12 @@ def parse_meta_from_preset(preset_content): for k, v in preset_content.items(): if k in modules.config.possible_preset_keys: if modules.config.possible_preset_keys[k] is not None: - preset_prepared[modules.config.possible_preset_keys[k]] = v + if k != "default_loras": + preset_prepared[modules.config.possible_preset_keys[k]] = v + else: + lora_count = 1 + for lora_value in v[:5]: + preset_prepared[f'LoRA {lora_count}'] = ' : '.join(map(str, lora_value)) + lora_count += 1 return load_parameter_button_click(json.dumps(preset_prepared)) \ No newline at end of file From 2770a40dc1f5a6acf3d31aa22cc976d8ea7bd9c6 Mon Sep 17 00:00:00 2001 From: Manuel Schmid Date: Sat, 23 Dec 2023 21:38:22 +0100 Subject: [PATCH 3/4] use default config as fallback value --- modules/config.py | 7 ++++--- modules/meta_parser.py | 20 ++++++++++---------- webui.py | 7 +++---- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/modules/config.py b/modules/config.py index 952fc602..42386f2f 100644 --- a/modules/config.py +++ b/modules/config.py @@ -81,7 +81,7 @@ try_load_deprecated_user_path_config() def list_presets(): preset_folder = 'presets' - presets = ['None'] + presets = ['initial'] if not os.path.exists(preset_folder): print('No presets found.') return presets; @@ -105,6 +105,7 @@ def try_get_preset_content(preset): except Exception as e: print(f'Load preset [{preset_path}] failed') print(e) + return {} def try_load_preset_global(preset): global config_dict @@ -181,12 +182,12 @@ def get_config_item_or_set_default(key, default_value, validator, disable_empty_ return default_value -default_base_model_name = get_config_item_or_set_default( +default_base_model_name = default_model = get_config_item_or_set_default( key='default_model', default_value='juggernautXL_version6Rundiffusion.safetensors', validator=lambda x: isinstance(x, str) ) -default_refiner_model_name = get_config_item_or_set_default( +default_refiner_model_name = default_refiner = get_config_item_or_set_default( key='default_refiner', default_value='None', validator=lambda x: isinstance(x, str) diff --git a/modules/meta_parser.py b/modules/meta_parser.py index b9ee47de..b9465c48 100644 --- a/modules/meta_parser.py +++ b/modules/meta_parser.py @@ -146,16 +146,16 @@ def load_parameter_button_click(raw_prompt_txt): def parse_meta_from_preset(preset_content): assert isinstance(preset_content, dict) preset_prepared = {} + items = preset_content - for k, v in preset_content.items(): - if k in modules.config.possible_preset_keys: - if modules.config.possible_preset_keys[k] is not None: - if k != "default_loras": - preset_prepared[modules.config.possible_preset_keys[k]] = v - else: - lora_count = 1 - for lora_value in v[:5]: - preset_prepared[f'LoRA {lora_count}'] = ' : '.join(map(str, lora_value)) - lora_count += 1 + for settings_key, meta_key in modules.config.possible_preset_keys.items(): + if settings_key != "default_loras": + preset_prepared[meta_key] = items[settings_key] if settings_key in items and items[settings_key] is not None else getattr(modules.config, settings_key) + else: + loras = getattr(modules.config, settings_key) + if settings_key in items: + loras = items[settings_key] + for index, lora in enumerate(loras[:5]): + preset_prepared[f'LoRA {index + 1}'] = ' : '.join(map(str, lora)) return load_parameter_button_click(json.dumps(preset_prepared)) \ No newline at end of file diff --git a/webui.py b/webui.py index 57ca89ac..f43d39b0 100644 --- a/webui.py +++ b/webui.py @@ -222,7 +222,7 @@ with shared.gradio_root: with gr.Tab(label='Setting'): preset_selection = gr.Radio(label='Preset', choices=modules.config.available_presets, - value=args_manager.args.preset if args_manager.args.preset else "None", + value=args_manager.args.preset if args_manager.args.preset else "initial", interactive=True) performance_selection = gr.Radio(label='Performance', choices=modules.flags.performance_selections, @@ -461,9 +461,8 @@ with shared.gradio_root: queue=False, show_progress=False) def preset_selection_change(preset): - preset_content = modules.config.try_get_preset_content(preset) - if preset_content is not None: - return modules.meta_parser.parse_meta_from_preset(preset_content) + preset_content = modules.config.try_get_preset_content(preset) if preset != 'initial' else {} + return modules.meta_parser.parse_meta_from_preset(preset_content) preset_selection.change(preset_selection_change, inputs=preset_selection, outputs=[ advanced_checkbox, From ccfd4f5094b5e441f37929409e6a486a737d101b Mon Sep 17 00:00:00 2001 From: Manuel Schmid Date: Sat, 23 Dec 2023 22:10:50 +0100 Subject: [PATCH 4/4] add preset refresh on "Refresh All Files" click --- modules/config.py | 3 +++ webui.py | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/config.py b/modules/config.py index 42386f2f..336092fa 100644 --- a/modules/config.py +++ b/modules/config.py @@ -90,6 +90,9 @@ def list_presets(): available_presets = list_presets() +def update_presets(): + global available_presets + available_presets = list_presets() def try_get_preset_content(preset): if isinstance(preset, str): diff --git a/webui.py b/webui.py index f43d39b0..c3c0a187 100644 --- a/webui.py +++ b/webui.py @@ -451,13 +451,16 @@ with shared.gradio_root: def model_refresh_clicked(): modules.config.update_all_model_names() + modules.config.update_presets() results = [] - results += [gr.update(choices=modules.config.model_filenames), gr.update(choices=['None'] + modules.config.model_filenames)] + results += [gr.update(choices=modules.config.model_filenames), + gr.update(choices=['None'] + modules.config.model_filenames), + gr.update(choices=modules.config.available_presets)] for i in range(5): results += [gr.update(choices=['None'] + modules.config.lora_filenames), gr.update()] return results - model_refresh.click(model_refresh_clicked, [], [base_model, refiner_model] + lora_ctrls, + model_refresh.click(model_refresh_clicked, [], [base_model, refiner_model, preset_selection] + lora_ctrls, queue=False, show_progress=False) def preset_selection_change(preset):