diff --git a/CHANGELOG.md b/CHANGELOG.md index d78943f42..b989132f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ This release can be considered an LTS release before we kick off the next round - create video from generated grid images supports all standard video types and interpolation - UI: + - better gallery and networks sidebar sizing - add additional [hotkeys](https://github.com/vladmandic/automatic/wiki/Hotkeys) - add show networks on startup setting - better mapping of networks previews @@ -68,6 +69,8 @@ This release can be considered an LTS release before we kick off the next round - Auto-remove invalid packages from `venv/site-packages` e.g. packages starting with `~` which are left-over due to windows access violation - Requirements: update + - Scripts: + - More verbose descriptions for all scripts - Model loader: - Report modules included in safetensors when attempting to load a model - CLI: diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 9a33baa86..77fe125f3 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -481,11 +481,13 @@ function setupExtraNetworksForTab(tabname) { en.style.position = 'absolute'; en.style.height = 'auto'; en.style.width = `${window.opts.extra_networks_sidebar_width}vw`; + en.style.maxWidth = '655px'; en.style.right = '0'; en.style.top = '13em'; en.style.transition = 'width 0.3s ease'; en.style.zIndex = 100; - gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = `${100 - 2 - window.opts.extra_networks_sidebar_width}vw`; + // gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = `${100 - 2 - window.opts.extra_networks_sidebar_width}vw`; + gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = `calc(100vw - 2em - min(${window.opts.extra_networks_sidebar_width}vw, 655px))`; } else { en.style.position = 'relative'; en.style.height = 'unset'; diff --git a/modules/face/__init__.py b/modules/face/__init__.py index aae3cdaa2..19af6d01b 100644 --- a/modules/face/__init__.py +++ b/modules/face/__init__.py @@ -9,7 +9,7 @@ debug = shared.log.trace if os.environ.get('SD_FACE_DEBUG', None) is not None el class Script(scripts.Script): def title(self): - return 'Face' + return 'Face: Multiple ID Transfers' def show(self, is_img2img): return True if shared.native else False @@ -45,7 +45,7 @@ class Script(scripts.Script): # return signature is array of gradio components def ui(self, _is_img2img): with gr.Row(): - gr.HTML("  Face module
") + gr.HTML("  Face: Multiple ID Transfers
") with gr.Row(): mode = gr.Dropdown(label='Mode', choices=['None', 'FaceID', 'FaceSwap', 'InstantID', 'PhotoMaker'], value='None') with gr.Group(visible=False) as cfg_faceid: diff --git a/modules/scripts.py b/modules/scripts.py index 8a67d0a50..cf2cf25b9 100644 --- a/modules/scripts.py +++ b/modules/scripts.py @@ -352,7 +352,9 @@ class ScriptRunner: self.selectable_scripts.clear() auto_processing_scripts = scripts_auto_postprocessing.create_auto_preprocessing_script_data() - for script_class, path, _basedir, _script_module in auto_processing_scripts + scripts_data: + all_scripts = auto_processing_scripts + scripts_data + sorted_scripts = sorted(all_scripts, key=lambda x: x.script_class().title().lower()) + for script_class, path, _basedir, _script_module in sorted_scripts: try: script = script_class() script.filename = path diff --git a/modules/ui_common.py b/modules/ui_common.py index 9ad87c17f..9c4bb5cdc 100644 --- a/modules/ui_common.py +++ b/modules/ui_common.py @@ -246,7 +246,7 @@ def create_output_panel(tabname, preview=True, prompt=None, height=None): # columns are for <576px, <768px, <992px, <1200px, <1400px, >1400px result_gallery = gr.Gallery(value=[], label='Output', show_label=False, show_download_button=True, allow_preview=True, container=False, preview=preview, - columns=5, object_fit='scale-down', height=height, + columns=4, object_fit='scale-down', height=height, elem_id=f"{tabname}_gallery", ) if prompt is not None: diff --git a/scripts/animatediff.py b/scripts/animatediff.py index fca09424b..4c50f9cf6 100644 --- a/scripts/animatediff.py +++ b/scripts/animatediff.py @@ -189,7 +189,7 @@ def set_free_noise(frames): class Script(scripts.Script): def title(self): - return 'AnimateDiff' + return 'Video AnimateDiff' def show(self, is_img2img): # return scripts.AlwaysVisible if shared.native else False diff --git a/scripts/apg.py b/scripts/apg.py index 6a3020c38..0476da246 100644 --- a/scripts/apg.py +++ b/scripts/apg.py @@ -9,14 +9,14 @@ class Script(scripts.Script): self.register() def title(self): - return 'APG' + return 'APG: Adaptive Projected Guidance' def show(self, is_img2img): return not is_img2img if shared.native else False def ui(self, _is_img2img): # ui elements with gr.Row(): - gr.HTML('  APG: Adaptive projected guidance
') + gr.HTML('  APG: Adaptive Projected Guidance
') with gr.Row(): eta = gr.Slider(label="ETA", value=1.0, minimum=0, maximum=2.0, step=0.05) momentum = gr.Slider(label="Momentum", value=-0.50, minimum=-1.0, maximum=1.0, step=0.05) diff --git a/scripts/blipdiffusion.py b/scripts/blipdiffusion.py index 39d8974e1..0acc80929 100644 --- a/scripts/blipdiffusion.py +++ b/scripts/blipdiffusion.py @@ -2,19 +2,16 @@ import gradio as gr from modules import scripts, processing, shared, sd_models -title = 'BLIP Diffusion' - - class Script(scripts.Script): def title(self): - return title + return 'BLIP Diffusion: Controllable Generation and Editing' def show(self, is_img2img): return is_img2img if shared.native else False def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  BLIP Diffusion
') + gr.HTML('  BLIP Diffusion: Controllable Generation and Editing
') with gr.Row(): source_subject = gr.Textbox(value='', label='Source subject') with gr.Row(): @@ -26,7 +23,7 @@ class Script(scripts.Script): def run(self, p: processing.StableDiffusionProcessing, source_subject, target_subject, prompt_strength): # pylint: disable=arguments-differ, unused-argument c = shared.sd_model.__class__.__name__ if shared.sd_loaded else '' if c != 'BlipDiffusionPipeline': - shared.log.error(f'{title}: model selected={c} required=BLIPDiffusion') + shared.log.error(f'BLIP: model selected={c} required=BLIPDiffusion') return None if hasattr(p, 'init_images') and len(p.init_images) > 0: p.task_args['reference_image'] = p.init_images[0] @@ -41,5 +38,5 @@ class Script(scripts.Script): processed = processing.process_images(p) return processed else: - shared.log.error(f'{title}: no init_images') + shared.log.error('BLIP: no init_images') return None diff --git a/scripts/cogvideo.py b/scripts/cogvideo.py index a4a3141d4..7f2c7225e 100644 --- a/scripts/cogvideo.py +++ b/scripts/cogvideo.py @@ -22,7 +22,7 @@ debug = (os.environ.get('SD_LOAD_DEBUG', None) is not None) or (os.environ.get(' class Script(scripts.Script): def title(self): - return 'CogVideoX' + return 'Video CogVideoX' def show(self, is_img2img): return shared.native diff --git a/scripts/consistory_ext.py b/scripts/consistory_ext.py index b7454aa75..45de1ea6c 100644 --- a/scripts/consistory_ext.py +++ b/scripts/consistory_ext.py @@ -22,7 +22,7 @@ class Script(scripts.Script): self.anchor_cache_second_stage = None def title(self): - return 'ConsiStory' + return 'ConsiStory: Consistent Image Generation' def show(self, is_img2img): return not is_img2img if shared.native and shared.cmd_opts.experimental else False diff --git a/scripts/ctrlx.py b/scripts/ctrlx.py index 69d5994df..f372e2a94 100644 --- a/scripts/ctrlx.py +++ b/scripts/ctrlx.py @@ -7,14 +7,14 @@ from modules import shared, scripts, processing, processing_helpers, sd_models, class Script(scripts.Script): def title(self): - return 'Ctrl-X' + return 'Ctrl-X: Controlling Structure and Appearance' def show(self, is_img2img): return shared.native def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  Ctrl-X
') + gr.HTML('  Ctrl-X: Controlling Structure and Appearance
') with gr.Accordion(label='Structure', open=True): with gr.Row(): struct_prompt = gr.Textbox(label='Prompt', value='', rows=1) diff --git a/scripts/demofusion.py b/scripts/demofusion.py index f7cdfe543..6625c0c79 100644 --- a/scripts/demofusion.py +++ b/scripts/demofusion.py @@ -1221,7 +1221,7 @@ class DemoFusionSDXLPipeline(DiffusionPipeline, FromSingleFileMixin, LoraLoaderM class Script(scripts.Script): def title(self): - return 'DemoFusion' + return 'DemoFusion: High-Resolution Image Generation' def show(self, is_img2img): return not is_img2img if shared.native else False @@ -1229,7 +1229,7 @@ class Script(scripts.Script): # return signature is array of gradio components def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  DemoFusion
') + gr.HTML('  DemoFusion: High-Resolution Image Generation
') with gr.Row(): cosine_scale_1 = gr.Slider(minimum=0, maximum=5, step=0.1, value=3, label="Cosine scale 1") cosine_scale_2 = gr.Slider(minimum=0, maximum=5, step=0.1, value=1, label="Cosine scale 2") diff --git a/scripts/differential_diffusion.py b/scripts/differential_diffusion.py index 705242987..da4ae0e2e 100644 --- a/scripts/differential_diffusion.py +++ b/scripts/differential_diffusion.py @@ -1858,14 +1858,14 @@ MODELS = { class Script(scripts.Script): def title(self): - return 'Differential diffusion' + return 'Differential diffusion: Individual Pixel Strength' def show(self, is_img2img): return is_img2img if shared.native else False def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  Differential diffusion
Select a model for auto-preprocess or upload an image map
') + gr.HTML('  Differential diffusion: Individual Pixel Strength
Select a model for auto-preprocess or upload an image map
') with gr.Row(): enabled = gr.Checkbox(label='Enabled', value=True) invert = gr.Checkbox(label='Mask invert', value=False) diff --git a/scripts/hdr.py b/scripts/hdr.py index 788c0add2..9afc3673b 100644 --- a/scripts/hdr.py +++ b/scripts/hdr.py @@ -11,14 +11,14 @@ from modules.shared import opts, state class Script(scripts.Script): def title(self): - return "HDR" + return "HDR: High Dynamic Range" def show(self, is_img2img): return True def ui(self, is_img2img): with gr.Row(): - gr.HTML("  High Dynamic Range
") + gr.HTML("  HDR: High Dynamic Range
") with gr.Row(): save_hdr = gr.Checkbox(label="Save HDR image", value=True) hdr_range = gr.Slider(minimum=0, maximum=1, step=0.05, value=0.65, label='HDR range') diff --git a/scripts/image2video.py b/scripts/image2video.py index 332972a6d..876ed3193 100644 --- a/scripts/image2video.py +++ b/scripts/image2video.py @@ -13,7 +13,7 @@ MODELS = [ class Script(scripts.Script): def title(self): - return 'Image-to-Video' + return 'Video VGen Image-to-Video' def show(self, is_img2img): return is_img2img if shared.native else False @@ -102,6 +102,7 @@ class Script(scripts.Script): processed = processing.process_images(p) shared.sd_model.motion_adapter = None + processed = None if model_name == 'VGen': if not isinstance(shared.sd_model, diffusers.I2VGenXLPipeline): shared.log.info(f'Image2Video VGen load: model={repo_id}') diff --git a/scripts/instantir.py b/scripts/instantir.py index 4c7ce77b7..5eb7d503a 100644 --- a/scripts/instantir.py +++ b/scripts/instantir.py @@ -12,7 +12,7 @@ class Script(scripts.Script): self.orig_ip_unapply = None def title(self): - return 'InstantIR' + return 'InstantIR: Image Restoration' def show(self, is_img2img): return is_img2img if shared.native else False diff --git a/scripts/k_diff.py b/scripts/k_diff.py index 354df5d4b..92b43149d 100644 --- a/scripts/k_diff.py +++ b/scripts/k_diff.py @@ -9,14 +9,14 @@ class Script(scripts.Script): orig_pipe = None def title(self): - return 'K-Diffusion' + return 'K-Diffusion Samplers' def show(self, is_img2img): return not is_img2img if shared.native else False def ui(self, _is_img2img): # ui elements with gr.Row(): - gr.HTML('  K-Diffusion samplers
') + gr.HTML('  K-Diffusion Samplers
') with gr.Row(): sampler = gr.Dropdown(label="Sampler", choices=self.samplers()) return [sampler] diff --git a/scripts/layerdiffuse.py b/scripts/layerdiffuse.py index a1e15aa8b..ecf7da1d3 100644 --- a/scripts/layerdiffuse.py +++ b/scripts/layerdiffuse.py @@ -5,7 +5,7 @@ from modules import shared, scripts, sd_models class Script(scripts.Script): def title(self): - return 'LayerDiffuse' + return 'LayerDiffuse: Transparent Image' def show(self, is_img2img): return True if shared.native else False @@ -40,7 +40,7 @@ class Script(scripts.Script): def ui(self, _is_img2img): with gr.Row(): gr.HTML(""" -   LayerDiffuse

+   LayerDiffuse: Transparent Image

- Click Apply to model to apply LayerDiffuse to current model
- Click Reload model to remove LayerDiffuse from current model

""") diff --git a/scripts/ledits.py b/scripts/ledits.py index ba9d49f89..b75c6ff6f 100644 --- a/scripts/ledits.py +++ b/scripts/ledits.py @@ -5,7 +5,7 @@ from modules import scripts, processing, shared, devices, sd_models class Script(scripts.Script): def title(self): - return 'LEdits++' + return 'LEdits: Limitless Image Editing' def show(self, is_img2img): return is_img2img if shared.native else False @@ -13,7 +13,7 @@ class Script(scripts.Script): # return signature is array of gradio components def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  LEdits++
') + gr.HTML('  LEdits++: Limitless Image Editing
') with gr.Row(): edit_start = gr.Slider(label='Edit start', minimum=0.0, maximum=1.0, step=0.01, value=0.1) edit_stop = gr.Slider(label='Edit stop', minimum=0.0, maximum=1.0, step=0.01, value=1.0) diff --git a/scripts/lut.py b/scripts/lut.py index 3d240f291..573222161 100644 --- a/scripts/lut.py +++ b/scripts/lut.py @@ -17,7 +17,7 @@ class Script(scripts.Script): def ui(self, _is_img2img): with gr.Row(): - gr.HTML("  Color grading
") + gr.HTML("  LUT Color grading
") with gr.Row(): original = gr.Checkbox(label='Include original image', value=True) with gr.Row(): diff --git a/scripts/mixture_tiling.py b/scripts/mixture_tiling.py index 13e48ce11..5b5aab9db 100644 --- a/scripts/mixture_tiling.py +++ b/scripts/mixture_tiling.py @@ -26,14 +26,14 @@ def check_dependencies(): class Script(scripts.Script): def title(self): - return 'Mixture tiling' + return 'Mixture Tiling: Scene Composition' def show(self, is_img2img): return not is_img2img if shared.native else False def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  Mixture tiling
') + gr.HTML('  Mixture Tiling: Scene Composition
') with gr.Row(): gr.HTML('  Separated prompts using new lines
  Number of prompts must matcxh X*Y
') with gr.Row(): diff --git a/scripts/mulan.py b/scripts/mulan.py index c2ad10d2e..829ce1463 100644 --- a/scripts/mulan.py +++ b/scripts/mulan.py @@ -46,14 +46,14 @@ text_encoder_path = None class Script(scripts.Script): def title(self): - return 'MuLan' + return 'MuLan: Multi Language Prompts' def show(self, is_img2img): return True if shared.native else False def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  MuLan
') + gr.HTML('  MuLan: Multi Language Prompts
') with gr.Row(): selected_encoder = gr.Dropdown(label='Encoder', choices=ENCODERS, value=ENCODERS[0]) return [selected_encoder] diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index 5d209c211..b7fad31bc 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -20,7 +20,7 @@ class Script(scripts.Script): self.register() # pulid is script with processing override so xyz doesnt execute def title(self): - return 'PuLID' + return 'PuLID: ID Customization' def show(self, _is_img2img): return shared.native diff --git a/scripts/resadapter.py b/scripts/resadapter.py index cbd0bf671..58162f9ab 100644 --- a/scripts/resadapter.py +++ b/scripts/resadapter.py @@ -19,7 +19,7 @@ models = { class Script(scripts.Script): def title(self): - return 'ResAdapter' + return 'ResAdapter: Domain Consistent Resolution' def show(self, is_img2img): return not is_img2img if shared.native else False @@ -27,7 +27,7 @@ class Script(scripts.Script): # return signature is array of gradio components def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  ResAdapter
') + gr.HTML('  ResAdapter: Domain Consistent Resolution
') with gr.Row(): model = gr.Dropdown(label="Model", choices=list(models), value="None") weight = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label="Weight", value=1.0) diff --git a/scripts/sd_upscale.py b/scripts/sd_upscale.py index 9f21c5645..9c5a72204 100644 --- a/scripts/sd_upscale.py +++ b/scripts/sd_upscale.py @@ -9,7 +9,7 @@ from modules.shared import opts, state, log class Script(scripts.Script): def title(self): - return "SD upscale" + return "SD Upscale" def show(self, is_img2img): return is_img2img diff --git a/scripts/stablevideodiffusion.py b/scripts/stablevideodiffusion.py index 585871edc..cbf2ce003 100644 --- a/scripts/stablevideodiffusion.py +++ b/scripts/stablevideodiffusion.py @@ -16,7 +16,7 @@ models = { class Script(scripts.Script): def title(self): - return 'Stable Video Diffusion' + return 'Video: SVD' def show(self, is_img2img): return is_img2img if shared.native else False diff --git a/scripts/t_gate.py b/scripts/t_gate.py index 3bd51445d..3808a796d 100644 --- a/scripts/t_gate.py +++ b/scripts/t_gate.py @@ -5,7 +5,7 @@ from installer import install class Script(scripts.Script): def title(self): - return 'T-Gate' + return 'T-Gate: Accelerate via Gating Attention' def show(self, is_img2img): return not is_img2img if shared.native else False @@ -13,7 +13,7 @@ class Script(scripts.Script): # return signature is array of gradio components def ui(self, _is_img2img): with gr.Row(): - gr.HTML('  T-Gate
') + gr.HTML('  T-Gate: Accelerate via Gating Attention
') with gr.Row(): enabled = gr.Checkbox(label="Enabled", value=True) with gr.Row(): diff --git a/scripts/text2video.py b/scripts/text2video.py index 8dec9bd0e..dc4c44cac 100644 --- a/scripts/text2video.py +++ b/scripts/text2video.py @@ -23,7 +23,7 @@ MODELS = [ class Script(scripts.Script): def title(self): - return 'Text-to-Video' + return 'Video: ModelScope' def show(self, is_img2img): return not is_img2img if shared.native else False