From 25ae93441be26f5d9b1c59d51231f1cd13c8d4f1 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 30 Jun 2025 16:48:11 -0400 Subject: [PATCH 001/186] update modernui Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 6 ++++++ extensions-builtin/sdnext-modernui | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc7e9f782..03f680dc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log for SD.Next +## Update for 2025-07-01 + +- **UI** + - major update to modernui layout + + ## Update for 2025-06-30 ### Highlights for 2025-06-30 diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 6ad9a291b..c4b07a0f7 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 6ad9a291b515041adbefdb3eb94f87fb2892c902 +Subproject commit c4b07a0f7ae121c183dba7974622fd0b93b72927 From 4c43c1cc5ee9a97b6cc18ab775c610fd20206285 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 30 Jun 2025 16:49:43 -0400 Subject: [PATCH 002/186] update cuda max memory limit Signed-off-by: Vladimir Mandic --- modules/shared.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/shared.py b/modules/shared.py index d87d5b252..624d7eae5 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -484,7 +484,7 @@ options_templates.update(options_section(('backends', "Backend Settings"), { "cudnn_benchmark_limit": OptionInfo(10, "cuDNN benchmark limit", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1}), "torch_tunable_ops": OptionInfo("default", "Tunable ops", gr.Radio, {"choices": ["default", "true", "false"]}), "torch_tunable_limit": OptionInfo(30, "Tunable ops limit", gr.Slider, {"minimum": 1, "maximum": 100, "step": 1}), - "cuda_mem_fraction": OptionInfo(0.0, "Memory limit", gr.Slider, {"minimum": 0, "maximum": 2.0, "step": 0.05}), + "cuda_mem_fraction": OptionInfo(0.0, "Memory limit", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05}), "torch_gc_threshold": OptionInfo(70, "GC threshold", gr.Slider, {"minimum": 1, "maximum": 100, "step": 1}), "inference_mode": OptionInfo("no-grad", "Inference mode", gr.Radio, {"choices": ["no-grad", "inference-mode", "none"]}), "torch_malloc": OptionInfo("native", "Memory allocator", gr.Radio, {"choices": ['native', 'cudaMallocAsync'] }), From 773638202822ca7295306f53e1cbc02c7826faac Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 1 Jul 2025 13:12:21 -0400 Subject: [PATCH 003/186] major requirements refactor Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 14 +++++-- TODO.md | 5 ++- extensions-builtin/sdnext-modernui | 2 +- installer.py | 47 +++++++++++++++-------- launch.py | 1 + modules/face/insightface.py | 2 +- modules/loader.py | 22 +++++++++-- modules/pulid/__init__.py | 16 ++++++-- modules/pulid/pulid_sdxl.py | 2 +- modules/shared.py | 5 +-- modules/theme.py | 2 + repositories/ldm/models/diffusion/ddpm.py | 3 +- requirements.txt | 16 ++++---- scripts/infiniteyou_ext.py | 2 +- scripts/k_diff.py | 5 ++- scripts/pulid_ext.py | 2 +- webui.py | 2 + wiki | 2 +- 18 files changed, 99 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03f680dc6..a25ac0ab6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,17 @@ ## Update for 2025-07-01 -- **UI** - - major update to modernui layout - +- **UI** + - major update to modernui layout +- **Core** + - override `gradio` installer + - major refactoring of requirements and dependencies to unblock `numpy>=2.1.0` + - patch `insightface` + - patch `k-diffusion` + - better handle startup import errors +- **Fixes** + - allow theme type `None` to be set in config + ## Update for 2025-06-30 diff --git a/TODO.md b/TODO.md index 29a2dcf94..ce1305ea8 100644 --- a/TODO.md +++ b/TODO.md @@ -9,8 +9,9 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma - Refactor: Move `model_*` stuff into subfolder - Refactor: sampler options - Common repo for `T5` and `CLiP` -- Upgrade: unblock `numpy`: see `gradio` -- Upgrade: unblock `pydantic`: see +- Upgrade: unblock `pydantic` and `albumentations` + - see + - blocked by `insightface` ### Complete Features diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index c4b07a0f7..b9ff142c7 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit c4b07a0f7ae121c183dba7974622fd0b93b72927 +Subproject commit b9ff142c7c75ec9833ccab6c1ee5125bc1fa5294 diff --git a/installer.py b/installer.py index 4de6f8103..be8ea712b 100644 --- a/installer.py +++ b/installer.py @@ -346,7 +346,7 @@ def pip(arg: str, ignore: bool = False, quiet: bool = True, uv = True): t_start = time.time() originalArg = arg arg = arg.replace('>=', '==') - package = arg.replace("install", "").replace("--upgrade", "").replace("--no-deps", "").replace("--force", "").replace(" ", " ").strip() + package = arg.replace("install", "").replace("--upgrade", "").replace("--no-deps", "").replace("--force-reinstall", "").replace(" ", " ").strip() uv = uv and args.uv and not package.startswith('git+') pipCmd = "uv pip" if uv else "pip" if not quiet and '-r ' not in arg: @@ -360,7 +360,7 @@ def pip(arg: str, ignore: bool = False, quiet: bool = True, uv = True): if len(result.stderr) > 0: if uv and result.returncode != 0: err = result.stderr.decode(encoding="utf8", errors="ignore") - log.warning('Install: cannot use uv, fallback to pip') + log.warning(f'Install: cmd="{pipCmd}" args="{all_args}" cannot use uv, fallback to pip') debug(f'Install: uv pip error: {err}') return pip(originalArg, ignore, quiet, uv=False) else: @@ -385,7 +385,7 @@ def install(package, friendly: str = None, ignore: bool = False, reinstall: bool quick_allowed = False if (args.reinstall) or (reinstall) or (not installed(package, friendly, quiet=quiet)): deps = '' if not no_deps else '--no-deps ' - cmd = f"install{' --upgrade' if not args.uv else ''}{' --force' if force else ''} {deps}{package}" + cmd = f"install{' --upgrade' if not args.uv else ''}{' --force-reinstall' if force else ''} {deps}{package}" res = pip(cmd, ignore=ignore, uv=package != "uv" and not package.startswith('git+')) try: importlib.reload(pkg_resources) @@ -827,6 +827,7 @@ def check_cudnn(): # check torch version def check_torch(): + log.info('Verifying torch installation') t_start = time.time() if args.skip_torch: log.info('Torch: skip tests') @@ -1163,31 +1164,43 @@ def ensure_base_requirements(): update_setuptools() # used by installler itself so must be installed before requirements - install('rich', 'rich', quiet=True) + install('rich==14.0.0', 'rich', quiet=True) install('psutil', 'psutil', quiet=True) - install('requests', 'requests', quiet=True) + install('requests==2.32.3', 'requests', quiet=True) ts('base', t_start) +def install_gradio(): + # pip install gradio==3.43.2 installs: + # aiofiles-23.2.1 altair-5.5.0 annotated-types-0.7.0 anyio-4.9.0 attrs-25.3.0 certifi-2025.6.15 charset_normalizer-3.4.2 click-8.2.1 contourpy-1.3.2 cycler-0.12.1 fastapi-0.115.14 ffmpy-0.6.0 filelock-3.18.0 fonttools-4.58.4 fsspec-2025.5.1 gradio-3.43.2 gradio-client-0.5.0 h11-0.16.0 hf-xet-1.1.5 httpcore-1.0.9 httpx-0.28.1 huggingface-hub-0.33.1 idna-3.10 importlib-resources-6.5.2 jinja2-3.1.6 jsonschema-4.24.0 jsonschema-specifications-2025.4.1 kiwisolver-1.4.8 markupsafe-2.1.5 matplotlib-3.10.3 narwhals-1.45.0 numpy-1.26.4 orjson-3.10.18 packaging-25.0 pandas-2.3.0 pillow-10.4.0 pydantic-2.11.7 pydantic-core-2.33.2 pydub-0.25.1 pyparsing-3.2.3 python-dateutil-2.9.0.post0 python-multipart-0.0.20 pytz-2025.2 pyyaml-6.0.2 referencing-0.36.2 requests-2.32.4 rpds-py-0.25.1 semantic-version-2.10.0 six-1.17.0 sniffio-1.3.1 starlette-0.46.2 tqdm-4.67.1 typing-extensions-4.14.0 typing-inspection-0.4.1 tzdata-2025.2 urllib3-2.5.0 uvicorn-0.35.0 websockets-11.0.3 + install('gradio==3.43.2', no_deps=True) + install('gradio-client==0.5.0', no_deps=True, quiet=True) + install('dctorch==0.1.2', no_deps=True, quiet=True) + pkgs = ['fastapi', 'websockets', 'aiofiles', 'ffmpy', 'pydub', 'uvicorn', 'semantic-version', 'altair', 'python-multipart'] + for pkg in pkgs: + if not installed(pkg, quiet=True): + install(pkg, quiet=True) + + def install_optional(): t_start = time.time() log.info('Installing optional requirements...') install('git+https://github.com/Disty0/BasicSR@2b6a12c28e0c81bfb13b7e984144f0b0f5461484', 'basicsr') install('git+https://github.com/Disty0/GFPGAN@09b1190eabbc77e5f15c61fa7c38a2064b403e20', 'gfpgan') - install('clean-fid') - install('pillow-jxl-plugin==1.3.3', ignore=True) - install('optimum-quanto==0.2.7', ignore=True) - install('torchao==0.10.0', ignore=True) - install('bitsandbytes==0.45.5', ignore=True) - install('pynvml', ignore=True) - install('ultralytics==8.3.40', ignore=True) - install('Cython', ignore=True) - install('insightface==0.7.3', ignore=True) # problematic build - install('albumentations==1.4.3', ignore=True) - install('pydantic==1.10.21', ignore=True) + install('clean-fid', quiet=True) + install('pillow-jxl-plugin==1.3.3', ignore=True, quiet=True) + install('optimum-quanto==0.2.7', ignore=True, quiet=True) + install('torchao==0.10.0', ignore=True, quiet=True) + install('bitsandbytes==0.45.5', ignore=True, quiet=True) + install('pynvml', ignore=True, quiet=True) + install('ultralytics==8.3.40', ignore=True, quiet=True) + install('Cython', ignore=True, quiet=True) + install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches + install('albumentations==1.4.3', ignore=True, quiet=True) + install('pydantic==1.10.21', ignore=True, quiet=True) reload('pydantic', '1.10.21') install('gguf', ignore=True) - install('av', ignore=True) + install('av', ignore=True, quiet=True) try: import gguf scripts_dir = os.path.join(os.path.dirname(gguf.__file__), '..', 'scripts') diff --git a/launch.py b/launch.py index facf7d25a..082de3465 100755 --- a/launch.py +++ b/launch.py @@ -260,6 +260,7 @@ def main(): installer.set_environment() if args.uv: installer.install("uv", "uv") + installer.install_gradio() installer.check_torch() installer.check_onnx() installer.check_diffusers() diff --git a/modules/face/insightface.py b/modules/face/insightface.py index 7c9ec5af9..78e6c34a7 100644 --- a/modules/face/insightface.py +++ b/modules/face/insightface.py @@ -12,7 +12,7 @@ def get_app(mp_name, threshold=0.5, resolution=640): from installer import install, installed, reload if not installed('insightface', reload=False, quiet=True): - install('insightface==0.7.3', ignore=False) + install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches install('albumentations==1.4.3', ignore=False, reinstall=True) install('pydantic==1.10.21', ignore=False, reinstall=True, force=True) reload('pydantic') diff --git a/modules/loader.py b/modules/loader.py index 674167d20..9d364daad 100644 --- a/modules/loader.py +++ b/modules/loader.py @@ -14,7 +14,22 @@ errors.install() logging.getLogger("DeepSpeed").disabled = True -# os.environ.setdefault('TORCH_LOGS', '-all') +np = None +try: + import numpy as np # pylint: disable=W0611,C0411 + import numpy.random # pylint: disable=W0611,C0411 # this causes failure if numpy version changed +except Exception as e: + errors.log.error(f'Loader: numpy=={np.__version__ if np is not None else None} {e}') + errors.log.error('Please restart the app to fix this issue') + sys.exit(1) + +try: + import scipy # pylint: disable=W0611,C0411 +except Exception as e: + errors.log.error(f'Loader: scipy=={np.__version__ if np is not None else None} {e}') + errors.log.error('Please restart the app to fix this issue') + sys.exit(1) + import torch # pylint: disable=C0411 if torch.__version__.startswith('2.5.0'): errors.log.warning(f'Disabling cuDNN for SDP on torch={torch.__version__}') @@ -34,6 +49,7 @@ logging.getLogger("pytorch_lightning").disabled = True warnings.filterwarnings(action="ignore", category=DeprecationWarning) warnings.filterwarnings(action="ignore", category=FutureWarning) warnings.filterwarnings(action="ignore", category=UserWarning, module="torchvision") +warnings.filterwarnings(action="ignore", message="numpy.dtype size changed") try: import torch._logging # pylint: disable=ungrouped-imports torch._logging._internal.DEFAULT_LOG_LEVEL = logging.ERROR # pylint: disable=protected-access @@ -139,7 +155,7 @@ try: except Exception: pass -try: # fix changed import in torchvision 0.17+, which breaks basicsr +try: import torchvision.transforms.functional_tensor # pylint: disable=unused-import, ungrouped-imports except ImportError: try: @@ -160,4 +176,4 @@ diffusers.utils.deprecate = deprecate_warn errors.log.info(f'Torch: torch=={torch.__version__} torchvision=={torchvision.__version__}') -errors.log.info(f'Packages: diffusers=={diffusers.__version__} transformers=={transformers.__version__} accelerate=={accelerate.__version__} gradio=={gradio.__version__} pydantic=={pydantic.__version__}') +errors.log.info(f'Packages: diffusers=={diffusers.__version__} transformers=={transformers.__version__} accelerate=={accelerate.__version__} gradio=={gradio.__version__} pydantic=={pydantic.__version__} numpy=={np.__version__}') diff --git a/modules/pulid/__init__.py b/modules/pulid/__init__.py index dcee2d7b9..958ee9c1e 100644 --- a/modules/pulid/__init__.py +++ b/modules/pulid/__init__.py @@ -4,8 +4,16 @@ Credit and original implementation: import os import sys +from modules.errors import log sys.path.append(os.path.dirname(__file__)) -from pulid_sdxl import StableDiffusionXLPuLIDPipeline, StableDiffusionXLPuLIDPipelineImage, StableDiffusionXLPuLIDPipelineInpaint -from pulid_utils import resize_numpy_image_long as resize -import attention_processor as attention -import pulid_sampling as sampling +try: + from pulid_sdxl import StableDiffusionXLPuLIDPipeline, StableDiffusionXLPuLIDPipelineImage, StableDiffusionXLPuLIDPipelineInpaint + from pulid_utils import resize_numpy_image_long as resize + import attention_processor as attention + import pulid_sampling as sampling +except Exception as e: + import traceback + log.error(f'PuLID import error: {e}') + print(traceback.format_exc()) + print(sys.exc_info()[0]) + raise ImportError(f'PuLID import error: {e}') from e diff --git a/modules/pulid/pulid_sdxl.py b/modules/pulid/pulid_sdxl.py index 0f4cf4f26..18bf0eb1c 100644 --- a/modules/pulid/pulid_sdxl.py +++ b/modules/pulid/pulid_sdxl.py @@ -1,7 +1,6 @@ from typing import Union import os import cv2 -import insightface import numpy as np import torch import torch.nn as nn @@ -14,6 +13,7 @@ from safetensors.torch import load_file from torchvision.transforms import InterpolationMode from torchvision.transforms.functional import normalize, resize +import insightface from basicsr.utils import img2tensor, tensor2img from facexlib.parsing import init_parsing_model from facexlib.utils.face_restoration_helper import FaceRestoreHelper diff --git a/modules/shared.py b/modules/shared.py index 624d7eae5..2cc4b0589 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -308,10 +308,7 @@ def temp_disable_extensions(): modules.shared.opts.data['theme_type'] = 'Modern' modules.shared.opts.data['gradio_theme'] = theme_name[7:] disable_themes.remove('sdnext-modernui') - elif theme_name.lower().startswith('gradio'): - modules.shared.opts.data['theme_type'] = 'None' - modules.shared.opts.data['gradio_theme'] = theme_name - elif theme_name.lower().startswith('huggingface'): + elif theme_name.lower().startswith('huggingface') or theme_name.lower().startswith('gradio') or theme_name.lower().startswith('none'): modules.shared.opts.data['theme_type'] = 'None' modules.shared.opts.data['gradio_theme'] = theme_name else: diff --git a/modules/theme.py b/modules/theme.py index f5e4e5455..c5924d96b 100644 --- a/modules/theme.py +++ b/modules/theme.py @@ -99,6 +99,8 @@ def reload_gradio_theme(): theme_name = 'black-teal' elif modules.shared.opts.theme_type == 'Modern': theme_name = 'Default' + elif modules.shared.opts.theme_type == 'None': + theme_name = 'gradio/default' else: modules.shared.opts.theme_type = 'Standard' theme_name = 'black-teal' diff --git a/repositories/ldm/models/diffusion/ddpm.py b/repositories/ldm/models/diffusion/ddpm.py index 99879b224..fe3f51fce 100644 --- a/repositories/ldm/models/diffusion/ddpm.py +++ b/repositories/ldm/models/diffusion/ddpm.py @@ -17,7 +17,8 @@ from functools import partial import itertools from tqdm import tqdm from torchvision.utils import make_grid -from pytorch_lightning.utilities.distributed import rank_zero_only +from pytorch_lightning.utilities.rank_zero import rank_zero_only + from omegaconf import ListConfig from ldm.util import log_txt_as_img, exists, default, ismap, isimage, mean_flat, count_params, instantiate_from_config diff --git a/requirements.txt b/requirements.txt index 0eea8fbac..66547dd6f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -43,30 +43,28 @@ antlr4-python3-runtime==4.9.3 requests==2.32.3 tqdm==4.67.1 accelerate==1.8.1 -opencv-contrib-python-headless==4.9.0.80 +opencv-contrib-python-headless==4.11.0.86 einops==0.4.1 -gradio==3.43.2 huggingface_hub==0.33.1 numexpr==2.10.2 -numpy==1.26.4 +numpy==2.1.2 pandas==2.3.0 numba==0.61.2 protobuf==4.25.3 -pytorch_lightning==1.9.4 -tokenizers==0.21.1 +pytorch_lightning==2.5.2 +tokenizers==0.21.2 transformers==4.53.0 urllib3==1.26.19 Pillow==10.4.0 timm==1.0.16 pydantic==1.10.21 -pyparsing==3.1.4 -typing-extensions==4.12.2 +pyparsing==3.1.2 +typing-extensions==4.14.0 # additional blendmodes -scipy +scipy==1.16.0 torchdiffeq -dctorch scikit-image seam-carving sentencepiece diff --git a/scripts/infiniteyou_ext.py b/scripts/infiniteyou_ext.py index a8ca9c9c3..7a702d858 100644 --- a/scripts/infiniteyou_ext.py +++ b/scripts/infiniteyou_ext.py @@ -15,7 +15,7 @@ orig_pipeline, orig_prompt_attention = None, None def verify_insightface(): from installer import installed, install, reload if not installed('insightface', reload=False, quiet=True): - install('insightface==0.7.3', ignore=False) + install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches install('albumentations==1.4.3', ignore=False, reinstall=True) install('pydantic==1.10.21', ignore=False, reinstall=True, force=True) reload('pydantic') diff --git a/scripts/k_diff.py b/scripts/k_diff.py index 117df9c31..f5f7caab6 100644 --- a/scripts/k_diff.py +++ b/scripts/k_diff.py @@ -1,6 +1,6 @@ import inspect import gradio as gr -from modules import scripts, processing, shared, sd_models +from modules import scripts, processing, shared, sd_models, ui_common class Script(scripts.Script): @@ -17,7 +17,8 @@ class Script(scripts.Script): with gr.Row(): gr.HTML('  K-Diffusion Samplers
') with gr.Row(): - sampler = gr.Dropdown(label="Sampler", choices=self.samplers()) + sampler = gr.Dropdown(label="Sampler", choices=[]) + _refresh = ui_common.create_refresh_button(sampler, self.samplers, lambda: {"choices": self.samplers()}) return [sampler] def samplers(self): diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index 1c4b1a696..f000bc43a 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -30,7 +30,7 @@ class Script(scripts.Script): def dependencies(self): from installer import install, installed, reload if not installed('insightface==0.7.3', reload=False, quiet=True): - install('insightface==0.7.3', ignore=False) + install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches install('albumentations==1.4.3', ignore=False, reinstall=True) install('pydantic==1.10.21', ignore=False, reinstall=True, force=True) reload('pydantic') diff --git a/webui.py b/webui.py index c24dbe179..927ea58e5 100644 --- a/webui.py +++ b/webui.py @@ -371,9 +371,11 @@ def webui(restart=False): app = start_ui() modules.script_callbacks.after_ui_callback() modules.sd_models.write_metadata() + load_model() mount_subpath(app) shared.opts.save(shared.config_filename) + if shared.cmd_opts.profile: for k, v in modules.script_callbacks.callback_map.items(): shared.log.debug(f'Registered callbacks: {k}={len(v)} {[c.script for c in v]}') diff --git a/wiki b/wiki index 45c389a37..a450f80ed 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 45c389a3747cb1caceb4035535041c400c29cad2 +Subproject commit a450f80edbdee9ba4daab34f05a374da7936cb5c From 060c17ac2ee488123818eb2c80096b14c1eed1bf Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 1 Jul 2025 20:37:14 +0300 Subject: [PATCH 004/186] Add matplotlib to gradio packages --- installer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer.py b/installer.py index be8ea712b..5101d53e3 100644 --- a/installer.py +++ b/installer.py @@ -1176,7 +1176,7 @@ def install_gradio(): install('gradio==3.43.2', no_deps=True) install('gradio-client==0.5.0', no_deps=True, quiet=True) install('dctorch==0.1.2', no_deps=True, quiet=True) - pkgs = ['fastapi', 'websockets', 'aiofiles', 'ffmpy', 'pydub', 'uvicorn', 'semantic-version', 'altair', 'python-multipart'] + pkgs = ['fastapi', 'websockets', 'aiofiles', 'ffmpy', 'pydub', 'uvicorn', 'semantic-version', 'altair', 'python-multipart', 'matplotlib'] for pkg in pkgs: if not installed(pkg, quiet=True): install(pkg, quiet=True) From 71bcb5b8ada97ada2dde1a9e990be7844dd4dc5d Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 1 Jul 2025 16:31:53 -0400 Subject: [PATCH 005/186] update requirements Signed-off-by: Vladimir Mandic --- extensions-builtin/stable-diffusion-webui-rembg | 2 +- launch.py | 4 ++-- requirements.txt | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/extensions-builtin/stable-diffusion-webui-rembg b/extensions-builtin/stable-diffusion-webui-rembg index fbf4215c3..b3a3a0a60 160000 --- a/extensions-builtin/stable-diffusion-webui-rembg +++ b/extensions-builtin/stable-diffusion-webui-rembg @@ -1 +1 @@ -Subproject commit fbf4215c3af8924bb830e4c58887af7acdefccbf +Subproject commit b3a3a0a60b807a83284b90ea9567f89640967f0d diff --git a/launch.py b/launch.py index 082de3465..fdded8dde 100755 --- a/launch.py +++ b/launch.py @@ -112,8 +112,8 @@ def check_run(command): # compatbility function @lru_cache() -def is_installed(package): # compatbility function - return installer.installed(package) +def is_installed(pkg): # compatbility function + return installer.installed(pkg) @lru_cache() diff --git a/requirements.txt b/requirements.txt index 66547dd6f..87d1b9f9f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,6 +28,7 @@ fasteners orjson ruff pylint +sqlalchemy invisible-watermark pi-heif From adcee933da52f0eb899d801463eec7180333cbea Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 1 Jul 2025 17:48:31 -0400 Subject: [PATCH 006/186] installer dont cache states Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + installer.py | 7 ------- webui.py | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a25ac0ab6..695ea79ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - better handle startup import errors - **Fixes** - allow theme type `None` to be set in config + - installer dont cache installed state ## Update for 2025-06-30 diff --git a/installer.py b/installer.py index 5101d53e3..e2ef83392 100644 --- a/installer.py +++ b/installer.py @@ -1,4 +1,3 @@ -from functools import lru_cache import os import sys import json @@ -254,7 +253,6 @@ def print_profile(profiler: cProfile.Profile, msg: str): profile(profiler, msg) -@lru_cache() def package_version(package): try: return pkg_resources.get_distribution(package).version @@ -262,7 +260,6 @@ def package_version(package): return None -@lru_cache() def package_spec(package): spec = pkg_resources.working_set.by_key.get(package, None) # more reliable than importlib if spec is None: @@ -273,7 +270,6 @@ def package_spec(package): # check if package is installed -@lru_cache() def installed(package, friendly: str = None, reload = False, quiet = False): # pylint: disable=redefined-outer-name t_start = time.time() ok = True @@ -341,7 +337,6 @@ def run(cmd: str, arg: str): return txt -@lru_cache() def pip(arg: str, ignore: bool = False, quiet: bool = True, uv = True): t_start = time.time() originalArg = arg @@ -376,7 +371,6 @@ def pip(arg: str, ignore: bool = False, quiet: bool = True, uv = True): # install package using pip if not already installed -@lru_cache() def install(package, friendly: str = None, ignore: bool = False, reinstall: bool = False, no_deps: bool = False, quiet: bool = False, force: bool = False): t_start = time.time() res = '' @@ -396,7 +390,6 @@ def install(package, friendly: str = None, ignore: bool = False, reinstall: bool # execute git command -@lru_cache() def git(arg: str, folder: str = None, ignore: bool = False, optional: bool = False): # pylint: disable=unused-argument t_start = time.time() if args.skip_git: diff --git a/webui.py b/webui.py index 927ea58e5..6dd8e1c40 100644 --- a/webui.py +++ b/webui.py @@ -353,7 +353,7 @@ def start_ui(): timer.startup.record("app-started") time_sorted = sorted(modules.scripts.time_setup.items(), key=lambda x: x[1], reverse=True) - time_script = [f'{k}:{round(v,3)}' for (k,v) in time_sorted if v > 0.01] + time_script = [f'{k}:{round(v,3)}' for (k,v) in time_sorted if v > 0.03] time_total = sum(modules.scripts.time_setup.values()) shared.log.debug(f'Scripts setup: time={time_total:.3f} {time_script}') time_component = [f'{k}:{round(v,3)}' for (k,v) in modules.scripts.time_component.items() if v > 0.005] From 3406083d14949c88c27ecadadf20e65deebcaf70 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 2 Jul 2025 06:40:27 +0300 Subject: [PATCH 007/186] Override lumina2 to use diffusers lora loading --- modules/lora/lora_overrides.py | 1 + modules/sdnq/forward.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/lora/lora_overrides.py b/modules/lora/lora_overrides.py index 0e16c1254..9f6174966 100644 --- a/modules/lora/lora_overrides.py +++ b/modules/lora/lora_overrides.py @@ -32,6 +32,7 @@ force_models_diffusers = [ # forced always 'kandinsky', 'hunyuandit', 'auraflow', + 'lumina2', # video models 'hunyuanvideo', 'cogvideo', diff --git a/modules/sdnq/forward.py b/modules/sdnq/forward.py index 048354cca..7b3ab4b91 100644 --- a/modules/sdnq/forward.py +++ b/modules/sdnq/forward.py @@ -44,15 +44,15 @@ def get_forward_func(layer_class_name: str, use_quantized_matmul: bool, is_integ def quantize_fp8_matmul_input(input: torch.FloatTensor) -> Tuple[torch.Tensor, torch.FloatTensor]: input = input.flatten(0,-2).contiguous() input_scale = torch.amax(input.abs(), dim=-1, keepdims=True).div_(448) - input = torch.div(input, input_scale).clamp_(-448, 448).to(torch.float8_e4m3fn) - input_scale = input_scale.to(torch.float32) + input = torch.div(input, input_scale).clamp_(-448, 448).to(dtype=torch.float8_e4m3fn) + input_scale = input_scale.to(dtype=torch.float32) return input, input_scale def quantize_fp8_matmul_input_tensorwise(input: torch.FloatTensor, scale: torch.FloatTensor) -> Tuple[torch.Tensor, torch.FloatTensor]: input = input.flatten(0,-2).contiguous() input_scale = torch.amax(input.abs(), dim=-1, keepdims=True).div_(448) - input = torch.div(input, input_scale).clamp_(-448, 448).to(torch.float8_e4m3fn) + input = torch.div(input, input_scale).clamp_(-448, 448).to(dtype=torch.float8_e4m3fn) scale = torch.mul(input_scale, scale) if scale.dtype == torch.float16: # fp16 will overflow scale = scale.to(dtype=torch.float32) @@ -62,7 +62,7 @@ def quantize_fp8_matmul_input_tensorwise(input: torch.FloatTensor, scale: torch. def quantize_int8_matmul_input(input: torch.FloatTensor, scale: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: input = input.flatten(0,-2).contiguous() input_scale = torch.amax(input.abs(), dim=-1, keepdims=True).div_(127) - input = torch.div(input, input_scale).round_().clamp_(-128, 127).to(torch.int8) + input = torch.div(input, input_scale).round_().clamp_(-128, 127).to(dtype=torch.int8) scale = torch.mul(input_scale, scale) if scale.dtype == torch.float16: # fp16 will overflow scale = scale.to(dtype=torch.float32) From 9b38a5dc58298cb401d64ce718a74006a1cc57b6 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 2 Jul 2025 08:14:45 -0400 Subject: [PATCH 008/186] add kontext inpainting Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 5 ++++- installer.py | 2 +- modules/model_flux.py | 2 +- modules/processing_helpers.py | 24 ++++++++++++------------ modules/sd_vae_taesd.py | 1 + 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 695ea79ce..fb7ea4f5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # Change Log for SD.Next -## Update for 2025-07-01 +## Update for 2025-07-02 +- **Models** + - Add **FLUX.1-Kontext-Dev** inpaint workflow - **UI** - major update to modernui layout - **Core** @@ -13,6 +15,7 @@ - **Fixes** - allow theme type `None` to be set in config - installer dont cache installed state + - fix Cosmos-Predict2 retrying TAESD download ## Update for 2025-06-30 diff --git a/installer.py b/installer.py index e2ef83392..2d6f7c727 100644 --- a/installer.py +++ b/installer.py @@ -554,7 +554,7 @@ def check_diffusers(): t_start = time.time() if args.skip_all or args.skip_git or args.experimental: return - sha = '00f95b9755718aabb65456e791b8408526ae6e76' # diffusers commit hash + sha = 'd6fa3298fa14db874b71b3fc5ebcefae99e15f45' # diffusers commit hash pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else 0) cur = opts.get('diffusers_version', '') if minor > 0 else '' diff --git a/modules/model_flux.py b/modules/model_flux.py index 518e396d7..6194cfbd1 100644 --- a/modules/model_flux.py +++ b/modules/model_flux.py @@ -323,7 +323,7 @@ def load_flux(checkpoint_info, diffusers_load_config): # triggered by opts.sd_ch from diffusers import pipelines pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["flux1kontext"] = diffusers.FluxKontextPipeline pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["flux1kontext"] = diffusers.FluxKontextPipeline - pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING["flux1kontext"] = diffusers.FluxKontextPipeline + pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING["flux1kontext"] = diffusers.FluxKontextInpaintPipeline else: cls = diffusers.FluxPipeline diff --git a/modules/processing_helpers.py b/modules/processing_helpers.py index 5d1647f8f..cdfe774bc 100644 --- a/modules/processing_helpers.py +++ b/modules/processing_helpers.py @@ -462,12 +462,12 @@ def fix_prompts(p, prompts, negative_prompts, prompts_2, negative_prompts_2): def calculate_base_steps(p, use_denoise_start, use_refiner_start): if len(getattr(p, 'timesteps', [])) > 0: return None - if not is_txt2img(): - cls = shared.sd_model.__class__.__name__ + cls = shared.sd_model.__class__.__name__ + if 'Flex' in cls or 'HiDreamImageEditingPipeline' in cls or 'Kontext' in cls: + steps = p.steps + elif not is_txt2img(): if cls in sd_models.i2i_pipes: steps = p.steps - elif 'Flex' in cls or 'HiDreamImageEditingPipeline' in cls or 'Kontext' in cls: - steps = p.steps elif use_denoise_start and (shared.sd_model_type == 'sdxl'): steps = p.steps // (1 - p.refiner_start) elif p.denoising_strength > 0: @@ -483,9 +483,10 @@ def calculate_base_steps(p, use_denoise_start, use_refiner_start): def calculate_hires_steps(p): - # if len(getattr(p, 'timesteps', [])) > 0: - # return None - if p.hr_second_pass_steps > 0: + cls = shared.sd_model.__class__.__name__ + if 'Flex' in cls or 'HiDreamImageEditingPipeline' in cls or 'Kontext' in cls: + steps = p.steps + elif p.hr_second_pass_steps > 0: steps = (p.hr_second_pass_steps // p.denoising_strength) + 1 elif p.denoising_strength > 0: steps = (p.steps // p.denoising_strength) + 1 @@ -496,18 +497,17 @@ def calculate_hires_steps(p): def calculate_refiner_steps(p): - # if len(getattr(p, 'timesteps', [])) > 0: - # return None - if "StableDiffusionXL" in shared.sd_refiner.__class__.__name__: + cls = shared.sd_model.__class__.__name__ + if 'Flex' in cls or 'HiDreamImageEditingPipeline' in cls or 'Kontext' in cls: + steps = p.steps + elif "StableDiffusionXL" in shared.sd_refiner.__class__.__name__: if p.refiner_start > 0 and p.refiner_start < 1: - #steps = p.refiner_steps // (1 - p.refiner_start) # SDXL with denoise strenght steps = (p.refiner_steps // (1 - p.refiner_start) // 2) + 1 elif p.denoising_strength > 0: steps = (p.refiner_steps // p.denoising_strength) + 1 else: steps = 0 else: - #steps = p.refiner_steps # SD 1.5 with denoise strenght steps = (p.refiner_steps * 1.25) + 1 debug_steps(f'Steps: type=refiner input={p.refiner_steps} output={steps} start={p.refiner_start} denoise={p.denoising_strength}') return max(1, int(steps)) diff --git a/modules/sd_vae_taesd.py b/modules/sd_vae_taesd.py index 3ef7e123d..079e8a40b 100644 --- a/modules/sd_vae_taesd.py +++ b/modules/sd_vae_taesd.py @@ -63,6 +63,7 @@ def get_model(model_type = 'decoder', variant = None): model_cls = 'sdxl' elif model_cls not in supported: warn_once(f'cls={shared.sd_model.__class__.__name__} type={model_cls} unsuppported', variant=variant) + return None variant = variant or shared.opts.taesd_variant folder = os.path.join(paths.models_path, "TAESD") os.makedirs(folder, exist_ok=True) From 79aeab90c9dec248bc440849cce9b1d6f566f36a Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 2 Jul 2025 11:46:42 -0400 Subject: [PATCH 009/186] add sageattention2++ support note Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 6 ++++++ extensions-builtin/sdnext-modernui | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb7ea4f5d..970c6d8ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ - Add **FLUX.1-Kontext-Dev** inpaint workflow - **UI** - major update to modernui layout +- **Compute** + - support for [SageAttention2++](https://github.com/thu-ml/SageAttention) + provides 10-15% performance improvement over default SDPA for transformer-based models! + enable in *settings -> compute settings -> sdp options* + *note*: SD.Next will use either SageAttention v1 or 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 - **Core** - override `gradio` installer - major refactoring of requirements and dependencies to unblock `numpy>=2.1.0` diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index b9ff142c7..c2c0c2793 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit b9ff142c7c75ec9833ccab6c1ee5125bc1fa5294 +Subproject commit c2c0c27939e20303d63c30ea7a5e179697af8eaf From 772a5c9ad34e1d9573be42e2df532bfd7caafd3d Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 2 Jul 2025 12:32:09 -0400 Subject: [PATCH 010/186] update todo and changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 - TODO.md | 14 +++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 970c6d8ca..9ba4c3462 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,6 @@ - installer dont cache installed state - fix Cosmos-Predict2 retrying TAESD download - ## Update for 2025-06-30 ### Highlights for 2025-06-30 diff --git a/TODO.md b/TODO.md index ce1305ea8..cbecb502e 100644 --- a/TODO.md +++ b/TODO.md @@ -9,16 +9,15 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma - Refactor: Move `model_*` stuff into subfolder - Refactor: sampler options - Common repo for `T5` and `CLiP` +- Video: API support +- LoRA: add OMI format support for SD35/FLUX.1 + +### Blocked items + - Upgrade: unblock `pydantic` and `albumentations` - see - blocked by `insightface` -### Complete Features - -- Python==3.13 improved support -- Video: API support -- LoRA: add OMI format support for SD35/FLUX.1 - ### Under Consideration - [IPAdapter negative guidance](https://github.com/huggingface/diffusers/discussions/7167) @@ -34,9 +33,6 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma - [Dream0 guidance](https://huggingface.co/ByteDance/DreamO) - [S3Diff diffusion upscaler](https://github.com/ArcticHare105/S3Diff) - [SUPIR upscaler](https://github.com/Fanghua-Yu/SUPIR) - -### Monitoring - - [TensorRT](https://github.com/huggingface/diffusers/pull/11173) ### New models From c4d9338d2eabc0bf1b2dd32e159de157c8dbb4d8 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 3 Jul 2025 09:18:38 -0400 Subject: [PATCH 011/186] major refactoring of modules Signed-off-by: Vladimir Mandic --- .pylintrc | 56 +- .ruff.toml | 57 +- CHANGELOG.md | 18 +- TODO.md | 22 +- extensions-builtin/Lora/networks.py | 4 +- extensions-builtin/sdnext-modernui | 2 +- modules/api/generate.py | 14 +- modules/api/process.py | 4 +- modules/api/script.py | 10 +- modules/control/run.py | 6 +- modules/extensions.py | 4 +- modules/face/__init__.py | 4 +- modules/flash_attn_triton_amd/utils.py | 20 +- modules/gr_hijack.py | 26 +- modules/hidiffusion/utils.py | 5 +- modules/img2img.py | 13 +- modules/ldsr/sd_hijack_autoencoder.py | 2 +- modules/model_quant.py | 2 +- modules/model_te.py | 4 +- modules/postprocessing.py | 8 +- modules/processing.py | 24 +- modules/processing_class.py | 4 +- modules/prompt_parser_xhinker.py | 3 +- modules/scripts.py | 732 +----------------- modules/scripts_auto_postprocessing.py | 10 +- modules/scripts_manager.py | 730 +++++++++++++++++ modules/scripts_postprocessing.py | 4 +- modules/sd_models.py | 42 +- modules/sd_unet.py | 4 +- modules/sdnq/__init__.py | 2 +- modules/shared_items.py | 4 +- modules/txt2img.py | 8 +- modules/ui.py | 4 +- modules/ui_common.py | 8 +- modules/ui_control.py | 6 +- modules/ui_control_helpers.py | 6 +- modules/ui_img2img.py | 8 +- modules/ui_javascript.py | 8 +- modules/ui_postprocessing.py | 6 +- modules/ui_txt2img.py | 8 +- package.json | 2 +- {modules => pipelines}/flex2/__init__.py | 0 .../hidream/pipeline_hidream_image_editing.py | 0 .../meissonic}/__init__.py | 0 {modules => pipelines}/meissonic/pipeline.py | 0 .../meissonic/pipeline_img2img.py | 0 .../meissonic/pipeline_inpaint.py | 0 {modules => pipelines}/meissonic/scheduler.py | 0 {modules => pipelines}/meissonic/test.py | 0 .../meissonic/transformer.py | 0 {modules => pipelines}/model_auraflow.py | 0 {modules => pipelines}/model_chroma.py | 6 +- {modules => pipelines}/model_cogview.py | 2 +- {modules => pipelines}/model_cosmos.py | 0 {modules => pipelines}/model_flex.py | 5 +- {modules => pipelines}/model_flux.py | 6 +- {modules => pipelines}/model_flux_nf4.py | 0 {modules => pipelines}/model_hidream.py | 2 +- {modules => pipelines}/model_kolors.py | 0 {modules => pipelines}/model_lumina.py | 0 {modules => pipelines}/model_meissonic.py | 10 +- {modules => pipelines}/model_omnigen.py | 2 +- {modules => pipelines}/model_omnigen2.py | 2 +- {modules => pipelines}/model_pixart.py | 0 {modules => pipelines}/model_sana.py | 0 {modules => pipelines}/model_sd3.py | 0 {modules => pipelines}/model_stablecascade.py | 0 {modules => pipelines}/omnigen2/__init__.py | 0 .../omnigen2/image_processor.py | 0 .../omnigen2/models/attention_processor.py | 0 .../omnigen2/models/embeddings.py | 0 .../omnigen2/models/transformers/__init__.py | 0 .../models/transformers/block_lumina2.py | 0 .../omnigen2/models/transformers/repo.py | 0 .../transformers/transformer_omnigen2.py | 0 .../omnigen2/pipeline_omnigen2.py | 0 {modules => pipelines}/segmoe/segmoe_model.py | 0 scripts/allegrovideo.py | 4 +- scripts/animatediff.py | 8 +- scripts/apg.py | 5 +- scripts/automatic_color_inpaint.py | 4 +- scripts/blipdiffusion.py | 4 +- scripts/cogvideo.py | 4 +- {modules => scripts}/consistory/__init__.py | 0 .../consistory/attention_processor.py | 0 .../consistory/consistory_pipeline.py | 0 .../consistory/consistory_run.py | 0 .../consistory/consistory_unet_sdxl.py | 0 .../consistory/consistory_utils.py | 0 .../consistory/utils/general_utils.py | 0 .../consistory/utils/ptp_utils.py | 0 scripts/consistory_ext.py | 10 +- {modules => scripts}/ctrlx/__init__.py | 0 {modules => scripts}/ctrlx/features.py | 0 {modules => scripts}/ctrlx/media.py | 0 {modules => scripts}/ctrlx/sdxl.py | 0 {modules => scripts}/ctrlx/utils.py | 0 scripts/{ctrlx.py => ctrlx_ext.py} | 10 +- scripts/custom_code.py | 14 +- scripts/demofusion.py | 4 +- scripts/differential_diffusion.py | 4 +- scripts/example.py | 4 +- scripts/flux_enhance.py | 4 +- scripts/flux_tools.py | 7 +- {modules => scripts}/freescale/__init__.py | 0 .../freescale/free_lunch_utils.py | 0 .../freescale/freescale_pipeline.py | 0 .../freescale/freescale_pipeline_img2img.py | 0 .../freescale/scale_attention.py | 0 scripts/{freescale.py => freescale_ext.py} | 6 +- scripts/hdr.py | 7 +- scripts/hunyuanvideo.py | 4 +- scripts/image2video.py | 10 +- {modules => scripts}/infiniteyou/__init__.py | 0 .../infiniteyou/pipeline_flux_infusenet.py | 0 .../infiniteyou/pipeline_infu_flux.py | 0 {modules => scripts}/infiniteyou/resampler.py | 0 scripts/infiniteyou_ext.py | 6 +- scripts/init_latents.py | 6 +- {modules => scripts}/instantir/__init__.py | 0 {modules => scripts}/instantir/aggregator.py | 0 .../instantir/ip_adapter}/__init__.py | 0 .../ip_adapter/attention_processor.py | 0 .../instantir/ip_adapter/ip_adapter.py | 0 .../instantir/ip_adapter/resampler.py | 0 .../instantir/ip_adapter/utils.py | 0 .../instantir/lcm_single_step_scheduler.py | 0 .../instantir/sdxl_instantir.py | 0 scripts/{instantir.py => instantir_ext.py} | 6 +- scripts/ipadapter.py | 6 +- scripts/ipinstruct.py | 4 +- scripts/k_diff.py | 5 +- scripts/kohya_hires_fix.py | 4 +- {modules => scripts}/layerdiffuse/__init__.py | 4 +- .../layerdiffuse/layerdiffuse_loader.py | 2 +- .../layerdiffuse/layerdiffuse_model.py | 0 .../{layerdiffuse.py => layerdiffuse_ext.py} | 6 +- scripts/ledits.py | 4 +- scripts/legacy_allegrovideo.py | 4 +- scripts/loopback.py | 5 +- scripts/ltxvideo.py | 4 +- scripts/lut.py | 6 +- scripts/mixture_of_diffusers.py | 10 +- scripts/mixture_tiling.py | 12 +- scripts/mochivideo.py | 4 +- {modules => scripts}/mod/__init__.py | 0 scripts/mulan.py | 10 +- scripts/outpainting_mk_2.py | 5 +- {modules => scripts}/pixelsmith/__init__.py | 0 .../pixelsmith/autoencoder_kl.py | 0 .../pixelsmith/pixelsmith_pipeline.py | 0 {modules => scripts}/pixelsmith/vae.py | 0 scripts/{pixelsmith.py => pixelsmith_ext.py} | 6 +- scripts/poor_mans_outpainting.py | 5 +- scripts/prompt_enhance.py | 7 +- scripts/prompt_matrix.py | 7 +- scripts/prompts_from_file.py | 5 +- {modules => scripts}/pulid/__init__.py | 0 .../pulid/attention_processor.py | 0 .../pulid/encoders_transformer.py | 0 .../pulid/eva_clip/__init__.py | 0 .../eva_clip/bpe_simple_vocab_16e6.txt.gz | Bin .../pulid/eva_clip/constants.py | 0 .../pulid/eva_clip/eva_vit_model.py | 0 .../pulid/eva_clip/factory.py | 0 .../pulid/eva_clip/hf_configs.py | 0 .../pulid/eva_clip/hf_model.py | 0 {modules => scripts}/pulid/eva_clip/loss.py | 0 {modules => scripts}/pulid/eva_clip/model.py | 0 .../model_configs/EVA01-CLIP-B-16.json | 0 .../model_configs/EVA01-CLIP-g-14-plus.json | 0 .../model_configs/EVA01-CLIP-g-14.json | 0 .../model_configs/EVA02-CLIP-B-16.json | 0 .../model_configs/EVA02-CLIP-L-14-336.json | 0 .../model_configs/EVA02-CLIP-L-14.json | 0 .../EVA02-CLIP-bigE-14-plus.json | 0 .../model_configs/EVA02-CLIP-bigE-14.json | 0 .../pulid/eva_clip/modified_resnet.py | 0 {modules => scripts}/pulid/eva_clip/openai.py | 0 .../pulid/eva_clip/pretrained.py | 0 {modules => scripts}/pulid/eva_clip/rope.py | 0 .../pulid/eva_clip/timm_model.py | 0 .../pulid/eva_clip/tokenizer.py | 0 .../pulid/eva_clip/transform.py | 0 .../pulid/eva_clip/transformer.py | 0 {modules => scripts}/pulid/eva_clip/utils.py | 0 {modules => scripts}/pulid/pulid_sampling.py | 0 {modules => scripts}/pulid/pulid_sdxl.py | 2 +- {modules => scripts}/pulid/pulid_utils.py | 0 scripts/pulid_ext.py | 6 +- scripts/regional_prompting.py | 10 +- scripts/resadapter.py | 4 +- scripts/sd_upscale.py | 5 +- scripts/skip_layer_guidance.py | 4 +- scripts/softfill.py | 4 +- scripts/stablevideodiffusion.py | 6 +- .../style_aligned/inversion.py | 0 .../style_aligned/sa_handler.py | 0 ...{style_aligned.py => style_aligned_ext.py} | 11 +- scripts/t_gate.py | 4 +- scripts/text2video.py | 10 +- scripts/tiling.py | 6 +- {modules => scripts}/xadapter/adapter.py | 0 .../xadapter/pipeline_sd_xl_adapter.py | 0 .../pipeline_sd_xl_adapter_controlnet.py | 0 ...peline_sd_xl_adapter_controlnet_img2img.py | 0 {modules => scripts}/xadapter/unet_adapter.py | 0 {modules => scripts}/xadapter/utils.py | 0 .../xadapter/xadapter_hijacks.py | 0 scripts/{x_adapter.py => xadapter_ext.py} | 12 +- scripts/xyz_grid.py | 4 +- scripts/xyz_grid_classes.py | 2 +- scripts/xyz_grid_on.py | 8 +- webui.py | 14 +- 214 files changed, 1154 insertions(+), 1153 deletions(-) create mode 100644 modules/scripts_manager.py rename {modules => pipelines}/flex2/__init__.py (100%) rename {modules => pipelines}/hidream/pipeline_hidream_image_editing.py (100%) rename {modules/instantir/ip_adapter => pipelines/meissonic}/__init__.py (100%) rename {modules => pipelines}/meissonic/pipeline.py (100%) rename {modules => pipelines}/meissonic/pipeline_img2img.py (100%) rename {modules => pipelines}/meissonic/pipeline_inpaint.py (100%) rename {modules => pipelines}/meissonic/scheduler.py (100%) rename {modules => pipelines}/meissonic/test.py (100%) rename {modules => pipelines}/meissonic/transformer.py (100%) rename {modules => pipelines}/model_auraflow.py (100%) rename {modules => pipelines}/model_chroma.py (98%) rename {modules => pipelines}/model_cogview.py (96%) rename {modules => pipelines}/model_cosmos.py (100%) rename {modules => pipelines}/model_flex.py (94%) rename {modules => pipelines}/model_flux.py (99%) rename {modules => pipelines}/model_flux_nf4.py (100%) rename {modules => pipelines}/model_hidream.py (98%) rename {modules => pipelines}/model_kolors.py (100%) rename {modules => pipelines}/model_lumina.py (100%) rename {modules => pipelines}/model_meissonic.py (80%) rename {modules => pipelines}/model_omnigen.py (93%) rename {modules => pipelines}/model_omnigen2.py (93%) rename {modules => pipelines}/model_pixart.py (100%) rename {modules => pipelines}/model_sana.py (100%) rename {modules => pipelines}/model_sd3.py (100%) rename {modules => pipelines}/model_stablecascade.py (100%) rename {modules => pipelines}/omnigen2/__init__.py (100%) rename {modules => pipelines}/omnigen2/image_processor.py (100%) rename {modules => pipelines}/omnigen2/models/attention_processor.py (100%) rename {modules => pipelines}/omnigen2/models/embeddings.py (100%) rename {modules => pipelines}/omnigen2/models/transformers/__init__.py (100%) rename {modules => pipelines}/omnigen2/models/transformers/block_lumina2.py (100%) rename {modules => pipelines}/omnigen2/models/transformers/repo.py (100%) rename {modules => pipelines}/omnigen2/models/transformers/transformer_omnigen2.py (100%) rename {modules => pipelines}/omnigen2/pipeline_omnigen2.py (100%) rename {modules => pipelines}/segmoe/segmoe_model.py (100%) rename {modules => scripts}/consistory/__init__.py (100%) rename {modules => scripts}/consistory/attention_processor.py (100%) rename {modules => scripts}/consistory/consistory_pipeline.py (100%) rename {modules => scripts}/consistory/consistory_run.py (100%) rename {modules => scripts}/consistory/consistory_unet_sdxl.py (100%) rename {modules => scripts}/consistory/consistory_utils.py (100%) rename {modules => scripts}/consistory/utils/general_utils.py (100%) rename {modules => scripts}/consistory/utils/ptp_utils.py (100%) rename {modules => scripts}/ctrlx/__init__.py (100%) rename {modules => scripts}/ctrlx/features.py (100%) rename {modules => scripts}/ctrlx/media.py (100%) rename {modules => scripts}/ctrlx/sdxl.py (100%) rename {modules => scripts}/ctrlx/utils.py (100%) rename scripts/{ctrlx.py => ctrlx_ext.py} (93%) rename {modules => scripts}/freescale/__init__.py (100%) rename {modules => scripts}/freescale/free_lunch_utils.py (100%) rename {modules => scripts}/freescale/freescale_pipeline.py (100%) rename {modules => scripts}/freescale/freescale_pipeline_img2img.py (100%) rename {modules => scripts}/freescale/scale_attention.py (100%) rename scripts/{freescale.py => freescale_ext.py} (97%) rename {modules => scripts}/infiniteyou/__init__.py (100%) rename {modules => scripts}/infiniteyou/pipeline_flux_infusenet.py (100%) rename {modules => scripts}/infiniteyou/pipeline_infu_flux.py (100%) rename {modules => scripts}/infiniteyou/resampler.py (100%) rename {modules => scripts}/instantir/__init__.py (100%) rename {modules => scripts}/instantir/aggregator.py (100%) rename {modules/meissonic => scripts/instantir/ip_adapter}/__init__.py (100%) rename {modules => scripts}/instantir/ip_adapter/attention_processor.py (100%) rename {modules => scripts}/instantir/ip_adapter/ip_adapter.py (100%) rename {modules => scripts}/instantir/ip_adapter/resampler.py (100%) rename {modules => scripts}/instantir/ip_adapter/utils.py (100%) rename {modules => scripts}/instantir/lcm_single_step_scheduler.py (100%) rename {modules => scripts}/instantir/sdxl_instantir.py (100%) rename scripts/{instantir.py => instantir_ext.py} (96%) rename {modules => scripts}/layerdiffuse/__init__.py (94%) rename {modules => scripts}/layerdiffuse/layerdiffuse_loader.py (99%) rename {modules => scripts}/layerdiffuse/layerdiffuse_model.py (100%) rename scripts/{layerdiffuse.py => layerdiffuse_ext.py} (94%) rename {modules => scripts}/mod/__init__.py (100%) rename {modules => scripts}/pixelsmith/__init__.py (100%) rename {modules => scripts}/pixelsmith/autoencoder_kl.py (100%) rename {modules => scripts}/pixelsmith/pixelsmith_pipeline.py (100%) rename {modules => scripts}/pixelsmith/vae.py (100%) rename scripts/{pixelsmith.py => pixelsmith_ext.py} (95%) rename {modules => scripts}/pulid/__init__.py (100%) rename {modules => scripts}/pulid/attention_processor.py (100%) rename {modules => scripts}/pulid/encoders_transformer.py (100%) rename {modules => scripts}/pulid/eva_clip/__init__.py (100%) rename {modules => scripts}/pulid/eva_clip/bpe_simple_vocab_16e6.txt.gz (100%) rename {modules => scripts}/pulid/eva_clip/constants.py (100%) rename {modules => scripts}/pulid/eva_clip/eva_vit_model.py (100%) rename {modules => scripts}/pulid/eva_clip/factory.py (100%) rename {modules => scripts}/pulid/eva_clip/hf_configs.py (100%) rename {modules => scripts}/pulid/eva_clip/hf_model.py (100%) rename {modules => scripts}/pulid/eva_clip/loss.py (100%) rename {modules => scripts}/pulid/eva_clip/model.py (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA01-CLIP-B-16.json (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA01-CLIP-g-14-plus.json (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA01-CLIP-g-14.json (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA02-CLIP-B-16.json (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA02-CLIP-L-14-336.json (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA02-CLIP-L-14.json (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14-plus.json (100%) rename {modules => scripts}/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14.json (100%) rename {modules => scripts}/pulid/eva_clip/modified_resnet.py (100%) rename {modules => scripts}/pulid/eva_clip/openai.py (100%) rename {modules => scripts}/pulid/eva_clip/pretrained.py (100%) rename {modules => scripts}/pulid/eva_clip/rope.py (100%) rename {modules => scripts}/pulid/eva_clip/timm_model.py (100%) rename {modules => scripts}/pulid/eva_clip/tokenizer.py (100%) rename {modules => scripts}/pulid/eva_clip/transform.py (100%) rename {modules => scripts}/pulid/eva_clip/transformer.py (100%) rename {modules => scripts}/pulid/eva_clip/utils.py (100%) rename {modules => scripts}/pulid/pulid_sampling.py (100%) rename {modules => scripts}/pulid/pulid_sdxl.py (99%) rename {modules => scripts}/pulid/pulid_utils.py (100%) rename {modules => scripts}/style_aligned/inversion.py (100%) rename {modules => scripts}/style_aligned/sa_handler.py (100%) rename scripts/{style_aligned.py => style_aligned_ext.py} (96%) rename {modules => scripts}/xadapter/adapter.py (100%) rename {modules => scripts}/xadapter/pipeline_sd_xl_adapter.py (100%) rename {modules => scripts}/xadapter/pipeline_sd_xl_adapter_controlnet.py (100%) rename {modules => scripts}/xadapter/pipeline_sd_xl_adapter_controlnet_img2img.py (100%) rename {modules => scripts}/xadapter/unet_adapter.py (100%) rename {modules => scripts}/xadapter/utils.py (100%) rename {modules => scripts}/xadapter/xadapter_hijacks.py (100%) rename scripts/{x_adapter.py => xadapter_ext.py} (94%) diff --git a/.pylintrc b/.pylintrc index 5ecbbef48..68b004820 100644 --- a/.pylintrc +++ b/.pylintrc @@ -7,32 +7,27 @@ fail-on= fail-under=10 ignore=CVS ignore-paths=/usr/lib/.*$, + venv, + .git, + .ruff_cache, + .vscode, modules/apg, - modules/consistory, + modules/cfgzero, modules/control/proc, modules/control/units, - modules/ctrlx, modules/dml, - modules/freescale, + modules/flash_attn_triton_amd, modules/ggml, modules/hidiffusion, - modules/hijack, - modules/instantir, + modules/hijack/ddpm_edit.py, + modules/intel, modules/intel/ipex, - modules/intel/openvino, modules/k-diffusion, - modules/flex2, modules/ldsr, - modules/hidream, - modules/meissonic, - modules/mod, - modules/omnigen, - modules/omnigen2, modules/onnx_impl, modules/pag, - modules/pixelsmith, + modules/postprocess/aurasr_arch.py, modules/prompt_parser_xhinker.py, - modules/pulid/eva_clip, modules/ras, modules/rife, modules/schedulers, @@ -40,15 +35,26 @@ ignore-paths=/usr/lib/.*$, modules/teacache, modules/todo, modules/unipc, - modules/xadapter, - modules/cfgzero, - modules/infiniteyou, - modules/flash_attn_triton_amd, - scripts/softfill.py, + pipelines/flex2, + pipelines/hidream, + pipelines/meissonic, + pipelines/omnigen2, + pipelines/segmoe, + scripts/consistory, + scripts/ctrlx, + scripts/demofusion, + scripts/freescale, + scripts/infiniteyou, + scripts/instantir, + scripts/mod, + scripts/pixelsmith, + scripts/differential_diffusion.py, + scripts/pulid, + scripts/xadapter, repositories, extensions-builtin/Lora, - extensions-builtin/sd-webui-agent-scheduler, extensions-builtin/sd-extension-chainner/nodes, + extensions-builtin/sd-webui-agent-scheduler, extensions-builtin/sdnext-modernui/node_modules, ignore-patterns=.*test*.py$, .*_model.py$, @@ -158,8 +164,8 @@ disable=abstract-method, consider-using-generator, consider-using-get, consider-using-in, - consider-using-min-builtin, consider-using-max-builtin, + consider-using-min-builtin, consider-using-sys-exit, cyclic-import, dangerous-default-value, @@ -175,6 +181,7 @@ disable=abstract-method, missing-class-docstring, missing-function-docstring, missing-module-docstring, + no-else-raise, no-else-return, not-callable, pointless-string-statement, @@ -185,16 +192,17 @@ disable=abstract-method, too-many-instance-attributes, too-many-locals, too-many-nested-blocks, - too-many-statements, too-many-positional-arguments, + too-many-statements, unidiomatic-typecheck, + unknown-option-value, unnecessary-dict-index-lookup, unnecessary-dunder-call, - unnecessary-lambda, unnecessary-lambda-assigment, + unnecessary-lambda, + unused-wildcard-import, use-dict-literal, use-symbolic-message-instead, - unknown-option-value, useless-suppression, wrong-import-position, enable=c-extension-no-member diff --git a/.ruff.toml b/.ruff.toml index 023678c33..b21563996 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -3,44 +3,33 @@ exclude = [ ".git", ".ruff_cache", ".vscode", - "modules/apg", - "modules/consistory", + + "modules/cfgzero", + "modules/flash_attn_triton_amd", + "modules/hidiffusion", + "modules/intel/ipex", + "modules/k-diffusion", + "modules/pag", + "modules/schedulers", + "modules/teacache", + "modules/control/proc", "modules/control/units", - "modules/freescale", - "modules/flex2", - "modules/ggml", - "modules/hidiffusion", - "modules/hijack", - "modules/instantir", - "modules/intel/ipex", - "modules/intel/openvino", - "modules/k-diffusion", - "modules/ldsr", - "modules/meissonic", - "modules/mod", - "modules/omnigen", - "modules/omnigen2", - "modules/hidream", - "modules/pag", - "modules/pixelsmith", + "modules/control/units/xs_pipe.py", "modules/postprocess/aurasr_arch.py", - "modules/prompt_parser_xhinker.py", - "modules/pulid/eva_clip", - "modules/ras", - "modules/rife", - "modules/schedulers", - "modules/segmoe", - "modules/taesd", - "modules/teacache", - "modules/todo", - "modules/unipc", - "modules/cfgzero", - "modules/xadapter", - "modules/infiniteyou", - "modules/flash_attn_triton_amd", - "scripts/softfill.py", + + "pipelines/meissonic", + "pipelines/omnigen2", + "pipelines/segmoe", + + "scripts/xadapter", + "scripts/pulid", + "scripts/instantir", + "scripts/freescale", + "scripts/consistory", + "repositories", + "extensions-builtin/Lora", "extensions-builtin/sd-extension-chainner/nodes", "extensions-builtin/sd-webui-agent-scheduler", diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ba4c3462..eb140b412 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-07-02 +## Update for 2025-07-03 - **Models** - Add **FLUX.1-Kontext-Dev** inpaint workflow @@ -12,16 +12,20 @@ enable in *settings -> compute settings -> sdp options* *note*: SD.Next will use either SageAttention v1 or 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 -- **Core** - - override `gradio` installer - - major refactoring of requirements and dependencies to unblock `numpy>=2.1.0` - - patch `insightface` - - patch `k-diffusion` - - better handle startup import errors - **Fixes** - allow theme type `None` to be set in config - installer dont cache installed state - fix Cosmos-Predict2 retrying TAESD download + - better handle startup import errors +- **Refactoring** + - override `gradio` installer + - major refactoring of requirements and dependencies to unblock `numpy>=2.1.0` + - patch `insightface` + - patch `k-diffusion` + - cleanup `/modules`: move pipeline loaders to `/pipelines` root + - cleanup `/modules`: move code folders used by scripts to `/scripts/\n' added = [] - for script in modules.scripts.list_scripts("javascript", ".js"): + for script in modules.scripts_manager.list_scripts("javascript", ".js"): if script.filename in main or script.filename in skip: continue head += f'\n' added.append(script.path) - for script in modules.scripts.list_scripts("javascript", ".mjs"): + for script in modules.scripts_manager.list_scripts("javascript", ".mjs"): head += f'\n' added.append(script.path) added = [a.replace(script_path, '').replace('\\', '/') for a in added] @@ -59,7 +59,7 @@ def html_css(css: str): head = '' if css is not None: head += stylesheet(os.path.join(script_path, 'javascript', css)) - for cssfile in modules.scripts.list_files_with_name("style.css"): + for cssfile in modules.scripts_manager.list_files_with_name("style.css"): if not os.path.isfile(cssfile): continue head += stylesheet(cssfile) diff --git a/modules/ui_postprocessing.py b/modules/ui_postprocessing.py index 8ed530de7..a84b30276 100644 --- a/modules/ui_postprocessing.py +++ b/modules/ui_postprocessing.py @@ -1,6 +1,6 @@ import json import gradio as gr -from modules import scripts, shared, ui_common, postprocessing, call_queue, generation_parameters_copypaste +from modules import scripts_manager, shared, ui_common, postprocessing, call_queue, generation_parameters_copypaste def submit_info(image): @@ -32,7 +32,7 @@ def create_ui(): with gr.Row(): save_output = gr.Checkbox(label='Save output', value=True, elem_id="extras_save_output") - script_inputs = scripts.scripts_postproc.setup_ui() + script_inputs = scripts_manager.scripts_postproc.setup_ui() with gr.Column(): id_part = 'extras' with gr.Row(elem_id=f"{id_part}_generate_box", elem_classes="generate-box"): @@ -56,7 +56,7 @@ def create_ui(): tab_batch.select(fn=lambda: 1, inputs=[], outputs=[tab_index]) tab_batch_dir.select(fn=lambda: 2, inputs=[], outputs=[tab_index]) extras_image.change(fn=submit_info, inputs=[extras_image], outputs=[html_info_formatted, exif_info, gen_info]) - extras_image.change(fn=scripts.scripts_postproc.image_changed, inputs=[], outputs=[]) + extras_image.change(fn=scripts_manager.scripts_postproc.image_changed, inputs=[], outputs=[]) submit.click( _js="submit_postprocessing", fn=call_queue.wrap_gradio_gpu_call(submit_process, extra_outputs=[None, ''], name='Postprocess'), diff --git a/modules/ui_txt2img.py b/modules/ui_txt2img.py index 63d47920d..c74547e3c 100644 --- a/modules/ui_txt2img.py +++ b/modules/ui_txt2img.py @@ -17,8 +17,8 @@ def calc_resolution_hires(width, height, hr_scale, hr_resize_x, hr_resize_y, hr_ def create_ui(): shared.log.debug('UI initialize: txt2img') import modules.txt2img # pylint: disable=redefined-outer-name - modules.scripts.scripts_current = modules.scripts.scripts_txt2img - modules.scripts.scripts_txt2img.initialize_scripts(is_img2img=False, is_control=False) + modules.scripts_manager.scripts_current = modules.scripts_manager.scripts_txt2img + modules.scripts_manager.scripts_txt2img.initialize_scripts(is_img2img=False, is_control=False) with gr.Blocks(analytics_enabled=False) as _txt2img_interface: txt2img_prompt, txt2img_prompt_styles, txt2img_negative_prompt, txt2img_submit, txt2img_reprocess, txt2img_paste, txt2img_extra_networks_button, txt2img_token_counter, txt2img_token_button, txt2img_negative_token_counter, txt2img_negative_token_button = ui_sections.create_toprow(is_img2img=False, id_part="txt2img") @@ -52,7 +52,7 @@ def create_ui(): state = gr.Textbox(value='', visible=False) with gr.Group(elem_id="txt2img_script_container"): - txt2img_script_inputs = modules.scripts.scripts_txt2img.setup_ui(parent='txt2img', accordion=True) + txt2img_script_inputs = modules.scripts_manager.scripts_txt2img.setup_ui(parent='txt2img', accordion=True) txt2img_gallery, txt2img_generation_info, txt2img_html_info, _txt2img_html_info_formatted, txt2img_html_log = ui_common.create_output_panel("txt2img", preview=True, prompt=txt2img_prompt) ui_common.connect_reuse_seed(seed, reuse_seed, txt2img_generation_info, is_subseed=False) @@ -158,7 +158,7 @@ def create_ui(): # hidden (seed_resize_from_w, "Seed resize from-1"), (seed_resize_from_h, "Seed resize from-2"), - *modules.scripts.scripts_txt2img.infotext_fields + *modules.scripts_manager.scripts_txt2img.infotext_fields ] generation_parameters_copypaste.add_paste_fields("txt2img", None, txt2img_paste_fields, override_settings) txt2img_bindings = generation_parameters_copypaste.ParamBinding(paste_button=txt2img_paste, tabname="txt2img", source_text_component=txt2img_prompt, source_image_component=None) diff --git a/package.json b/package.json index 8e6126230..93b117e9a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "localize": "node cli/localize.js", "ruff": ". venv/bin/activate && ruff check", "eslint": "eslint javascript/ extensions-builtin/sdnext-modernui/javascript/", - "pylint": ". venv/bin/activate && pylint *.py modules/ extensions-builtin/ | grep -v '^*'", + "pylint": ". venv/bin/activate && pylint *.py modules/ pipelines/ scripts/ extensions-builtin/ | grep -v '^*'", "lint": "npm run eslint && npm run ruff && npm run pylint", "test": "cli/test.sh" }, diff --git a/modules/flex2/__init__.py b/pipelines/flex2/__init__.py similarity index 100% rename from modules/flex2/__init__.py rename to pipelines/flex2/__init__.py diff --git a/modules/hidream/pipeline_hidream_image_editing.py b/pipelines/hidream/pipeline_hidream_image_editing.py similarity index 100% rename from modules/hidream/pipeline_hidream_image_editing.py rename to pipelines/hidream/pipeline_hidream_image_editing.py diff --git a/modules/instantir/ip_adapter/__init__.py b/pipelines/meissonic/__init__.py similarity index 100% rename from modules/instantir/ip_adapter/__init__.py rename to pipelines/meissonic/__init__.py diff --git a/modules/meissonic/pipeline.py b/pipelines/meissonic/pipeline.py similarity index 100% rename from modules/meissonic/pipeline.py rename to pipelines/meissonic/pipeline.py diff --git a/modules/meissonic/pipeline_img2img.py b/pipelines/meissonic/pipeline_img2img.py similarity index 100% rename from modules/meissonic/pipeline_img2img.py rename to pipelines/meissonic/pipeline_img2img.py diff --git a/modules/meissonic/pipeline_inpaint.py b/pipelines/meissonic/pipeline_inpaint.py similarity index 100% rename from modules/meissonic/pipeline_inpaint.py rename to pipelines/meissonic/pipeline_inpaint.py diff --git a/modules/meissonic/scheduler.py b/pipelines/meissonic/scheduler.py similarity index 100% rename from modules/meissonic/scheduler.py rename to pipelines/meissonic/scheduler.py diff --git a/modules/meissonic/test.py b/pipelines/meissonic/test.py similarity index 100% rename from modules/meissonic/test.py rename to pipelines/meissonic/test.py diff --git a/modules/meissonic/transformer.py b/pipelines/meissonic/transformer.py similarity index 100% rename from modules/meissonic/transformer.py rename to pipelines/meissonic/transformer.py diff --git a/modules/model_auraflow.py b/pipelines/model_auraflow.py similarity index 100% rename from modules/model_auraflow.py rename to pipelines/model_auraflow.py diff --git a/modules/model_chroma.py b/pipelines/model_chroma.py similarity index 98% rename from modules/model_chroma.py rename to pipelines/model_chroma.py index 9333ccc30..262b698e5 100644 --- a/modules/model_chroma.py +++ b/pipelines/model_chroma.py @@ -173,7 +173,7 @@ def load_transformer(file_path): # triggered by opts.sd_unet change if transformer is not None: return transformer shared.log.info(f'Load module: type=UNet/Transformer file="{file_path}" offload={shared.opts.diffusers_offload_mode} quant=none dtype={devices.dtype}') - # TODO chroma transformer from-single-file with quant + # TODO model load: chroma transformer from-single-file with quant # shared.log.warning('Load module: type=UNet/Transformer does not support load-time quantization') # transformer = diffusers.ChromaTransformer2DModel.from_single_file(file_path, **diffusers_load_config) if transformer is None: @@ -261,8 +261,8 @@ def load_chroma(checkpoint_info, diffusers_load_config): # triggered by opts.sd_ if vae is not None: kwargs['vae'] = vae - # TODO add ChromaFillPipeline, ChromaControlPipeline, ChromaImg2ImgPipeline etc when available - # TODO Chroma will support inpainting *after* its training has finished: https://huggingface.co/lodestones/Chroma/discussions/28#6826dd2ed86f53ff983add5c + # TODO model load: add ChromaFillPipeline, ChromaControlPipeline, ChromaImg2ImgPipeline etc when available + # Chroma will support inpainting *after* its training has finished: https://huggingface.co/lodestones/Chroma/discussions/28#6826dd2ed86f53ff983add5c cls = diffusers.ChromaPipeline shared.log.debug(f'Load model: type=Chroma cls={cls.__name__} preloaded={list(kwargs)} revision={diffusers_load_config.get("revision", None)}') for c in kwargs: diff --git a/modules/model_cogview.py b/pipelines/model_cogview.py similarity index 96% rename from modules/model_cogview.py rename to pipelines/model_cogview.py index eaba437ed..0f1f4a3f7 100644 --- a/modules/model_cogview.py +++ b/pipelines/model_cogview.py @@ -76,6 +76,6 @@ def load_cogview4(checkpoint_info, diffusers_load_config={}): if shared.opts.diffusers_eval: pipe.text_encoder.eval() pipe.transformer.eval() - pipe.enable_model_cpu_offload() # TODO cogview4: balanced offload does not work for GlmModel + pipe.enable_model_cpu_offload() # TODO model fix: cogview4: balanced offload does not work for GlmModel devices.torch_gc() return pipe diff --git a/modules/model_cosmos.py b/pipelines/model_cosmos.py similarity index 100% rename from modules/model_cosmos.py rename to pipelines/model_cosmos.py diff --git a/modules/model_flex.py b/pipelines/model_flex.py similarity index 94% rename from modules/model_flex.py rename to pipelines/model_flex.py index 1ce5d6145..169d704e6 100644 --- a/modules/model_flex.py +++ b/pipelines/model_flex.py @@ -24,9 +24,6 @@ def load_transformer(repo_id, diffusers_load_config={}): elif fn is not None and 'safetensors' in fn.lower(): shared.log.debug(f'Load model: type=FLEX transformer="{repo_id}" quant="{model_quant.get_quant(repo_id)}" args={load_args}') transformer = diffusers.FluxTransformer2DModel.from_single_file(fn, cache_dir=shared.opts.hfcache_dir, **load_args) - # elif model_quant.check_nunchaku('Model'): - # shared.log.error(f'Load model: type=HiDream transformer="{repo_id}" quant="Nunchaku" unsupported') - # transformer = None else: shared.log.debug(f'Load model: type=FLEX transformer="{repo_id}" quant="{model_quant.get_quant_type(quant_args)}" args={load_args}') transformer = diffusers.FluxTransformer2DModel.from_pretrained( @@ -71,7 +68,7 @@ def load_flex(checkpoint_info, diffusers_load_config={}): load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, module='Model') shared.log.debug(f'Load model: type=FLEX model="{checkpoint_info.name}" repo="{repo_id}" offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args}') - from modules.flex2 import Flex2Pipeline + from pipelines.flex2 import Flex2Pipeline pipe = Flex2Pipeline.from_pretrained( repo_id, # custom_pipeline=repo_id, diff --git a/modules/model_flux.py b/pipelines/model_flux.py similarity index 99% rename from modules/model_flux.py rename to pipelines/model_flux.py index 6194cfbd1..574904f14 100644 --- a/modules/model_flux.py +++ b/pipelines/model_flux.py @@ -175,7 +175,7 @@ def load_transformer(file_path): # triggered by opts.sd_unet change if _transformer is not None: transformer = _transformer elif 'nf4' in quant: # TODO flux: loader for civitai nf4 models - from modules.model_flux_nf4 import load_flux_nf4 + from pipelines.model_flux_nf4 import load_flux_nf4 _transformer, _text_encoder_2 = load_flux_nf4(file_path, prequantized=True) if _transformer is not None: transformer = _transformer @@ -183,7 +183,7 @@ def load_transformer(file_path): # triggered by opts.sd_unet change quant_args = model_quant.create_bnb_config({}) if quant_args: shared.log.info(f'Load module: type=UNet/Transformer file="{file_path}" offload={shared.opts.diffusers_offload_mode} quant=bnb dtype={devices.dtype}') - from modules.model_flux_nf4 import load_flux_nf4 + from pipelines.model_flux_nf4 import load_flux_nf4 transformer, _text_encoder_2 = load_flux_nf4(file_path, prequantized=False) if transformer is not None: return transformer @@ -275,7 +275,7 @@ def load_flux(checkpoint_info, diffusers_load_config): # triggered by opts.sd_ch # load quantized components if any if prequantized == 'nf4': try: - from modules.model_flux_nf4 import load_flux_nf4 + from pipelines.model_flux_nf4 import load_flux_nf4 _transformer, _text_encoder = load_flux_nf4(checkpoint_info) if _transformer is not None: transformer = _transformer diff --git a/modules/model_flux_nf4.py b/pipelines/model_flux_nf4.py similarity index 100% rename from modules/model_flux_nf4.py rename to pipelines/model_flux_nf4.py diff --git a/modules/model_hidream.py b/pipelines/model_hidream.py similarity index 98% rename from modules/model_hidream.py rename to pipelines/model_hidream.py index ac7b335d1..9acd92e38 100644 --- a/modules/model_hidream.py +++ b/pipelines/model_hidream.py @@ -102,7 +102,7 @@ def load_hidream(checkpoint_info, diffusers_load_config={}): if 'I1' in repo_id: cls = diffusers.HiDreamImagePipeline elif 'E1' in repo_id: - from modules.hidream.pipeline_hidream_image_editing import HiDreamImageEditingPipeline + from pipelines.hidream.pipeline_hidream_image_editing import HiDreamImageEditingPipeline cls = HiDreamImageEditingPipeline diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["hidream-e1"] = diffusers.HiDreamImagePipeline diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["hidream-e1"] = HiDreamImageEditingPipeline diff --git a/modules/model_kolors.py b/pipelines/model_kolors.py similarity index 100% rename from modules/model_kolors.py rename to pipelines/model_kolors.py diff --git a/modules/model_lumina.py b/pipelines/model_lumina.py similarity index 100% rename from modules/model_lumina.py rename to pipelines/model_lumina.py diff --git a/modules/model_meissonic.py b/pipelines/model_meissonic.py similarity index 80% rename from modules/model_meissonic.py rename to pipelines/model_meissonic.py index 2be5c3bbe..da7ea1429 100644 --- a/modules/model_meissonic.py +++ b/pipelines/model_meissonic.py @@ -4,11 +4,11 @@ import diffusers def load_meissonic(checkpoint_info, diffusers_load_config={}): from modules import shared, devices, modelloader, sd_models, shared_items - from modules.meissonic.transformer import Transformer2DModel as TransformerMeissonic - from modules.meissonic.scheduler import Scheduler as MeissonicScheduler - from modules.meissonic.pipeline import Pipeline as PipelineMeissonic - from modules.meissonic.pipeline_img2img import Img2ImgPipeline as PipelineMeissonicImg2Img - from modules.meissonic.pipeline_inpaint import InpaintPipeline as PipelineMeissonicInpaint + from pipelines.meissonic.transformer import Transformer2DModel as TransformerMeissonic + from pipelines.meissonic.scheduler import Scheduler as MeissonicScheduler + from pipelines.meissonic.pipeline import Pipeline as PipelineMeissonic + from pipelines.meissonic.pipeline_img2img import Img2ImgPipeline as PipelineMeissonicImg2Img + from pipelines.meissonic.pipeline_inpaint import InpaintPipeline as PipelineMeissonicInpaint shared_items.pipelines['Meissonic'] = PipelineMeissonic modelloader.hf_login() diff --git a/modules/model_omnigen.py b/pipelines/model_omnigen.py similarity index 93% rename from modules/model_omnigen.py rename to pipelines/model_omnigen.py index b2fb95830..ba60eb389 100644 --- a/modules/model_omnigen.py +++ b/pipelines/model_omnigen.py @@ -1,6 +1,6 @@ import os import diffusers -from modules import errors, shared, devices, sd_models, model_quant +from modules import shared, devices, sd_models, model_quant debug = shared.log.trace if os.environ.get('SD_LOAD_DEBUG', None) is not None else lambda *args, **kwargs: None diff --git a/modules/model_omnigen2.py b/pipelines/model_omnigen2.py similarity index 93% rename from modules/model_omnigen2.py rename to pipelines/model_omnigen2.py index 285e46f50..33c354931 100644 --- a/modules/model_omnigen2.py +++ b/pipelines/model_omnigen2.py @@ -7,7 +7,7 @@ debug = shared.log.trace if os.environ.get('SD_LOAD_DEBUG', None) is not None el def load_omnigen2(checkpoint_info, diffusers_load_config={}): # pylint: disable=unused-argument repo_id = sd_models.path_to_repo(checkpoint_info.name) - from modules.omnigen2 import OmniGen2Pipeline, OmniGen2Transformer2DModel, Qwen2_5_VLForConditionalGeneration + from pipelines.omnigen2 import OmniGen2Pipeline, OmniGen2Transformer2DModel, Qwen2_5_VLForConditionalGeneration import diffusers from diffusers import pipelines diffusers.OmniGen2Pipeline = OmniGen2Pipeline # monkey-pathch diff --git a/modules/model_pixart.py b/pipelines/model_pixart.py similarity index 100% rename from modules/model_pixart.py rename to pipelines/model_pixart.py diff --git a/modules/model_sana.py b/pipelines/model_sana.py similarity index 100% rename from modules/model_sana.py rename to pipelines/model_sana.py diff --git a/modules/model_sd3.py b/pipelines/model_sd3.py similarity index 100% rename from modules/model_sd3.py rename to pipelines/model_sd3.py diff --git a/modules/model_stablecascade.py b/pipelines/model_stablecascade.py similarity index 100% rename from modules/model_stablecascade.py rename to pipelines/model_stablecascade.py diff --git a/modules/omnigen2/__init__.py b/pipelines/omnigen2/__init__.py similarity index 100% rename from modules/omnigen2/__init__.py rename to pipelines/omnigen2/__init__.py diff --git a/modules/omnigen2/image_processor.py b/pipelines/omnigen2/image_processor.py similarity index 100% rename from modules/omnigen2/image_processor.py rename to pipelines/omnigen2/image_processor.py diff --git a/modules/omnigen2/models/attention_processor.py b/pipelines/omnigen2/models/attention_processor.py similarity index 100% rename from modules/omnigen2/models/attention_processor.py rename to pipelines/omnigen2/models/attention_processor.py diff --git a/modules/omnigen2/models/embeddings.py b/pipelines/omnigen2/models/embeddings.py similarity index 100% rename from modules/omnigen2/models/embeddings.py rename to pipelines/omnigen2/models/embeddings.py diff --git a/modules/omnigen2/models/transformers/__init__.py b/pipelines/omnigen2/models/transformers/__init__.py similarity index 100% rename from modules/omnigen2/models/transformers/__init__.py rename to pipelines/omnigen2/models/transformers/__init__.py diff --git a/modules/omnigen2/models/transformers/block_lumina2.py b/pipelines/omnigen2/models/transformers/block_lumina2.py similarity index 100% rename from modules/omnigen2/models/transformers/block_lumina2.py rename to pipelines/omnigen2/models/transformers/block_lumina2.py diff --git a/modules/omnigen2/models/transformers/repo.py b/pipelines/omnigen2/models/transformers/repo.py similarity index 100% rename from modules/omnigen2/models/transformers/repo.py rename to pipelines/omnigen2/models/transformers/repo.py diff --git a/modules/omnigen2/models/transformers/transformer_omnigen2.py b/pipelines/omnigen2/models/transformers/transformer_omnigen2.py similarity index 100% rename from modules/omnigen2/models/transformers/transformer_omnigen2.py rename to pipelines/omnigen2/models/transformers/transformer_omnigen2.py diff --git a/modules/omnigen2/pipeline_omnigen2.py b/pipelines/omnigen2/pipeline_omnigen2.py similarity index 100% rename from modules/omnigen2/pipeline_omnigen2.py rename to pipelines/omnigen2/pipeline_omnigen2.py diff --git a/modules/segmoe/segmoe_model.py b/pipelines/segmoe/segmoe_model.py similarity index 100% rename from modules/segmoe/segmoe_model.py rename to pipelines/segmoe/segmoe_model.py diff --git a/scripts/allegrovideo.py b/scripts/allegrovideo.py index 673627ddb..9fe0bc584 100644 --- a/scripts/allegrovideo.py +++ b/scripts/allegrovideo.py @@ -2,7 +2,7 @@ import time import gradio as gr import transformers import diffusers -from modules import scripts, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant, timer, sd_hijack_te +from modules import scripts_manager, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant, timer, sd_hijack_te repo_id = 'rhymes-ai/Allegro' @@ -19,7 +19,7 @@ def hijack_decode(*args, **kwargs): return res -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: Allegro (Legacy)' diff --git a/scripts/animatediff.py b/scripts/animatediff.py index 6fb77a45b..79fa4c740 100644 --- a/scripts/animatediff.py +++ b/scripts/animatediff.py @@ -2,7 +2,7 @@ import os import gradio as gr import diffusers from safetensors.torch import load_file -from modules import scripts, processing, shared, devices, sd_models +from modules import scripts_manager, processing, shared, devices, sd_models # config @@ -189,12 +189,12 @@ def set_free_noise(frames): shared.sd_model.enable_free_noise(context_length=context_length, context_stride=context_stride) -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: AnimateDiff' def show(self, is_img2img): - # return scripts.AlwaysVisible if shared.native else False + # return scripts_manager.AlwaysVisible if shared.native else False return not is_img2img @@ -231,7 +231,7 @@ class Script(scripts.Script): lora = LORAS[lora_index] set_adapter(adapter) if motion_adapter is None: - return + return None set_scheduler(p, adapter, override_scheduler) set_lora(p, lora, strength) set_free_init(fi_method, fi_iters, fi_order, fi_spatial, fi_temporal) diff --git a/scripts/apg.py b/scripts/apg.py index 6d0ec107e..5b8373a8d 100644 --- a/scripts/apg.py +++ b/scripts/apg.py @@ -1,11 +1,11 @@ import gradio as gr -from modules import scripts, processing, shared, sd_models +from modules import scripts_manager, processing, shared, sd_models registered = False -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None @@ -71,6 +71,7 @@ class Script(scripts.Script): shared.log.info(f'APG apply: guidance={p.cfg_scale} momentum={apg.momentum} eta={apg.eta} threshold={apg.threshold} class={shared.sd_model.__class__.__name__}') p.extra_generation_params["APG"] = f'ETA={apg.eta} Momentum={apg.momentum} Threshold={apg.threshold}' # processed = processing.process_images(p) + return None def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, eta, momentum, threshold): # pylint: disable=arguments-differ, unused-argument from modules import apg diff --git a/scripts/automatic_color_inpaint.py b/scripts/automatic_color_inpaint.py index 227a445fa..afe020881 100644 --- a/scripts/automatic_color_inpaint.py +++ b/scripts/automatic_color_inpaint.py @@ -1,7 +1,7 @@ import gradio as gr from PIL import Image import numpy as np -from modules import shared, scripts, processing, masking +from modules import shared, scripts_manager, processing, masking """ Automatic Color Inpaint Script for SD.NEXT - SD & SDXL Support @@ -28,7 +28,7 @@ img2img = True ### Script definition -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return title diff --git a/scripts/blipdiffusion.py b/scripts/blipdiffusion.py index 0acc80929..14b4a6a1c 100644 --- a/scripts/blipdiffusion.py +++ b/scripts/blipdiffusion.py @@ -1,8 +1,8 @@ import gradio as gr -from modules import scripts, processing, shared, sd_models +from modules import scripts_manager, processing, shared, sd_models -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'BLIP Diffusion: Controllable Generation and Editing' diff --git a/scripts/cogvideo.py b/scripts/cogvideo.py index 67022da67..42b9111fc 100644 --- a/scripts/cogvideo.py +++ b/scripts/cogvideo.py @@ -13,14 +13,14 @@ import torch from torchvision import transforms import diffusers import numpy as np -from modules import scripts, shared, devices, errors, sd_models, processing +from modules import scripts_manager, shared, devices, errors, sd_models, processing from modules.processing_callbacks import diffusers_callback, set_callbacks_p debug = (os.environ.get('SD_LOAD_DEBUG', None) is not None) or (os.environ.get('SD_PROCESS_DEBUG', None) is not None) -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: CogVideoX (Legacy)' diff --git a/modules/consistory/__init__.py b/scripts/consistory/__init__.py similarity index 100% rename from modules/consistory/__init__.py rename to scripts/consistory/__init__.py diff --git a/modules/consistory/attention_processor.py b/scripts/consistory/attention_processor.py similarity index 100% rename from modules/consistory/attention_processor.py rename to scripts/consistory/attention_processor.py diff --git a/modules/consistory/consistory_pipeline.py b/scripts/consistory/consistory_pipeline.py similarity index 100% rename from modules/consistory/consistory_pipeline.py rename to scripts/consistory/consistory_pipeline.py diff --git a/modules/consistory/consistory_run.py b/scripts/consistory/consistory_run.py similarity index 100% rename from modules/consistory/consistory_run.py rename to scripts/consistory/consistory_run.py diff --git a/modules/consistory/consistory_unet_sdxl.py b/scripts/consistory/consistory_unet_sdxl.py similarity index 100% rename from modules/consistory/consistory_unet_sdxl.py rename to scripts/consistory/consistory_unet_sdxl.py diff --git a/modules/consistory/consistory_utils.py b/scripts/consistory/consistory_utils.py similarity index 100% rename from modules/consistory/consistory_utils.py rename to scripts/consistory/consistory_utils.py diff --git a/modules/consistory/utils/general_utils.py b/scripts/consistory/utils/general_utils.py similarity index 100% rename from modules/consistory/utils/general_utils.py rename to scripts/consistory/utils/general_utils.py diff --git a/modules/consistory/utils/ptp_utils.py b/scripts/consistory/utils/ptp_utils.py similarity index 100% rename from modules/consistory/utils/ptp_utils.py rename to scripts/consistory/utils/ptp_utils.py diff --git a/scripts/consistory_ext.py b/scripts/consistory_ext.py index c02ca1e50..ab0019fcc 100644 --- a/scripts/consistory_ext.py +++ b/scripts/consistory_ext.py @@ -12,10 +12,10 @@ ported to modules/consistory import time import gradio as gr import diffusers -from modules import scripts, devices, errors, processing, shared, sd_models, sd_samplers +from modules import scripts_manager, devices, errors, processing, shared, sd_models, sd_samplers -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.anchor_cache_first_stage = None @@ -66,7 +66,7 @@ class Script(scripts.Script): def create_model(self): diffusers.models.embeddings.PositionNet = diffusers.models.embeddings.GLIGENTextBoundingboxProjection # patch as renamed in https://github.com/huggingface/diffusers/pull/6244/files - import modules.consistory as cs + import scripts.consistory as cs if shared.sd_model.__class__.__name__ != 'ConsistoryExtendAttnSDXLPipeline': shared.log.debug('ConsiStory init') t0 = time.time() @@ -128,7 +128,7 @@ class Script(scripts.Script): return concepts, anchors, prompts, alpha, steps, seed def create_anchors(self, anchors, concepts, seed, steps, dropout, same, queries, sdsa, injection, alpha): - import modules.consistory as cs + import scripts.consistory as cs t0 = time.time() if len(anchors) == 0: shared.log.warning('ConsiStory: no anchors') @@ -159,7 +159,7 @@ class Script(scripts.Script): return images def create_extra(self, prompt, concepts, seed, steps, dropout, same, queries, sdsa, injection, alpha): - import modules.consistory as cs + import scripts.consistory as cs t0 = time.time() images = [] shared.log.debug(f'ConsiStory extra: concepts={concepts} prompt="{prompt}"') diff --git a/modules/ctrlx/__init__.py b/scripts/ctrlx/__init__.py similarity index 100% rename from modules/ctrlx/__init__.py rename to scripts/ctrlx/__init__.py diff --git a/modules/ctrlx/features.py b/scripts/ctrlx/features.py similarity index 100% rename from modules/ctrlx/features.py rename to scripts/ctrlx/features.py diff --git a/modules/ctrlx/media.py b/scripts/ctrlx/media.py similarity index 100% rename from modules/ctrlx/media.py rename to scripts/ctrlx/media.py diff --git a/modules/ctrlx/sdxl.py b/scripts/ctrlx/sdxl.py similarity index 100% rename from modules/ctrlx/sdxl.py rename to scripts/ctrlx/sdxl.py diff --git a/modules/ctrlx/utils.py b/scripts/ctrlx/utils.py similarity index 100% rename from modules/ctrlx/utils.py rename to scripts/ctrlx/utils.py diff --git a/scripts/ctrlx.py b/scripts/ctrlx_ext.py similarity index 93% rename from scripts/ctrlx.py rename to scripts/ctrlx_ext.py index 30b87c038..66c4881f8 100644 --- a/scripts/ctrlx.py +++ b/scripts/ctrlx_ext.py @@ -2,10 +2,10 @@ import gradio as gr from diffusers import StableDiffusionXLPipeline -from modules import shared, scripts, processing, processing_helpers, sd_models, devices +from modules import shared, scripts_manager, processing, processing_helpers, sd_models, devices -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Ctrl-X: Controlling Structure and Appearance' @@ -44,9 +44,9 @@ class Script(scripts.Script): return None import yaml - from modules.ctrlx import CtrlXStableDiffusionXLPipeline - from modules.ctrlx.sdxl import get_control_config, register_control - from modules.ctrlx.utils import get_self_recurrence_schedule + from scripts.ctrlx import CtrlXStableDiffusionXLPipeline + from scripts.ctrlx.sdxl import get_control_config, register_control + from scripts.ctrlx.utils import get_self_recurrence_schedule orig_prompt_attention = shared.opts.prompt_attention shared.opts.data['prompt_attention'] = 'fixed' diff --git a/scripts/custom_code.py b/scripts/custom_code.py index 56b0db222..4c79463db 100644 --- a/scripts/custom_code.py +++ b/scripts/custom_code.py @@ -1,8 +1,7 @@ import copy import ast import gradio as gr -import modules.scripts as scripts - +from modules import scripts_manager from modules.processing import Processed from modules.shared import opts, cmd_opts, state # pylint: disable=unused-import @@ -28,14 +27,15 @@ def exec_with_return(code, module): last_ast = copy.deepcopy(code_ast) last_ast.body = code_ast.body[-1:] - exec(compile(init_ast, "", "exec"), module.__dict__) + exec(compile(init_ast, "", "exec"), module.__dict__) # pylint: disable=exec-used if type(last_ast.body[0]) == ast.Expr: - return eval(compile(convertExpr2Expression(last_ast.body[0]), "", "eval"), module.__dict__) + return eval(compile(convertExpr2Expression(last_ast.body[0]), "", "eval"), module.__dict__) # pylint: disable=eval-used else: - exec(compile(last_ast, "", "exec"), module.__dict__) + exec(compile(last_ast, "", "exec"), module.__dict__) # pylint: disable=exec-used + return None -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "Custom code" @@ -60,7 +60,7 @@ return process_images(p) return [code, indent_level] - def run(self, p, code, indent_level): + def run(self, p, code, indent_level): # pylint: disable=arguments-differ assert cmd_opts.allow_code, '--allow-code option must be enabled' display_result_data = [[], -1, ""] diff --git a/scripts/demofusion.py b/scripts/demofusion.py index 6625c0c79..a81d3727e 100644 --- a/scripts/demofusion.py +++ b/scripts/demofusion.py @@ -14,7 +14,7 @@ from diffusers.schedulers import KarrasDiffusionSchedulers from diffusers.utils import is_accelerate_available, is_accelerate_version from diffusers.utils.torch_utils import randn_tensor from diffusers.pipelines.pipeline_utils import DiffusionPipeline, ImagePipelineOutput -from modules import scripts, processing, shared, sd_models, devices +from modules import scripts_manager, processing, shared, sd_models, devices ### Class definition @@ -1219,7 +1219,7 @@ class DemoFusionSDXLPipeline(DiffusionPipeline, FromSingleFileMixin, LoraLoaderM ### Script definition -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'DemoFusion: High-Resolution Image Generation' diff --git a/scripts/differential_diffusion.py b/scripts/differential_diffusion.py index 12bbe45e7..ce4e71d3e 100644 --- a/scripts/differential_diffusion.py +++ b/scripts/differential_diffusion.py @@ -1845,7 +1845,7 @@ import gradio as gr import diffusers from PIL import Image, ImageEnhance, ImageOps # pylint: disable=reimported from torchvision import transforms -from modules import errors, shared, devices, scripts, processing, sd_models, images +from modules import errors, shared, devices, scripts_manager, processing, sd_models, images detector = None @@ -1856,7 +1856,7 @@ MODELS = { } -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Differential diffusion: Individual Pixel Strength' diff --git a/scripts/example.py b/scripts/example.py index d62d65461..7d84ab184 100644 --- a/scripts/example.py +++ b/scripts/example.py @@ -1,6 +1,6 @@ import gradio as gr from diffusers.pipelines import StableDiffusionPipeline, StableDiffusionXLPipeline # pylint: disable=unused-import -from modules import shared, scripts, processing, sd_models, devices +from modules import shared, scripts_manager, processing, sd_models, devices """ This is a simpler template for script for SD.Next that implements a custom pipeline @@ -62,7 +62,7 @@ params = ['test1', 'test2', 'test3', 'test4'] ### Script definition -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return title diff --git a/scripts/flux_enhance.py b/scripts/flux_enhance.py index 72eb76d4e..75e6b7770 100644 --- a/scripts/flux_enhance.py +++ b/scripts/flux_enhance.py @@ -5,7 +5,7 @@ import random import threading from transformers import AutoTokenizer, AutoModelForSeq2SeqLM import gradio as gr -from modules import shared, scripts, devices, processing +from modules import shared, scripts_manager, devices, processing repo_id = "gokaygokay/Flux-Prompt-Enhance" @@ -13,7 +13,7 @@ num_return_sequences = 5 load_lock = threading.Lock() -class Script(scripts.Script): +class Script(scripts_manager.Script): prompts = [['']] tokenizer: AutoTokenizer = None model: AutoModelForSeq2SeqLM = None diff --git a/scripts/flux_tools.py b/scripts/flux_tools.py index ff5367cd8..07b96f0aa 100644 --- a/scripts/flux_tools.py +++ b/scripts/flux_tools.py @@ -3,7 +3,7 @@ import time import gradio as gr import diffusers -from modules import scripts, processing, shared, devices, sd_models +from modules import scripts_manager, processing, shared, devices, sd_models from installer import install @@ -14,7 +14,7 @@ processor_depth = None title = 'Flux Tools' -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return f'{title}' @@ -44,7 +44,7 @@ class Script(scripts.Script): def run(self, p: processing.StableDiffusionProcessing, tool: str = 'None', prompt: float = 1.0, strength: bool = True, process: bool = True): # pylint: disable=arguments-differ global redux_pipe, processor_canny, processor_depth # pylint: disable=global-statement if tool is None or tool == 'None': - return + return None image = getattr(p, 'init_images', None) if image is None or len(image) == 0: shared.log.error(f'{title}: tool={tool} no init_images') @@ -147,3 +147,4 @@ class Script(scripts.Script): shared.log.debug(f'{title}: tool={tool} ready time={time.time() - t0:.2f}') devices.torch_gc() + return None diff --git a/modules/freescale/__init__.py b/scripts/freescale/__init__.py similarity index 100% rename from modules/freescale/__init__.py rename to scripts/freescale/__init__.py diff --git a/modules/freescale/free_lunch_utils.py b/scripts/freescale/free_lunch_utils.py similarity index 100% rename from modules/freescale/free_lunch_utils.py rename to scripts/freescale/free_lunch_utils.py diff --git a/modules/freescale/freescale_pipeline.py b/scripts/freescale/freescale_pipeline.py similarity index 100% rename from modules/freescale/freescale_pipeline.py rename to scripts/freescale/freescale_pipeline.py diff --git a/modules/freescale/freescale_pipeline_img2img.py b/scripts/freescale/freescale_pipeline_img2img.py similarity index 100% rename from modules/freescale/freescale_pipeline_img2img.py rename to scripts/freescale/freescale_pipeline_img2img.py diff --git a/modules/freescale/scale_attention.py b/scripts/freescale/scale_attention.py similarity index 100% rename from modules/freescale/scale_attention.py rename to scripts/freescale/scale_attention.py diff --git a/scripts/freescale.py b/scripts/freescale_ext.py similarity index 97% rename from scripts/freescale.py rename to scripts/freescale_ext.py index 31c5a3b1c..1f24123af 100644 --- a/scripts/freescale.py +++ b/scripts/freescale_ext.py @@ -1,11 +1,11 @@ import gradio as gr -from modules import scripts, processing, shared, sd_models +from modules import scripts_manager, processing, shared, sd_models registered = False -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None @@ -58,7 +58,7 @@ class Script(scripts.Script): shared.log.warning('FreeScale: missing input image') return None - from modules.freescale import StableDiffusionXLFreeScale, StableDiffusionXLFreeScaleImg2Img + from scripts.freescale import StableDiffusionXLFreeScale, StableDiffusionXLFreeScaleImg2Img self.orig_pipe = shared.sd_model self.orig_slice = shared.opts.diffusers_vae_slicing self.orig_tile = shared.opts.diffusers_vae_tiling diff --git a/scripts/hdr.py b/scripts/hdr.py index 9afc3673b..7daf3e3a0 100644 --- a/scripts/hdr.py +++ b/scripts/hdr.py @@ -3,13 +3,12 @@ import cv2 import numpy as np import gradio as gr from PIL import Image -import modules.scripts as scripts -from modules import images, processing, shared +from modules import images, processing, shared, scripts_manager from modules.processing import Processed from modules.shared import opts, state -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "HDR: High Dynamic Range" @@ -60,7 +59,7 @@ class Script(scripts.Script): def run(self, p, hdr_range, save_hdr, is_tonemap, gamma, scale, saturation): # pylint: disable=arguments-differ if shared.sd_model_type != 'sd' and shared.sd_model_type != 'sdxl': shared.log.error(f'HDR: incorrect base model: {shared.sd_model.__class__.__name__}') - return + return None p.extra_generation_params = { "HDR range": hdr_range, } diff --git a/scripts/hunyuanvideo.py b/scripts/hunyuanvideo.py index 0291c4124..93a2a157c 100644 --- a/scripts/hunyuanvideo.py +++ b/scripts/hunyuanvideo.py @@ -3,7 +3,7 @@ import torch import gradio as gr import transformers import diffusers -from modules import scripts, processing, shared, images, devices, sd_models, sd_checkpoint, sd_samplers, model_quant, timer, sd_hijack_te +from modules import scripts_manager, processing, shared, images, devices, sd_models, sd_checkpoint, sd_samplers, model_quant, timer, sd_hijack_te default_template = """Describe the video by detailing the following aspects: @@ -48,7 +48,7 @@ def hijack_decode(*args, **kwargs): return res -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: Hunyuan Video (Legacy)' diff --git a/scripts/image2video.py b/scripts/image2video.py index b39b793b5..3b59a84a3 100644 --- a/scripts/image2video.py +++ b/scripts/image2video.py @@ -1,7 +1,7 @@ import torch import gradio as gr import diffusers -from modules import scripts, processing, shared, images, sd_models, devices +from modules import scripts_manager, processing, shared, images, sd_models, devices MODELS = [ @@ -11,7 +11,7 @@ MODELS = [ ] -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: VGen Image-to-Video' @@ -53,9 +53,9 @@ class Script(scripts.Script): def run(self, p: processing.StableDiffusionProcessing, model_name, num_frames, video_type, duration, gif_loop, mp4_pad, mp4_interpolate, fi_method, fi_iters, fi_order, fi_spatial, fi_temporal, vg_chunks, vg_fps): # pylint: disable=arguments-differ, unused-argument if model_name == 'None': - return + return None if p.init_images is None or len(p.init_images) == 0: - return + return None model = [m for m in MODELS if m['name'] == model_name][0] repo_id = model['url'] shared.log.debug(f'Image2Video: model={model_name} frames={num_frames}, video={video_type} duration={duration} loop={gif_loop} pad={mp4_pad} interpolate={mp4_interpolate}') @@ -66,7 +66,7 @@ class Script(scripts.Script): if model_name == 'PIA': if shared.sd_model_type != 'sd': shared.log.error('Image2Video PIA: base model must be SD15') - return + return None shared.log.info(f'Image2Video PIA load: model={repo_id}') motion_adapter = diffusers.MotionAdapter.from_pretrained(repo_id) sd_models.move_model(motion_adapter, devices.device) diff --git a/modules/infiniteyou/__init__.py b/scripts/infiniteyou/__init__.py similarity index 100% rename from modules/infiniteyou/__init__.py rename to scripts/infiniteyou/__init__.py diff --git a/modules/infiniteyou/pipeline_flux_infusenet.py b/scripts/infiniteyou/pipeline_flux_infusenet.py similarity index 100% rename from modules/infiniteyou/pipeline_flux_infusenet.py rename to scripts/infiniteyou/pipeline_flux_infusenet.py diff --git a/modules/infiniteyou/pipeline_infu_flux.py b/scripts/infiniteyou/pipeline_infu_flux.py similarity index 100% rename from modules/infiniteyou/pipeline_infu_flux.py rename to scripts/infiniteyou/pipeline_infu_flux.py diff --git a/modules/infiniteyou/resampler.py b/scripts/infiniteyou/resampler.py similarity index 100% rename from modules/infiniteyou/resampler.py rename to scripts/infiniteyou/resampler.py diff --git a/scripts/infiniteyou_ext.py b/scripts/infiniteyou_ext.py index 7a702d858..9a280811b 100644 --- a/scripts/infiniteyou_ext.py +++ b/scripts/infiniteyou_ext.py @@ -4,7 +4,7 @@ import gradio as gr from PIL import Image -from modules import scripts, processing, shared, sd_models, devices +from modules import scripts_manager, processing, shared, sd_models, devices prefix = 'InfiniteYou' @@ -22,7 +22,7 @@ def verify_insightface(): def load_infiniteyou(model: str): - from modules.infiniteyou import InfUFluxPipeline + from scripts.infiniteyou import InfUFluxPipeline shared.sd_model = InfUFluxPipeline( pipe=shared.sd_model, model_version=model, @@ -31,7 +31,7 @@ def load_infiniteyou(model: str): sd_models.set_diffuser_options(shared.sd_model) -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return f'{prefix}: Flexible Photo Recrafting' diff --git a/scripts/init_latents.py b/scripts/init_latents.py index 77a73c80b..5b3d9b406 100644 --- a/scripts/init_latents.py +++ b/scripts/init_latents.py @@ -1,14 +1,14 @@ -from modules import scripts, processing, shared, devices +from modules import scripts_manager, processing, shared, devices -class Script(scripts.Script): +class Script(scripts_manager.Script): standalone = False def title(self): return 'Init Latents' def show(self, is_img2img): - return scripts.AlwaysVisible if shared.native else False + return scripts_manager.AlwaysVisible if shared.native else False @staticmethod def get_latents(p): diff --git a/modules/instantir/__init__.py b/scripts/instantir/__init__.py similarity index 100% rename from modules/instantir/__init__.py rename to scripts/instantir/__init__.py diff --git a/modules/instantir/aggregator.py b/scripts/instantir/aggregator.py similarity index 100% rename from modules/instantir/aggregator.py rename to scripts/instantir/aggregator.py diff --git a/modules/meissonic/__init__.py b/scripts/instantir/ip_adapter/__init__.py similarity index 100% rename from modules/meissonic/__init__.py rename to scripts/instantir/ip_adapter/__init__.py diff --git a/modules/instantir/ip_adapter/attention_processor.py b/scripts/instantir/ip_adapter/attention_processor.py similarity index 100% rename from modules/instantir/ip_adapter/attention_processor.py rename to scripts/instantir/ip_adapter/attention_processor.py diff --git a/modules/instantir/ip_adapter/ip_adapter.py b/scripts/instantir/ip_adapter/ip_adapter.py similarity index 100% rename from modules/instantir/ip_adapter/ip_adapter.py rename to scripts/instantir/ip_adapter/ip_adapter.py diff --git a/modules/instantir/ip_adapter/resampler.py b/scripts/instantir/ip_adapter/resampler.py similarity index 100% rename from modules/instantir/ip_adapter/resampler.py rename to scripts/instantir/ip_adapter/resampler.py diff --git a/modules/instantir/ip_adapter/utils.py b/scripts/instantir/ip_adapter/utils.py similarity index 100% rename from modules/instantir/ip_adapter/utils.py rename to scripts/instantir/ip_adapter/utils.py diff --git a/modules/instantir/lcm_single_step_scheduler.py b/scripts/instantir/lcm_single_step_scheduler.py similarity index 100% rename from modules/instantir/lcm_single_step_scheduler.py rename to scripts/instantir/lcm_single_step_scheduler.py diff --git a/modules/instantir/sdxl_instantir.py b/scripts/instantir/sdxl_instantir.py similarity index 100% rename from modules/instantir/sdxl_instantir.py rename to scripts/instantir/sdxl_instantir.py diff --git a/scripts/instantir.py b/scripts/instantir_ext.py similarity index 96% rename from scripts/instantir.py rename to scripts/instantir_ext.py index 6ab7733fe..0fb39b0bb 100644 --- a/scripts/instantir.py +++ b/scripts/instantir_ext.py @@ -2,10 +2,10 @@ import gradio as gr import torch import diffusers from huggingface_hub import hf_hub_download -from modules import scripts, processing, shared, sd_models, devices, ipadapter +from modules import scripts_manager, processing, shared, sd_models, devices, ipadapter -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None @@ -40,7 +40,7 @@ class Script(scripts.Script): shared.log.warning(f'InstantIR: class={shared.sd_model.__class__.__name__} model={shared.sd_model_type} required={supported_model_list}') return None start, end, hq, multistep, adastep, image = args - from modules import instantir as ir + from scripts import instantir as ir if shared.sd_model_type == "sdxl": if shared.sd_model.__class__.__name__ != "InstantIRPipeline": self.orig_pipe = shared.sd_model diff --git a/scripts/ipadapter.py b/scripts/ipadapter.py index 98b2a683f..ca1cdcfbc 100644 --- a/scripts/ipadapter.py +++ b/scripts/ipadapter.py @@ -1,20 +1,20 @@ import json from PIL import Image import gradio as gr -from modules import scripts, processing, shared, ipadapter, ui_common +from modules import scripts_manager, processing, shared, ipadapter, ui_common MAX_ADAPTERS = 4 -class Script(scripts.Script): +class Script(scripts_manager.Script): standalone = True def title(self): return 'IP Adapters' def show(self, is_img2img): - return scripts.AlwaysVisible if shared.native else False + return scripts_manager.AlwaysVisible if shared.native else False def load_images(self, files): init_images = [] diff --git a/scripts/ipinstruct.py b/scripts/ipinstruct.py index 9add5c41d..57e20de86 100644 --- a/scripts/ipinstruct.py +++ b/scripts/ipinstruct.py @@ -7,7 +7,7 @@ encoder: `laion/CLIP-ViT-H-14-laion2B-s32B-b79K`=3.94GB import os import importlib import gradio as gr -from modules import scripts, processing, shared, sd_models, devices +from modules import scripts_manager, processing, shared, sd_models, devices repo = 'https://github.com/vladmandic/IP-Instruct' @@ -16,7 +16,7 @@ encoder = "laion/CLIP-ViT-H-14-laion2B-s32B-b79K" folder = os.path.join('repositories', 'ip_instruct') -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/k_diff.py b/scripts/k_diff.py index f5f7caab6..d2f50ff3c 100644 --- a/scripts/k_diff.py +++ b/scripts/k_diff.py @@ -1,9 +1,9 @@ import inspect import gradio as gr -from modules import scripts, processing, shared, sd_models, ui_common +from modules import scripts_manager, processing, shared, sd_models, ui_common -class Script(scripts.Script): +class Script(scripts_manager.Script): supported_models = ['sd', 'sdxl'] orig_pipe = None @@ -65,6 +65,7 @@ class Script(scripts.Script): # params['disable'] = False shared.log.info(f'K-diffusion apply: class={shared.sd_model.__class__.__name__} sampler={sampler} params={params}') p.extra_generation_params["Sampler"] = sampler + return None def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, sampler): # pylint: disable=arguments-differ, unused-argument if self.orig_pipe is None: diff --git a/scripts/kohya_hires_fix.py b/scripts/kohya_hires_fix.py index 090edcaf9..3d7b16c61 100644 --- a/scripts/kohya_hires_fix.py +++ b/scripts/kohya_hires_fix.py @@ -1,9 +1,9 @@ import gradio as gr import diffusers -from modules import scripts, processing, shared, sd_models, devices +from modules import scripts_manager, processing, shared, sd_models, devices -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Kohya HiRes Fix' diff --git a/modules/layerdiffuse/__init__.py b/scripts/layerdiffuse/__init__.py similarity index 94% rename from modules/layerdiffuse/__init__.py rename to scripts/layerdiffuse/__init__.py index 368790c19..c980196c4 100644 --- a/modules/layerdiffuse/__init__.py +++ b/scripts/layerdiffuse/__init__.py @@ -2,9 +2,9 @@ from huggingface_hub import hf_hub_download from safetensors.torch import load_file -from modules.layerdiffuse.layerdiffuse_model import TransparentVAEDecoder -from modules.layerdiffuse.layerdiffuse_loader import load_lora_to_unet, merge_delta_weights_into_unet from modules import shared, errors, devices +from .layerdiffuse_model import TransparentVAEDecoder +from .layerdiffuse_loader import load_lora_to_unet, merge_delta_weights_into_unet def apply_layerdiffuse_sd15(pipeline): diff --git a/modules/layerdiffuse/layerdiffuse_loader.py b/scripts/layerdiffuse/layerdiffuse_loader.py similarity index 99% rename from modules/layerdiffuse/layerdiffuse_loader.py rename to scripts/layerdiffuse/layerdiffuse_loader.py index 577b006fe..4c029f4d5 100644 --- a/modules/layerdiffuse/layerdiffuse_loader.py +++ b/scripts/layerdiffuse/layerdiffuse_loader.py @@ -1,5 +1,5 @@ from safetensors.torch import load_file -from modules.layerdiffuse.layerdiffuse_model import LoraLoader, AttentionSharingProcessor +from scripts.layerdiffuse.layerdiffuse_model import LoraLoader, AttentionSharingProcessor def merge_delta_weights_into_unet(pipe, delta_weights): diff --git a/modules/layerdiffuse/layerdiffuse_model.py b/scripts/layerdiffuse/layerdiffuse_model.py similarity index 100% rename from modules/layerdiffuse/layerdiffuse_model.py rename to scripts/layerdiffuse/layerdiffuse_model.py diff --git a/scripts/layerdiffuse.py b/scripts/layerdiffuse_ext.py similarity index 94% rename from scripts/layerdiffuse.py rename to scripts/layerdiffuse_ext.py index ecf7da1d3..611af5a77 100644 --- a/scripts/layerdiffuse.py +++ b/scripts/layerdiffuse_ext.py @@ -1,8 +1,8 @@ import gradio as gr -from modules import shared, scripts, sd_models +from modules import shared, scripts_manager, sd_models -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'LayerDiffuse: Transparent Image' @@ -11,7 +11,7 @@ class Script(scripts.Script): return True if shared.native else False def apply(self): - from modules import layerdiffuse + from scripts import layerdiffuse if not shared.sd_loaded: shared.log.error('LayerDiffuse: model not loaded') return self.is_active() diff --git a/scripts/ledits.py b/scripts/ledits.py index b75c6ff6f..712840e7c 100644 --- a/scripts/ledits.py +++ b/scripts/ledits.py @@ -1,9 +1,9 @@ import diffusers import gradio as gr -from modules import scripts, processing, shared, devices, sd_models +from modules import scripts_manager, processing, shared, devices, sd_models -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'LEdits: Limitless Image Editing' diff --git a/scripts/legacy_allegrovideo.py b/scripts/legacy_allegrovideo.py index 1403e0765..ac6ee7f2b 100644 --- a/scripts/legacy_allegrovideo.py +++ b/scripts/legacy_allegrovideo.py @@ -2,7 +2,7 @@ import time import gradio as gr import transformers import diffusers -from modules import scripts, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant, timer, sd_hijack_te +from modules import scripts_manager, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant, timer, sd_hijack_te repo_id = 'rhymes-ai/Allegro' @@ -19,7 +19,7 @@ def hijack_decode(*args, **kwargs): return res -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: Allegro (Legacy)' diff --git a/scripts/loopback.py b/scripts/loopback.py index 99111d486..98b4f1e00 100644 --- a/scripts/loopback.py +++ b/scripts/loopback.py @@ -1,13 +1,12 @@ import math import gradio as gr -import modules.scripts as scripts -from modules import images, processing +from modules import images, processing, scripts_manager from modules.processing import Processed from modules.shared import opts, state -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "Loopback" diff --git a/scripts/ltxvideo.py b/scripts/ltxvideo.py index 43ea75595..51a823f3b 100644 --- a/scripts/ltxvideo.py +++ b/scripts/ltxvideo.py @@ -4,7 +4,7 @@ import torch import gradio as gr import diffusers import transformers -from modules import scripts, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant, timer, sd_hijack_te +from modules import scripts_manager, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant, timer, sd_hijack_te repos = { @@ -39,7 +39,7 @@ def hijack_decode(*args, **kwargs): return res -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: LTX Video (Legacy)' diff --git a/scripts/lut.py b/scripts/lut.py index 265abb2de..c32986fe5 100644 --- a/scripts/lut.py +++ b/scripts/lut.py @@ -5,14 +5,14 @@ lib: https://github.com/homm/pillow-lut-tools import os import gradio as gr from installer import install -from modules import scripts, shared, processing +from modules import scripts_manager, shared, processing -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'LUT Color grading' - def show(self, is_img2img): + def show(self, is_img2img): # pylint: disable=unused-argument return shared.native def ui(self, _is_img2img): diff --git a/scripts/mixture_of_diffusers.py b/scripts/mixture_of_diffusers.py index 58598ec66..0cbc60d4e 100644 --- a/scripts/mixture_of_diffusers.py +++ b/scripts/mixture_of_diffusers.py @@ -1,5 +1,5 @@ import gradio as gr -from modules import scripts, processing, shared, sd_models +from modules import scripts_manager, processing, shared, sd_models supported_models = ['sdxl'] @@ -7,7 +7,7 @@ max_xtiles = 4 max_ytiles = 4 -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None @@ -16,7 +16,7 @@ class Script(scripts.Script): def title(self): return 'Mixture-of-Diffusers: Tile Control' - def show(self, is_img2img): + def show(self, is_img2img): # pylint: disable=unused-argument return shared.native def update_ui(self, x_tiles, y_tiles): @@ -85,7 +85,7 @@ class Script(scripts.Script): [x_tiles, y_tiles, x_overlap, y_overlap], prompts = args[:4], args[4:] if max(x_tiles, y_tiles) <= 1: return None - from modules.mod import StableDiffusionXLTilingPipeline + from scripts.mod import StableDiffusionXLTilingPipeline self.orig_pipe = shared.sd_model self.orig_attn = shared.opts.prompt_attention @@ -113,7 +113,7 @@ class Script(scripts.Script): shared.sd_model = sd_models.switch_pipe(StableDiffusionXLTilingPipeline, shared.sd_model) sd_models.set_diffuser_options(shared.sd_model) sd_models.apply_balanced_offload(shared.sd_model) - + return None def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, *args): # pylint: disable=arguments-differ, unused-argument if self.orig_pipe is None: diff --git a/scripts/mixture_tiling.py b/scripts/mixture_tiling.py index 5b5aab9db..5a78c8203 100644 --- a/scripts/mixture_tiling.py +++ b/scripts/mixture_tiling.py @@ -1,6 +1,6 @@ import gradio as gr import torch -from modules import shared, devices, scripts, processing, sd_models +from modules import shared, devices, scripts_manager, processing, sd_models checked_ok = False @@ -24,7 +24,7 @@ def check_dependencies(): return False -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Mixture Tiling: Scene Composition' @@ -47,11 +47,11 @@ class Script(scripts.Script): def run(self, p: processing.StableDiffusionProcessing, x_size, y_size, x_overlap, y_overlap): # pylint: disable=arguments-differ if not checked_ok: if not check_dependencies(): - return + return None prompts = p.prompt.splitlines() if len(prompts) != x_size * y_size: shared.log.error(f'Mixture tiling prompt count mismatch: prompts={len(prompts)} required={x_size * y_size}') - return + return None # backup pipeline and params orig_pipeline = shared.sd_model orig_dtype = devices.dtype @@ -59,12 +59,12 @@ class Script(scripts.Script): # create pipeline if shared.sd_model_type != 'sd': shared.log.error(f'Mixture tiling: incorrect base model: {shared.sd_model.__class__.__name__}') - return + return None shared.sd_model = sd_models.switch_pipe('mixture_tiling', shared.sd_model) if shared.sd_model.__class__.__name__ != 'StableDiffusionTilingPipeline': # switch failed shared.log.error(f'Mixture tiling: not a tiling pipeline: {shared.sd_model.__class__.__name__}') shared.sd_model = orig_pipeline - return + return None sd_models.set_diffuser_options(shared.sd_model) shared.opts.data['prompt_attention'] = 'fixed' # this pipeline is not compatible with embeds shared.sd_model.to(torch.float32) # this pipeline unet is not compatible with fp16 diff --git a/scripts/mochivideo.py b/scripts/mochivideo.py index 1e7ba5541..d5c743ad6 100644 --- a/scripts/mochivideo.py +++ b/scripts/mochivideo.py @@ -2,13 +2,13 @@ import time import torch import gradio as gr import diffusers -from modules import scripts, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant +from modules import scripts_manager, processing, shared, images, devices, sd_models, sd_checkpoint, model_quant repo_id = 'genmo/mochi-1-preview' -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: Mochi.1 Video (Legacy)' diff --git a/modules/mod/__init__.py b/scripts/mod/__init__.py similarity index 100% rename from modules/mod/__init__.py rename to scripts/mod/__init__.py diff --git a/scripts/mulan.py b/scripts/mulan.py index 829ce1463..f177d5d14 100644 --- a/scripts/mulan.py +++ b/scripts/mulan.py @@ -24,7 +24,7 @@ Examples: """ import gradio as gr -from modules import shared, scripts, processing, devices +from modules import shared, scripts_manager, processing, devices ENCODERS =[ @@ -44,7 +44,7 @@ tokenizer = None text_encoder_path = None -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'MuLan: Multi Language Prompts' @@ -61,11 +61,11 @@ class Script(scripts.Script): def run(self, p: processing.StableDiffusionProcessing, selected_encoder): # pylint: disable=arguments-differ global pipe_type, adapter, text_encoder, tokenizer, text_encoder_path # pylint: disable=global-statement if not selected_encoder or selected_encoder == 'None': - return + return None # create pipeline if shared.sd_model_type != 'sd' and shared.sd_model_type != 'sdxl': shared.log.error(f'MuLan: incorrect base model: {shared.sd_model.__class__.__name__}') - return + return None adapter_path = None if shared.sd_model_type == 'sd': @@ -73,7 +73,7 @@ class Script(scripts.Script): if shared.sd_model_type == 'sdxl': adapter_path = 'mulanai/mulan-lang-adapter::sdxl_aesthetic.pth' if adapter_path is None: - return + return None # install-on-demand import installer diff --git a/scripts/outpainting_mk_2.py b/scripts/outpainting_mk_2.py index 7fd56e353..adbdbdb83 100644 --- a/scripts/outpainting_mk_2.py +++ b/scripts/outpainting_mk_2.py @@ -2,8 +2,7 @@ import math import numpy as np import gradio as gr from PIL import Image, ImageDraw -import modules.scripts as scripts -from modules import images +from modules import images, scripts_manager from modules.processing import Processed, process_images from modules.shared import opts, state @@ -100,7 +99,7 @@ def get_matched_noise(_np_src_image, np_mask_rgb, noise_q=1, color_variation=0.0 return np.clip(matched_noise, 0., 1.) -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "Outpainting" diff --git a/modules/pixelsmith/__init__.py b/scripts/pixelsmith/__init__.py similarity index 100% rename from modules/pixelsmith/__init__.py rename to scripts/pixelsmith/__init__.py diff --git a/modules/pixelsmith/autoencoder_kl.py b/scripts/pixelsmith/autoencoder_kl.py similarity index 100% rename from modules/pixelsmith/autoencoder_kl.py rename to scripts/pixelsmith/autoencoder_kl.py diff --git a/modules/pixelsmith/pixelsmith_pipeline.py b/scripts/pixelsmith/pixelsmith_pipeline.py similarity index 100% rename from modules/pixelsmith/pixelsmith_pipeline.py rename to scripts/pixelsmith/pixelsmith_pipeline.py diff --git a/modules/pixelsmith/vae.py b/scripts/pixelsmith/vae.py similarity index 100% rename from modules/pixelsmith/vae.py rename to scripts/pixelsmith/vae.py diff --git a/scripts/pixelsmith.py b/scripts/pixelsmith_ext.py similarity index 95% rename from scripts/pixelsmith.py rename to scripts/pixelsmith_ext.py index a9509081c..b2cd06bdd 100644 --- a/scripts/pixelsmith.py +++ b/scripts/pixelsmith_ext.py @@ -1,9 +1,9 @@ import gradio as gr from PIL import Image -from modules import scripts, processing, shared, sd_models, devices, images +from modules import scripts_manager, processing, shared, sd_models, devices, images -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None @@ -49,7 +49,7 @@ class Script(scripts.Script): supported_model_list = ['sdxl'] if shared.sd_model_type not in supported_model_list: shared.log.warning(f'PixelSmith: class={shared.sd_model.__class__.__name__} model={shared.sd_model_type} required={supported_model_list}') - from modules.pixelsmith import PixelSmithXLPipeline, PixelSmithVAE + from scripts.pixelsmith import PixelSmithXLPipeline, PixelSmithVAE self.orig_pipe = shared.sd_model self.orig_vae = shared.sd_model.vae if self.vae is None: diff --git a/scripts/poor_mans_outpainting.py b/scripts/poor_mans_outpainting.py index 690dd1911..667ec6853 100644 --- a/scripts/poor_mans_outpainting.py +++ b/scripts/poor_mans_outpainting.py @@ -1,13 +1,12 @@ import math import gradio as gr from PIL import Image, ImageDraw -import modules.scripts as scripts -from modules import images, devices +from modules import images, devices, scripts_manager from modules.processing import Processed, process_images from modules.shared import opts, state, log -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "Outpainting alternative" diff --git a/scripts/prompt_enhance.py b/scripts/prompt_enhance.py index 26981f812..077d8959c 100644 --- a/scripts/prompt_enhance.py +++ b/scripts/prompt_enhance.py @@ -8,7 +8,7 @@ import torch import transformers import gradio as gr from PIL import Image -from modules import scripts, shared, devices, errors, processing, sd_models, sd_modules +from modules import scripts_manager, shared, devices, errors, processing, sd_models, sd_modules debug_enabled = os.environ.get('SD_LLM_DEBUG', None) is not None @@ -83,7 +83,7 @@ class Options: thinking_mode: bool = False -class Script(scripts.Script): +class Script(scripts_manager.Script): prompt: gr.Textbox = None image: gr.Image = None model: str = None @@ -96,7 +96,7 @@ class Script(scripts.Script): return 'Prompt enhance' def show(self, _is_img2img): - return scripts.AlwaysVisible + return scripts_manager.AlwaysVisible def load(self, name:str=None, model_repo:str=None, model_gguf:str=None, model_type:str=None, model_file:str=None): name = name or self.options.default @@ -515,4 +515,3 @@ class Script(scripts.Script): ) p.extra_generation_params['LLM'] = llm_model shared.state.end() - diff --git a/scripts/prompt_matrix.py b/scripts/prompt_matrix.py index 37cc2795c..05f007ba0 100644 --- a/scripts/prompt_matrix.py +++ b/scripts/prompt_matrix.py @@ -1,7 +1,6 @@ import math import gradio as gr -import modules.scripts as scripts -from modules import images +from modules import images, scripts_manager from modules.processing import process_images from modules.shared import opts, state, log import modules.sd_samplers @@ -21,7 +20,7 @@ def draw_xy_grid(xs, ys, x_label, y_label, cell): for ix, x in enumerate(xs): state.job = f"{ix + iy * len(xs) + 1} out of {len(xs) * len(ys)}" - processed, t = cell(x, y) + processed, _t = cell(x, y) if first_processed is None: first_processed = processed @@ -37,7 +36,7 @@ def draw_xy_grid(xs, ys, x_label, y_label, cell): return first_processed -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "Prompt matrix" diff --git a/scripts/prompts_from_file.py b/scripts/prompts_from_file.py index eac66b418..6e55a8ebb 100644 --- a/scripts/prompts_from_file.py +++ b/scripts/prompts_from_file.py @@ -2,8 +2,7 @@ import copy import random import shlex import gradio as gr -import modules.scripts as scripts -from modules import sd_samplers, errors +from modules import sd_samplers, errors, scripts_manager from modules.processing import Processed, process_images from modules.shared import state, log @@ -94,7 +93,7 @@ def load_prompt_file(file): return None, "\n".join(lines), gr.update(lines=7) -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "Prompts from file" diff --git a/modules/pulid/__init__.py b/scripts/pulid/__init__.py similarity index 100% rename from modules/pulid/__init__.py rename to scripts/pulid/__init__.py diff --git a/modules/pulid/attention_processor.py b/scripts/pulid/attention_processor.py similarity index 100% rename from modules/pulid/attention_processor.py rename to scripts/pulid/attention_processor.py diff --git a/modules/pulid/encoders_transformer.py b/scripts/pulid/encoders_transformer.py similarity index 100% rename from modules/pulid/encoders_transformer.py rename to scripts/pulid/encoders_transformer.py diff --git a/modules/pulid/eva_clip/__init__.py b/scripts/pulid/eva_clip/__init__.py similarity index 100% rename from modules/pulid/eva_clip/__init__.py rename to scripts/pulid/eva_clip/__init__.py diff --git a/modules/pulid/eva_clip/bpe_simple_vocab_16e6.txt.gz b/scripts/pulid/eva_clip/bpe_simple_vocab_16e6.txt.gz similarity index 100% rename from modules/pulid/eva_clip/bpe_simple_vocab_16e6.txt.gz rename to scripts/pulid/eva_clip/bpe_simple_vocab_16e6.txt.gz diff --git a/modules/pulid/eva_clip/constants.py b/scripts/pulid/eva_clip/constants.py similarity index 100% rename from modules/pulid/eva_clip/constants.py rename to scripts/pulid/eva_clip/constants.py diff --git a/modules/pulid/eva_clip/eva_vit_model.py b/scripts/pulid/eva_clip/eva_vit_model.py similarity index 100% rename from modules/pulid/eva_clip/eva_vit_model.py rename to scripts/pulid/eva_clip/eva_vit_model.py diff --git a/modules/pulid/eva_clip/factory.py b/scripts/pulid/eva_clip/factory.py similarity index 100% rename from modules/pulid/eva_clip/factory.py rename to scripts/pulid/eva_clip/factory.py diff --git a/modules/pulid/eva_clip/hf_configs.py b/scripts/pulid/eva_clip/hf_configs.py similarity index 100% rename from modules/pulid/eva_clip/hf_configs.py rename to scripts/pulid/eva_clip/hf_configs.py diff --git a/modules/pulid/eva_clip/hf_model.py b/scripts/pulid/eva_clip/hf_model.py similarity index 100% rename from modules/pulid/eva_clip/hf_model.py rename to scripts/pulid/eva_clip/hf_model.py diff --git a/modules/pulid/eva_clip/loss.py b/scripts/pulid/eva_clip/loss.py similarity index 100% rename from modules/pulid/eva_clip/loss.py rename to scripts/pulid/eva_clip/loss.py diff --git a/modules/pulid/eva_clip/model.py b/scripts/pulid/eva_clip/model.py similarity index 100% rename from modules/pulid/eva_clip/model.py rename to scripts/pulid/eva_clip/model.py diff --git a/modules/pulid/eva_clip/model_configs/EVA01-CLIP-B-16.json b/scripts/pulid/eva_clip/model_configs/EVA01-CLIP-B-16.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA01-CLIP-B-16.json rename to scripts/pulid/eva_clip/model_configs/EVA01-CLIP-B-16.json diff --git a/modules/pulid/eva_clip/model_configs/EVA01-CLIP-g-14-plus.json b/scripts/pulid/eva_clip/model_configs/EVA01-CLIP-g-14-plus.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA01-CLIP-g-14-plus.json rename to scripts/pulid/eva_clip/model_configs/EVA01-CLIP-g-14-plus.json diff --git a/modules/pulid/eva_clip/model_configs/EVA01-CLIP-g-14.json b/scripts/pulid/eva_clip/model_configs/EVA01-CLIP-g-14.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA01-CLIP-g-14.json rename to scripts/pulid/eva_clip/model_configs/EVA01-CLIP-g-14.json diff --git a/modules/pulid/eva_clip/model_configs/EVA02-CLIP-B-16.json b/scripts/pulid/eva_clip/model_configs/EVA02-CLIP-B-16.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA02-CLIP-B-16.json rename to scripts/pulid/eva_clip/model_configs/EVA02-CLIP-B-16.json diff --git a/modules/pulid/eva_clip/model_configs/EVA02-CLIP-L-14-336.json b/scripts/pulid/eva_clip/model_configs/EVA02-CLIP-L-14-336.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA02-CLIP-L-14-336.json rename to scripts/pulid/eva_clip/model_configs/EVA02-CLIP-L-14-336.json diff --git a/modules/pulid/eva_clip/model_configs/EVA02-CLIP-L-14.json b/scripts/pulid/eva_clip/model_configs/EVA02-CLIP-L-14.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA02-CLIP-L-14.json rename to scripts/pulid/eva_clip/model_configs/EVA02-CLIP-L-14.json diff --git a/modules/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14-plus.json b/scripts/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14-plus.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14-plus.json rename to scripts/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14-plus.json diff --git a/modules/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14.json b/scripts/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14.json similarity index 100% rename from modules/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14.json rename to scripts/pulid/eva_clip/model_configs/EVA02-CLIP-bigE-14.json diff --git a/modules/pulid/eva_clip/modified_resnet.py b/scripts/pulid/eva_clip/modified_resnet.py similarity index 100% rename from modules/pulid/eva_clip/modified_resnet.py rename to scripts/pulid/eva_clip/modified_resnet.py diff --git a/modules/pulid/eva_clip/openai.py b/scripts/pulid/eva_clip/openai.py similarity index 100% rename from modules/pulid/eva_clip/openai.py rename to scripts/pulid/eva_clip/openai.py diff --git a/modules/pulid/eva_clip/pretrained.py b/scripts/pulid/eva_clip/pretrained.py similarity index 100% rename from modules/pulid/eva_clip/pretrained.py rename to scripts/pulid/eva_clip/pretrained.py diff --git a/modules/pulid/eva_clip/rope.py b/scripts/pulid/eva_clip/rope.py similarity index 100% rename from modules/pulid/eva_clip/rope.py rename to scripts/pulid/eva_clip/rope.py diff --git a/modules/pulid/eva_clip/timm_model.py b/scripts/pulid/eva_clip/timm_model.py similarity index 100% rename from modules/pulid/eva_clip/timm_model.py rename to scripts/pulid/eva_clip/timm_model.py diff --git a/modules/pulid/eva_clip/tokenizer.py b/scripts/pulid/eva_clip/tokenizer.py similarity index 100% rename from modules/pulid/eva_clip/tokenizer.py rename to scripts/pulid/eva_clip/tokenizer.py diff --git a/modules/pulid/eva_clip/transform.py b/scripts/pulid/eva_clip/transform.py similarity index 100% rename from modules/pulid/eva_clip/transform.py rename to scripts/pulid/eva_clip/transform.py diff --git a/modules/pulid/eva_clip/transformer.py b/scripts/pulid/eva_clip/transformer.py similarity index 100% rename from modules/pulid/eva_clip/transformer.py rename to scripts/pulid/eva_clip/transformer.py diff --git a/modules/pulid/eva_clip/utils.py b/scripts/pulid/eva_clip/utils.py similarity index 100% rename from modules/pulid/eva_clip/utils.py rename to scripts/pulid/eva_clip/utils.py diff --git a/modules/pulid/pulid_sampling.py b/scripts/pulid/pulid_sampling.py similarity index 100% rename from modules/pulid/pulid_sampling.py rename to scripts/pulid/pulid_sampling.py diff --git a/modules/pulid/pulid_sdxl.py b/scripts/pulid/pulid_sdxl.py similarity index 99% rename from modules/pulid/pulid_sdxl.py rename to scripts/pulid/pulid_sdxl.py index 18bf0eb1c..e964e58fe 100644 --- a/modules/pulid/pulid_sdxl.py +++ b/scripts/pulid/pulid_sdxl.py @@ -123,7 +123,7 @@ class StableDiffusionXLPuLIDPipeline: if sampler is not None: self.sampler = sampler else: - from modules.pulid import sampling + from scripts.pulid import sampling self.sampler = sampling.sample_dpmpp_sde @property diff --git a/modules/pulid/pulid_utils.py b/scripts/pulid/pulid_utils.py similarity index 100% rename from modules/pulid/pulid_utils.py rename to scripts/pulid/pulid_utils.py diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index f000bc43a..5fc186c57 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -4,7 +4,7 @@ import time import contextlib import gradio as gr from PIL import Image -from modules import shared, devices, errors, scripts, processing, processing_helpers, sd_models +from modules import shared, devices, errors, scripts_manager, processing, processing_helpers, sd_models debug = os.environ.get('SD_PULID_DEBUG', None) is not None @@ -13,7 +13,7 @@ registered = False uploaded_images = [] -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): self.pulid = None self.cache = None @@ -144,7 +144,7 @@ class Script(scripts.Script): if self.pulid is None: self.dependencies() try: - from modules import pulid # pylint: disable=redefined-outer-name + from scripts import pulid # pylint: disable=redefined-outer-name self.pulid = pulid from diffusers import pipelines pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["pulid"] = pulid.StableDiffusionXLPuLIDPipeline diff --git a/scripts/regional_prompting.py b/scripts/regional_prompting.py index 5016d6e2f..ba92364ec 100644 --- a/scripts/regional_prompting.py +++ b/scripts/regional_prompting.py @@ -3,7 +3,7 @@ import gradio as gr from diffusers.pipelines import pipeline_utils -from modules import shared, devices, scripts, processing, sd_models, prompt_parser_diffusers +from modules import shared, devices, scripts_manager, processing, sd_models, prompt_parser_diffusers def hijack_register_modules(self, **kwargs): @@ -21,7 +21,7 @@ def hijack_register_modules(self, **kwargs): setattr(self, name, module) -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Regional prompting' @@ -45,7 +45,7 @@ class Script(scripts.Script): def run(self, p: processing.StableDiffusionProcessing, mode, grid, power, threshold): # pylint: disable=arguments-differ if mode is None or mode == 'None': - return + return None # backup pipeline and params orig_pipeline = shared.sd_model orig_dtype = devices.dtype @@ -53,7 +53,7 @@ class Script(scripts.Script): # create pipeline if shared.sd_model_type != 'sd': shared.log.error(f'Regional prompting: incorrect base model: {shared.sd_model.__class__.__name__}') - return + return None pipeline_utils.DiffusionPipeline.register_modules = hijack_register_modules prompt_parser_diffusers.EmbeddingsProvider._encode_token_ids_to_embeddings = prompt_parser_diffusers.orig_encode_token_ids_to_embeddings # pylint: disable=protected-access @@ -62,7 +62,7 @@ class Script(scripts.Script): if shared.sd_model.__class__.__name__ != 'RegionalPromptingStableDiffusionPipeline': # switch failed shared.log.error(f'Regional prompting: not a tiling pipeline: {shared.sd_model.__class__.__name__}') shared.sd_model = orig_pipeline - return + return None sd_models.set_diffuser_options(shared.sd_model) shared.opts.data['prompt_attention'] = 'fixed' # this pipeline is not compatible with embeds processing.fix_seed(p) diff --git a/scripts/resadapter.py b/scripts/resadapter.py index 58162f9ab..45e2900b0 100644 --- a/scripts/resadapter.py +++ b/scripts/resadapter.py @@ -1,7 +1,7 @@ from safetensors.torch import load_file from huggingface_hub import hf_hub_download import gradio as gr -from modules import scripts, processing, shared, sd_models, devices +from modules import scripts_manager, processing, shared, sd_models, devices repo = 'jiaxiangc/res-adapter' @@ -17,7 +17,7 @@ models = { 'SDXL v1 interpolation': 'resadapter_v1_sdxl_interpolation', } -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'ResAdapter: Domain Consistent Resolution' diff --git a/scripts/sd_upscale.py b/scripts/sd_upscale.py index 7ac31b603..3665bcfc5 100644 --- a/scripts/sd_upscale.py +++ b/scripts/sd_upscale.py @@ -1,13 +1,12 @@ import math import gradio as gr from PIL import Image -import modules.scripts as scripts -from modules import processing, shared, images, devices +from modules import processing, shared, images, devices, scripts_manager from modules.processing import Processed from modules.shared import opts, state, log -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return "SD Upscale" diff --git a/scripts/skip_layer_guidance.py b/scripts/skip_layer_guidance.py index 4196db037..e1b2add37 100644 --- a/scripts/skip_layer_guidance.py +++ b/scripts/skip_layer_guidance.py @@ -1,12 +1,12 @@ import sys import gradio as gr -from modules import scripts, processing, shared +from modules import scripts_manager, processing, shared registered = False -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.register() diff --git a/scripts/softfill.py b/scripts/softfill.py index 7b90a845d..821b4386b 100644 --- a/scripts/softfill.py +++ b/scripts/softfill.py @@ -1604,10 +1604,10 @@ class StableDiffusionXLSoftFillPipeline( import gradio as gr from installer import install -from modules import shared, scripts, processing, sd_models +from modules import shared, scripts_manager, processing, sd_models -class Script(scripts.Script): +class Script(scripts_manager.Script): orig_pipeline = None def title(self): diff --git a/scripts/stablevideodiffusion.py b/scripts/stablevideodiffusion.py index 20b302ff6..1d581eba7 100644 --- a/scripts/stablevideodiffusion.py +++ b/scripts/stablevideodiffusion.py @@ -5,7 +5,7 @@ Additional params for StableVideoDiffusion import os import torch import gradio as gr -from modules import scripts, processing, shared, sd_models, images, modelloader +from modules import scripts_manager, processing, shared, sd_models, images, modelloader models = { @@ -14,7 +14,7 @@ models = { "SVD XT 1.1": "stabilityai/stable-video-diffusion-img2vid-xt-1-1", } -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: Stable Video Diffusion' @@ -62,7 +62,7 @@ class Script(scripts.Script): if model_name != model_loaded or c != 'StableVideoDiffusionPipeline': shared.opts.sd_model_checkpoint = model_path sd_models.reload_model_weights() - shared.sd_model = shared.sd_model.to(torch.float32) # TODO svd: runs in fp32 due to dtype mismatch + shared.sd_model = shared.sd_model.to(torch.float32) # must run in fp32 due to dtype mismatch # set params if override_resolution: diff --git a/modules/style_aligned/inversion.py b/scripts/style_aligned/inversion.py similarity index 100% rename from modules/style_aligned/inversion.py rename to scripts/style_aligned/inversion.py diff --git a/modules/style_aligned/sa_handler.py b/scripts/style_aligned/sa_handler.py similarity index 100% rename from modules/style_aligned/sa_handler.py rename to scripts/style_aligned/sa_handler.py diff --git a/scripts/style_aligned.py b/scripts/style_aligned_ext.py similarity index 96% rename from scripts/style_aligned.py rename to scripts/style_aligned_ext.py index 7e236972c..75e586971 100644 --- a/scripts/style_aligned.py +++ b/scripts/style_aligned_ext.py @@ -2,7 +2,7 @@ import gradio as gr import torch import numpy as np import diffusers -from modules import scripts, processing, shared, devices +from modules import scripts_manager, processing, shared, devices handler = None @@ -11,7 +11,7 @@ supported_model_list = ['sdxl'] orig_prompt_attention = None -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Style Aligned Image Generation' @@ -27,9 +27,9 @@ class Script(scripts.Script): def preset(self, preset): if preset == 'text': return [['attention', 'adain_queries', 'adain_keys'], 1.0, 0, 0.0] - if preset == 'image': + elif preset == 'image': return [['group_norm', 'layer_norm', 'attention', 'adain_queries', 'adain_keys'], 1.0, 2, 0.0] - if preset == 'all': + else: return [['group_norm', 'layer_norm', 'attention', 'adain_queries', 'adain_keys', 'adain_values', 'full_attention_share'], 1.0, 1, 0.5] def ui(self, _is_img2img): # ui elements @@ -64,7 +64,7 @@ class Script(scripts.Script): shared.log.warning(f'SA: class={shared.sd_model.__class__.__name__} model={shared.sd_model_type} required={supported_model_list}') return None - from modules.style_aligned import sa_handler, inversion + from scripts.style_aligned import sa_handler, inversion handler = sa_handler.Handler(shared.sd_model) sa_args = sa_handler.StyleAlignedArgs( @@ -108,6 +108,7 @@ class Script(scripts.Script): p.task_args['callback_on_step_end'] = inversion_callback shared.log.info(f'SA: batch={p.batch_size} type={"image" if zts is not None else "text"} config={sa_args.__dict__}') + return None def after(self, p: processing.StableDiffusionProcessing, *args): # pylint: disable=unused-argument global handler # pylint: disable=global-statement diff --git a/scripts/t_gate.py b/scripts/t_gate.py index 3808a796d..7bce40c59 100644 --- a/scripts/t_gate.py +++ b/scripts/t_gate.py @@ -1,9 +1,9 @@ import gradio as gr -from modules import scripts, processing, shared, sd_models, devices +from modules import scripts_manager, processing, shared, sd_models, devices from installer import install -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'T-Gate: Accelerate via Gating Attention' diff --git a/scripts/text2video.py b/scripts/text2video.py index 4a5f71f2e..3a6146280 100644 --- a/scripts/text2video.py +++ b/scripts/text2video.py @@ -7,7 +7,7 @@ TODO text2video items: """ import gradio as gr -from modules import scripts, processing, shared, images, sd_models, modelloader +from modules import scripts_manager, processing, shared, images, sd_models, modelloader MODELS = [ @@ -21,7 +21,7 @@ MODELS = [ ] -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'Video: ModelScope' @@ -55,7 +55,7 @@ class Script(scripts.Script): def run(self, p: processing.StableDiffusionProcessing, model_name, use_default, num_frames, video_type, duration, gif_loop, mp4_pad, mp4_interpolate): # pylint: disable=arguments-differ, unused-argument if model_name == 'None': - return + return None model = [m for m in MODELS if m['name'] == model_name][0] shared.log.debug(f'Text2Video: model={model} defaults={use_default} frames={num_frames}, video={video_type} duration={duration} loop={gif_loop} pad={mp4_pad} interpolate={mp4_interpolate}') @@ -69,7 +69,7 @@ class Script(scripts.Script): sd_models.list_models() if checkpoint is None: shared.log.error(f'Text2Video: failed to find model={model["path"]}') - return + return None shared.log.debug(f'Text2Video loading: model={checkpoint}') shared.opts.sd_model_checkpoint = checkpoint.name sd_models.reload_model_weights(op='model') @@ -84,7 +84,7 @@ class Script(scripts.Script): p.task_args['num_frames'] = num_frames else: shared.log.error('Text2Video: invalid number of frames') - return + return None shared.sd_model = sd_models.set_diffuser_pipe(shared.sd_model, sd_models.DiffusersTaskType.TEXT_2_IMAGE) shared.log.debug(f'Text2Video: args={p.task_args}') diff --git a/scripts/tiling.py b/scripts/tiling.py index 60c234dcf..8c76119d4 100644 --- a/scripts/tiling.py +++ b/scripts/tiling.py @@ -6,7 +6,7 @@ from diffusers.models.lora import LoRACompatibleConv from torch import Tensor from torch.nn import functional as F from torch.nn.modules.utils import _pair -from modules import scripts, processing, shared +from modules import scripts_manager, processing, shared modex = 'constant' @@ -21,7 +21,7 @@ def asymmetricConv2DConvForward(self, input: Tensor, weight: Tensor, bias: Optio return F.conv2d(working, weight, bias, self.stride, _pair(0), self.dilation, self.groups) -class Script(scripts.Script): +class Script(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None @@ -71,7 +71,7 @@ class Script(scripts.Script): cl._orig_conv_forward = cl._conv_forward # pylint: disable=protected-access cl._conv_forward = asymmetricConv2DConvForward.__get__(cl, torch.nn.Conv2d) # pylint: disable=protected-access, no-value-for-parameter shared.log.info(f'Tiling: x={tilex}:{numx} y={tiley}:{numy}') - + return None def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, tilex:bool=False, numx:int=1, tiley:bool=False, numy:int=1): # pylint: disable=arguments-differ, unused-argument if len(self.conv_layers) == 0: diff --git a/modules/xadapter/adapter.py b/scripts/xadapter/adapter.py similarity index 100% rename from modules/xadapter/adapter.py rename to scripts/xadapter/adapter.py diff --git a/modules/xadapter/pipeline_sd_xl_adapter.py b/scripts/xadapter/pipeline_sd_xl_adapter.py similarity index 100% rename from modules/xadapter/pipeline_sd_xl_adapter.py rename to scripts/xadapter/pipeline_sd_xl_adapter.py diff --git a/modules/xadapter/pipeline_sd_xl_adapter_controlnet.py b/scripts/xadapter/pipeline_sd_xl_adapter_controlnet.py similarity index 100% rename from modules/xadapter/pipeline_sd_xl_adapter_controlnet.py rename to scripts/xadapter/pipeline_sd_xl_adapter_controlnet.py diff --git a/modules/xadapter/pipeline_sd_xl_adapter_controlnet_img2img.py b/scripts/xadapter/pipeline_sd_xl_adapter_controlnet_img2img.py similarity index 100% rename from modules/xadapter/pipeline_sd_xl_adapter_controlnet_img2img.py rename to scripts/xadapter/pipeline_sd_xl_adapter_controlnet_img2img.py diff --git a/modules/xadapter/unet_adapter.py b/scripts/xadapter/unet_adapter.py similarity index 100% rename from modules/xadapter/unet_adapter.py rename to scripts/xadapter/unet_adapter.py diff --git a/modules/xadapter/utils.py b/scripts/xadapter/utils.py similarity index 100% rename from modules/xadapter/utils.py rename to scripts/xadapter/utils.py diff --git a/modules/xadapter/xadapter_hijacks.py b/scripts/xadapter/xadapter_hijacks.py similarity index 100% rename from modules/xadapter/xadapter_hijacks.py rename to scripts/xadapter/xadapter_hijacks.py diff --git a/scripts/x_adapter.py b/scripts/xadapter_ext.py similarity index 94% rename from scripts/x_adapter.py rename to scripts/xadapter_ext.py index 08874aac9..fdd5dc470 100644 --- a/scripts/x_adapter.py +++ b/scripts/xadapter_ext.py @@ -4,13 +4,13 @@ import torch import diffusers import gradio as gr import huggingface_hub as hf -from modules import errors, shared, devices, scripts, processing, sd_models, sd_samplers +from modules import errors, shared, devices, scripts_manager, processing, sd_models, sd_samplers adapter = None -class Script(scripts.Script): +class Script(scripts_manager.Script): def title(self): return 'X-Adapter' @@ -35,11 +35,11 @@ class Script(scripts.Script): return model, sampler, width, height, start, scale, lora def run(self, p: processing.StableDiffusionProcessing, model, sampler, width, height, start, scale, lora): # pylint: disable=arguments-differ, unused-argument - from modules.xadapter.xadapter_hijacks import PositionNet + from scripts.xadapter.xadapter_hijacks import PositionNet diffusers.models.embeddings.PositionNet = PositionNet # patch diffusers==0.26 from diffusers==0.20 - from modules.xadapter.adapter import Adapter_XL - from modules.xadapter.pipeline_sd_xl_adapter import StableDiffusionXLAdapterPipeline - from modules.xadapter.unet_adapter import UNet2DConditionModel as UNet2DConditionModelAdapter + from scripts.xadapter.adapter import Adapter_XL + from scripts.xadapter.pipeline_sd_xl_adapter import StableDiffusionXLAdapterPipeline + from scripts.xadapter.unet_adapter import UNet2DConditionModel as UNet2DConditionModelAdapter global adapter # pylint: disable=global-statement if model == 'None': diff --git a/scripts/xyz_grid.py b/scripts/xyz_grid.py index c79ce6909..22938e3d8 100644 --- a/scripts/xyz_grid.py +++ b/scripts/xyz_grid.py @@ -14,7 +14,7 @@ from scripts.xyz_grid_shared import str_permutations, list_to_csv_string, re_ran from scripts.xyz_grid_classes import axis_options, AxisOption, SharedSettingsStackHelper # pylint: disable=no-name-in-module from scripts.xyz_grid_draw import draw_xyz_grid # pylint: disable=no-name-in-module from scripts.xyz_grid_shared import apply_field, apply_task_args, apply_setting, apply_prompt, apply_order, apply_sampler, apply_hr_sampler_name, confirm_samplers, apply_checkpoint, apply_refiner, apply_unet, apply_dict, apply_clip_skip, apply_vae, list_lora, apply_lora, apply_lora_strength, apply_te, apply_styles, apply_upscaler, apply_context, apply_detailer, apply_override, apply_processing, apply_options, apply_seed, format_value_add_label, format_value, format_value_join_list, do_nothing, format_nothing # pylint: disable=no-name-in-module, unused-import -from modules import shared, errors, scripts, images, processing +from modules import shared, errors, scripts_manager, images, processing from modules.ui_components import ToolButton from modules.ui_sections import create_video_inputs import modules.ui_symbols as symbols @@ -23,7 +23,7 @@ import modules.ui_symbols as symbols debug = shared.log.trace if os.environ.get('SD_XYZ_DEBUG', None) is not None else lambda *args, **kwargs: None -class Script(scripts.Script): +class Script(scripts_manager.Script): current_axis_options = [] def title(self): diff --git a/scripts/xyz_grid_classes.py b/scripts/xyz_grid_classes.py index 289059afb..7f7209605 100644 --- a/scripts/xyz_grid_classes.py +++ b/scripts/xyz_grid_classes.py @@ -24,7 +24,7 @@ class AxisOptionTxt2Img(AxisOption): self.is_img2img = False -class SharedSettingsStackHelper(object): +class SharedSettingsStackHelper(): sd_model_checkpoint = None sd_model_refiner = None sd_model_dict = None diff --git a/scripts/xyz_grid_on.py b/scripts/xyz_grid_on.py index 5e070ce8b..c9e2755e2 100644 --- a/scripts/xyz_grid_on.py +++ b/scripts/xyz_grid_on.py @@ -13,7 +13,7 @@ import gradio as gr from scripts.xyz_grid_shared import str_permutations, list_to_csv_string, re_range # pylint: disable=no-name-in-module from scripts.xyz_grid_classes import axis_options, AxisOption, SharedSettingsStackHelper # pylint: disable=no-name-in-module from scripts.xyz_grid_draw import draw_xyz_grid # pylint: disable=no-name-in-module -from modules import shared, errors, scripts, images, processing +from modules import shared, errors, scripts_manager, images, processing from modules.ui_components import ToolButton from modules.ui_sections import create_video_inputs import modules.ui_symbols as symbols @@ -24,11 +24,11 @@ xyz_results_cache = None debug = shared.log.trace if os.environ.get('SD_XYZ_DEBUG', None) is not None else lambda *args, **kwargs: None -class Script(scripts.Script): +class Script(scripts_manager.Script): current_axis_options = [] def show(self, is_img2img): - return scripts.AlwaysVisible + return scripts_manager.AlwaysVisible def title(self): return "XYZ Grid" @@ -178,7 +178,7 @@ class Script(scripts.Script): global active, xyz_results_cache # pylint: disable=W0603 xyz_results_cache = None if not enabled or active: - return + return None active = True if not no_fixed_seeds: processing.fix_seed(p) diff --git a/webui.py b/webui.py index 6dd8e1c40..69f9a1ade 100644 --- a/webui.py +++ b/webui.py @@ -19,7 +19,7 @@ import modules.devices import modules.sd_checkpoint import modules.sd_samplers import modules.lowvram -import modules.scripts +import modules.scripts_manager import modules.sd_models import modules.sd_vae import modules.sd_unet @@ -109,7 +109,7 @@ def initialize(): timer.startup.record("extensions") log.info('Load extensions') - t_timer, t_total = modules.scripts.load_scripts() + t_timer, t_total = modules.scripts_manager.load_scripts() timer.startup.record("extensions") timer.startup.records["extensions"] = t_total # scripts can reset the time log.debug(f'Extensions init time: {t_timer.summary()}') @@ -352,11 +352,11 @@ def start_ui(): modules.script_callbacks.app_started_callback(shared.demo, app) timer.startup.record("app-started") - time_sorted = sorted(modules.scripts.time_setup.items(), key=lambda x: x[1], reverse=True) + time_sorted = sorted(modules.scripts_manager.time_setup.items(), key=lambda x: x[1], reverse=True) time_script = [f'{k}:{round(v,3)}' for (k,v) in time_sorted if v > 0.03] - time_total = sum(modules.scripts.time_setup.values()) + time_total = sum(modules.scripts_manager.time_setup.values()) shared.log.debug(f'Scripts setup: time={time_total:.3f} {time_script}') - time_component = [f'{k}:{round(v,3)}' for (k,v) in modules.scripts.time_component.items() if v > 0.005] + time_component = [f'{k}:{round(v,3)}' for (k,v) in modules.scripts_manager.time_component.items() if v > 0.005] if len(time_component) > 0: shared.log.debug(f'Scripts components: {time_component}') return app @@ -381,10 +381,10 @@ def webui(restart=False): shared.log.debug(f'Registered callbacks: {k}={len(v)} {[c.script for c in v]}') debug = log.trace if os.environ.get('SD_SCRIPT_DEBUG', None) is not None else lambda *args, **kwargs: None debug('Trace: SCRIPTS') - for m in modules.scripts.scripts_data: + for m in modules.scripts_manager.scripts_data: debug(f' {m}') debug('Loaded postprocessing scripts:') - for m in modules.scripts.postprocessing_scripts_data: + for m in modules.scripts_manager.postprocessing_scripts_data: debug(f' {m}') modules.script_callbacks.print_timers() From e3beea1864684e071ca954b3164bc8a60d4e3809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enes=20Sad=C4=B1k=20=C3=96zbek?= <1809172+Trojaner@users.noreply.github.com> Date: Thu, 3 Jul 2025 17:24:21 +0300 Subject: [PATCH 012/186] Fix colliding hashes for direct download diffusers models --- modules/modelloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/modelloader.py b/modules/modelloader.py index 15ecb7dbe..6ef7e275b 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -326,7 +326,7 @@ def load_diffusers_models(clear=True): folder = os.path.join(place, folder) friendly = os.path.join(place, name) if os.path.exists(os.path.join(folder, 'model_index.json')): # direct download of diffusers model - repo = { 'name': name, 'filename': name, 'friendly': friendly, 'folder': folder, 'path': folder, 'hash': '', 'mtime': os.path.getmtime(folder), 'model_info': os.path.join(folder, 'model_info.json'), 'model_index': os.path.join(folder, 'model_index.json') } + repo = { 'name': name, 'filename': name, 'friendly': friendly, 'folder': folder, 'path': folder, 'hash': None, 'mtime': os.path.getmtime(folder), 'model_info': os.path.join(folder, 'model_info.json'), 'model_index': os.path.join(folder, 'model_index.json') } diffuser_repos.append(repo) continue snapshots = os.listdir(os.path.join(folder, "snapshots")) From de5142e64a7fb7edafedc51e7621a571cdd018c5 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 3 Jul 2025 10:33:38 -0400 Subject: [PATCH 013/186] update changelog and todo Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ TODO.md | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb140b412..be248b001 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Add **FLUX.1-Kontext-Dev** inpaint workflow - **UI** - major update to modernui layout + - redesign of the Flat UI theme - **Compute** - support for [SageAttention2++](https://github.com/thu-ml/SageAttention) provides 10-15% performance improvement over default SDPA for transformer-based models! @@ -23,6 +24,7 @@ - patch `insightface` - patch `k-diffusion` - cleanup `/modules`: move pipeline loaders to `/pipelines` root + - cleanup `/modules`: move code folders used by pipelines to `/pipelines/` folder - cleanup `/modules`: move code folders used by scripts to `/scripts/