diff --git a/.eslintrc.json b/.eslintrc.json index 22a9edee5..7ea7b8dae 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -112,6 +112,8 @@ "idbPut": "readonly", "idbDel": "readonly", "idbAdd": "readonly", + // changelog.js + "initChangelog": "readonly", // notification.js "sendNotification": "readonly" }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 71e8a667e..b3f2a9fb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,23 @@ # Change Log for SD.Next -## Update for 2024-10-30 +## Update for 2024-10-31 - XYZ grid: optional per-image time benchmark info - UI: add additional [hotkeys](https://github.com/vladmandic/automatic/wiki/Hotkeys) +- Docs: since [changelog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) is the up-to-date source of info + - go to system -> changelog and search/highligh/navigate directly in UI! - SD3: support for ControlNets: - *InstantX Canny, Pose, Depth, Tile* - *Alimama Inpainting, SoftEdge* - *note*: that just like with FLUX.1 or any large model, ControlNet are also large and can push your system over the limit e.g. SD3 controlnets vary from 1GB to over 4GB in size - SD3: support for all-in-one safetensors - - examples: [large](https://civitai.com/models/882666/sd35-large-google-flan?modelVersionId=1003031) [medium](https://civitai.com/models/900327) + - *examples*: [large](https://civitai.com/models/882666/sd35-large-google-flan?modelVersionId=1003031), [medium](https://civitai.com/models/900327) - *note*: enable bnb on-the-fly quantization for even bigger gains +- CLI: refactor command line params + - run `webui.sh`/`webui.bat` with `--help` to see all options +- Repo: move screenshots to GH pages +- Update requirements ## Update for 2024-10-29 diff --git a/README.md b/README.md index ac96b2e32..a2caa5cb7 100644 --- a/README.md +++ b/README.md @@ -50,12 +50,13 @@ All individual features are not listed here, instead check [ChangeLog](CHANGELOG
*Main interface using **StandardUI***: -![Screenshot-Dark](html/screenshot-text2image.jpg) +![screenshot-text2image](https://github.com/user-attachments/assets/87ac2813-65c2-45f4-80b8-67b26ccf5cd6) *Main interface using **ModernUI***: -![Screenshot-Dark](html/screenshot-modernui-f1.jpg) -![Screenshot-Dark](html/screenshot-modernui.jpg) -![Screenshot-Dark](html/screenshot-modernui-sd3.jpg) + +![screenshot-modernui-f1](https://github.com/user-attachments/assets/b509a280-8d3b-48b5-8525-363bad8c1ed2) +![screenshot-modernui](https://github.com/user-attachments/assets/fef33127-f733-4e78-b66e-17729539512f) +![screenshot-modernui-sd3](https://github.com/user-attachments/assets/1ed02ecc-23e4-4fda-8ae5-2d7393dc530c) For screenshots and informations on other available themes, see [Themes Wiki](https://github.com/vladmandic/automatic/wiki/Themes) @@ -63,12 +64,13 @@ For screenshots and informations on other available themes, see [Themes Wiki](ht ## Model support -Additional models will be added as they become available and there is public interest in them +Additional models will be added as they become available and there is public interest in them +See [models overview](https://github.com/vladmandic/automatic/wiki/Models) for details on each model, including their architecture, complexity and other info - [RunwayML Stable Diffusion](https://github.com/Stability-AI/stablediffusion/) 1.x and 2.x *(all variants)* - [StabilityAI Stable Diffusion XL](https://github.com/Stability-AI/generative-models) -- [StabilityAI Stable Diffusion 3 Medium](https://stability.ai/news/stable-diffusion-3-medium) -- [Stable Diffusion 3.5 Large](https://huggingface.co/stabilityai/stable-diffusion-3.5-large) +- [StabilityAI Stable Diffusion](https://stability.ai/news/stable-diffusion-3-medium) +- [Stable Diffusion 3.x](https://huggingface.co/stabilityai/stable-diffusion-3.5-large) 3.0 Medium, 3.5 Medium, 3.5 Large, 3.5 Large Turbo - [StabilityAI Stable Video Diffusion](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid) Base, XT 1.0, XT 1.1 - [StabilityAI Stable Cascade](https://github.com/Stability-AI/StableCascade) *Full* and *Lite* - [Black Forest Labs FLUX.1](https://blackforestlabs.ai/announcing-black-forest-labs/) Dev, Schnell @@ -136,13 +138,13 @@ Also supported are modifiers such as: ## Examples *IP Adapters*: -![Screenshot-IPAdapter](html/screenshot-ipadapter.jpg) +![screenshot-ipadapter](https://github.com/user-attachments/assets/92830894-845c-49ec-92d9-18c8a577d04f) *Color grading*: -![Screenshot-Color](html/screenshot-color.jpg) +![screenshot-control](https://github.com/user-attachments/assets/cdad2722-ae7c-4c9c-94d6-5ea35a4b1356) *InstantID*: -![Screenshot-InstantID](html/screenshot-instantid.jpg) +![screenshot-instantid](https://github.com/user-attachments/assets/f38a5660-32b3-4235-9da1-c79eccf5372f) > [!IMPORTANT] > - Loading any model other than standard SD 1.x / SD 2.x requires use of backend **Diffusers** @@ -173,92 +175,34 @@ Also supported are modifiers such as: Once SD.Next is installed, simply run `webui.ps1` or `webui.bat` (*Windows*) or `webui.sh` (*Linux or MacOS*) -List of available parameters, run `webui --help` for the full & up-to-date list: +For list of available command line options, run `webui --help` for the full & up-to-date list - Server options: - --config CONFIG Use specific server configuration file, default: config.json - --ui-config UI_CONFIG Use specific UI configuration file, default: ui-config.json - --medvram Split model stages and keep only active part in VRAM, default: False - --lowvram Split model components and keep only active part in VRAM, default: False - --ckpt CKPT Path to model checkpoint to load immediately, default: None - --vae VAE Path to VAE checkpoint to load immediately, default: None - --data-dir DATA_DIR Base path where all user data is stored, default: - --models-dir MODELS_DIR Base path where all models are stored, default: models - --allow-code Allow custom script execution, default: False - --share Enable UI accessible through Gradio site, default: False - --insecure Enable extensions tab regardless of other options, default: False - --use-cpu USE_CPU [USE_CPU ...] Force use CPU for specified modules, default: [] - --listen Launch web server using public IP address, default: False - --port PORT Launch web server with given server port, default: 7860 - --freeze Disable editing settings - --auth AUTH Set access authentication like "user:pwd,user:pwd"" - --auth-file AUTH_FILE Set access authentication using file, default: None - --autolaunch Open the UI URL in the system's default browser upon launch - --docs Mount API docs, default: False - --api-only Run in API only mode without starting UI - --api-log Enable logging of all API requests, default: False - --device-id DEVICE_ID Select the default CUDA device to use, default: None - --cors-origins CORS_ORIGINS Allowed CORS origins as comma-separated list, default: None - --cors-regex CORS_REGEX Allowed CORS origins as regular expression, default: None - --tls-keyfile TLS_KEYFILE Enable TLS and specify key file, default: None - --tls-certfile TLS_CERTFILE Enable TLS and specify cert file, default: None - --tls-selfsign Enable TLS with self-signed certificates, default: False - --server-name SERVER_NAME Sets hostname of server, default: None - --no-hashing Disable hashing of checkpoints, default: False - --no-metadata Disable reading of metadata from models, default: False - --disable-queue Disable queues, default: False - --subpath SUBPATH Customize the URL subpath for usage with reverse proxy - --backend {original,diffusers} force model pipeline type - --allowed-paths ALLOWED_PATHS [ALLOWED_PATHS ...] add additional paths to paths allowed for web access - - Setup options: - --reset Reset main repository to latest version, default: False - --upgrade Upgrade main repository to latest version, default: False - --requirements Force re-check of requirements, default: False - --quick Bypass version checks, default: False - --use-directml Use DirectML if no compatible GPU is detected, default: False - --use-openvino Use Intel OpenVINO backend, default: False - --use-ipex Force use Intel OneAPI XPU backend, default: False - --use-cuda Force use nVidia CUDA backend, default: False - --use-rocm Force use AMD ROCm backend, default: False - --use-zluda Force use ZLUDA, AMD GPUs only, default: False - --use-xformers Force use xFormers cross-optimization, default: False - --skip-requirements Skips checking and installing requirements, default: False - --skip-extensions Skips running individual extension installers, default: False - --skip-git Skips running all GIT operations, default: False - --skip-torch Skips running Torch checks, default: False - --skip-all Skips running all checks, default: False - --skip-env Skips setting of env variables during startup, default: False - --experimental Allow unsupported versions of libraries, default: False - --reinstall Force reinstallation of all requirements, default: False - --test Run test only and exit - --version Print version information - --ignore Ignore any errors and attempt to continue - --safe Run in safe mode with no user extensions - --uv Use uv as installer, default: False - - Logging options: - --log LOG Set log file, default: None - --debug Run installer with debug logging, default: False - --profile Run profiler, default: False +> [!TIP] +> All command line options can also be set via env variable +> For example `--debug` is same as `set SD_DEBUG=true` ## Notes > [!TIP] > If you don't want to use built-in `venv` support and prefer to run SD.Next in your own environment such as *Docker* container, *Conda* environment or any other virtual environment, you can skip `venv` create/activate and launch SD.Next directly using `python launch.py` (command line flags noted above still apply). +### Quantization + +**SD.Next** comes with broad quantization support, including support for BitsAndBytes, Optimum.Quanto, TorchAO, NNCF and GGUF +See [Quantization Wiki](https://github.com/vladmandic/automatic/wiki/Quantization) + ### Control **SD.Next** comes with built-in control for all types of text2image, image2image, video2video and batch processing *Control interface*: -![Screenshot-Control](html/screenshot-control.jpg) +![screenshot-control](https://github.com/user-attachments/assets/cdad2722-ae7c-4c9c-94d6-5ea35a4b1356) *Control processors*: -![Screenshot-Process](html/screenshot-processors.jpg) +![screenshot-processors](https://github.com/user-attachments/assets/7bccb82b-366e-4bdb-ae57-cc53fac95d3c) *Masking*: -![Screenshot-Mask](html/screenshot-mask.jpg) +![screenshot-mask](https://github.com/user-attachments/assets/4b057e65-64f0-44ea-93b4-c3b69bc55532) ### Extensions diff --git a/html/card-no-preview.png b/html/card-no-preview.png index 352b0a9df..6b89aad1a 100644 Binary files a/html/card-no-preview.png and b/html/card-no-preview.png differ diff --git a/html/screenshot-color.jpg b/html/screenshot-color.jpg deleted file mode 100644 index 2cd070a3a..000000000 Binary files a/html/screenshot-color.jpg and /dev/null differ diff --git a/html/screenshot-control.jpg b/html/screenshot-control.jpg deleted file mode 100644 index ffc71cdbe..000000000 Binary files a/html/screenshot-control.jpg and /dev/null differ diff --git a/html/screenshot-corrections.jpg b/html/screenshot-corrections.jpg deleted file mode 100644 index e202fa746..000000000 Binary files a/html/screenshot-corrections.jpg and /dev/null differ diff --git a/html/screenshot-differential.jpg b/html/screenshot-differential.jpg deleted file mode 100644 index c0bb1e78d..000000000 Binary files a/html/screenshot-differential.jpg and /dev/null differ diff --git a/html/screenshot-instantid.jpg b/html/screenshot-instantid.jpg deleted file mode 100644 index 5f780a3c0..000000000 Binary files a/html/screenshot-instantid.jpg and /dev/null differ diff --git a/html/screenshot-ipadapter-mask.jpg b/html/screenshot-ipadapter-mask.jpg deleted file mode 100644 index 3dd36a2af..000000000 Binary files a/html/screenshot-ipadapter-mask.jpg and /dev/null differ diff --git a/html/screenshot-ipadapter.jpg b/html/screenshot-ipadapter.jpg deleted file mode 100644 index b1d5c80b6..000000000 Binary files a/html/screenshot-ipadapter.jpg and /dev/null differ diff --git a/html/screenshot-ipadapter02.jpg b/html/screenshot-ipadapter02.jpg deleted file mode 100644 index d0e59a2ec..000000000 Binary files a/html/screenshot-ipadapter02.jpg and /dev/null differ diff --git a/html/screenshot-ledit.jpg b/html/screenshot-ledit.jpg deleted file mode 100644 index f43189d81..000000000 Binary files a/html/screenshot-ledit.jpg and /dev/null differ diff --git a/html/screenshot-mask.jpg b/html/screenshot-mask.jpg deleted file mode 100644 index c286803f2..000000000 Binary files a/html/screenshot-mask.jpg and /dev/null differ diff --git a/html/screenshot-modernui-control.jpg b/html/screenshot-modernui-control.jpg deleted file mode 100644 index 20a22a88a..000000000 Binary files a/html/screenshot-modernui-control.jpg and /dev/null differ diff --git a/html/screenshot-modernui-f1.jpg b/html/screenshot-modernui-f1.jpg deleted file mode 100644 index 3e7b27ce1..000000000 Binary files a/html/screenshot-modernui-f1.jpg and /dev/null differ diff --git a/html/screenshot-modernui-img2img.jpg b/html/screenshot-modernui-img2img.jpg deleted file mode 100644 index 22afd166d..000000000 Binary files a/html/screenshot-modernui-img2img.jpg and /dev/null differ diff --git a/html/screenshot-modernui-sd3.jpg b/html/screenshot-modernui-sd3.jpg deleted file mode 100644 index 81d0eb459..000000000 Binary files a/html/screenshot-modernui-sd3.jpg and /dev/null differ diff --git a/html/screenshot-modernui.jpg b/html/screenshot-modernui.jpg deleted file mode 100644 index dafadc28f..000000000 Binary files a/html/screenshot-modernui.jpg and /dev/null differ diff --git a/html/screenshot-outpaint.jpg b/html/screenshot-outpaint.jpg deleted file mode 100644 index 485c67c52..000000000 Binary files a/html/screenshot-outpaint.jpg and /dev/null differ diff --git a/html/screenshot-processors.jpg b/html/screenshot-processors.jpg deleted file mode 100644 index 8d3207fa2..000000000 Binary files a/html/screenshot-processors.jpg and /dev/null differ diff --git a/html/screenshot-regional.jpg b/html/screenshot-regional.jpg deleted file mode 100644 index 335297b37..000000000 Binary files a/html/screenshot-regional.jpg and /dev/null differ diff --git a/html/screenshot-text2image.jpg b/html/screenshot-text2image.jpg deleted file mode 100644 index f5b48dc3a..000000000 Binary files a/html/screenshot-text2image.jpg and /dev/null differ diff --git a/installer.py b/installer.py index a17efa83a..492961439 100644 --- a/installer.py +++ b/installer.py @@ -552,7 +552,7 @@ def install_rocm_zluda(): from modules import zluda_installer zluda_installer.set_default_agent(device) try: - if args.reinstall_zluda: + if args.reinstall: zluda_installer.uninstall() zluda_path = zluda_installer.get_path() zluda_installer.install(zluda_path) @@ -1234,39 +1234,44 @@ def check_timestamp(): def add_args(parser): - group = parser.add_argument_group('Setup options') - group.add_argument('--reset', default = os.environ.get("SD_RESET",False), action='store_true', help = "Reset main repository to latest version, default: %(default)s") - group.add_argument('--upgrade', '--update', default = os.environ.get("SD_UPGRADE",False), action='store_true', help = "Upgrade main repository to latest version, default: %(default)s") - group.add_argument('--requirements', default = os.environ.get("SD_REQUIREMENTS",False), action='store_true', help = "Force re-check of requirements, default: %(default)s") - group.add_argument('--quick', default = os.environ.get("SD_QUICK",False), action='store_true', help = "Bypass version checks, default: %(default)s") - group.add_argument('--use-directml', default = os.environ.get("SD_USEDIRECTML",False), action='store_true', help = "Use DirectML if no compatible GPU is detected, default: %(default)s") - group.add_argument("--use-openvino", default = os.environ.get("SD_USEOPENVINO",False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s") - group.add_argument("--use-ipex", default = os.environ.get("SD_USEIPEX",False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s") - group.add_argument("--use-cuda", default = os.environ.get("SD_USECUDA",False), action='store_true', help="Force use nVidia CUDA backend, default: %(default)s") - group.add_argument("--use-rocm", default = os.environ.get("SD_USEROCM",False), action='store_true', help="Force use AMD ROCm backend, default: %(default)s") - group.add_argument('--use-zluda', default=os.environ.get("SD_USEZLUDA", False), action='store_true', help = "Force use ZLUDA, AMD GPUs only, default: %(default)s") - group.add_argument("--use-xformers", default = os.environ.get("SD_USEXFORMERS",False), action='store_true', help="Force use xFormers cross-optimization, default: %(default)s") - group.add_argument('--skip-requirements', default = os.environ.get("SD_SKIPREQUIREMENTS",False), action='store_true', help = "Skips checking and installing requirements, default: %(default)s") - group.add_argument('--skip-extensions', default = os.environ.get("SD_SKIPEXTENSION",False), action='store_true', help = "Skips running individual extension installers, default: %(default)s") - group.add_argument('--skip-git', default = os.environ.get("SD_SKIPGIT",False), action='store_true', help = "Skips running all GIT operations, default: %(default)s") - group.add_argument('--skip-torch', default = os.environ.get("SD_SKIPTORCH",False), action='store_true', help = "Skips running Torch checks, default: %(default)s") - group.add_argument('--skip-all', default = os.environ.get("SD_SKIPALL",False), action='store_true', help = "Skips running all checks, default: %(default)s") - group.add_argument('--skip-env', default = os.environ.get("SD_SKIPENV",False), action='store_true', help = "Skips setting of env variables during startup, default: %(default)s") - group.add_argument('--experimental', default = os.environ.get("SD_EXPERIMENTAL",False), action='store_true', help = "Allow unsupported versions of libraries, default: %(default)s") - group.add_argument('--reinstall', default = os.environ.get("SD_REINSTALL",False), action='store_true', help = "Force reinstallation of all requirements, default: %(default)s") - group.add_argument('--reinstall-zluda', default = os.environ.get("SD_REINSTALL_ZLUDA",False), action='store_true', help = "Force reinstallation of ZLUDA, default: %(default)s") - group.add_argument('--test', default = os.environ.get("SD_TEST",False), action='store_true', help = "Run test only and exit") - group.add_argument('--version', default = False, action='store_true', help = "Print version information") - group.add_argument('--ignore', default = os.environ.get("SD_IGNORE",False), action='store_true', help = "Ignore any errors and attempt to continue") - group.add_argument('--safe', default = os.environ.get("SD_SAFE",False), action='store_true', help = "Run in safe mode with no user extensions") - group.add_argument('--uv', default = os.environ.get("SD_UV",False), action='store_true', help = "Use uv instead of pip to install the packages") + group_setup = parser.add_argument_group('Setup') + group_setup.add_argument('--reset', default = os.environ.get("SD_RESET",False), action='store_true', help = "Reset main repository to latest version, default: %(default)s") + group_setup.add_argument('--upgrade', '--update', default = os.environ.get("SD_UPGRADE",False), action='store_true', help = "Upgrade main repository to latest version, default: %(default)s") + group_setup.add_argument('--requirements', default = os.environ.get("SD_REQUIREMENTS",False), action='store_true', help = "Force re-check of requirements, default: %(default)s") + group_setup.add_argument('--reinstall', default = os.environ.get("SD_REINSTALL",False), action='store_true', help = "Force reinstallation of all requirements, default: %(default)s") + group_setup.add_argument('--uv', default = os.environ.get("SD_UV",False), action='store_true', help = "Use uv instead of pip to install the packages") - group = parser.add_argument_group('Logging options') - group.add_argument("--log", type=str, default=os.environ.get("SD_LOG", None), help="Set log file, default: %(default)s") - group.add_argument('--debug', default = os.environ.get("SD_DEBUG",False), action='store_true', help = "Run installer with debug logging, default: %(default)s") - group.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s") - group.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") - group.add_argument("--api-log", default=os.environ.get("SD_APILOG", False), action='store_true', help="Enable logging of all API requests, default: %(default)s") + group_startup = parser.add_argument_group('Startup') + group_startup.add_argument('--quick', default = os.environ.get("SD_QUICK",False), action='store_true', help = "Bypass version checks, default: %(default)s") + group_startup.add_argument('--skip-requirements', default = os.environ.get("SD_SKIPREQUIREMENTS",False), action='store_true', help = "Skips checking and installing requirements, default: %(default)s") + group_startup.add_argument('--skip-extensions', default = os.environ.get("SD_SKIPEXTENSION",False), action='store_true', help = "Skips running individual extension installers, default: %(default)s") + group_startup.add_argument('--skip-git', default = os.environ.get("SD_SKIPGIT",False), action='store_true', help = "Skips running all GIT operations, default: %(default)s") + group_startup.add_argument('--skip-torch', default = os.environ.get("SD_SKIPTORCH",False), action='store_true', help = "Skips running Torch checks, default: %(default)s") + group_startup.add_argument('--skip-all', default = os.environ.get("SD_SKIPALL",False), action='store_true', help = "Skips running all checks, default: %(default)s") + group_startup.add_argument('--skip-env', default = os.environ.get("SD_SKIPENV",False), action='store_true', help = "Skips setting of env variables during startup, default: %(default)s") + + group_compute = parser.add_argument_group('Compute Engine') + group_compute.add_argument('--use-directml', default = os.environ.get("SD_USEDIRECTML",False), action='store_true', help = "Use DirectML if no compatible GPU is detected, default: %(default)s") + group_compute.add_argument("--use-openvino", default = os.environ.get("SD_USEOPENVINO",False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s") + group_compute.add_argument("--use-ipex", default = os.environ.get("SD_USEIPEX",False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s") + group_compute.add_argument("--use-cuda", default = os.environ.get("SD_USECUDA",False), action='store_true', help="Force use nVidia CUDA backend, default: %(default)s") + group_compute.add_argument("--use-rocm", default = os.environ.get("SD_USEROCM",False), action='store_true', help="Force use AMD ROCm backend, default: %(default)s") + group_compute.add_argument('--use-zluda', default=os.environ.get("SD_USEZLUDA", False), action='store_true', help = "Force use ZLUDA, AMD GPUs only, default: %(default)s") + group_compute.add_argument("--use-xformers", default = os.environ.get("SD_USEXFORMERS",False), action='store_true', help="Force use xFormers cross-optimization, default: %(default)s") + + group_diag = parser.add_argument_group('Diagnostics') + group_diag.add_argument('--safe', default = os.environ.get("SD_SAFE",False), action='store_true', help = "Run in safe mode with no user extensions") + group_diag.add_argument('--experimental', default = os.environ.get("SD_EXPERIMENTAL",False), action='store_true', help = "Allow unsupported versions of libraries, default: %(default)s") + group_diag.add_argument('--test', default = os.environ.get("SD_TEST",False), action='store_true', help = "Run test only and exit") + group_diag.add_argument('--version', default = False, action='store_true', help = "Print version information") + group_diag.add_argument('--ignore', default = os.environ.get("SD_IGNORE",False), action='store_true', help = "Ignore any errors and attempt to continue") + + group_log = parser.add_argument_group('Logging') + group_log.add_argument("--log", type=str, default=os.environ.get("SD_LOG", None), help="Set log file, default: %(default)s") + group_log.add_argument('--debug', default = os.environ.get("SD_DEBUG",False), action='store_true', help = "Run installer with debug logging, default: %(default)s") + group_log.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s") + group_log.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") + group_log.add_argument("--api-log", default=os.environ.get("SD_APILOG", False), action='store_true', help="Enable logging of all API requests, default: %(default)s") def parse_args(parser): diff --git a/javascript/changelog.js b/javascript/changelog.js new file mode 100644 index 000000000..410ec8cfb --- /dev/null +++ b/javascript/changelog.js @@ -0,0 +1,73 @@ +let changelogElements = []; + +const getAllChildren = (el) => { + const elements = []; + for (let i = 0; i < el.children.length; i++) { + elements.push(el.children[i]); + if (el.children[i].children.length) elements.push(...getAllChildren(el.children[i])); + } + return elements; +}; + +function getText(el) { + let text = ''; + el.childNodes.forEach((node) => { + if (node.nodeType === Node.TEXT_NODE) text += node.nodeValue; + }); + return text.trim(); +} + +let currentElement = -1; + +function changelogNavigate(found) { + const result = gradioApp().getElementById('changelog_result'); + result.innerHTML = ''; + + const onPrev = () => { + if (currentElement > 0) { + currentElement--; + found[currentElement].scrollIntoView(); + } + }; + const onNext = () => { + if (currentElement < found.length - 1) { + currentElement++; + found[currentElement].scrollIntoView(); + } + }; + + const prev = document.createElement('p'); + prev.innerHTML = ' ⇦ '; + prev.className = 'changelog_arrow'; + prev.onclick = onPrev; + result.appendChild(prev); + + const next = document.createElement('p'); + next.innerHTML = ' ⇨ '; + next.className = 'changelog_arrow'; + next.onclick = onNext; + result.appendChild(next); + + const text = document.createElement('p'); + text.innerHTML = `   found ${found.length} items`; + result.appendChild(text); +} + +async function initChangelog() { + const search = gradioApp().querySelector('#changelog_search > label> textarea'); + const md = gradioApp().getElementById('changelog_markdown'); + const searchChangelog = async (e) => { + if (changelogElements.length < 100) changelogElements = getAllChildren(md); + const found = []; + for (const el of changelogElements) { + if (getText(el).toLowerCase().includes(search.value.toLowerCase())) { + el.classList.add('changelog_highlight'); + found.push(el); + } else { + el.classList.remove('changelog_highlight'); + } + } + changelogNavigate(found); + }; + search.addEventListener('keyup', searchChangelog); +} diff --git a/javascript/sdnext.css b/javascript/sdnext.css index cbd3cac83..c0192235c 100644 --- a/javascript/sdnext.css +++ b/javascript/sdnext.css @@ -319,6 +319,12 @@ div:has(>#tab-gallery-folders) { flex-grow: 0 !important; background-color: var( .gallery-sort { background: var(--input-background-fill) !important; margin: 0 !important; padding: 6px !important; } .gallery-sort:hover { background: var(--button-primary-background-fill-hover) !important; } +/* changelog */ +#changelog_markdown { max-height: 55vh; margin-top: 1em; } +#changelog_result { display: flex; cursor: pointer; margin-left: 1em; } +.changelog_arrow { font-size: 2em; margin-right: 0.5em; } +.changelog_highlight { background-color: var(--color-warning); } + /* loader */ .splash { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 1000; display: block; text-align: center; } .motd { margin-top: 2em; color: var(--body-text-color-subdued); font-family: monospace; font-variant: all-petite-caps; } diff --git a/javascript/startup.js b/javascript/startup.js index 81bfa1a61..637a8d15e 100644 --- a/javascript/startup.js +++ b/javascript/startup.js @@ -16,6 +16,7 @@ async function initStartup() { initImageViewer(); initGallery(); initiGenerationParams(); + initChangelog(); setupControlUI(); // reconnect server session diff --git a/modules/cmd_args.py b/modules/cmd_args.py index afbe239fe..752ad02c0 100644 --- a/modules/cmd_args.py +++ b/modules/cmd_args.py @@ -2,104 +2,134 @@ import os import argparse from modules.paths import data_path + parser = argparse.ArgumentParser(description="SD.Next", conflict_handler='resolve', epilog='For other options see UI Settings page', prog='', add_help=True, formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=55, indent_increment=2, width=200)) parser._optionals = parser.add_argument_group('Other options') # pylint: disable=protected-access -group = parser.add_argument_group('Server options') - -# main server args -group.add_argument("--config", type=str, default=os.environ.get("SD_CONFIG", os.path.join(data_path, 'config.json')), help="Use specific server configuration file, default: %(default)s") -group.add_argument("--ui-config", type=str, default=os.environ.get("SD_UICONFIG", os.path.join(data_path, 'ui-config.json')), help="Use specific UI configuration file, default: %(default)s") -group.add_argument("--medvram", default=os.environ.get("SD_MEDVRAM", False), action='store_true', help="Split model stages and keep only active part in VRAM, default: %(default)s") -group.add_argument("--lowvram", default=os.environ.get("SD_LOWVRAM", False), action='store_true', help="Split model components and keep only active part in VRAM, default: %(default)s") -group.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s") -group.add_argument('--vae', type=str, default=os.environ.get("SD_VAE", None), help='Path to VAE checkpoint to load immediately, default: %(default)s') -group.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s") -group.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", 'models'), help="Base path where all models are stored, default: %(default)s",) -group.add_argument("--allow-code", default=os.environ.get("SD_ALLOWCODE", False), action='store_true', help="Allow custom script execution, default: %(default)s") -group.add_argument("--share", default=os.environ.get("SD_SHARE", False), action='store_true', help="Enable UI accessible through Gradio site, default: %(default)s") -group.add_argument("--insecure", default=os.environ.get("SD_INSECURE", False), action='store_true', help="Enable extensions tab regardless of other options, default: %(default)s") -group.add_argument("--use-cpu", nargs='+', default=[], type=str.lower, help="Force use CPU for specified modules, default: %(default)s") -group.add_argument("--listen", default=os.environ.get("SD_LISTEN", False), action='store_true', help="Launch web server using public IP address, default: %(default)s") -group.add_argument("--port", type=int, default=os.environ.get("SD_PORT", 7860), help="Launch web server with given server port, default: %(default)s") -group.add_argument("--freeze", default=os.environ.get("SD_FREEZE", False), action='store_true', help="Disable editing settings") -group.add_argument("--auth", type=str, default=os.environ.get("SD_AUTH", None), help='Set access authentication like "user:pwd,user:pwd""') -group.add_argument("--auth-file", type=str, default=os.environ.get("SD_AUTHFILE", None), help='Set access authentication using file, default: %(default)s') -group.add_argument("--autolaunch", default=os.environ.get("SD_AUTOLAUNCH", False), action='store_true', help="Open the UI URL in the system's default browser upon launch") -group.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") -group.add_argument('--api-only', default=os.environ.get("SD_APIONLY", False), action='store_true', help = "Run in API only mode without starting UI") -group.add_argument("--device-id", type=str, default=os.environ.get("SD_DEVICEID", None), help="Select the default CUDA device to use, default: %(default)s") -group.add_argument("--cors-origins", type=str, default=os.environ.get("SD_CORSORIGINS", None), help="Allowed CORS origins as comma-separated list, default: %(default)s") -group.add_argument("--cors-regex", type=str, default=os.environ.get("SD_CORSREGEX", None), help="Allowed CORS origins as regular expression, default: %(default)s") -group.add_argument("--tls-keyfile", type=str, default=os.environ.get("SD_TLSKEYFILE", None), help="Enable TLS and specify key file, default: %(default)s") -group.add_argument("--tls-certfile", type=str, default=os.environ.get("SD_TLSCERTFILE", None), help="Enable TLS and specify cert file, default: %(default)s") -group.add_argument("--tls-selfsign", action="store_true", default=os.environ.get("SD_TLSSELFSIGN", False), help="Enable TLS with self-signed certificates, default: %(default)s") -group.add_argument("--server-name", type=str, default=os.environ.get("SD_SERVERNAME", None), help="Sets hostname of server, default: %(default)s") -group.add_argument("--no-hashing", default=os.environ.get("SD_NOHASHING", False), action='store_true', help="Disable hashing of checkpoints, default: %(default)s") -group.add_argument("--no-metadata", default=os.environ.get("SD_NOMETADATA", False), action='store_true', help="Disable reading of metadata from models, default: %(default)s") -group.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s") -group.add_argument("--disable-queue", default=os.environ.get("SD_DISABLEQUEUE", False), action='store_true', help="Disable queues, default: %(default)s") -group.add_argument('--debug', default=os.environ.get("SD_DEBUG", False), action='store_true', help = "Run installer with debug logging, default: %(default)s") -group.add_argument('--use-directml', default=os.environ.get("SD_USEDIRECTML", False), action='store_true', help = "Use DirectML if no compatible GPU is detected, default: %(default)s") -group.add_argument('--use-zluda', default=os.environ.get("SD_USEZLUDA", False), action='store_true', help = "Force use ZLUDA, AMD GPUs only, default: %(default)s") -group.add_argument("--use-openvino", default=os.environ.get("SD_USEOPENVINO", False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s") -group.add_argument("--use-ipex", default=os.environ.get("SD_USEIPX", False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s") -group.add_argument("--use-cuda", default=os.environ.get("SD_USECUDA", False), action='store_true', help="Force use nVidia CUDA backend, default: %(default)s") -group.add_argument("--use-rocm", default=os.environ.get("SD_USEROCM", False), action='store_true', help="Force use AMD ROCm backend, default: %(default)s") -group.add_argument('--subpath', type=str, default=os.environ.get("SD_SUBPATH", None), help='Customize the URL subpath for usage with reverse proxy') -group.add_argument('--backend', type=str, default=os.environ.get("SD_BACKEND", None), choices=['original', 'diffusers'], required=False, help='force model pipeline type') -group.add_argument('--theme', type=str, default=os.environ.get("SD_THEME", None), help='Override UI theme') -# removed args are added here as hidden in fixed format for compatbility reasons -group.add_argument("-f", action='store_true', help=argparse.SUPPRESS) # allows running as root; implemented outside of webui -group.add_argument("--ui-settings-file", type=str, help=argparse.SUPPRESS, default=os.path.join(data_path, 'config.json')) -group.add_argument("--ui-config-file", type=str, help=argparse.SUPPRESS, default=os.path.join(data_path, 'ui-config.json')) -group.add_argument("--hide-ui-dir-config", action='store_true', help=argparse.SUPPRESS, default=False) -group.add_argument("--theme", type=str, help=argparse.SUPPRESS, default=None) -group.add_argument("--disable-console-progressbars", action='store_true', help=argparse.SUPPRESS, default=True) -group.add_argument("--disable-safe-unpickle", action='store_true', help=argparse.SUPPRESS, default=True) -group.add_argument("--lowram", action='store_true', help=argparse.SUPPRESS) -group.add_argument("--disable-extension-access", default=False, action='store_true', help=argparse.SUPPRESS) -group.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access") -group.add_argument("--api", help=argparse.SUPPRESS, default=True) -group.add_argument("--api-auth", type=str, help=argparse.SUPPRESS, default=None) +def main_args(): + # main server args + group_config = parser.add_argument_group('Configuration') + group_config.add_argument('--backend', type=str, default=os.environ.get("SD_BACKEND", None), choices=['original', 'diffusers'], required=False, help='force model pipeline type') + group_config.add_argument("--config", type=str, default=os.environ.get("SD_CONFIG", os.path.join(data_path, 'config.json')), help="Use specific server configuration file, default: %(default)s") + group_config.add_argument("--ui-config", type=str, default=os.environ.get("SD_UICONFIG", os.path.join(data_path, 'ui-config.json')), help="Use specific UI configuration file, default: %(default)s") + group_config.add_argument("--medvram", default=os.environ.get("SD_MEDVRAM", False), action='store_true', help="Split model stages and keep only active part in VRAM, default: %(default)s") + group_config.add_argument("--lowvram", default=os.environ.get("SD_LOWVRAM", False), action='store_true', help="Split model components and keep only active part in VRAM, default: %(default)s") + group_config.add_argument("--freeze", default=os.environ.get("SD_FREEZE", False), action='store_true', help="Disable editing settings") + + group_paths = parser.add_argument_group('Paths') + group_paths.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s") + group_paths.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s") + group_paths.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", 'models'), help="Base path where all models are stored, default: %(default)s",) + + group_diag = parser.add_argument_group('Diagnostics') + group_diag.add_argument("--no-hashing", default=os.environ.get("SD_NOHASHING", False), action='store_true', help="Disable hashing of checkpoints, default: %(default)s") + group_diag.add_argument("--no-metadata", default=os.environ.get("SD_NOMETADATA", False), action='store_true', help="Disable reading of metadata from models, default: %(default)s") + group_diag.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s") + group_diag.add_argument("--disable-queue", default=os.environ.get("SD_DISABLEQUEUE", False), action='store_true', help="Disable queues, default: %(default)s") + group_diag.add_argument('--debug', default=os.environ.get("SD_DEBUG", False), action='store_true', help = "Run installer with debug logging, default: %(default)s") + + group_compute = parser.add_argument_group('Compute Engine') + group_compute.add_argument('--use-directml', default=os.environ.get("SD_USEDIRECTML", False), action='store_true', help = "Use DirectML if no compatible GPU is detected, default: %(default)s") + group_compute.add_argument('--use-zluda', default=os.environ.get("SD_USEZLUDA", False), action='store_true', help = "Force use ZLUDA, AMD GPUs only, default: %(default)s") + group_compute.add_argument("--use-openvino", default=os.environ.get("SD_USEOPENVINO", False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s") + group_compute.add_argument("--use-ipex", default=os.environ.get("SD_USEIPX", False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s") + group_compute.add_argument("--use-cuda", default=os.environ.get("SD_USECUDA", False), action='store_true', help="Force use nVidia CUDA backend, default: %(default)s") + group_compute.add_argument("--use-rocm", default=os.environ.get("SD_USEROCM", False), action='store_true', help="Force use AMD ROCm backend, default: %(default)s") + group_diag.add_argument("--device-id", type=str, default=os.environ.get("SD_DEVICEID", None), help="Select the default CUDA device to use, default: %(default)s") + + group_http = parser.add_argument_group('HTTP') + group_http.add_argument('--theme', type=str, default=os.environ.get("SD_THEME", None), help='Override UI theme') + group_http.add_argument("--server-name", type=str, default=os.environ.get("SD_SERVERNAME", None), help="Sets hostname of server, default: %(default)s") + group_http.add_argument("--tls-keyfile", type=str, default=os.environ.get("SD_TLSKEYFILE", None), help="Enable TLS and specify key file, default: %(default)s") + group_http.add_argument("--tls-certfile", type=str, default=os.environ.get("SD_TLSCERTFILE", None), help="Enable TLS and specify cert file, default: %(default)s") + group_http.add_argument("--tls-selfsign", action="store_true", default=os.environ.get("SD_TLSSELFSIGN", False), help="Enable TLS with self-signed certificates, default: %(default)s") + group_http.add_argument("--cors-origins", type=str, default=os.environ.get("SD_CORSORIGINS", None), help="Allowed CORS origins as comma-separated list, default: %(default)s") + group_http.add_argument("--cors-regex", type=str, default=os.environ.get("SD_CORSREGEX", None), help="Allowed CORS origins as regular expression, default: %(default)s") + group_http.add_argument('--subpath', type=str, default=os.environ.get("SD_SUBPATH", None), help='Customize the URL subpath for usage with reverse proxy') + group_http.add_argument("--autolaunch", default=os.environ.get("SD_AUTOLAUNCH", False), action='store_true', help="Open the UI URL in the system's default browser upon launch") + group_http.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") + group_http.add_argument("--auth", type=str, default=os.environ.get("SD_AUTH", None), help='Set access authentication like "user:pwd,user:pwd""') + group_http.add_argument("--auth-file", type=str, default=os.environ.get("SD_AUTHFILE", None), help='Set access authentication using file, default: %(default)s') + group_http.add_argument('--api-only', default=os.environ.get("SD_APIONLY", False), action='store_true', help = "Run in API only mode without starting UI") + group_http.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access") + group_http.add_argument("--share", default=os.environ.get("SD_SHARE", False), action='store_true', help="Enable UI accessible through Gradio site, default: %(default)s") + group_http.add_argument("--insecure", default=os.environ.get("SD_INSECURE", False), action='store_true', help="Enable extensions tab regardless of other options, default: %(default)s") + group_http.add_argument("--listen", default=os.environ.get("SD_LISTEN", False), action='store_true', help="Launch web server using public IP address, default: %(default)s") + group_http.add_argument("--port", type=int, default=os.environ.get("SD_PORT", 7860), help="Launch web server with given server port, default: %(default)s") -def compatibility_args(opts, args): +def compatibility_args(): + group_compat = parser.add_argument_group('Compatibility options') + # removed args are added here as hidden in fixed format for compatbility reasons + group_compat.add_argument("--allow-code", default=os.environ.get("SD_ALLOWCODE", False), action='store_true', help=argparse.SUPPRESS) + group_compat.add_argument("--use-cpu", nargs='+', default=[], type=str.lower, help=argparse.SUPPRESS) + group_compat.add_argument("-f", action='store_true', help=argparse.SUPPRESS) # allows running as root; implemented outside of webui + group_compat.add_argument('--vae', type=str, default=os.environ.get("SD_VAE", None), help=argparse.SUPPRESS) + group_compat.add_argument("--ui-settings-file", type=str, help=argparse.SUPPRESS, default=os.path.join(data_path, 'config.json')) + group_compat.add_argument("--ui-config-file", type=str, help=argparse.SUPPRESS, default=os.path.join(data_path, 'ui-config.json')) + group_compat.add_argument("--hide-ui-dir-config", action='store_true', help=argparse.SUPPRESS, default=False) + group_compat.add_argument("--theme", type=str, help=argparse.SUPPRESS, default=None) + group_compat.add_argument("--disable-console-progressbars", action='store_true', help=argparse.SUPPRESS, default=True) + group_compat.add_argument("--disable-safe-unpickle", action='store_true', help=argparse.SUPPRESS, default=True) + group_compat.add_argument("--lowram", action='store_true', help=argparse.SUPPRESS) + group_compat.add_argument("--disable-extension-access", default=False, action='store_true', help=argparse.SUPPRESS) + group_compat.add_argument("--api", help=argparse.SUPPRESS, default=True) + group_compat.add_argument("--api-auth", type=str, help=argparse.SUPPRESS, default=None) + + +def settings_args(opts, args): + group_compat = parser.add_argument_group('Compatibility options') + # removed args are added here as hidden in fixed format for compatbility reasons + group_compat.add_argument("--allow-code", default=os.environ.get("SD_ALLOWCODE", False), action='store_true', help=argparse.SUPPRESS) + group_compat.add_argument("--use-cpu", nargs='+', default=[], type=str.lower, help=argparse.SUPPRESS) + group_compat.add_argument("-f", action='store_true', help=argparse.SUPPRESS) # allows running as root; implemented outside of webui + group_compat.add_argument('--vae', type=str, default=os.environ.get("SD_VAE", None), help=argparse.SUPPRESS) + group_compat.add_argument("--ui-settings-file", type=str, help=argparse.SUPPRESS, default=os.path.join(data_path, 'config.json')) + group_compat.add_argument("--ui-config-file", type=str, help=argparse.SUPPRESS, default=os.path.join(data_path, 'ui-config.json')) + group_compat.add_argument("--hide-ui-dir-config", action='store_true', help=argparse.SUPPRESS, default=False) + group_compat.add_argument("--theme", type=str, help=argparse.SUPPRESS, default=None) + group_compat.add_argument("--disable-console-progressbars", action='store_true', help=argparse.SUPPRESS, default=True) + group_compat.add_argument("--disable-safe-unpickle", action='store_true', help=argparse.SUPPRESS, default=True) + group_compat.add_argument("--lowram", action='store_true', help=argparse.SUPPRESS) + group_compat.add_argument("--disable-extension-access", default=False, action='store_true', help=argparse.SUPPRESS) + group_compat.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access") + group_compat.add_argument("--api", help=argparse.SUPPRESS, default=True) + group_compat.add_argument("--api-auth", type=str, help=argparse.SUPPRESS, default=None) # removed args that have been moved to opts are added here as hidden with default values as defined in opts - group.add_argument("--ckpt-dir", type=str, help=argparse.SUPPRESS, default=opts.ckpt_dir) - group.add_argument("--vae-dir", type=str, help=argparse.SUPPRESS, default=opts.vae_dir) - group.add_argument("--embeddings-dir", type=str, help=argparse.SUPPRESS, default=opts.embeddings_dir) - group.add_argument("--embeddings-templates-dir", type=str, help=argparse.SUPPRESS, default=opts.embeddings_templates_dir) - group.add_argument("--hypernetwork-dir", type=str, help=argparse.SUPPRESS, default=opts.hypernetwork_dir) - group.add_argument("--codeformer-models-path", type=str, help=argparse.SUPPRESS, default=opts.codeformer_models_path) - group.add_argument("--gfpgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.gfpgan_models_path) - group.add_argument("--esrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.esrgan_models_path) - group.add_argument("--bsrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.bsrgan_models_path) - group.add_argument("--realesrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.realesrgan_models_path) - group.add_argument("--scunet-models-path", help=argparse.SUPPRESS, default=opts.scunet_models_path) - group.add_argument("--swinir-models-path", help=argparse.SUPPRESS, default=opts.swinir_models_path) - group.add_argument("--ldsr-models-path", help=argparse.SUPPRESS, default=opts.ldsr_models_path) - group.add_argument("--clip-models-path", type=str, help=argparse.SUPPRESS, default=opts.clip_models_path) - group.add_argument("--opt-channelslast", help=argparse.SUPPRESS, action='store_true', default=opts.opt_channelslast) - group.add_argument("--xformers", default=(opts.cross_attention_optimization == "xFormers"), action='store_true', help=argparse.SUPPRESS) - group.add_argument("--disable-nan-check", help=argparse.SUPPRESS, action='store_true', default=opts.disable_nan_check) - group.add_argument("--rollback-vae", help=argparse.SUPPRESS, default=opts.rollback_vae) - group.add_argument("--no-half", help=argparse.SUPPRESS, action='store_true', default=opts.no_half) - group.add_argument("--no-half-vae", help=argparse.SUPPRESS, action='store_true', default=opts.no_half_vae) - group.add_argument("--precision", help=argparse.SUPPRESS, default=opts.precision) - group.add_argument("--sub-quad-q-chunk-size", help=argparse.SUPPRESS, default=opts.sub_quad_q_chunk_size) - group.add_argument("--sub-quad-kv-chunk-size", help=argparse.SUPPRESS, default=opts.sub_quad_kv_chunk_size) - group.add_argument("--sub-quad-chunk-threshold", help=argparse.SUPPRESS, default=opts.sub_quad_chunk_threshold) - group.add_argument("--lora-dir", help=argparse.SUPPRESS, default=opts.lora_dir) - group.add_argument("--lyco-dir", help=argparse.SUPPRESS, default=opts.lyco_dir) - group.add_argument("--embeddings-dir", help=argparse.SUPPRESS, default=opts.embeddings_dir) - group.add_argument("--hypernetwork-dir", help=argparse.SUPPRESS, default=opts.hypernetwork_dir) - group.add_argument("--lyco-patch-lora", help=argparse.SUPPRESS, action='store_true', default=False) - group.add_argument("--lyco-debug", help=argparse.SUPPRESS, action='store_true', default=False) - group.add_argument("--enable-console-prompts", help=argparse.SUPPRESS, action='store_true', default=False) - group.add_argument("--safe", help=argparse.SUPPRESS, action='store_true', default=False) - group.add_argument("--use-xformers", help=argparse.SUPPRESS, action='store_true', default=False) + group_compat.add_argument("--ckpt-dir", type=str, help=argparse.SUPPRESS, default=opts.ckpt_dir) + group_compat.add_argument("--vae-dir", type=str, help=argparse.SUPPRESS, default=opts.vae_dir) + group_compat.add_argument("--embeddings-dir", type=str, help=argparse.SUPPRESS, default=opts.embeddings_dir) + group_compat.add_argument("--embeddings-templates-dir", type=str, help=argparse.SUPPRESS, default=opts.embeddings_templates_dir) + group_compat.add_argument("--hypernetwork-dir", type=str, help=argparse.SUPPRESS, default=opts.hypernetwork_dir) + group_compat.add_argument("--codeformer-models-path", type=str, help=argparse.SUPPRESS, default=opts.codeformer_models_path) + group_compat.add_argument("--gfpgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.gfpgan_models_path) + group_compat.add_argument("--esrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.esrgan_models_path) + group_compat.add_argument("--bsrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.bsrgan_models_path) + group_compat.add_argument("--realesrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.realesrgan_models_path) + group_compat.add_argument("--scunet-models-path", help=argparse.SUPPRESS, default=opts.scunet_models_path) + group_compat.add_argument("--swinir-models-path", help=argparse.SUPPRESS, default=opts.swinir_models_path) + group_compat.add_argument("--ldsr-models-path", help=argparse.SUPPRESS, default=opts.ldsr_models_path) + group_compat.add_argument("--clip-models-path", type=str, help=argparse.SUPPRESS, default=opts.clip_models_path) + group_compat.add_argument("--opt-channelslast", help=argparse.SUPPRESS, action='store_true', default=opts.opt_channelslast) + group_compat.add_argument("--xformers", default=(opts.cross_attention_optimization == "xFormers"), action='store_true', help=argparse.SUPPRESS) + group_compat.add_argument("--disable-nan-check", help=argparse.SUPPRESS, action='store_true', default=opts.disable_nan_check) + group_compat.add_argument("--rollback-vae", help=argparse.SUPPRESS, default=opts.rollback_vae) + group_compat.add_argument("--no-half", help=argparse.SUPPRESS, action='store_true', default=opts.no_half) + group_compat.add_argument("--no-half-vae", help=argparse.SUPPRESS, action='store_true', default=opts.no_half_vae) + group_compat.add_argument("--precision", help=argparse.SUPPRESS, default=opts.precision) + group_compat.add_argument("--sub-quad-q-chunk-size", help=argparse.SUPPRESS, default=opts.sub_quad_q_chunk_size) + group_compat.add_argument("--sub-quad-kv-chunk-size", help=argparse.SUPPRESS, default=opts.sub_quad_kv_chunk_size) + group_compat.add_argument("--sub-quad-chunk-threshold", help=argparse.SUPPRESS, default=opts.sub_quad_chunk_threshold) + group_compat.add_argument("--lora-dir", help=argparse.SUPPRESS, default=opts.lora_dir) + group_compat.add_argument("--lyco-dir", help=argparse.SUPPRESS, default=opts.lyco_dir) + group_compat.add_argument("--embeddings-dir", help=argparse.SUPPRESS, default=opts.embeddings_dir) + group_compat.add_argument("--hypernetwork-dir", help=argparse.SUPPRESS, default=opts.hypernetwork_dir) + group_compat.add_argument("--lyco-patch-lora", help=argparse.SUPPRESS, action='store_true', default=False) + group_compat.add_argument("--lyco-debug", help=argparse.SUPPRESS, action='store_true', default=False) + group_compat.add_argument("--enable-console-prompts", help=argparse.SUPPRESS, action='store_true', default=False) + group_compat.add_argument("--safe", help=argparse.SUPPRESS, action='store_true', default=False) + group_compat.add_argument("--use-xformers", help=argparse.SUPPRESS, action='store_true', default=False) # removed opts are added here with fixed values for compatibility reasons opts.use_old_emphasis_implementation = False @@ -126,3 +156,7 @@ def compatibility_args(opts, args): args = parser.parse_args() return args + + +main_args() +compatibility_args() diff --git a/modules/generation_parameters_copypaste.py b/modules/generation_parameters_copypaste.py index cf4278e80..36b5ea382 100644 --- a/modules/generation_parameters_copypaste.py +++ b/modules/generation_parameters_copypaste.py @@ -189,7 +189,7 @@ def create_override_settings_dict(text_pairs): def connect_paste(button, local_paste_fields, input_comp, override_settings_component, tabname): def paste_func(prompt): - if prompt is None or len(prompt.strip()) == 0 and not shared.cmd_opts.hide_ui_dir_config: + if prompt is None or len(prompt.strip()) == 0: filename = os.path.join(data_path, "params.txt") if os.path.exists(filename): with open(filename, "r", encoding="utf8") as file: diff --git a/modules/postprocessing.py b/modules/postprocessing.py index 346758851..967bd04cc 100644 --- a/modules/postprocessing.py +++ b/modules/postprocessing.py @@ -37,7 +37,6 @@ def run_postprocessing(extras_mode, image, image_folder: List[tempfile.NamedTemp image_ext.append(ext) shared.log.debug(f'Process: mode=batch inputs={len(image_folder)} images={len(image_data)}') elif extras_mode == 2: - assert not shared.cmd_opts.hide_ui_dir_config, '--hide-ui-dir-config option must be disabled' assert input_dir, 'input directory not selected' image_list = os.listdir(input_dir) for filename in image_list: diff --git a/modules/shared.py b/modules/shared.py index ae94f26cf..7d575d33e 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -1101,7 +1101,7 @@ profiler = None opts = Options() config_filename = cmd_opts.config opts.load(config_filename) -cmd_opts = cmd_args.compatibility_args(opts, cmd_opts) +cmd_opts = cmd_args.settings_args(opts, cmd_opts) if cmd_opts.use_xformers: opts.data['cross_attention_optimization'] = 'xFormers' opts.data['uni_pc_lower_order_final'] = opts.schedulers_use_loworder # compatibility diff --git a/modules/ui.py b/modules/ui.py index 8ea565cfc..039ef6487 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -355,13 +355,20 @@ def create_ui(startup_timer = None): ui_onnx.create_ui() with gr.TabItem("Change log", id="change_log", elem_id="system_tab_changelog"): - with open('CHANGELOG.md', 'r', encoding='utf-8') as f: - md = f.read() - gr.Markdown(md) + def get_changelog(): + with open('CHANGELOG.md', 'r', encoding='utf-8') as f: + content = f.read() + content = content.replace('# Change Log for SD.Next', ' ') + return content - with gr.TabItem("Licenses", id="system_licenses", elem_id="system_tab_licenses"): - gr.HTML(shared.html("licenses.html"), elem_id="licenses", elem_classes="licenses") - create_dirty_indicator("tab_licenses", [], interactive=False) + with gr.Column(): + get_changelog_btn = gr.Button(value='Get changelog', elem_id="get_changelog") + with gr.Column(): + _changelog_search = gr.Textbox(label="Search", elem_id="changelog_search") + _changelog_result = gr.HTML(elem_id="changelog_result") + + changelog_markdown = gr.Markdown('', elem_id="changelog_markdown") + get_changelog_btn.click(fn=get_changelog, outputs=[changelog_markdown], show_progress=True) def unload_sd_weights(): modules.sd_models.unload_model_weights(op='model') diff --git a/requirements.txt b/requirements.txt index d376fe320..c6fcf97ec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,7 +50,7 @@ pandas protobuf==4.25.3 pytorch_lightning==1.9.4 tokenizers==0.20.1 -transformers==4.46.0 +transformers==4.46.1 urllib3==1.26.19 Pillow==10.4.0 timm==0.9.16