From 4dc56c6813d9d8dd1c66dff5baf7b944f5f65f24 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 6 Jul 2025 16:42:29 -0400 Subject: [PATCH] allow styles to modify settings and improve parser Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ modules/styles.py | 28 ++++++++++++++++++++-------- wiki | 2 +- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec4f4ee3f..ca8c98d49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ *note*: SD.Next will use either SageAttention v1/v2/v2++, depending which one is installed until authors provide pre-build wheels for v2++, you need to install it manually or SD.Next will auto-install v1 - **Other** + - **Styles** can now include both generation params and server settings + see [Styles wiki](https://github.com/vladmandic/sdnext/wiki/Styles) for details - **TAESD** is now default preview type since its the only one that supports most new models - SD.Next now starts with *locked* state preventing model loading until startup is complete - **API** diff --git a/modules/styles.py b/modules/styles.py index 1369315c5..832192fe6 100644 --- a/modules/styles.py +++ b/modules/styles.py @@ -6,7 +6,7 @@ import csv import json import time import random -from modules import files_cache, shared, infotext +from modules import files_cache, shared, infotext, sd_models, sd_vae class Style(): @@ -145,37 +145,49 @@ def apply_styles_to_extra(p, style: Style): 'sampler': 'sampler_name', 'size-1': 'width', 'size-2': 'height', + 'model': 'sd_model_checkpoint', + 'vae': 'sd_vae', + 'unet': 'sd_unet', + 'te': 'sd_text_encoder', + 'refine': 'enable_hr', + 'hires': 'hr_force', } name_exclude = [ 'size', ] reference_style = get_reference_style() extra = infotext.parse(reference_style) if shared.opts.extra_network_reference_values else {} - style_extra = apply_wildcards_to_prompt(style.extra, [style.wildcards], silent=True) style_extra = ' ' + style_extra.lower() extra.update(infotext.parse(style_extra)) extra.pop('Prompt', None) extra.pop('Negative prompt', None) - fields = [] + params = [] + settings = [] skipped = [] for k, v in extra.items(): - k = k.lower() - k = k.replace(' ', '_') + k = k.lower().replace(' ', '_') if k in name_map: # rename some fields k = name_map[k] if k in name_exclude: # exclude some fields continue - if hasattr(p, k): + elif hasattr(p, k): orig = getattr(p, k) if (type(orig) != type(v)) and (orig is not None): if not (type(orig) == int and type(v) == float): # dont convert float to int v = type(orig)(v) setattr(p, k, v) - fields.append(f'{k}={v}') + params.append(f'{k}={v}') + elif shared.opts.data_labels.get(k, None) is not None: + shared.opts.data[k] = v + if k == 'sd_model_checkpoint': + sd_models.reload_model_weights() + if k == 'sd_vae': + sd_vae.reload_vae_weights() + settings.append(f'{k}={v}') else: skipped.append(f'{k}={v}') - shared.log.debug(f'Apply style: name="{style.name}" extra={fields} skipped={skipped} reference={True if reference_style else False}') + shared.log.debug(f'Apply style: name="{style.name}" params={params} settings={settings} unknown={skipped} reference={True if reference_style else False}') class StyleDatabase: diff --git a/wiki b/wiki index d685d8132..a8d925f54 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit d685d8132b201b824d300a8f1c092ee8e15e4ef2 +Subproject commit a8d925f54c30d826913451b6eea52694657cb0ea