diff --git a/CHANGELOG.md b/CHANGELOG.md
index 76dac5867..3f4c804e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -46,6 +46,7 @@ But there's more than SD3:
*example*: load FP4 or FP8 quantized T5 text-encoder into PixArt Sigma!
- support for `torch-directml` **0.2.2**, thanks @lshqqytiger!
*note*: new directml is finally based on modern `torch` 2.3.1!
+- xyz grid: add support for LoRA selector
- extra networks: info display now contains link to source url if model if its known
works for civitai and huggingface models
- force gc for lowvram users and improve gc logging
diff --git a/modules/shared.py b/modules/shared.py
index 81b32fa8b..ea551ea3b 100644
--- a/modules/shared.py
+++ b/modules/shared.py
@@ -821,7 +821,7 @@ options_templates.update(options_section(('extra_networks', "Networks"), {
"extra_networks_sep2": OptionInfo("
Extra networks general
", "", gr.HTML),
"extra_network_reference": OptionInfo(False, "Use reference values when available", gr.Checkbox),
"extra_network_skip_indexing": OptionInfo(False, "Build info on first access", gr.Checkbox),
- "extra_networks_default_multiplier": OptionInfo(1.0, "Default multiplier for extra networks", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}),
+ "extra_networks_default_multiplier": OptionInfo(1.0, "Default strength for extra networks", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}),
"diffusers_convert_embed": OptionInfo(False, "Auto-convert SD 1.5 embeddings to SDXL ", gr.Checkbox, {"visible": native}),
"extra_networks_sep3": OptionInfo("Extra networks settings
", "", gr.HTML),
"extra_networks_styles": OptionInfo(True, "Show built-in styles"),
diff --git a/scripts/xyz_grid.py b/scripts/xyz_grid.py
index c4b44282d..7de4b138f 100644
--- a/scripts/xyz_grid.py
+++ b/scripts/xyz_grid.py
@@ -65,6 +65,7 @@ def apply_sampler(p, x, xs):
else:
p.sampler_name = sampler_name
+
def apply_hr_sampler_name(p, x, xs):
hr_sampler_name = sd_samplers.samplers_map.get(x.lower(), None)
if hr_sampler_name is None:
@@ -72,6 +73,7 @@ def apply_hr_sampler_name(p, x, xs):
else:
p.hr_sampler_name = hr_sampler_name
+
def confirm_samplers(p, xs):
for x in xs:
if x.lower() not in sd_samplers.samplers_map:
@@ -138,6 +140,19 @@ def apply_vae(p, x, xs):
sd_vae.reload_vae_weights(shared.sd_model, vae_file=find_vae(x))
+def list_lora():
+ import sys
+ lora = [v for k, v in sys.modules.items() if k == 'networks'][0]
+ loras = [v.name for v in lora.available_networks.values()]
+ return ['None'] + loras
+
+
+def apply_lora(p, x, xs):
+ if x == 'None':
+ return
+ p.prompt = p.prompt + f" "
+
+
def apply_te(p, x, xs):
shared.opts.data["sd_text_encoder"] = x
sd_models.reload_text_encoder()
@@ -235,6 +250,7 @@ axis_options = [
AxisOption("Prompt S/R", str, apply_prompt, fmt=format_value),
AxisOption("Model", str, apply_checkpoint, fmt=format_value, cost=1.0, choices=lambda: sorted(sd_models.checkpoints_list)),
AxisOption("VAE", str, apply_vae, cost=0.7, choices=lambda: ['None'] + list(sd_vae.vae_dict)),
+ AxisOption("LoRA", str, apply_lora, cost=0.5, choices=list_lora),
AxisOption("Text encoder", str, apply_te, cost=0.7, choices=lambda: ['None', 'T5 FP4', 'T5 FP8', 'T5 FP16']),
AxisOption("Styles", str, apply_styles, choices=lambda: [s.name for s in shared.prompt_styles.styles.values()]),
AxisOption("Seed", int, apply_field("seed")),