1
0
mirror of https://github.com/vladmandic/sdnext.git synced 2026-01-27 15:02:48 +03:00
Files
sdnext/scripts/skip_layer_guidance.py
Vladimir Mandic cd84cfec11 xyzgrid with control tab
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2025-07-15 14:35:27 -04:00

74 lines
2.8 KiB
Python

import sys
import gradio as gr
from modules import scripts_manager, processing, shared
registered = False
class Script(scripts_manager.Script):
def __init__(self):
super().__init__()
self.register()
def title(self):
return 'SLG: Skip Layer Guidance'
def show(self, is_img2img):
return True
# return signature is array of gradio components
def ui(self, _is_img2img):
with gr.Row():
layers = gr.Textbox(label='Skip guidance layers', value='7,8,9')
with gr.Row():
scale = gr.Slider(label='Guidance strength', minimum=0.0, maximum=1.0, step=0.01, value=1.0)
with gr.Row():
start = gr.Slider(label='Guidance start', minimum=0.0, maximum=1.0, step=0.01, value=0.01)
stop = gr.Slider(label='Guidance stop', minimum=0.0, maximum=1.0, step=0.01, value=0.2)
return [layers, scale, start, stop]
def register(self): # register xyz grid elements
global registered # pylint: disable=global-statement
if registered:
return
registered = True
def apply_task_args(field):
def fun(p, x, xs): # pylint: disable=unused-argument
try:
val = str(x).replace('"', '')
val = [int(layer.strip()) for layer in val.split(',')]
except Exception:
return
if len(val) > 0:
shared.log.debug(f'SLG: {field}={val}')
p.task_args[field] = val
return fun
xyz_classes = [v for k, v in sys.modules.items() if 'xyz_grid_classes' in k]
if xyz_classes and len(xyz_classes) > 0:
xyz_classes = xyz_classes[0]
options = [
xyz_classes.AxisOption("[SLG] Layers", str, apply_task_args("skip_guidance_layers")),
]
for option in options:
if option not in xyz_classes.axis_options:
xyz_classes.axis_options.append(option)
def run(self, p: processing.StableDiffusionProcessing, layers: str = '', scale: float = 1.0, start: float = 1.0, stop: float = 1.0): # pylint: disable=arguments-differ, unused-argument
if shared.sd_model_type != 'sd3':
return
p.task_args['skip_layer_guidance_scale'] = float(scale)
p.task_args['skip_layer_guidance_start'] = float(start)
p.task_args['skip_layer_guidance_stop'] = float(stop)
parsed = []
try:
parsed = [int(layer.strip()) for layer in layers.split(',')]
except Exception:
return
if len(parsed) == 0:
return
p.task_args['skip_guidance_layers'] = parsed
shared.log.info(f'SLG: layers={parsed} scale={scale} start={start} stop={stop}')