Compare commits

...

733 Commits

Author SHA1 Message Date
Vladimir Mandic 0eb4a98e07
Merge branch 'dev' into master 2026-04-04 11:10:28 +02:00
vladmandic 155dabc840 cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-04 11:09:39 +02:00
vladmandic 2fcabc8047 fix upscaler init causing server fail
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-04 11:03:34 +02:00
vladmandic d98d05ca2d update wiki
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-04 10:53:07 +02:00
Vladimir Mandic 27a62cfa70
Merge pull request #4734 from vladmandic/master
refresh dev
2026-04-04 09:00:28 +02:00
Vladimir Mandic d97191f342
Merge branch 'dev' into master 2026-04-04 09:00:21 +02:00
vladmandic fbf1a962f2 refresh
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-04 08:59:55 +02:00
vladmandic d7904b239f add ftfy
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-04 08:58:27 +02:00
vladmandic 90b5e7de30 update todo/changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-04 08:56:37 +02:00
Vladimir Mandic 08c28ab257
Merge pull request #4733 from vladmandic/master
refresh dev
2026-04-04 08:50:18 +02:00
Vladimir Mandic 0c94a169ea
Merge branch 'dev' into master 2026-04-04 08:50:09 +02:00
vladmandic 32b69bdd3d guard against spaces
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-04 08:47:59 +02:00
Disty0 b2e071dc52 cleanup 2026-04-04 01:39:26 +03:00
Disty0 470a0d816e SDNQ add tensor descriptor kernel to triton mm for Intel Arc 2026-04-04 01:32:34 +03:00
Disty0 ffeda702c5 Set default openvino_accuracy to no hint 2026-04-03 23:50:45 +03:00
Vladimir Mandic bfd9a0c0f5
Merge pull request #4726 from resonantsky/dev
Added further rocblas support enhancements
2026-04-03 15:59:24 +02:00
resonantsky 25af3242c3
Merge branch 'vladmandic:dev' into dev 2026-04-03 15:57:49 +02:00
Vladimir Mandic dc6f20ec8f
Merge pull request #4729 from liutyi/dev
sdxs-1b reference image
2026-04-03 15:50:03 +02:00
resonantsky a809b616e6 Restoring platform agnosticism, Linux users report OK 2026-04-03 15:46:15 +02:00
Oleksandr Liutyi 88bde026f7 sdxs-1b reference image 2026-04-03 13:12:08 +00:00
resonantsky e49d6262e9 UI edits, small corrections 2026-04-03 12:25:06 +02:00
resonantsky ac9aacac66 edited if installer.torch_info line 470 2026-04-03 11:58:43 +02:00
resonantsky 2177609e54 further fixes requested by review 2026-04-03 11:28:25 +02:00
resonantsky ee3b141297 fixes as requested by review 2026-04-03 11:21:53 +02:00
resonantsky 24f4490a59
Apply suggestion from @awsr
Co-authored-by: awsr <43862868+awsr@users.noreply.github.com>
2026-04-03 11:09:55 +02:00
resonantsky d2a47ee0ed code quality and layout fixes 2026-04-03 10:29:53 +02:00
resonantsky 01d53edb25 code quality and layout fixes 2026-04-03 10:12:21 +02:00
resonantsky 4cafae9350
Merge branch 'vladmandic:dev' into dev 2026-04-03 08:53:18 +02:00
resonantsky b659a06c60 rocm_mgr: easy fixes - simplify _get_venv to sys.prefix, _get_root to direct script_path import 2026-04-02 21:13:22 +02:00
vladmandic 9d0ecde462 add sdxs
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-02 20:15:30 +02:00
resonantsky fdc2f46457 further rocblas default settings 2026-04-02 16:20:30 +02:00
resonantsky 1ed2811c80 rocm_mgr: use modules.paths.script_path for app root 2026-04-02 15:21:54 +02:00
resonantsky f5c037a735 Added further rocblas support enhancements and performance-related best practice settings. 2026-04-02 14:59:16 +02:00
Vladimir Mandic 668a94141d
Merge pull request #4722 from awsr/various1
typing and typechecks updates
2026-04-02 08:36:41 +02:00
Vladimir Mandic 999cbe5d3a
Merge branch 'dev' into various1 2026-04-02 08:36:24 +02:00
Vladimir Mandic 5d83552630
Merge pull request #4725 from vladmandic/dev
dev merge refresh
2026-04-02 08:26:31 +02:00
Vladimir Mandic fa97cf6232
Merge branch 'master' into dev 2026-04-02 08:26:10 +02:00
vladmandic d3880632ed flag python 3.14 as experimental
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-02 08:20:31 +02:00
Vladimir Mandic 7a51017ac3
Merge pull request #4716 from vladmandic/dev
dev merge
2026-04-01 10:39:43 +02:00
vladmandic 1310264d43 regen all localizations
Signed-off-by: vladmandic <mandic00@live.com>
2026-04-01 10:29:08 +02:00
CalamitousFelicitousness 75cc035354 add Enso to changelog and wiki, add colour grading hints
Add Enso entries to UI and API sections of the changelog.
Add colour grading parameter hints to locale_en.json.
Update wiki submodule with new Enso page and Home link.
2026-04-01 03:15:52 +02:00
vladmandic 61c10d6591 update diffusers and transformers
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-31 16:34:28 +02:00
awsr 3dd09fde08
Syntax change 2026-03-30 20:09:02 -07:00
vladmandic ec1341348b update todo/changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-30 12:19:36 +02:00
vladmandic ca2d49497b ltx test
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-30 11:16:55 +02:00
vladmandic a370bfc987 handle taesd init failures
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-30 10:24:26 +02:00
vladmandic 849ab8fe1e fix loader
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-30 09:58:42 +02:00
vladmandic 61e7663eb3 update chainner
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-30 09:07:47 +02:00
awsr 95dadab5c3
Revert import format change
Not sure why, but it was causing errors
2026-03-29 02:04:22 -07:00
awsr 59b9ca50ee
Guard against divide by zero and out-of-bounds 2026-03-29 01:25:22 -07:00
awsr eeb9b6291b
Update typing + enforce variable not unbound + import sort 2026-03-28 19:27:45 -07:00
awsr 8d6ec348b2
Refactor get_grid_size
Type safe, avoids redefining parameter types, and the static type checker is able to parse it easily.
2026-03-28 19:18:55 -07:00
awsr a1b03a383c
Upgrade Grid to typed NamedTuple 2026-03-28 19:17:59 -07:00
awsr ba362ad3ca
Type safety 2026-03-28 17:32:23 -07:00
awsr 7f07d4cb31
Update to match actual code logic 2026-03-28 17:31:37 -07:00
awsr 715b1b0699
More typing updates 2026-03-28 17:30:06 -07:00
awsr b2b6fdf9d5
Typing updates 2026-03-28 17:15:48 -07:00
awsr 8ef8074467
Upgrade to typed NamedTuples 2026-03-28 16:57:59 -07:00
Disty0 06fe4c7f20 SDNQ cleanup triton_mm 2026-03-29 00:44:58 +03:00
Disty0 005eb789a3 SDNQ use combination config for Triton MM 2026-03-28 18:02:17 +03:00
Vladimir Mandic b44493d171
Merge pull request #4719 from resonantsky/dev
Minor fixes to i2i folder batch
2026-03-28 15:42:01 +01:00
resonantsky 133bf81ad0 faulty pre-inference resize removed 2026-03-28 10:57:15 +02:00
resonantsky ba8f7b06b2 pre-inference resize save out fix 2026-03-28 10:57:15 +02:00
vladmandic b86e357b8e update nunchaku code
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-28 09:49:05 +01:00
vladmandic 611dfe4301 update nunchaku installer
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-28 08:57:23 +01:00
Vladimir Mandic 274aeef65e
Merge branch 'master' into dev 2026-03-28 06:40:09 +01:00
CalamitousFelicitousness fa1bc15e64 fix(installer): remove duplicate pip prefix from CUDA torch command 2026-03-28 03:14:44 +00:00
awsr 1e9bef8d56
Type enforcement for ResGPU
Only tuples support typing a specific number of entries.
2026-03-27 14:15:44 -07:00
awsr fe7e4b40ff
Update models to match actual behavior
- ResScripts
- ResEmbeddings
2026-03-27 14:12:39 -07:00
Disty0 6eadf40f33 SDNQ add ufp aliases 2026-03-27 21:31:36 +03:00
vladmandic 64400a0cde add dev stats
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-27 19:22:38 +01:00
vladmandic e0f6766b8a update permissions
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-27 19:17:37 +01:00
Vladimir Mandic cef81ba7cf
Merge pull request #4715 from liutyi/dev
new reference images: Anima Preview 1/2
2026-03-27 17:56:24 +01:00
Oleksandr Liutyi 716bbd759b new reference images: Anima Preview 1/2 2026-03-27 16:47:32 +00:00
vladmandic 20dd097235 update modernui
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-27 14:00:46 +01:00
vladmandic b5e9fbc7b3 reorganize scripts/extensions
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-27 14:00:46 +01:00
Vladimir Mandic db6b724dfa
Merge pull request #4714 from liutyi/dev
new reference images: FireRed Image 1.0/1.1
2026-03-27 13:55:46 +01:00
Oleksandr Liutyi 1c5edb913c new reference images: FireRed Image 1.0/1.1 2026-03-27 11:49:57 +00:00
vladmandic 58f9902ffc fix typo
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-27 08:02:44 +01:00
vladmandic 107e9f78a7 safe loader
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-27 07:55:12 +01:00
vladmandic 4b6b577d14 detect active venv
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-27 07:50:42 +01:00
Vladimir Mandic d812726570
Merge pull request #4713 from awsr/modeldata-type
Update typing for model data access
2026-03-27 07:36:40 +01:00
awsr 775ff59fdb
Update typing for model data access 2026-03-26 16:42:04 -07:00
vladmandic a6029afb04 i2i cleanup imports
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-26 09:29:14 +01:00
Vladimir Mandic 31e1461a65
Merge pull request #4709 from resonantsky/dev
CeeTeeDee's I2I folder batch inference.
2026-03-26 09:23:38 +01:00
resonantsky 9003e67ec4 Added multifile support through modules\file_cache.py, tested. 2026-03-26 10:11:49 +02:00
vladmandic 27205c295e lint
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-26 08:11:42 +01:00
vladmandic 4a297d70f2 update diffusers/transformers
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-26 08:10:04 +01:00
vladmandic 397631fb4c update constraints, patch loader and create ext exclude list
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-26 07:21:50 +01:00
Vladimir Mandic 48e8b3a513
Merge pull request #4711 from awsr/pep484-plus
Final PEP 484 updates
2026-03-26 07:10:22 +01:00
Vladimir Mandic 51ec59d06b
Merge pull request #4710 from awsr/RUF013-followup
Revert regressions from PEP 484 patch
2026-03-26 07:09:19 +01:00
awsr 1ac3359e20
Update sd_checkpoint.py 2026-03-25 16:56:51 -07:00
awsr bec694a7d2
PEP 484 pipelines directory 2026-03-25 16:56:41 -07:00
awsr c3cce0ad76
PEP 484 scripts directory 2026-03-25 16:56:28 -07:00
resonantsky b3837aa944 Added inference bypass for upscale only passes. 2026-03-25 23:28:38 +02:00
awsr 2675e68813
Revert minor change
Will re-implement in a separate PR
2026-03-25 13:55:56 -07:00
resonantsky a51755dcf4 further edits 2026-03-25 22:50:31 +02:00
awsr 375591ecdd
Revert non-critical changes
The following errors are re-introduced and will need follow-up:
- models.py, line 92
- sd_unet.py, line 41
- sd_models.py, line 1440
2026-03-25 13:47:27 -07:00
resonantsky 8b6de3c215 added pre-inference resize 2026-03-25 20:52:22 +02:00
Disty0 a255e5bdcf SDNQ set sdnq_dequantize_fp32 to True by default 2026-03-25 21:46:17 +03:00
resonantsky c37e788c0b fixes 2026-03-25 19:51:25 +02:00
resonantsky 12af43e4de CeeTeeDee's I2I folder batch inference. 2026-03-25 19:30:55 +02:00
Vladimir Mandic 688485018e
Merge pull request #4708 from liutyi/dev
new reference images: GLM Image (+metadata) and FLUX2 Klein 9B KV (new)
2026-03-25 17:44:34 +01:00
Oleksandr Liutyi d16676518c new reference images: GLM Image (+metadata) and FLUX2 Klein 9B KV (new) 2026-03-25 16:18:15 +00:00
vladmandic 0b74796d94 basic ty config
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-25 09:34:59 +01:00
vladmandic b90558430e fix grid
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-25 09:11:31 +01:00
vladmandic 7a47b6bbdb update torch-cuda and create agents.md
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-25 08:23:55 +01:00
vladmandic 400d284711 fix metadata parser
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-25 07:32:37 +01:00
CalamitousFelicitousness 18568db41c Add native LoRA loading for Flux2/Klein models
Load Flux2/Klein LoRAs as native NetworkModuleLora objects, bypassing
diffusers PEFT. Handles kohya (lora_unet_), AI toolkit (diffusion_model.),
diffusers PEFT (transformer.), and bare BFL key formats with automatic
QKV splitting for double block fused attention weights.

Includes shape validation to reject architecture-mismatched LoRAs early.
Respects lora_force_diffusers setting to fall back to PEFT when needed.
2026-03-25 04:24:49 +00:00
Disty0 10942032a3 Add SDNQ_COMPILE_KWARGS env var 2026-03-25 02:10:58 +03:00
Disty0 11f3921832 SDNQ make dyn loss threshold auto selected by default 2026-03-25 01:47:59 +03:00
Disty0 81cc9383b0 Update ROCm on Linux to Torch 2.11 + ROCm 7.2 2026-03-24 17:46:15 +03:00
vladmandic 78dbe18150 update todo/changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-24 15:21:40 +01:00
Vladimir Mandic 66d4d6ca3a
Merge pull request #4706 from awsr/RUF013
RUF013 / PEP 484 compatibility update
2026-03-24 15:19:36 +01:00
awsr ff247d8fd2
Merge branch 'dev' into RUF013 2026-03-24 07:12:51 -07:00
Disty0 d429e11d55 Update OpenVINO to 2026 and Torch to 2.11 2026-03-24 17:06:57 +03:00
Vladimir Mandic 62e629a3ac
Merge pull request #4705 from resonantsky/dev
Added : Group Conv / CK Toggles (RDNA3/4+) per request
2026-03-24 15:03:03 +01:00
vladmandic 53839e464c remove legacy quant loaders
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-24 15:01:07 +01:00
vladmandic acf475ee45 update locales
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-24 15:01:07 +01:00
Disty0 14c3cf9172 IPEX fix transformers and disable torch.tensor hijack 2026-03-24 16:58:53 +03:00
awsr fd1646cc37
Revert extra return statement 2026-03-24 06:28:39 -07:00
awsr a6f6a37dea
Add Ruff per-file-ignores 2026-03-24 06:16:13 -07:00
awsr 876e3b9897
RUF013 updates 2026-03-24 06:15:26 -07:00
awsr 1003926646
RUF013 updates and import updates 2026-03-24 06:08:15 -07:00
awsr 09ab19c438
RUF013 updates and formatting 2026-03-24 06:07:34 -07:00
awsr c4ebef29a9
RUF013 updates 2026-03-24 05:48:19 -07:00
awsr 3f830589d1
RUF013 updates and typing update 2026-03-24 05:19:51 -07:00
awsr f0bb0a921a
RUF013 updates and value handling fix 2026-03-24 05:13:11 -07:00
awsr 62d2229520
RUIF013 updates and formatting 2026-03-24 05:12:18 -07:00
awsr 4f0fb7cc29
More RUF013 updates for processing_class 2026-03-24 05:00:41 -07:00
awsr fb853af4b0
RUF013 updates 2026-03-24 04:58:19 -07:00
resonantsky 670ca3a644 ROCm: fix apply_env to clear _EXTRA_CLEAR_VARS; fix info table value cell color for light themes 2026-03-24 13:39:35 +02:00
Disty0 cff7f8d4a9 IPEX remove the use of lambdas 2026-03-24 14:36:58 +03:00
resonantsky 903869b337 Added :Group Conv / CK Toggles (RDNA3/4+) 2026-03-24 13:35:52 +02:00
awsr 641321d7d2
RUF013 updates 2026-03-24 04:34:38 -07:00
awsr 92960de8d6
RUF013 updates 2026-03-24 04:27:30 -07:00
awsr 6ab9b7bc62
RUF013 updates 2026-03-24 04:19:53 -07:00
Disty0 4f8260e670 Update IPEX to Torch 2.11 2026-03-24 14:17:24 +03:00
awsr 2d81bcdc69
RUF013 updates + type fixes 2026-03-24 04:12:14 -07:00
awsr abe25e7b07
RUF013 update 2026-03-24 03:46:44 -07:00
awsr d3f925e8e5
RUF013 update 2026-03-24 03:46:26 -07:00
awsr 481d974b91
RUF013 update 2026-03-24 03:40:15 -07:00
awsr b75a1f971f
RUF013 update + minor typing fixes 2026-03-24 03:39:02 -07:00
Disty0 a5977f09f5 Fix JPEG XL 2026-03-24 13:36:52 +03:00
awsr 53598d40ab
RUF013 update 2026-03-23 22:59:32 -07:00
awsr 3e228afa78
RUF013 update 2026-03-23 22:58:08 -07:00
awsr de86927c1b
Remove unneeded type and default 2026-03-23 22:54:40 -07:00
awsr d474f28cb3
RUF013 update 2026-03-23 22:53:34 -07:00
vladmandic bc22e0f0dc monkey patch transformers version checks
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 18:30:28 +01:00
vladmandic dbd2293586 remove hf token from load args
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 17:53:47 +01:00
vladmandic f5fbc06fe4 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 16:26:48 +01:00
vladmandic c1e67a9c71 update changelog/todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 16:21:35 +01:00
Vladimir Mandic 047e66f610
Merge pull request #4703 from resonantsky/dev
ROCm: Advanced Configuration Script.
2026-03-23 16:10:06 +01:00
resonantsky eb4a1ec781 lint: fix ruff and pylint warnings in rocm_ext and rocm_mgr 2026-03-23 16:37:50 +02:00
resonantsky 0ee33ea60e corrections as specified in PR conversation 2026-03-23 16:19:33 +02:00
resonantsky 312d909739 Restored rocm_ext.py IF checks for rocm to those supplied with the template 2026-03-23 15:19:59 +02:00
resonantsky 9033095be6 ROCm: Advanced Configuration Script 2026-03-23 12:04:07 +02:00
resonantsky 73b854e4cf ROCm: Advanced Config 2026-03-23 12:04:07 +02:00
vladmandic 41fddce2e9 update wiki and todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 09:22:01 +01:00
vladmandic 09b9ae32c1 add color grading to processing
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 08:44:07 +01:00
vladmandic 3261e2eeae update requirements and introduce constraints
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 07:27:50 +01:00
vladmandic 57990fd8c0 add FireRed-Image-Edit-1.1
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-23 06:41:46 +01:00
Vladimir Mandic a6cae50a67
Merge pull request #4700 from vladmandic/feat/flux2-klein-lora
add Flux2/Klein LoRA support
2026-03-23 06:36:31 +01:00
CalamitousFelicitousness 9719290ceb fix(lora): handle kohya-format alpha keys in Flux2/Klein LoRA loading 2026-03-23 02:14:07 +00:00
CalamitousFelicitousness 091f31d4bf add Flux2/Klein LoRA support
- detect f2 model type for LoRAs via metadata, architecture, and filename/folder
- preprocess bare BFL-format keys with diffusion_model prefix for Flux2LoraLoaderMixin
- handle LoKR format via native NetworkModuleLokr with on-the-fly kron(w1, w2)
- add NetworkModuleLokrChunk for fused QKV split into separate Q/K/V modules
- activate native modules loaded via diffusers path
- improve error message for Flux1/Flux2 architecture mismatch
2026-03-23 02:14:07 +00:00
CalamitousFelicitousness 0d248c45e7 fix(upscaler): convert non-RGB images before ESRGAN forward pass 2026-03-23 02:12:59 +00:00
vladmandic deb45c49b3 add rocm config prototype
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-22 17:32:47 +01:00
vladmandic e87fcd1bc5 latent correction hints
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-22 11:27:36 +01:00
vladmandic b2b4e13bab lint
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-22 11:17:41 +01:00
vladmandic e572364766 update modernui
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-22 11:09:45 +01:00
vladmandic afe3786f5f add unet/dir to networks
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-22 11:09:45 +01:00
CalamitousFelicitousness 9a5e908ddf fix(ui): initialize max_length before tokenizer block 2026-03-21 23:27:46 +00:00
vladmandic a54e9b3311 update readme and some debug functions
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-21 09:08:53 +01:00
awsr 8e10ec3fec
RUF013 compatibility 2026-03-20 18:42:44 -07:00
awsr 783f20b5d7
Remove RUF013 from ignored rules 2026-03-20 18:42:00 -07:00
CalamitousFelicitousness 5e4819c3e9 run enso extension installer after clone and update
After deletion and re-clone, enso.install() runs after
install_extensions() has already passed, so install.py
was never triggered and the frontend was not built.
2026-03-20 21:43:44 +00:00
vladmandic 79bf0f8c1d update changelog/todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 18:06:27 +01:00
vladmandic 93947d3901 update changelog/todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 10:14:00 +01:00
Vladimir Mandic ab7c780c9f
Merge pull request #4657 from awsr/detailed-token-counts
Add detailed token counts
2026-03-20 10:04:54 +01:00
Vladimir Mandic 8311add607
Merge pull request #4687 from awsr/gallery-sort
Gallery: Decouple sort button icon value from sorting logic
2026-03-20 10:03:16 +01:00
Vladimir Mandic f86b0e69ef
Merge pull request #4691 from awsr/errorlimiter-update
Update Errorlimiter to be thread-safe
2026-03-20 10:02:28 +01:00
vladmandic 295fe6fbd3 handle script errors
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 09:30:17 +01:00
vladmandic 7588ec0636 cleanup rembg
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 09:10:28 +01:00
vladmandic c10472f37a cleanup rembg
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 09:10:19 +01:00
Vladimir Mandic 24c4f2599e
Merge pull request #4695 from vladmandic/fb-merge
merge feature branch to dev
2026-03-20 08:56:57 +01:00
vladmandic f83e9e7943 deregister rembg submodule
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 08:14:01 +01:00
vladmandic 4b998e3866 deregister rembg submodule
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 08:13:28 +01:00
vladmandic 760b0121bc update register_api
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 08:07:05 +01:00
vladmandic d679fbb8fb move rembg to internal
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-20 08:04:21 +01:00
Vladimir Mandic 6a282d904b
Merge pull request #4694 from vladmandic/feat/civitai-browser-overhaul
Feat/civitai browser overhaul
2026-03-20 07:39:06 +01:00
CalamitousFelicitousness 813b61eda8 test: add api tests for generation params and detailer endpoints
Generation tests cover scheduler params, color grading, and latent
corrections. Detailer tests cover model enumeration and object
detection. Both require a running SD.Next instance.
2026-03-20 04:33:51 +00:00
CalamitousFelicitousness 0ec1e9bca2 test: add offline unit tests for color grading and latent corrections
Covers pixel-space color grading and latent-space corrections with
synthetic inputs, no running server required.
2026-03-20 04:33:51 +00:00
CalamitousFelicitousness 9cf2ab08a0 feat(civitai): add url parsing to cli search tool
Extract model ID from civitai.com URLs pasted as the query argument,
matching the same behavior added to the main search module.
2026-03-20 04:33:51 +00:00
CalamitousFelicitousness e7f2b63814 style(ui): add disabled-look class for civitai mutual exclusivity 2026-03-20 04:33:51 +00:00
CalamitousFelicitousness 0be7678ea4 feat(ui): extend civitai download bridge with model/version ids and mutual exclusivity
Add selectedModelId and selectedVersionId to the download bridge so
metadata JSON and preview images are fetched alongside model files.
Pass model_id and version_id from card detail view through
startCivitDownload and downloadCivitModel. Add keyword/tag mutual
exclusivity via disabled-look CSS class toggle.
2026-03-20 04:33:39 +00:00
CalamitousFelicitousness c220e2858c feat(ui): overhaul civitai browser with browse/discover capabilities
Add Sort and Time period dropdowns, change Type from textbox to
dropdown. Rename Advanced accordion to Options. Layout: Model type +
Base model in one row, Sort + Time period in another. Add subfolder
toggle with template auto-fill. Wire tab-enter auto-browse with lazy
API discovery for dynamic dropdown refresh. Set Sort and Time period
values to match the initial auto-browse query. Fix duplicate elem_id
bug on tag field. Pass model_id, version_id, and base_model through
download handler to enable sidecar metadata and preview fetching.
2026-03-20 04:33:31 +00:00
CalamitousFelicitousness 202862fb64 feat(civitai): wire subfolder resolution and sidecar metadata into download
Add base_model, model_id, version_id params to download_civit_model.
Call resolve_save_path when subfolder sorting is enabled. Pass model_id
and version_id to DownloadManager.enqueue so _fetch_sidecar downloads
metadata JSON and preview images alongside the model file. Extract
version_id from the download URL as fallback when not provided.
2026-03-20 04:33:20 +00:00
CalamitousFelicitousness 91d21eefb6 feat(civitai): allow tag-only and sort-only browsing
Relax the empty-query guard so search works with tag, sort, or period
alone. Skip exact-match name filtering when no keyword is provided so
browse results return the full API response.
2026-03-20 04:33:12 +00:00
awsr ef0573a409
Fix TypeError
`func` is optional for `Array.prototype.sort()`, but `undefined` needs to be used.
2026-03-19 14:57:18 -07:00
vladmandic 87659823fc gpu info for xpu and log exclude list
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-19 15:01:49 +01:00
awsr d34896028d
Make `elimit` kwarg optional 2026-03-19 04:41:37 -07:00
Vladimir Mandic 97a16e5eb9
Merge pull request #4690 from vladmandic/fix/color-grading-and-latent-corrections
Fix/color grading and latent corrections
2026-03-19 12:36:02 +01:00
awsr 6e3c187b3f
Rework to only use contextmanager system 2026-03-19 04:28:11 -07:00
awsr 615c74fd05
Minor organization 2026-03-19 03:53:06 -07:00
awsr 867960f4ef
Minor typing update 2026-03-19 01:50:36 -07:00
awsr 4f40a9c8dd
Fix threading compatibility 2026-03-19 01:49:42 -07:00
vladmandic 5a5e3cc381 use rate-limit for api logging
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-19 08:52:10 +01:00
CalamitousFelicitousness e4cb96f6a4 fix(ui): widen latent correction slider ranges
brightness and sharpen: ±1.0 → ±4.0
color: 0-4.0 → 0-16.0
tint strength: ±1.0 → ±4.0
2026-03-19 04:03:20 +00:00
CalamitousFelicitousness 423c3ef8b7 fix(correction): step-based progress and multi-channel latent support
replace hardcoded timestep thresholds with step-based progress percentages
so corrections work with flow-match schedulers (Flux 2, etc.)
adapt brightness, color and tint corrections for multi-channel latents:
- brightness uses multiplicative scaling instead of additive offset
- color applies to all channels instead of skipping channel 0
- tint falls back to uniform offset when TAESD encoding is unavailable
pass step parameter through correction_callback for progress calculation
2026-03-19 04:03:13 +00:00
CalamitousFelicitousness ee2fc75619 fix(grading): color grading type coercion, CLAHE, sharpness and tone scaling
- add __post_init__ to GradingParams to coerce Gradio int returns to float
- apply CLAHE to L channel in Lab space instead of per-RGB channel
- fix sharpness scaling (kornia factor 1.0=no change, map 0-based slider)
- increase shadows/midtones/highlights gamma strength 2x for visible effect
- reduce CLAHE clip slider range to 0-5 with finer 0.25 step
2026-03-19 04:00:12 +00:00
CalamitousFelicitousness cb943919eb fix(devices): triton version detection always reporting false
triton_version was initialized to False instead of None, causing
the `is None` checks to be skipped and torch_info to report triton=false
even when triton is functional
2026-03-18 20:14:02 +00:00
vladmandic fb2f9ea650 new server info panel
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-18 15:37:57 +01:00
vladmandic c187aa706a cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-18 09:25:09 +01:00
vladmandic 59a07a33cd fix postprocess upscaler refresh
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-18 08:33:42 +01:00
vladmandic 39ce3d7ea3 separate color corrections
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-18 07:53:04 +01:00
vladmandic 84edba5d94 fix: dont switch modernui on unknown branch
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-17 14:02:52 +01:00
vladmandic 4e1c1a6844 add secrets manager
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-17 13:56:55 +01:00
vladmandic d588ced2ef fix rate limiter
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-17 11:52:53 +01:00
vladmandic ea1abfe2ce merge: modules/civitai 2026-03-17 11:07:51 +01:00
vladmandic 4c256976df cleanup enso
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-17 11:04:29 +01:00
vladmandic 1acc327192 merge: modules/sd_samplers_diffusers.py 2026-03-17 10:57:29 +01:00
vladmandic 03e686c988 merge: modules/enso.py 2026-03-17 10:53:44 +01:00
vladmandic 6427b799e9 merge: modules/postprocess/yolo.py 2026-03-17 10:50:09 +01:00
vladmandic 742eeb8691 new server settings section
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-17 10:07:48 +01:00
vladmandic de7959397c fb merge phase 3
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-16 10:32:12 +01:00
vladmandic 6a9b9297c1 cleanup yolo
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-16 08:30:23 +01:00
vladmandic ee9e93e62f merge: modules/caption/vqa.py 2026-03-16 08:12:58 +01:00
vladmandic 3ac68a2401 merge: modules/caption/models_def.py 2026-03-16 08:12:40 +01:00
vladmandic 936216e20d merge: modules/control/run.py 2026-03-16 08:10:48 +01:00
vladmandic 12fd4d30f1 fb merge phase 2
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-16 08:09:07 +01:00
vladmandic 7a409a9e83 patch installer
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-16 06:30:24 +01:00
awsr bbdaaae682
Decouple sort button icon from sorting logic 2026-03-15 21:59:51 -07:00
vladmandic 9013ba7bf1 cleanup yolo
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-14 13:01:51 +01:00
vladmandic 2fb9e2115e merge: modules/postprocess/yolo.py 2026-03-14 12:56:06 +01:00
vladmandic 729eca460e initialize grading params
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-14 12:52:37 +01:00
vladmandic c86674047a fix state end
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-14 12:46:43 +01:00
vladmandic d432945a29 update lint rules
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 15:35:13 +01:00
vladmandic 9eced4ff86 cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 15:05:47 +01:00
vladmandic edfbae0783 merge: modules/sd_models.py 2026-03-13 14:45:21 +01:00
vladmandic e0faa149dd cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 14:44:58 +01:00
vladmandic 35803746df merge: modules/sd_hijack_hypertile.py 2026-03-13 14:36:25 +01:00
vladmandic cb224651a0 merge: modules/sd_hijack_freeu.py 2026-03-13 14:34:47 +01:00
vladmandic 7a014f0612 merge: modules/prompt_parser_diffusers.py 2026-03-13 14:32:05 +01:00
vladmandic cb76c164e7 merge: modules/processing_prompt.py 2026-03-13 14:31:26 +01:00
vladmandic 4effd92663 merge: modules/processing_info.py 2026-03-13 14:30:53 +01:00
vladmandic 928448b654 merge: modules/processing_helpers.py 2026-03-13 14:27:59 +01:00
vladmandic 3addc16a5a merge: modules/processing_callbacks.py 2026-03-13 13:29:46 +01:00
vladmandic 7af0d6ea07 merge: modules/processing.py 2026-03-13 13:25:21 +01:00
vladmandic cbefbcf772 merge: modules/models_hf.py 2026-03-13 13:22:32 +01:00
vladmandic a72e3c4f29 merge: modules/video_models/video_run.py 2026-03-13 13:21:14 +01:00
vladmandic f4ec0bab4a merge: modules/image/metadata.py 2026-03-13 13:17:58 +01:00
vladmandic 6821d92a92 use aux for prompt enhance
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 13:05:34 +01:00
vladmandic 242325c11d merge: scripts/prompt_enhance.py 2026-03-13 13:04:35 +01:00
vladmandic f9abe07035 cleanup logging and update requirements
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 13:02:41 +01:00
vladmandic e8ba35e7e9 merge: modules/token_merge.py 2026-03-13 13:00:55 +01:00
vladmandic d4e87c6ff3 cleanup offload
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:38:57 +01:00
vladmandic 1b834f8ad6 create sd_offload_aux
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:29:51 +01:00
vladmandic 09e41b65d3 rename video_helper
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:22:53 +01:00
vladmandic 756b4599be merge: modules/caption
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:22:46 +01:00
vladmandic 278c2a1b6b merge: modules/loader.py 2026-03-13 12:13:33 +01:00
vladmandic 4bd6e42c62 fix lora deactivate
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:12:04 +01:00
vladmandic af1531af5a revert gallery appy
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:06:33 +01:00
vladmandic f89afe0add revert gallery api
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:06:26 +01:00
vladmandic 121c51289b patch lora
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 12:02:27 +01:00
vladmandic 14ec021eae merge: modules/ltx/ltx_process.py 2026-03-13 12:01:36 +01:00
vladmandic f6ed1a92a4 cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 11:49:41 +01:00
vladmandic f91fd63a60 merge: modules/sd_samplers.py 2026-03-13 11:43:30 +01:00
vladmandic ee6cadfa9c cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-13 11:42:16 +01:00
vladmandic 1b699557b8 merge: modules/sd_samplers_diffusers.py 2026-03-13 11:23:17 +01:00
vladmandic 2485753c6b merge: modules/ui_control.py 2026-03-13 11:01:27 +01:00
vladmandic 0838b938e1 merge: modules/control/run.py 2026-03-13 11:01:01 +01:00
vladmandic f484f80293 merge: modules/processing_class.py 2026-03-13 10:56:19 +01:00
awsr 51a10320c7
Implement updated Warn Once handling 2026-03-13 02:01:59 -07:00
awsr 9a7f1e7978
Typing update 2026-03-13 02:01:56 -07:00
awsr 041029d184
Restore max length of 75 (77 for model)
Default model max length for CLIP is 77 including BOS and EOS.
2026-03-13 02:01:53 -07:00
awsr 686ac0375d
Always enabled 2026-03-13 02:01:50 -07:00
awsr 09c82064e1
Only enable detailed with native prompt parsing 2026-03-13 02:01:47 -07:00
awsr f43b459e9b
Revert "Use manual looping"
This reverts commit e5fdb0015727edc68938a8a394a83b3c70f9833a.
2026-03-13 02:01:45 -07:00
awsr 0d27d9ea09
Use manual looping
- I'm assuming there won't be much of a difference in performance. If it ends up being too slow, this can always be reverted.
2026-03-13 02:01:41 -07:00
awsr 897925da2a
Minor cleanup 2026-03-13 02:01:35 -07:00
awsr f1a4faadb8
Add optional detailed token counts 2026-03-13 02:00:51 -07:00
vladmandic 7a225b4766 merge: modules/processing_correction.py 2026-03-13 08:27:07 +01:00
vladmandic 0b83da416e merge: modules/img2img.py 2026-03-13 08:22:41 +01:00
vladmandic eaf735f0ed merge: modules/txt2img.py 2026-03-13 08:19:32 +01:00
vladmandic 9013f2bbe1 merge: modules/ui_txt2img.py 2026-03-13 08:19:26 +01:00
vladmandic 2b2a044ff9 merge: modules/processing_grading.py 2026-03-13 08:12:45 +01:00
vladmandic 56d0307f13 merge: modules/api/models.py 2026-03-13 08:10:14 +01:00
vladmandic 80ab63db2c merge: ui_sections.py
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-12 15:38:21 +01:00
vladmandic fde3554341 spelling
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-12 15:36:24 +01:00
vladmandic 2ef12ddffb list installer
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-12 14:34:57 +01:00
vladmandic 860e9864d3 merge: modules/ui_img2img.py 2026-03-12 14:16:51 +01:00
vladmandic 886341b1cc merge: modules/ui_extra_networks_lora.py 2026-03-12 14:16:51 +01:00
vladmandic 6f13f6131e merge: modules/ui_extra_networks.py 2026-03-12 14:16:51 +01:00
vladmandic 7c87bb2d1e merge: modules/ui_definitions.py 2026-03-12 14:16:51 +01:00
vladmandic 939eea1cd9 merge: modules/sd_models_compile.py 2026-03-12 14:16:51 +01:00
vladmandic b526d98cb0 merge: modules/modelloader.py 2026-03-12 14:16:51 +01:00
vladmandic d3798cc6a4 merge: modules/infotext.py 2026-03-12 14:16:51 +01:00
vladmandic 24e3416e02 merge: modules/video_models/video_save.py 2026-03-12 14:16:51 +01:00
vladmandic 5451bbeec4 merge: modules/framepack/framepack_worker.py 2026-03-12 14:16:51 +01:00
vladmandic 565beebd90 merge: modules/face/insightface.py 2026-03-12 14:16:51 +01:00
vladmandic a3668e9f0c merge: modules/control/unit.py 2026-03-12 14:16:51 +01:00
vladmandic 72895b5192 merge: modules/control/processors.py 2026-03-12 14:16:51 +01:00
vladmandic 0e0b607cfa merge: modules/control/processor.py 2026-03-12 14:16:51 +01:00
vladmandic 49e2c6f53a merge: modules/control/proc/vitpose/__init__.py 2026-03-12 14:16:51 +01:00
vladmandic 6436b833f5 merge: modules/control/proc/teed/__init__.py 2026-03-12 14:16:51 +01:00
vladmandic d5a22d3951 merge: modules/control/proc/stablenormal/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic 954d079472 merge: modules/control/proc/sam2/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic 643256f21d merge: modules/control/proc/rtmlib_pose/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic 5b85a6d10b merge: modules/control/proc/oneformer/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic 0bdbf300ac merge: modules/control/proc/marigold_normals/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic de5b9f27f2 merge: modules/control/proc/lotus/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic 3bea120c08 merge: modules/control/proc/dsine/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic a42d2d41e1 merge: modules/control/proc/depth_anything_v2/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic 1890515a08 merge: modules/control/proc/anyline/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic 3586ae90bc merge: modules/civitai/__init__.py 2026-03-12 14:16:50 +01:00
vladmandic a23abb356e merge: modules/api/xyz_grid.py 2026-03-12 14:16:50 +01:00
vladmandic cbc1b7c994 merge: modules/api/script.py 2026-03-12 14:16:50 +01:00
vladmandic 07954ee849 merge: modules/api/process.py 2026-03-12 14:16:50 +01:00
vladmandic a93358b3ac merge: modules/api/nudenet.py 2026-03-12 14:16:50 +01:00
vladmandic ee1b76b1c9 merge: modules/api/loras.py 2026-03-12 14:16:50 +01:00
vladmandic ac5ae390d8 merge: modules/api/helpers.py 2026-03-12 14:16:50 +01:00
vladmandic 62dcf352eb merge: modules/api/gpu.py 2026-03-12 14:16:50 +01:00
vladmandic b388f7c582 merge: modules/api/generate.py 2026-03-12 14:16:50 +01:00
vladmandic a2624bebdc merge: modules/api/endpoints.py 2026-03-12 14:16:50 +01:00
vladmandic 86fba0b544 merge: modules/api/control.py 2026-03-12 14:16:50 +01:00
vladmandic eb94fa3f38 merge: modules/api/caption.py 2026-03-12 14:16:50 +01:00
vladmandic adff14c257 merge: data/reference-community.json 2026-03-12 14:16:50 +01:00
vladmandic 195a9568ac merge: cli/hf-search.py 2026-03-12 14:16:50 +01:00
vladmandic d9207aa2e1 merge: cli/hf-search.py 2026-03-12 14:13:19 +01:00
vladmandic 64e193b60b merge: cli/hf-search.py 2026-03-12 14:11:47 +01:00
vladmandic b2f95b91bf cleanup upload
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-12 09:20:19 +01:00
Disty0 f35e644d44 cast svd to torch_dtype 2026-03-11 14:50:14 +03:00
Disty0 e202d43801 SDNQ set sdnq_dequantize_fp32 to True by default 2026-03-11 14:35:11 +03:00
Disty0 30d21f420f Allow all types in dyn quant 2026-03-11 13:46:24 +03:00
Disty0 b02a63c60c SDNQ update minimum dtype check 2026-03-11 04:12:37 +03:00
Disty0 76b184a9fe fix fp16 mm is selected instead of fp8 mm 2026-03-11 03:55:43 +03:00
Disty0 d9e628574a SDNQ add 15, 13, 11 and 9 bit support 2026-03-11 03:39:02 +03:00
Vladimir Mandic e5f9707e48
Merge pull request #4675 from awsr/style-sort
Fix style sorting
2026-03-10 06:04:02 +01:00
awsr afc517ad87
Update variable name 2026-03-09 18:42:10 -07:00
awsr 3a8ef75068
Remove legacy code 2026-03-09 18:36:04 -07:00
awsr b27c48a3a6
Fix style sorting 2026-03-09 18:35:30 -07:00
Disty0 9fbe70195f SDNQ add 14, 12 and 10 bit support 2026-03-09 23:05:08 +03:00
vladmandic 20e8b8ab18 add upload api endpoint
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-09 16:02:05 +01:00
Vladimir Mandic 9fa6304cbc Merge branch 'dev' of https://github.com/vladmandic/sdnext into dev
Signed-off-by: Vladimir Mandic <57876960+vladmandic@users.noreply.github.com>
2026-03-08 20:17:04 +01:00
Vladimir Mandic 1ff587a191 update changelog
Signed-off-by: Vladimir Mandic <57876960+vladmandic@users.noreply.github.com>
2026-03-08 20:16:09 +01:00
Vladimir Mandic a5fd4ee15b
Merge pull request #4673 from awsr/folderview
Use `wslview` instead of `wsl-open` on WSL
2026-03-08 20:10:41 +01:00
Vladimir Mandic eacd09e09f
Merge pull request #4670 from awsr/subprocess
Update subprocess usage
2026-03-08 20:10:14 +01:00
awsr 61b98de9e2
Keep `wsl-open` as a fallback
Very unlikely to be needed, but just in case...
2026-03-07 14:52:10 -08:00
awsr 609c2bed44
Revert name `sub_run` back to `run` 2026-03-07 13:47:53 -08:00
Vladimir Mandic acab240e3b improve reinstall behavior
Signed-off-by: Vladimir Mandic <57876960+vladmandic@users.noreply.github.com>
2026-03-07 12:49:59 +01:00
awsr 952fdedd73
Use `wslview` on WSL + minor rewrite
`wslview` has been included by default in WSL for a while now.
2026-03-07 01:13:49 -08:00
Vladimir Mandic 020118a89f
Merge pull request #4671 from CalamitousFelicitousness/fix/tagger-batch-upload
Fix tagger batch upload and file list
2026-03-07 08:23:35 +01:00
awsr 7657c5af29
Ensure `shell=True` to work with single-string cmd 2026-03-06 20:24:51 -08:00
CalamitousFelicitousness c68ab0f75e fix(ui): constrain batch file list height in caption tab
Add max-height and overflow-y scroll to batch file upload components
so uploading many files doesn't push the entire UI down.
2026-03-07 02:50:23 +00:00
CalamitousFelicitousness 2f30e466e1 fix(caption): tagger batch only processes first uploaded file
Align tagger batch file collection with the working VQA/OpenCLIP
pattern. The previous implementation used Path wrapping and resolve()
deduplication which broke multi-file uploads from the Gradio File
component. Now all four batch modes (VQA, OpenCLIP, WaifuDiffusion,
DeepBooru) use the same f.name file collection approach.
2026-03-07 02:26:48 +00:00
awsr c2087de473
Fix `sub_run` usage 2026-03-06 03:07:27 -08:00
awsr 1b4a45e2a6
Revert "Avoid using `args` as a variable name"
This reverts commit 7c09e3dfe1.
2026-03-05 20:17:44 -08:00
awsr feffbe0851
Update `subprocess.run` usage 2026-03-05 20:06:09 -08:00
awsr af8622240c
Remove redundant formatting 2026-03-05 19:20:05 -08:00
awsr 61415ca305
Use new `sub_run` function 2026-03-05 19:18:30 -08:00
awsr 3f8812a76f
Shared function for running `subprocess.run` 2026-03-05 18:07:55 -08:00
awsr 7c09e3dfe1
Avoid using `args` as a variable name 2026-03-05 16:16:01 -08:00
vladmandic b2f29911d2 update diffusers and changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-05 17:57:34 +01:00
vladmandic 87cbfc7d39 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-04 17:13:24 +01:00
Vladimir Mandic 045df139c0
Merge pull request #4668 from resonantsky/seedvr-fix-distributed
Fixes for torch distributed errors on SeedVR 3B
2026-03-04 17:10:03 +01:00
vladmandic 7045c26f1b remove some cmd args
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-04 14:56:49 +01:00
resonantsky 3bc75d3832 fixes torch distributed errors on SeedVR 2026-03-04 15:18:17 +02:00
vladmandic f879c2d09a add copilot-instructions
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-04 12:16:06 +01:00
vladmandic eb9d9f6bb0 update diffusers and transformers
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-04 09:51:10 +01:00
vladmandic 0d9f6b98c8 installer handle forks
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-04 09:37:39 +01:00
vladmandic 9df9ed1b05 update gemini models
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-04 07:31:36 +01:00
Vladimir Mandic 540f34e41f
Merge pull request #4667 from liutyi/dev
ShuttleAI covers 4 STEPS re-generated
2026-03-03 13:43:34 +01:00
Oleksandr Liutyi d54bdefc2a ShuttleAI covers 4 STEPS re-generated 2026-03-03 09:41:43 +00:00
vladmandic 04757adc78 lint
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-02 11:09:15 +01:00
vladmandic 1ddd0bf33a add gemini to prompt enhance
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-02 11:01:17 +01:00
vladmandic 5ff73b61a4 add google gemini to captioning
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-02 09:34:40 +01:00
vladmandic 95a8c1125b lint
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-01 18:29:16 +01:00
vladmandic ff4b5c33dc reduce use of python generators with ui
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-01 18:17:42 +01:00
vladmandic 9ad68c2ff4 eliminate possible race conditions during startup
Signed-off-by: vladmandic <mandic00@live.com>
2026-03-01 13:46:05 +01:00
Vladimir Mandic 6c5f7c298a
Merge pull request #4663 from awsr/patch-2
Update PyRight Config
2026-02-28 19:49:35 +01:00
vladmandic 2da67ce7d3 cleanup and fix monitor
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-28 12:31:09 +01:00
Vladimir Mandic 77e639fe3c
Merge pull request #4664 from liutyi/dev
gemini-3.1-flash-image-preview
2026-02-27 15:49:55 +01:00
Oleksandr Liutyi c9918ed59b gemini-3.1-flash-image-preview 2026-02-27 12:49:58 +00:00
vladmandic 403e9c2241 reduce race condition
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-27 12:07:56 +01:00
vladmandic afff46f2ac add google-flash-3.1-image
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-27 10:53:22 +01:00
awsr 543b6802f2
Remove 'extensions-builtin' from extraPaths 2026-02-26 16:39:07 -08:00
awsr 37be4239dc
Update PyRight config
Add extraPaths for scripts, pipelines, and extensions.
2026-02-26 16:00:44 -08:00
vladmandic 9d3e7e7ed1 update changelog 2026-02-26 13:08:44 +01:00
vladmandic 5e572badf7 update 2026-02-26 13:08:06 +01:00
vladmandic d869c700b1 kanvas add paste image from clipboard
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-25 15:57:34 +01:00
vladmandic 6790690ff2 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-24 18:26:04 +01:00
vladmandic a485347896 fix kandinsky5
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-24 18:19:23 +01:00
vladmandic b111e7d782 remove script: xadapter
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-24 18:19:23 +01:00
vladmandic 554c8fbf2f remove model: hdm
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-24 18:19:23 +01:00
Disty0 0160f6b3ef add sdnq variants of pytorch native fp formats too 2026-02-24 20:08:41 +03:00
Disty0 78efbc7e85 update sdnq 2026-02-24 19:47:30 +03:00
Vladimir Mandic 2d9c3275f1 improve ui connection monitor
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-22 17:54:00 +01:00
Vladimir Mandic 8ea9d428d5 remove dwpose
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-22 09:21:24 +01:00
Vladimir Mandic a1d46b3ecd fix images.grid
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-21 15:10:26 +01:00
Vladimir Mandic a96b5234d7 rocm get version exception handler
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-21 14:57:16 +01:00
Vladimir Mandic d79d4edddb add explicit sdnq import
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-21 13:26:20 +00:00
Vladimir Mandic 87e4505acd
Merge pull request #4658 from liutyi/dev
FireRed Edit preview image
2026-02-21 13:43:13 +01:00
Vladimir Mandic c25bc9b4d8 update diffusers
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-21 11:02:02 +01:00
Vladimir Mandic 7ee8c85c46 update pyproject
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-21 10:45:25 +01:00
Vladimir Mandic 9a63ec758a initial pyright lint
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-21 09:32:36 +01:00
Vladimir Mandic 0c9c86c3f9 full switch to insightfacex
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-21 07:12:42 +01:00
Vladimir Mandic 58fe1f59ff add alternative insightfacex 2026-02-20 21:09:43 +01:00
Oleksandr Liutyi 316b940b6b Change Unipic3 CM to Unipic 3 base. Add unipic3 to autodetect patterns. Add preview image 2026-02-20 19:09:24 +00:00
Vladimir Mandic fce682f1d6 update changelog and todo 2026-02-20 20:03:06 +01:00
Oleksandr Liutyi 9de84792b4 FireRed Edit preview image 2026-02-20 17:40:28 +00:00
Vladimir Mandic bd39638df1 fix pydantic 2026-02-20 08:29:52 +01:00
Vladimir Mandic 47543663f9 cleanup references to p.sd_model
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-19 20:48:42 +01:00
Vladimir Mandic 6a72aa8083 explicit gradio requirements
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-19 18:51:43 +01:00
Vladimir Mandic 7db3eac944 reorder first startup 2026-02-19 17:57:45 +01:00
Vladimir Mandic cc8739e2fe gitignore 2026-02-19 17:40:13 +01:00
Vladimir Mandic 49f5a89961 cleanup 2026-02-19 17:39:29 +01:00
Vladimir Mandic f34df6faac fix class overrides 2026-02-19 17:33:01 +01:00
Vladimir Mandic 494e4a7a7b fixes 2026-02-19 16:20:17 +01:00
Vladimir Mandic 4d10449ae1 update state cache 2026-02-19 15:52:56 +01:00
Vladimir Mandic 403441feea update protobuf 2026-02-19 15:40:31 +01:00
Vladimir Mandic f78f0eb4a5 refactor imports 2026-02-19 15:28:24 +01:00
Vladimir Mandic 216558185b update installer usage 2026-02-19 12:21:46 +01:00
Vladimir Mandic 76a20cf43d cleanup 2026-02-19 11:39:03 +01:00
Vladimir Mandic 4006b3e093 pylint 2026-02-19 11:36:20 +01:00
Vladimir Mandic d65a2d1ebc ruff lint 2026-02-19 11:13:44 +01:00
Vladimir Mandic e5c494f999 cleanup logger 2026-02-19 11:09:13 +01:00
Vladimir Mandic 22aa9eab01 cleanup 2026-02-19 10:12:42 +01:00
Vladimir Mandic 2d28e7438c remove normalbae and add state caching 2026-02-19 10:11:25 +01:00
Vladimir Mandic a3074baf8b unified logger 2026-02-19 09:46:42 +01:00
Vladimir Mandic bfe014f5da modernize typing 2026-02-19 09:15:37 +01:00
Vladimir Mandic 7aded79e8a remove imp 2026-02-19 08:35:06 +01:00
Vladimir Mandic e9eadd06db remove dependency on pkg_resources and refactor cmd_args 2026-02-19 08:30:40 +01:00
Vladimir Mandic 6fdd3a53cf reduce mandatory requirements
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-18 17:53:08 +01:00
Vladimir Mandic d6bbfe3dc2 experimental python==3.14 support
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-17 22:08:36 +01:00
Vladimir Mandic ab44e59bd1
Merge pull request #4653 from liutyi/dev
Anima and Unipc 3 DMD preview with metadata
2026-02-17 18:31:08 +01:00
Oleksandr Liutyi 859072c683 Unipic3-DMD preview 2026-02-17 17:12:40 +00:00
Oleksandr Liutyi 84c95442ee Anima preview with metadata 2026-02-17 11:25:54 +00:00
vladmandic e307ef5e1b update todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-17 09:09:25 +01:00
vladmandic 71afd3fb6f handle missing preview
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-17 09:02:42 +01:00
vladmandic 0d0996878d fix ltx2-i2v
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-17 08:50:11 +01:00
vladmandic bcd2e76597 add skywork-unipic3
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-17 08:38:39 +01:00
vladmandic 3dde41faa5 cleanup previews and add firered
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-17 08:19:23 +01:00
vladmandic 73b90c5228 redo all locales
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-14 21:48:06 +01:00
Vladimir Mandic 6876d2b84d
Merge pull request #4649 from awsr/hashing-followup
Hashing fix followup
2026-02-14 11:02:35 +01:00
awsr dd776936d6
Remove previous error handler
- New fallback seems to be more stable than previous tries.
2026-02-13 22:53:53 -08:00
awsr 254198360f
Only add to cache if hash is available 2026-02-13 21:23:55 -08:00
awsr 792d2a4d99
Add fallback counter 2026-02-13 21:23:54 -08:00
awsr 43f134d9f9
Keep error handling within GalleryFile 2026-02-13 21:23:54 -08:00
Vladimir Mandic 2b460dd624
Merge pull request #4646 from awsr/patch-2
Remove debugging console log
2026-02-12 21:38:57 +01:00
awsr bce97efbf8
Remove debugging console log 2026-02-12 12:23:51 -08:00
Vladimir Mandic 82e91439bf update modernui
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-12 11:52:41 +00:00
vladmandic b1679152a0 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-12 12:51:26 +01:00
Vladimir Mandic 31ec4cb6e0
Merge pull request #4644 from awsr/patch-2
Add progress bar fallback if hashing fails
2026-02-12 12:46:29 +01:00
awsr e683884d5f
Move trigger back to correct location 2026-02-12 03:41:44 -08:00
awsr 9f9d67713d
Fix error message display 2026-02-12 03:41:00 -08:00
awsr 6971f3438c
Implement error method for gallery progress
Handle instances when Web Crypto API is not available.
2026-02-12 03:40:02 -08:00
Vladimir Mandic 63c5e493be add software version of sha256
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-12 11:34:28 +00:00
Vladimir Mandic c25c35ebb3 live preview ui sizing
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-12 10:15:30 +00:00
vladmandic ae8a6257c4 typo
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-12 10:37:40 +01:00
vladmandic ccd3e2e489 cleanup settings
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-12 10:30:39 +01:00
vladmandic 88db926ecd remove clip as requirement
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-12 08:40:10 +01:00
vladmandic 3ee816888e reduce logging on prompt apply
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 18:37:35 +01:00
vladmandic cf5e1e0df2 cleanup convert
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 18:09:57 +01:00
vladmandic da1cf2f996 refactor image methods
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 12:29:00 +01:00
vladmandic 0ed64ec195 cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 11:34:40 +01:00
vladmandic 3a4efcc444 update pyproject.toml
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 11:28:01 +01:00
vladmandic 1b4f94660f cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 11:15:59 +01:00
Vladimir Mandic 41f206dec9
Merge pull request #4637 from CalamitousFelicitousness/refactor/remove-face-restoration
Refactor/remove face restoration
2026-02-11 11:12:34 +01:00
vladmandic 78c58e0d70 update precommit
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 11:12:21 +01:00
CalamitousFelicitousness 8563e2a853 refactor: restore codeformer_model.py to avoid merge conflicts 2026-02-11 09:59:55 +00:00
vladmandic b4e5b563c6 update lint rules
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 10:47:07 +01:00
vladmandic 73a5d55022 cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 10:12:37 +01:00
vladmandic 8561da6f8c cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 10:02:41 +01:00
vladmandic 967974ade7 merge cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 09:57:37 +01:00
vladmandic 3ae9909b2a update sharpfin usage
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-11 09:57:37 +01:00
CalamitousFelicitousness dc8ecb0a64 refactor: address remaining PR #4640 review comments
- Remove _get_device_dtype() indirection, inline device/dtype at call sites
- Remove commented-out fallback blocks and try/finally wrappers
- Add modules/sharpfin to ruff and pylint excludes in pyproject.toml
- Fix import ordering in joytag.py and pixelart.py
2026-02-11 09:57:37 +01:00
CalamitousFelicitousness 162651cbdb refactor: address PR #4640 review comments
Changes based on vladmandic and Disty0 feedback:

- Fix logging: use direct `from installer import log` instead of lazy _get_log()
- Remove unused is_available() function
- Remove defensive getattr() calls in _resolve_kernel/_resolve_linearize
- Simplify _get_device_dtype() to use devices module directly
- Refactor to_pil() with single Image.fromarray() call and explicit mode
- Add cross-platform fallback: sharpfin only runs on CUDA, falls back to
  PIL/F.interpolate for other devices (CPU, MPS, OpenVINO)
- Replace lambdas with functools.partial in functional.py for torch.compile safety
- Add modules/sharpfin to pylint ignore-paths (vendored code)
2026-02-11 09:57:37 +01:00
CalamitousFelicitousness 76aa949a26 refactor: integrate sharpfin for high-quality image resize
Vendor sharpfin library (Apache 2.0) and add centralized wrapper
module (images_sharpfin.py) replacing torchvision tensor/PIL
conversion and resize operations throughout the codebase.

- Add modules/sharpfin/ vendored library with MKS2021, Lanczos3,
  Mitchell, Catmull-Rom kernels and optional Triton sparse acceleration
- Add modules/images_sharpfin.py wrapper with to_tensor(), to_pil(),
  pil_to_tensor(), normalize(), resize(), resize_tensor()
- Add resize_quality and resize_linearize_srgb settings
- Add MKS2021 and Lanczos3 upscaler entries
- Replace torchvision.transforms.functional imports across 18 files
- to_pil() auto-detects HWC/BHWC layout, adds .round() before uint8
- Sparse Triton path falls back to dense GPU on compilation failure
- Mixed-axis resize splits into two single-axis scale() calls
- Masks and non-sRGB data always use linearize=False
2026-02-11 09:57:37 +01:00
Vladimir Mandic 2c4d0751d9
Merge pull request #4613 from CalamitousFelicitousness/feat/caption-improvements-v2_backup
Caption system overhaul V2
2026-02-11 09:33:29 +01:00
CalamitousFelicitousness 80014fac7c fix(caption): address PR review feedback
- Remove superfluous SimpleNamespace import in cli/api-caption.py, use Map instead
- Drop _ prefix from internal helper functions in modules/api/caption.py
- Move DeepDanbooru model path to top-level models folder instead of nesting under CLIP
2026-02-11 02:50:06 +00:00
CalamitousFelicitousness 139e331d80 style(caption): fix lint warnings across caption module
- Rename shadowing import in waifudiffusion batch to avoid F823/E0606
- Fix import order in cli/api-caption.py (stdlib before third-party)
- Rename local variable shadowing function name in cli/api-caption.py
- Remove unnecessary global statement in devices.bypass_sdpa_hijacks
2026-02-11 02:50:06 +00:00
CalamitousFelicitousness 8d67debdfd fix(caption): use cache_dir for BLIP and Moondream model downloads
- Add _load_blip_model helper with explicit cache_dir so downloads
  go to hfcache_dir instead of default HF cache
- Pre-load BLIP model/processor before creating Interrogator config
  to control download location and avoid redundant loads
- Set clip_model_path on config for CLIP model cache location
- Add cache_dir to Moondream model and tokenizer loading
2026-02-11 02:50:06 +00:00
CalamitousFelicitousness 6c20e49897 refactor(caption): extract caption API into standalone module
Move all caption/interrogate/tagger/VQA API code out of the monolithic
endpoints.py and models.py into a new self-contained modules/api/caption.py,
following the loras.py / nudenet.py self-registering pattern.

- Move 15 Pydantic models (ReqCaption, ResCaption, ReqVQA, ResVQA,
  ReqTagger, ResTagger, dispatch union types, etc.) from models.py
- Move 11 handler functions from endpoints.py
- Deduplicate ~150 lines via shared _do_openclip, _do_tagger, _do_vqa
  core functions called by both direct and dispatch endpoints
- Add register_api() that registers all 8 caption routes
- Add promptgen field to ResVLMPrompts (bug fix: handler returned it
  but response model silently dropped it)
- Improve all endpoint docstrings and Field descriptions for API docs
2026-02-11 02:50:06 +00:00
CalamitousFelicitousness e2cdbe47fa fix(caption): safetensors-only downloads, model load fixes, UI default, prefill tests
- Add use_safetensors=True to all 16 model from_pretrained calls to
  avoid downloading redundant .bin files alongside safetensors
- Add device property to JoyTag VisionModel so move_model can relocate
  it to CUDA (fixes 'ViT object has no attribute device')
- Fix Pix2Struct dtype mismatch by casting float inputs to model dtype
  while preserving integer tensor types
- Patch AutoConfig.register with exist_ok=True during Ovis loading to
  handle duplicate aimv2 registration on model reload
- Detect Qwen VL fine-tune architecture from config model_type instead
  of repo name, fixing ToriiGate and similar third-party fine-tunes
- Change UI default task from Short Caption to Normal Caption, and
  preserve it on model switch instead of resetting to Use Prompt
- Add dual-prefill testing across 5 VQA test methods using a shared
  _check_prefill helper
- Fix pre-existing ruff W605 in strip_think_xml_tags docstring
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness 57659ab642 fix(caption): set clip_interrogator params on config, not instance
update_caption_params() was setting caption_max_length, chunk_size, and
flavor_intermediate_count on the Interrogator instance, but the library
reads them from self.config. The overrides were silently ignored.
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness 17b03ed8e4 feat(caption): add Florence detection parsing, SDPA bypass, and offload support
- Add parse_florence_detections() and format_florence_response() to
  vqa_detection for handling Florence-2 detection output formats
- Add bypass_sdpa_hijacks() context manager to devices.py for models
  incompatible with SageAttention or other SDPA hijacks
- Add OpenCLIP model offload support when caption_offload is enabled
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness 443a73b740 refactor(caption): code review fixes for offload, inference, and maintainability
Comprehensive review of modules/caption/ addressing memory management,
consistency, and code quality:

Inference correctness:
- Add devices.inference_context() to _qwen(), _smol(), _sa2() handlers
- Remove redundant @torch.no_grad() decorator from joycaption predict()
- Remove dead dtype=torch.bfloat16 kwarg from Florence loader

Memory management:
- Bound moondream3 image cache with LRU eviction (max 8 entries)
- Replace fragile id(image) cache keys with content-based md5 hash
- Add devices.torch_gc() after model loading in deepseek
- Move deepbooru model to CPU before dropping reference on unload
- Add external handler delegation to VQA.unload() (moondream3,
  joycaption, joytag, deepseek)
- Protect batch offload mutation with try/finally

Code deduplication:
- Extract strip_think_xml_tags() shared helper for Qwen/Gemma/SmolVLM
- Extract save_tags_to_file() into tagger.py from deepbooru and
  waifudiffusion

Documentation and clarity:
- Document deepseek global monkey-patches (LlamaFlashAttention2, attrdict)
- Document Florence task="task" as intentional design choice
- Add vendored-code comment to joytag.py
- Document openclip direct .to() usage vs sd_models.move_model
- Comment model.eval() calls that are required (trust_remote_code,
  custom loaders) vs removed where redundant (standard from_pretrained)

API robustness:
- Add HTTP 422 error response for VQA caption error strings in API
  endpoints (post_vqa, _dispatch_vlm)
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness bf7a72f12e fix(caption): remove dead min_length param, split Florence/PromptGen prompts, fix gaze detection
- Remove caption_openclip_min_length from settings, API models, endpoints, and UI
  (clip_interrogator library has no min_length support; parameter was never functional)
- Split vlm_prompts_florence into base Florence prompts and PromptGen-only prompts
  (GENERATE_TAGS, Analyze, Mixed Caption require MiaoshouAI PromptGen fine-tune)
- Add 'promptgen' category to /vqa/prompts API endpoint
- Fix gaze detection: move DETECT_GAZE check before generic 'detect ' prefix
  to prevent "Detect Gaze" matching as detect target="Gaze"
- Update test suite: remove min_length tests, fix min_flavors to use mode='best',
  add acceptance-only notes, fix thinking trace detection, improve bracket/OCR tests,
  split Florence/PromptGen test coverage
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness fba942b25e feat(caption): add debug logging for Florence-2 handler 2026-02-11 02:48:11 +00:00
CalamitousFelicitousness 0c45e58e80 docs: update localization and README for caption module
- Update html/locale_en.json with caption-related strings
- Update README.md documentation
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness 588222f2d1 test: update caption API tests
Update cli/test-caption-api.py:
- Update test structure for new caption API endpoints
- Fix Moondream gaze detection test prompt to use 'Detect Gaze'
  instead of 'Where is the person looking?' to match handler trigger
- Improve test result categorization and tracking
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness d78c5c1cd0 refactor: update CLI tools for caption module
- Rename cli/api-interrogate.py to cli/api-caption.py
- Update cli/options.py, cli/process.py for new module paths
- Update cli/test-tagger.py for caption module imports
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness f4b5abde68 refactor: update API for caption module
Update API endpoints and models for caption module rename:
- modules/api/api.py - update imports and endpoint handlers
- modules/api/endpoints.py - update endpoint definitions
- modules/api/models.py - update request/response models
2026-02-11 02:48:11 +00:00
CalamitousFelicitousness 61b031ada5 refactor: update imports for caption module rename
Update all imports from modules.interrogate to modules.caption across:
- modules/shared.py, modules/shared_legacy.py
- modules/ui_caption.py, modules/ui_common.py
- modules/ui_control.py, modules/ui_control_helpers.py
- modules/ui_img2img.py, modules/ui_sections.py
- modules/ui_symbols.py, modules/ui_video_vlm.py
2026-02-11 02:47:41 +00:00
CalamitousFelicitousness 5183ebec58 refactor: rename interrogate module to caption
Move all caption-related modules from modules/interrogate/ to modules/caption/
for better naming consistency:
- Rename deepbooru, deepseek, joycaption, joytag, moondream3, openclip, tagger,
  vqa, vqa_detection, waifudiffusion modules
- Add new caption.py dispatcher module
- Remove old interrogate.py (functionality moved to caption.py)
2026-02-11 02:47:41 +00:00
CalamitousFelicitousness 83fa8e39ba refactor(api): update cli tools for DeepBooru tagger migration
- Update cli/api-interrogate.py to use /sdapi/v1/tagger for DeepBooru
- Handle tagger response format (scores dict or tags string)
- Remove DeepBooru test from interrogate endpoint tests
- Update API model descriptions to reference tagger for anime tagging
2026-02-11 02:47:41 +00:00
CalamitousFelicitousness 7825f44581 refactor(api): remove DeepBooru from interrogate endpoint
DeepBooru/DeepDanbooru should only be accessed via the tagger endpoint.
The interrogate endpoint is now exclusively for OpenCLIP/BLIP.

- Remove DeepDanbooru handling from post_interrogate
- Update docstring to reference tagger endpoint for anime tagging
- Simplify code by removing if/else branching
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness 0559651b1b fix(vqa): fix infinite recursion and Florence-2 generation
- Fix get_keep_thinking() infinite recursion (was calling itself)
- Fix get_keep_prefill() infinite recursion (was calling itself)
- Fix Florence-2 to use beam search instead of sampling
  Sampling causes probability tensor errors with Florence-2
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness 3208067259 test(api): improve caption API test coverage and validation
Add model architecture coverage tests:
- VQA model family detection for 19 architectures
- Florence special prompts test (<OD>, <OCR>, <CAPTION>, etc.)
- Moondream detection features test
- VQA architecture capabilities test
- Tagger model types and WD version comparison tests

Improve test validation:
- Add is_meaningful_answer() to reject responses like "."
- Verify parameters have actual effect (not just accepted)
- Show actual output traces in PASS/FAIL messages
- Fix prefill tests to verify keep_prefill behavior

Add configurable timeout:
- Default timeout increased to 300s for slow models
- Add --timeout CLI argument for customization

Other improvements:
- Add JoyCaption to recognized model families
- Reduce BLIP models to avoid reloading large models
- Better detection result validation for annotated images
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness a04ba1e482 feat(api): add missing caption API parameters for UI parity
Add prompt field to VQA endpoint and advanced settings to OpenCLIP endpoint
to achieve full parity between UI and API capabilities.

VLM endpoint changes:
- Add prompt field for custom text input (required for 'Use Prompt' task)
- Pass prompt to vqa.interrogate instead of hardcoded empty string

OpenCLIP endpoint changes:
- Add 7 optional per-request override fields: min_length, max_length,
  chunk_size, min_flavors, max_flavors, flavor_count, num_beams
- Add get_clip_setting() helper for override support in openclip.py
- Apply overrides via update_interrogate_params() before interrogation

All new fields are optional with None defaults for backwards compatibility.
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness 5fc46c042e docs(api): synchronize API descriptions with UI hints
Update API model field descriptions to match the hints in locale_en.json
for consistency between UI and API documentation.

Updated models:
- ReqInterrogate: clip_model, blip_model, mode
- ReqVQA: model, question, system
- ReqTagger: model, threshold, character_threshold, max_tags,
  include_rating, sort_alpha, use_spaces, escape_brackets,
  exclude_tags, show_scores
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness f431141d2f feat(api): add LLM generation parameters to VQA endpoint
Add optional LLM generation parameters to the VQA API request model,
allowing per-request override of settings:

- max_tokens, temperature, top_k, top_p, num_beams, do_sample
- thinking_mode, prefill, keep_thinking, keep_prefill

Changes:
- Add 10 new optional fields to ReqVQA model with descriptive docs
- Update get_kwargs() to support per-request overrides via singleton
- Add helper functions get_keep_thinking(), get_keep_prefill()
- Update post_vqa endpoint to pass generation kwargs
- Add _generation_overrides instance variable to VQA class
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness f3c4fae440 test(api): add caption API test suite
Comprehensive test script for all Caption API endpoints:
- GET/POST /sdapi/v1/interrogate (OpenCLiP/DeepBooru)
- POST /sdapi/v1/vqa (VLM captioning)
- GET /sdapi/v1/vqa/models, /sdapi/v1/vqa/prompts
- POST /sdapi/v1/tagger
- GET /sdapi/v1/tagger/models

Usage: python cli/test-caption-api.py [--url URL] [--image PATH]
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness ef797169a3 refactor(interrogate): use configurable clip_models_path
- Remove unused paths import from deepbooru.py and openclip.py
- Use shared.opts.clip_models_path instead of hardcoded paths
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness ec7934799e feat(api): add caption API endpoints and documentation
Add comprehensive caption/interrogate API with documentation:

- GET /sdapi/v1/interrogate: List available interrogation models
- POST /sdapi/v1/interrogate: Interrogate with OpenCLIP/BLIP/DeepDanbooru
- POST /sdapi/v1/vqa: Caption with Vision-Language Models (VLM)
- GET /sdapi/v1/vqa: List available VLM models
- POST /sdapi/v1/vqa/batch: Batch caption multiple images
- POST /sdapi/v1/tagger: Tag images with WaifuDiffusion/DeepBooru

Updates:
- Add detailed docstrings with usage examples
- Fix analyze_image response parsing for Gradio update dicts
- Add request/response models for all endpoints
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness 6b89cc8463 feat(ui): add tooltips/hints to Caption tab
Add comprehensive tooltips to Caption tab UI elements in locale_en.json:

- Add new "llm" section for shared LLM/VLM parameters:
  System prompt, Prefill, Top-K, Top-P, Temperature, Num Beams,
  Use Samplers, Thinking Mode, Keep Thinking Trace, Keep Prefill

- Add new "caption" section for caption-specific settings:
  VLM, OpenCLiP, Tagger tab labels and all their parameters
  including thresholds, tag formatting, batch options

- Consolidate accordion labels in ui_caption.py:
  "Caption: Advanced Options" and "Caption: Batch" shared across
  VLM, OpenCLiP, and Tagger tabs (localized to "Advanced Options"
  and "Batch" in UI)

- Remove duplicate entries from missing section
2026-02-11 02:47:40 +00:00
CalamitousFelicitousness 385532154f Merge remote-tracking branch 'origin/dev' into refactor/remove-face-restoration
# Conflicts:
#	.pylintrc
#	.ruff.toml
2026-02-10 14:38:14 +00:00
CalamitousFelicitousness bc66d8aff8
Merge pull request #1 from CalamitousFelicitousness/refactor/remove-face-restoration-review
refactor: address PR #4637 review comments
2026-02-10 14:29:25 +00:00
CalamitousFelicitousness fe0fba0884 refactor: address PR #4637 review comments
- Remove modules/facelib from .ruff.toml and .pylintrc exclusions
  (folder was deleted, no longer needs to be excluded)
- Fix sdnext-modernui submodule pointer to match origin/dev
  (was accidentally rolled back 6 commits in original PR)
2026-02-10 14:25:54 +00:00
vladmandic 7eb9b1cc5c create tests folder
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-10 14:31:53 +01:00
vladmandic d602a093fb lint
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-10 13:54:13 +01:00
vladmandic bd61633e14 switch to pyproject.toml for tool config
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-10 13:51:51 +01:00
vladmandic 684d77d871 update diffusers
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-10 11:49:01 +01:00
vladmandic e907a0a573 update graphics
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-09 22:46:32 +01:00
vladmandic 363cb175aa allow different lora in hires
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-09 22:31:00 +01:00
vladmandic 42d8ad498e add ftfy
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-09 19:54:26 +01:00
Vladimir Mandic 4e7b5c0b70
Merge pull request #4638 from vladmandic/revert-4629-public-re-export
Revert "Mark public re-exports"
2026-02-09 18:30:46 +01:00
Vladimir Mandic e3ca883cbd
Revert "Mark public re-exports" 2026-02-09 18:30:18 +01:00
vladmandic 0d2e9fbf62 cleanup and update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-09 18:20:10 +01:00
Vladimir Mandic d0f9e25906
Merge pull request #4634 from CalamitousFelicitousness/nunchaku-reference
Nunchaku reference
2026-02-09 18:06:34 +01:00
Vladimir Mandic 480b58e994
Merge pull request #4636 from CalamitousFelicitousness/fix/installer-uv-clip
fix(installer): handle setuptools 82 removing pkg_resources and uv broken fallback
2026-02-09 17:52:02 +01:00
Vladimir Mandic b454fa9748
Merge pull request #4633 from awsr/patch-2
Linting rules: TCH -> TC
2026-02-09 17:50:58 +01:00
Vladimir Mandic 175771666b
Merge pull request #4632 from awsr/patch-1
Add call to initGalleryAutoRefresh
2026-02-09 17:50:39 +01:00
CalamitousFelicitousness 54c18d3f32 refactor: convert XYZ grid detailer option to boolean dropdown
- Change AxisOption type from str to bool with [False, True] choices
- Simplify apply_detailer() to accept bool directly
- Fix log message from "face-restore" to "detailer"
2026-02-09 02:16:24 +00:00
CalamitousFelicitousness 4162fd84db fix(installer): handle setuptools 82 removing pkg_resources and uv broken fallback
- Build CLIP with --no-build-isolation to use venv's setuptools 69.5.1
  instead of pip pulling setuptools 82.0.0 (which removed pkg_resources)
  into an isolated build environment
- Add cleanup_broken_packages() to remove dist-info directories with
  missing RECORD files before falling back from uv to pip, preventing
  cascading install failures when uv partially installs packages
- Add no_build_isolation parameter to install() function
2026-02-09 01:38:44 +00:00
CalamitousFelicitousness d426502d44 docs: remove face restoration from UI, licenses, and config
- Remove GFPGAN and CodeFormer sections from Modern UI extras template
- Remove CodeFormer S-Lab license block from licenses.html
- Update Postprocessing hint in locale_en.json
- Remove completed TODO items for CodeFormer/GFPGAN removal
2026-02-08 23:00:51 +00:00
CalamitousFelicitousness 93f8f66305 refactor: remove GFPGAN install, CLI args, and model migration
- Remove GFPGAN pip install from installer.py optional requirements
- Remove 'gfpgan' from modules_to_remove cleanup list in launch.py
- Remove --codeformer-models-path and --gfpgan-models-path CLI args
- Remove GFPGAN model directory migration from modelloader.py
2026-02-08 23:00:22 +00:00
CalamitousFelicitousness 3d0edb4f8f refactor: remove face restoration from CLI tools and XYZ grid
- Remove gfpgan/codeformer face template lines from cli/generate.py
- Remove gfpgan_visibility, codeformer_visibility, codeformer_weight
  from cli/generate.json upscale config
- Simplify cli/process.py upscale_restore_image() to remove the
  restore path and codeformer parameters
- Remove codeformer/gfpgan special cases from xyz_grid_shared.py
  apply_detailer(), keep generic boolean parsing
- Remove p.restore_faces assignment from xyz_grid_on.py
2026-02-08 23:00:05 +00:00
CalamitousFelicitousness 356505cab2 refactor: remove ONNX face upscaler support from detailer
- Remove codeformer, restoreformer, GFPGANv1.4, and GPEN-BFR ONNX
  model URLs from the predefined list
- Remove the .fp16 ONNX restorer code path that bypassed detailer
  processing to run face restoration directly
2026-02-08 22:59:45 +00:00
CalamitousFelicitousness 8d764951cf refactor(api): remove face restoration endpoints and parameters
- Remove /sdapi/v1/face-restorers route from api.py
- Remove get_restorers() function from endpoints.py
- Remove gfpgan_visibility, codeformer_visibility, codeformer_weight
  fields from ReqProcess model
- Remove GFPGAN and CodeFormer entries from run_extras() signature
  and create_args_for_run dict in postprocessing.py
2026-02-08 22:59:28 +00:00
CalamitousFelicitousness d01f45519f refactor: remove face restoration from processing pipeline
- Remove CodeFormer/GFPGAN import and setup from webui.py initialize()
- Remove face_restorers list, codeformer/gfpgan model path settings,
  and face restore UI settings section from shared.py
- Remove restore_faces parameter from StableDiffusionProcessing
- Remove face_restoration import and restore_faces processing block
  from processing.py
2026-02-08 22:59:00 +00:00
CalamitousFelicitousness 1e23495039 refactor: delete CodeFormer, GFPGAN, and face restoration modules
Remove all vendored face restoration code that is no longer maintained:

- modules/postprocess/codeformer_model.py, codeformer_arch.py, vqgan_arch.py
- modules/postprocess/gfpgan_model.py, restorer.py
- modules/face_restoration.py (base class and dispatcher)
- scripts/postprocessing_codeformer.py, postprocessing_gfpgan.py
- modules/facelib/ (vendored face detection/parsing library)

These were the only two backends registered in shared.face_restorers,
making the entire face restoration infrastructure dead code.
2026-02-08 22:58:33 +00:00
CalamitousFelicitousness 34a18c9098 fix: skip Nunchaku offloading for SDXL models
Nunchaku's SDXL UNet does not support offloading and raises
NotImplementedError when offload=True is passed. Skip the parameter
for SDXL and log a warning instead of crashing.
2026-02-07 22:27:05 +00:00
CalamitousFelicitousness 5000401647 docs(ui): add tooltips for Nunchaku attention and offload settings 2026-02-07 22:27:05 +00:00
CalamitousFelicitousness 33de04a0c7 feat: add 4-step Nunchaku variants for Qwen-Lightning models
Add 4-step distilled Nunchaku SVDQuant entries for Qwen-Lightning and
Qwen-Lightning-Edit alongside the existing 8-step variants. Step count
is now shown in the reference name (e.g. "Qwen-Lightning (4-step)").

- Add subfolder parameter to load_qwen_nunchaku to distinguish
  4-step (nunchaku-4step) from 8-step (nunchaku) variants
- Route to correct safetensors: lightningv1.0-4steps vs
  lightningv1.1-8steps for gen, lightningv1.0-4steps vs
  lightningv1.0-8steps for edit
- Strip nunchaku subfolder before pipeline from_pretrained since
  it does not exist in the base HuggingFace repos
2026-02-07 22:27:05 +00:00
CalamitousFelicitousness c8597ca84e feat: hide Nunchaku reference models on non-CUDA backends
Filter out reference entries tagged "nunchaku" from Extra Networks
when the active backend is not CUDA, since Nunchaku requires NVIDIA
GPUs. Entries remain in shared.reference_models for programmatic
lookup but are not yielded to the UI.
2026-02-07 22:27:05 +00:00
CalamitousFelicitousness a2ee885e28 refactor: update nunchaku repo URLs and version handling
- Rename HuggingFace org from nunchaku-tech to nunchaku-ai across all
  nunchaku model repos (flux, sdxl, sana, z-image, qwen, t5)
- Add per-torch-version nunchaku version mapping instead of single global
  version, with robust torch version parsing
2026-02-07 22:27:05 +00:00
CalamitousFelicitousness 8ff7074da5 feat: add Nunchaku variants for Fill and Depth in Flux Tools
- Add 'Fill (Nunchaku)' and 'Depth (Nunchaku)' options to Flux Tools
  dropdown, loading models with +nunchaku suffix for SVDQuant quantization
- Mark Fill and Depth nunchaku reference entries as hidden so they remain
  available for check_nunchaku() lookup but don't appear in Extra Networks
- Filter hidden reference models in ui_extra_networks_checkpoints
2026-02-07 22:27:05 +00:00
CalamitousFelicitousness 935a4fcb03 feat: add Nunchaku group to reference
Replace manual Model/TE checkboxes in Quantization Settings with a
dedicated "Nunchaku" tab in the Extra Networks menu where users can
directly select nunchaku-quantized model variants. Detection is now
using a +nunchaku path marker for disambiguation.
2026-02-07 22:27:05 +00:00
awsr 3ba1cfb540
Fix typo 2026-02-07 14:25:02 -08:00
awsr 89dd406a1d
Add call to initGalleryAutoRefresh 2026-02-07 12:14:02 -08:00
Vladimir Mandic bf1e763156 add attention benchmark
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-07 13:37:09 +00:00
Vladimir Mandic c9e21a51db
Merge pull request #4631 from vladmandic/dev
merge dev
2026-02-07 13:10:52 +01:00
Vladimir Mandic 3aac1f6510
Merge branch 'master' into dev 2026-02-07 13:10:43 +01:00
Vladimir Mandic d8362182bc
Merge pull request #4629 from awsr/public-re-export
Mark public re-exports
2026-02-07 13:10:02 +01:00
Vladimir Mandic bf36047ca6
Merge pull request #4630 from Tillerz/dev
test script for (un)weighted wildcards
2026-02-07 13:09:27 +01:00
vladmandic 38e52b8570 update modernui submodule
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-07 13:07:55 +01:00
Vladimir Mandic a0f9447d04 add --remote cmd opt
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-07 10:17:32 +00:00
Vladimir Mandic e8ff09a2d2 fix lora unload and improve preview error handler
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-02-07 09:07:34 +00:00
Oliver Hertel 9ebd05dc7b test file for weighted lists 2026-02-07 09:57:19 +01:00
Vladimir Mandic 04d7dbc1b8
update model template 2026-02-07 09:16:56 +01:00
Vladimir Mandic 56d0aade56
update gh templates 2026-02-07 08:05:06 +01:00
awsr e199f2d351
Update `images.py` exports 2026-02-06 14:29:46 -08:00
awsr c288f0de14
Explicitly mark additional items as re-exported 2026-02-06 14:16:46 -08:00
awsr 8e4aa8dbe1
Add comment 2026-02-06 13:42:37 -08:00
awsr 1e668fe86d
Mark public re-exports
See: https://typing.python.org/en/latest/spec/distributing.html#import-conventions
2026-02-06 13:28:21 -08:00
Vladimir Mandic 5e2ab3057f
Merge pull request #4627 from vladmandic/master
refresh dev
2026-02-06 14:16:01 +01:00
Vladimir Mandic 6eb1d0a2bf
Merge pull request #4626 from vladmandic/dev
merge dev
2026-02-06 14:15:10 +01:00
vladmandic ef75acffb4 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-06 14:11:46 +01:00
Vladimir Mandic 4db4ff00ca
Merge pull request #4625 from awsr/gallery-auto-refresh
Gallery: Add auto-update setting and functionality
2026-02-06 13:07:41 +01:00
Vladimir Mandic 54fac3090c
Merge pull request #4624 from awsr/subfolder-fix
Gallery: Restore subfolder handling and fixes
2026-02-06 13:06:54 +01:00
awsr ade7c2e5f9
Add auto-update setting and functionality 2026-02-06 00:50:04 -08:00
awsr f84cb6ac64
Track active gallery element 2026-02-06 00:44:48 -08:00
awsr 171ead0fa2
Auto-select current folder after refresh 2026-02-06 00:43:58 -08:00
awsr 0c0911eddc
Adjust click handlers for `GalleryFolder` 2026-02-06 00:43:03 -08:00
awsr 1696d0cd29
Update monitored options 2026-02-05 16:54:23 -08:00
awsr 8bfa612902
Fix typo 2026-02-05 16:43:37 -08:00
awsr d7da93e814
Remove redundant code...
- `src` is now normalized in advance.
- There's no ending `/` to remove because it's a file.
2026-02-05 16:25:11 -08:00
awsr 6d30df7ed6
Adjust input normalization 2026-02-05 15:55:18 -08:00
awsr 137504de36
Remove extra type checking...
- JSDoc should automatically apply the types to the variables/parameters in the IDE to provide a warning when the wrong value is being sent.
2026-02-05 15:18:07 -08:00
awsr f4bb78b51c
Update types in JSDoc 2026-02-05 15:16:13 -08:00
awsr e7d382dc29
Restore saving full folder path to database 2026-02-05 15:15:33 -08:00
awsr 6520784487
Fix recursive folder cleanup 2026-02-05 15:11:23 -08:00
vladmandic 339dff59f8 update diffusers
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 17:04:49 +01:00
vladmandic 40cbd33cbd add CTD-NT64Dark theme
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 16:57:30 +01:00
vladmandic 059cbaf470 update modernui
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 16:55:21 +01:00
vladmandic 9df9b84752 fix anima
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 16:55:06 +01:00
vladmandic dd80e15cfd add RealPLKSR NomosWebPhoto and AnimeSharpV2 using spandrel engine
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 14:06:17 +01:00
vladmandic e5ebc4e5a2 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 12:14:09 +01:00
vladmandic 3860737df7 update modernui
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 11:21:59 +01:00
vladmandic 59654d68ea add hqx and icb interpolations
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 11:21:17 +01:00
vladmandic 605d87cb2d reorg cli
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 10:33:42 +01:00
vladmandic 5009b70ed8 fix anima model detection
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 10:25:58 +01:00
vladmandic 2d6cc5addb metadata restore to always-on scrips
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-05 10:21:49 +01:00
Vladimir Mandic c3c3930cce
Merge pull request #4621 from Tillerz/dev
weighted wildcards: corrections after automated tests
2026-02-05 10:20:45 +01:00
Oliver Hertel a0c7df892c weighted wildcards: corrections after automated tests 2026-02-04 19:11:05 +01:00
Vladimir Mandic 0587a600c8
Merge pull request #4620 from vladmandic/master
refresh dev
2026-02-04 15:06:33 +01:00
Vladimir Mandic 0d240b1a8f
Merge pull request #4618 from vladmandic/dev
merge dev
2026-02-04 15:05:58 +01:00
vladmandic d3dff5df15 one-more-offload
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 15:05:22 +01:00
vladmandic 05df49a3cc update submodules
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 14:46:34 +01:00
Vladimir Mandic fe96285635
cleanup 2026-02-04 14:34:25 +01:00
vladmandic 2ec79a1807 update changelog and todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 14:10:17 +01:00
vladmandic be019a3b4a update todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 13:47:25 +01:00
vladmandic b9f1acdbc2 add scheduler class to image metadata
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 13:20:26 +01:00
vladmandic 2c80557d2c update todo
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 13:11:08 +01:00
vladmandic d9a2a21c8c add sampler api endpoints
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 13:08:31 +01:00
vladmandic d7ca4f63a7 update schedulers and lint everything
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-04 11:58:02 +01:00
Disty0 f439d51ea7 SDNQ update CosmosTransformer3DModel keys 2026-02-04 10:19:23 +03:00
Vladimir Mandic bf1414385f
Merge pull request #4616 from awsr/gallery-fix
Gallery fix
2026-02-04 07:45:18 +01:00
awsr c4de8fb1cc
Do not make changes to the index's primary key
- Values should not be modified in `indexdb.js`
2026-02-03 13:35:50 -08:00
awsr 915bcab3c2
Fix incorrect data handling
Partial reversion of commit c07eddb58d
2026-02-03 13:35:50 -08:00
Disty0 df30ba28ac SDNQ clamp weight_std and add CosmosTransformer3DModel keys 2026-02-04 00:31:00 +03:00
vladmandic 40df9ce689 fix wiki links
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-03 13:22:11 +01:00
vladmandic 4f7555d9e1 update schedulers
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-03 13:12:12 +01:00
Disty0 ced81d630d cleanup 2026-02-02 20:30:52 +03:00
Disty0 90cf83b90e update sdnq 2026-02-02 20:22:29 +03:00
vladmandic 4b3f395cdb update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-02-02 07:45:37 +01:00
Vladimir Mandic dd1704075c
Merge pull request #4612 from CalamitousFelicitousness/feat/anima-pipeline
Feat/anima pipeline
2026-02-02 07:43:57 +01:00
Seunghoon Lee 0920492294
update therock sources 2026-02-02 12:28:43 +09:00
CalamitousFelicitousness 4ba913e072 fix: Anima pipeline detection, custom module loading, and model type
- Relax sd_detect to match 'anima' without requiring 'cosmos' in name
- Use hf_hub_download for custom pipeline.py and adapter modules
- Register custom modules in sys.modules for Diffusers trust_remote_code
- Pass trust_remote_code=True to from_pretrained
- Map AnimaTextToImage to 'cosmos' model type for TAESD preview support
2026-02-02 00:44:51 +00:00
CalamitousFelicitousness a23c7d5733 feat: add Anima to community reference models
Add Anima (Cosmos-Predict-2B variant) to the Extra Networks community
tab with preview image so users can discover and download it.
2026-02-02 00:44:51 +00:00
CalamitousFelicitousness af9fe036a3 feat: add Anima (Cosmos-Predict-2B variant) pipeline support
Anima replaces the Cosmos T5-11B text encoder with Qwen3-0.6B + a
6-layer LLM adapter and uses CONST preconditioning instead of EDM.

- Add pipelines/model_anima.py loader with dynamic import of custom
  AnimaTextToImagePipeline and AnimaLLMAdapter from model repo
- Register 'Anima' pipeline in shared_items.py
- Add name-based detection in sd_detect.py
- Fix list-format _class_name handling in guess_by_diffusers()
- Wire loader in sd_models.py load_diffuser_force()
- Skip noise_pred callback injection for Anima (uses velocity instead)
- Add output_type='np' override in processing_args.py
2026-02-02 00:44:51 +00:00
Vladimir Mandic e03ce70082
Merge pull request #4611 from awsr/custom-element-refactor
Gallery custom elements update
2026-02-01 07:59:39 +01:00
awsr a3ad11ef93
Reorganize functions 2026-01-31 22:01:11 -08:00
Vladimir Mandic f97edb9950 res4lyf flow prediction
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-01-31 13:55:42 +00:00
Vladimir Mandic 8cbd5afb98 update sampler definitions
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-01-31 13:16:32 +00:00
Vladimir Mandic 1d369b032c res4lyf epsilon validated
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-01-31 12:37:17 +00:00
Vladimir Mandic 20aeb8b793 /sdapi/v1/xyz-grid
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-01-31 11:04:50 +00:00
Vladimir Mandic f5630fdf63 fix typo
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-01-31 10:30:46 +00:00
Vladimir Mandic 7eb776a594 update res4lyf
Signed-off-by: Vladimir Mandic <mandic00@live.com>
2026-01-31 10:18:39 +00:00
Vladimir Mandic 504e0cbbdd
Merge pull request #4610 from awsr/gallery-folder-updates
Simplify gallery folder updating
2026-01-31 08:08:35 +01:00
Vladimir Mandic ee8bd982e5
Merge pull request #4609 from awsr/awsr-patch-2
Fix modern gallery hover CSS
2026-01-31 08:07:33 +01:00
Vladimir Mandic 4cf899b3c0
Merge pull request #4608 from awsr/awsr-patch-1
Fix folder cleanup
2026-01-31 08:06:33 +01:00
awsr d2f0ca39de
Update custom elements
- Update known element when setting selected folder.
- Prevent re-trigger of `connectedCallback` when node is just being moved.
2026-01-30 22:53:15 -08:00
awsr 695e949627
Move content clear to avoid layout flash 2026-01-30 22:20:50 -08:00
awsr b4919f9960
Simplify folder updating 2026-01-30 17:42:31 -08:00
awsr c0b5858697
Revert one property that didn't need to be redeclared 2026-01-30 16:26:43 -08:00
awsr 682bbc3ccf
Fix gallery hover CSS 2026-01-30 16:18:58 -08:00
awsr 9caab3d6cd
Move manual folder cleanup function to inline
This keeps everything within the `addCacheClearLabel` function.
2026-01-30 14:03:25 -08:00
awsr c3e915badd
Fix folder cleanup 2026-01-30 13:27:23 -08:00
vladmandic cc03ebc584 move vae to subfolder
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-30 11:34:25 +01:00
Vladimir Mandic bb188314b0
Merge pull request #4606 from awsr/ui-connection-monitor
Fix + refactor connection monitor
2026-01-30 10:27:27 +01:00
Vladimir Mandic 8bc48c5c5b
Merge pull request #4605 from crashingalexsan/dev
[ROCM] Expand available gfx archs
2026-01-30 10:26:16 +01:00
awsr 9dc536b25b
Minor consolidation 2026-01-30 00:46:42 -08:00
awsr 2aa5820dea
Fix model not updating + refactor 2026-01-30 00:33:49 -08:00
Crashingalexsan 5465ba2279 Just Update 2 RDNA gfx archs 2026-01-30 02:26:07 -06:00
Crashingalexsan 867354bd29 [ROCM] Expand available gfx archs 2026-01-30 02:13:36 -06:00
Vladimir Mandic 900d567f59
Merge pull request #4602 from awsr/thumbnail-clear2
Thumbnail cache management part 2
2026-01-29 17:21:18 +01:00
awsr a8211bec84
Remove redundant catch/abort 2026-01-29 02:42:50 -08:00
awsr a74b1f53a9
Fix standalone AbortSignal 2026-01-29 02:19:27 -08:00
awsr 9e9e1e2236
Minor updates
- Update post-cleanup behavior for `thumbCacheCleanup`
- Add timing info to `clearCacheIfDisabled` log
- Improve visibility of cleanup message during cache clear
2026-01-28 20:51:58 -08:00
awsr 2925577ec2
Ensure message clear function always runs 2026-01-28 20:43:00 -08:00
awsr c25b7ac58f
Clear cache when it is disabled 2026-01-28 20:37:14 -08:00
awsr fa0670fcd9
Block maintenanceQueue until cache is ready 2026-01-28 20:34:09 -08:00
awsr 9c1f317980
Rename `"abortHandler" to "abortLogger" 2026-01-28 13:32:37 -08:00
vladmandic 58351b1f53 fix metadata save and temp file handler
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-28 19:28:49 +01:00
vladmandic ccff480d24 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-28 14:02:09 +01:00
vladmandic 8e3671c169 linting
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-28 13:50:52 +01:00
vladmandic 1629c21452 second phase of res4lyf
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-28 13:29:23 +01:00
vladmandic 8f0e46516d fix framepack video save
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-28 09:47:17 +01:00
vladmandic 264a9f02d7 preview: res4lyf reimplemented
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-28 09:23:49 +01:00
Vladimir Mandic 575c147ab4
Merge pull request #4601 from crashingalexsan/dev
[MIOPEN] Set MIOPEN_FIND_MODE 2 & Re enable GFX1200
2026-01-28 07:52:46 +01:00
Alejandro Alberto Aguilar Morales 668600cd69
Merge branch 'vladmandic:dev' into dev 2026-01-27 17:35:19 -06:00
Vladimir Mandic 8e227a1863
Merge pull request #4600 from liutyi/dev
Z-Image reference image
2026-01-28 00:28:09 +01:00
Crashingalexsan eeb176c0d0 [MIOPEN} Set MIOPEN_FIND_MODE 2 & enable GFX1200 2026-01-27 16:40:27 -06:00
Oleksandr Liutyi a0f5c064e2 Z-Image Turbo move back to reference from distilled 2026-01-27 22:39:17 +00:00
awsr 93fc65b2ea
Allow addition to monitored options 2026-01-27 13:55:16 -08:00
awsr 3ca4ebf2d0
Minor updates 2026-01-27 13:51:47 -08:00
awsr 2cb68b7432
Reusable IDB transaction configuration + update
- Use standard DOMException when rejecting
2026-01-27 13:41:53 -08:00
awsr ef416f9628
Move gallery reset steps into their own function 2026-01-27 13:32:06 -08:00
awsr b0cd31a0cb
Formatting and names 2026-01-27 13:29:48 -08:00
awsr 22240b93b5
Abort handling helper in SimpleFunctionQueue 2026-01-27 13:26:14 -08:00
awsr a89d97a1f3
Simplify message clearing 2026-01-27 13:23:33 -08:00
Oleksandr Liutyi b15f319195 Z-Image reference image 2026-01-27 20:02:41 +00:00
vladmandic df3ff41ebb z-image base
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-27 20:06:48 +01:00
Vladimir Mandic 1003074144
Merge pull request #4599 from CalamitousFelicitousness/feat/add-z-image-reference
feat: add Z-Image base model to reference models
2026-01-27 17:38:32 +01:00
CalamitousFelicitousness 4edf742c21 feat: add Z-Image base model to reference models
Add Tongyi-MAI/Z-Image alongside the existing Z-Image-Turbo entry.
Z-Image is the undistilled foundation model with full CFG support,
recommended at cfg_scale 4.0 and 50 steps.
2026-01-27 16:17:13 +00:00
Disty0 727fd92d76 Re-update ROCm / Linux to Torch 2.10 2026-01-27 16:07:20 +03:00
vladmandic 7ce0cc2520 update cuda nightly
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-27 10:02:45 +01:00
vladmandic f47c7d17af add CogXDDIM, DDIMParallel, DDPMParallel
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-27 09:46:31 +01:00
Vladimir Mandic 856a48a4f8
Merge pull request #4595 from awsr/thumbnail-clear
Add manual thumbnail cache cleanup
2026-01-27 09:31:44 +01:00
awsr e63422ba16
Move cache clear to Image Options in settings 2026-01-26 01:53:29 -08:00
Disty0 ad15f733b5 revert rocm back to torch 2.9.1 2026-01-25 20:06:31 +03:00
vladmandic c1f3fc594e cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-25 12:59:14 +01:00
vladmandic 947dd7b2b3 support lora inside prompt selector
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-25 09:49:36 +01:00
awsr 5613cb383a
Update text 2026-01-24 16:37:13 -08:00
awsr 7fc18befc5
Add `monitorOption` function 2026-01-24 16:12:36 -08:00
awsr 58347af998
Fix logic error and update syntax 2026-01-24 16:12:17 -08:00
awsr 5e8ea52177
Toggle visibility from settings 2026-01-24 16:10:26 -08:00
awsr 603560c079
Move setup, update style 2026-01-24 13:35:04 -08:00
vladmandic ea3098a26a cleanup
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-24 20:09:24 +01:00
vladmandic 33d4a4999d lint deepbooru
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-24 18:51:11 +01:00
vladmandic 7bd73d6e75 log captured exceptions
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-24 13:57:13 +01:00
vladmandic a7c32caae3 relocate all jsons to data
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-24 13:54:40 +01:00
Vladimir Mandic a468c5d8f8
Merge pull request #4592 from awsr/errorlimiter
Implement abort system when encountering excessive errors
2026-01-24 13:54:28 +01:00
awsr 09fdda05a4
Move to `modules` 2026-01-24 02:16:05 -08:00
vladmandic a4671045b6 lint and crlf
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-24 10:28:46 +01:00
vladmandic e4be2942bb update config
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-24 09:13:23 +01:00
vladmandic bfc5445025 fix torch typo
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-24 08:48:45 +01:00
awsr 82361e6633
Adjust names 2026-01-23 22:29:00 -08:00
awsr 58c3aecc00
Allow multiple identifiers for ErrorLimiter.notify
- Update identifiers.
- Also minor message formatting update.
2026-01-23 16:50:52 -08:00
awsr e7d7894130
Prevent redundant traceback display 2026-01-23 16:43:58 -08:00
awsr b8381f31ca
Update documentation and linting 2026-01-23 05:06:39 -08:00
awsr 3343d2e05f
Update and rewrite to use contextlib 2026-01-23 04:56:27 -08:00
vladmandic 6cd2c6a5f5 update changelog
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-23 13:03:41 +01:00
Disty0 50c65ed990 Update OpenVINO to 2025.4.1 2026-01-23 14:43:42 +03:00
Disty0 8d6bfcd827 Update SDNQ 2026-01-23 14:39:07 +03:00
Disty0 cc9c2c31e5 Update ROCm Linux and OpeinVINO Torch to 2.10 2026-01-23 14:34:17 +03:00
vladmandic 651e7177c4 update readme
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-23 10:26:59 +01:00
vladmandic 08f24b211a update changelog and modernui
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-23 10:22:44 +01:00
vladmandic b8bac68915 use base steps as-is for non sd/sdxl models
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-23 10:12:11 +01:00
vladmandic a673ed2411 support comments in wildcard files
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-23 10:07:38 +01:00
vladmandic 578a16c65d update torch
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-23 09:50:39 +01:00
Vladimir Mandic 9cce5676e4
update 2026-01-23 09:47:15 +01:00
vladmandic 64157f7ff5 update diffusers
Signed-off-by: vladmandic <mandic00@live.com>
2026-01-23 09:27:01 +01:00
Vladimir Mandic 69685f198d
Merge pull request #4584 from awsr/processing-updates
Processing updates
2026-01-23 09:19:47 +01:00
Vladimir Mandic a47e2ff62f
Merge pull request #4569 from CalamitousFelicitousness/feat/wd14-tagger
feat(caption): add WD14 tagger with Booru Tags tab
2026-01-23 09:17:19 +01:00
Vladimir Mandic 51e148cd2c
Merge pull request #4583 from ryanmeador/video-element-names
fix elem_ids for some video controls
2026-01-23 09:15:13 +01:00
Vladimir Mandic 1f2b0aa56d
Merge pull request #4568 from CalamitousFelicitousness/fix/skip-params-aliases
fix(settings): support aliases in metadata skip params
2026-01-23 09:14:27 +01:00
awsr 0310dc8fd6
Fix naming, use Exception as parent class 2026-01-22 21:39:20 -08:00
awsr 6700edaf7d
Update errorlimiter.py 2026-01-22 15:40:38 -08:00
awsr 65d8c9e7f2
Implement limiting system for excessive errors 2026-01-22 03:37:52 -08:00
awsr 747ec86eb9
Fix if cls is None 2026-01-21 18:16:47 -08:00
awsr b9b36ed962
Update typing 2026-01-21 18:15:20 -08:00
awsr 418f27266e
Add compatibility fallback just in case 2026-01-21 16:57:58 -08:00
awsr 3298f3db9a
Rework prompt parsing/processing
- Return consistent structure
2026-01-21 16:57:05 -08:00
Ryan Meador e6eeb22a81 fix/add element names for some video controls that were duplicate/missing 2026-01-21 19:53:11 -05:00
awsr fe20635d0f
Minor readability improvement 2026-01-21 16:41:05 -08:00
awsr 2f8976e28d
Type standardization in `processing_class` 2026-01-21 16:35:19 -08:00
awsr 6344db1b09
Enforce typing for `geninfo` 2026-01-21 16:20:53 -08:00
awsr c2c32d7847
Improve/update types and data handling 2026-01-21 14:13:00 -08:00
awsr 849f045301
Clear gallery image list when running 2026-01-21 05:45:43 -08:00
awsr cb0aa2fb97
Update layout 2026-01-21 05:45:04 -08:00
awsr 2fae55a7f9
Initial thumbnail cache clearing setup 2026-01-21 05:38:24 -08:00
awsr a344a13863
Move AbortController reset to function 2026-01-21 05:31:37 -08:00
CalamitousFelicitousness 26c679f9e7 refactor(caption): remove unused _device tracking property 2026-01-21 11:56:07 +00:00
CalamitousFelicitousness 6b10f0df4f refactor(caption): address PR review feedback
Rename WD14 module and settings to WaifuDiffusion:
- Rename wd14.py to waifudiffusion.py
- Rename WD14Tagger class to WaifuDiffusionTagger
- Rename WD14_MODELS constant to WAIFUDIFFUSION_MODELS
- Rename settings: wd14_model -> waifudiffusion_model,
  wd14_character_threshold -> waifudiffusion_character_threshold
- Update all log messages from "WD14" to "WaifuDiffusion"

Code quality improvements:
- Simplify threshold parameter defaulting using `or` operator
- Extract save_output logic into _save_tags_to_file() helper with
  isolated error handling to prevent single file failures from
  impacting entire batch
- Fix timing log format consistency (remove 's' suffix)
2026-01-21 11:56:07 +00:00
CalamitousFelicitousness 5abb794462 style(test): remove unused imports in test-tagger.py 2026-01-21 11:56:07 +00:00
CalamitousFelicitousness becb19319d refactor(caption): unify tagger settings and reorganize Caption Tab UI
Consolidate WD14 and DeepBooru tagger settings into unified options:
- Merge wd14_general_threshold + deepbooru_score_threshold → tagger_threshold
- Merge wd14_include_rating + deepbooru_include_rating → tagger_include_rating
- Rename interrogate_score → tagger_show_scores
- Rename tagger_escape → tagger_escape_brackets
- Rename CLiP → OpenCLiP in caption type choices

UI reorganization:
- Add Interrogate tab to Caption Tab with default caption type selector
- Move interrogate_offload to Model Offloading section as "Offload caption models"
- Hide Interrogate settings section (all settings now in Caption Tab UI)
- Update locale_en.json for OpenCLiP naming

Code improvements:
- DeepBooru tag_multi() now accepts same parameters as WD14 for unified interface
- Fix setting references in interrogate.py for consolidated settings
- Add comprehensive tagger test suite (cli/test-tagger.py)
2026-01-21 11:56:07 +00:00
CalamitousFelicitousness 656e86a962 refactor(caption): consolidate interrogate settings into Caption Tab UI
Hide all CLiP, VLM, and Tagger settings from Settings > Interrogate page
while keeping them in shared.opts for persistence. Caption Tab UI becomes
the single control point with change handlers that save directly to config.

Changes:
- Hide OpenCLiP, VLM, and Tagger settings with visible=False
- Add change handlers to save settings when UI controls change
- Rename "Booru Tags" tab to "Tagger", update choice labels
- Update interrogate.py to use unified tagger interface with all settings
2026-01-21 11:56:07 +00:00
CalamitousFelicitousness 09b8fe9761 feat(caption): integrate DeepBooru into unified Booru Tagger UI
Add DeepBooru as a model option alongside WD14 models in the Booru Tags
tab, with dynamic UI that disables inapplicable controls.

Changes:
- Create modules/interrogate/tagger.py as unified adapter module
- Add batch, load/unload, get_models functions to deepbooru.py
- Update ui_caption.py to use unified tagger interface
- Consolidate shared tagger settings in shared.py
- Add implementation plan for future settings consolidation

UI behavior:
- Model dropdown shows DeepBooru + all WD14 models
- Character threshold and include rating disabled for DeepBooru
- All controls re-enable when WD14 model selected
2026-01-21 11:56:07 +00:00
CalamitousFelicitousness db97c42320 feat(caption): add WD14 tagger with Booru Tags tab
Add SmilingWolf's WD14/WaifuDiffusion tagger models for anime/illustration
tagging as a new "Booru Tags" tab in the Caption panel.

- Support 9 models (v2 and v3 variants) via HuggingFace
- ONNX backend chosen due to safetensors v3 variants exhibiting
  unacceptable accuracy loss
- Separate thresholds for general/character tags
- Batch processing with progress bar
- Consolidate debug env var to SD_INTERROGATE_DEBUG
2026-01-21 11:56:07 +00:00
CalamitousFelicitousness 694e2f0427 fix(settings): support aliases in metadata skip params
The "Restore from metadata: skip params" setting previously required
exact metadata parameter names (e.g., "Batch-2" instead of "batch_size").
This was confusing because metadata names differ from Python variables
and UI labels.

Changes:
- Auto-populate param_aliases from component labels and elem_ids
- Expand user input with aliases in should_skip()
- Support normalized names so "Batch" skips both "Batch-1" and "Batch-2"

Users can now enter any of these formats (case-insensitive):
- Python variable names: batch_size, cfg_scale, clip_skip
- UI labels: Batch size, CFG scale, Clip skip
- Metadata names: Batch-2, CFG scale, Clip skip
- Normalized names: Batch (skips both Batch-1 and Batch-2)
2026-01-21 00:56:26 +00:00
844 changed files with 318451 additions and 112380 deletions

View File

@ -66,13 +66,14 @@ body:
If unsure if this is a right place to ask your question, perhaps post on [Discussions](https://github.com/vladmandic/automatic/discussions)
Or reach-out to us on [Discord](https://discord.gg/WqMzTUDC)
- type: dropdown
id: backend
id: os
attributes:
label: Backend
description: What is the backend you're using?
label: Operating system
description: What is the OS you're using?
options:
- Diffusers
- Original
- Windows
- Linux
- MacOS
default: 0
validations:
required: true

30
.github/ISSUE_TEMPLATE/model_request vendored Normal file
View File

@ -0,0 +1,30 @@
name: Model request
description: Request support for a new model
title: "[Model]: "
labels: ["enhancement"]
body:
- type: textarea
id: name
attributes:
label: Model name
description: Enter model name
value:
- type: textarea
id: type
attributes:
label: Model type
description: Describe model type
value:
- type: textarea
id: url
attributes:
label: Model URL
description: Enter URL to the model page
value:
- type: textarea
id: description
attributes:
label: Reason
description: Enter a reason why you would like to see this model supported
value:

60
.github/copilot-instructions.md vendored Normal file
View File

@ -0,0 +1,60 @@
# SD.Next: AGENTS.md Project Guidelines
SD.Next is a complex codebase with specific patterns and conventions.
General app structure is:
- Python backend server
Uses Torch for model inference, FastAPI for API routes and Gradio for creation of UI components.
- JavaScript/CSS frontend
## Tools
- `venv` for Python environment management, activated with `source venv/bin/activate` (Linux) or `venv\Scripts\activate` (Windows).
venv MUST be activated before running any Python commands or scripts to ensure correct dependencies and environment variables.
- `python` 3.10+.
- `pyproject.toml` for Python configuration, including linting and type checking settings.
- `eslint` configured for both core and UI code.
- `pnpm` for managing JavaScript dependencies and scripts, with key commands defined in `package.json`.
- `ruff` and `pylint` for Python linting, with configurations in `pyproject.toml` and executed via `pnpm ruff` and `pnpm pylint`.
- `pre-commit` hooks which also check line-endings and other formatting issues, configured in `.pre-commit-config.yaml`.
## Project Structure
- Entry/startup flow: `webui.sh` -> `launch.py` -> `webui.py` -> modules under `modules/`.
- Install: `installer.py` takes care of installing dependencies and setting up the environment.
- Core runtime state is centralized in `modules/shared.py` (shared.opts, model state, backend/device state).
- API/server routes are under `modules/api/`.
- UI codebase is split between base JS in `javascript/` and actual UI in `extensions-builtin/sdnext-modernui/`.
- Model and pipeline logic is split between `modules/sd_*` and `pipelines/`.
- Additional plug-ins live in `scripts/` and are used only when specified.
- Extensions live in `extensions-builtin/` and `extensions/` and are loaded dynamically.
- Tests and CLI scripts are under `test/` and `cli/`, with some API smoke checks in `test/full-test.sh`.
## Code Style
- Prefer existing project patterns over strict generic style rules;
this codebase intentionally allows patterns often flagged in default linters such as allowing long lines, etc.
## Build And Test
- Activate environment: `source venv/bin/activate` (always ensure this is active when working with Python code).
- Test startup: `python launch.py --test`
- Full startup: `python launch.py`
- Full lint sequence: `pnpm lint`
- Python checks individually: `pnpm ruff`, `pnpm pylint`
- JS checks: `pnpm eslint` and `pnpm eslint-ui`
## Conventions
- Keep PR-ready changes targeted to `dev` branch.
- Use conventions from `CONTRIBUTING`.
- Do not include unrelated edits or submodule changes when preparing contributions.
- Use existing CLI/API tool patterns in `cli/` and `test/` when adding automation scripts.
- Respect environment-driven behavior (`SD_*` flags and options) instead of hardcoding platform/model assumptions.
- For startup/init edits, preserve error handling and partial-failure tolerance in parallel scans and extension loading.
## Pitfalls
- Initialization order matters: startup paths in `launch.py` and `webui.py` are sensitive to import/load timing.
- Shared mutable global state can create subtle regressions; prefer narrow, explicit changes.
- Device/backend-specific code paths (**CUDA/ROCm/IPEX/DirectML/OpenVINO**) should not assume one platform.
- Scripts and extension loading is dynamic; failures may appear only when specific extensions or models are present.

View File

@ -0,0 +1,15 @@
---
description: "Use when editing Python core runtime code, startup flow, model loading, API internals, backend/device logic, or shared state in modules and pipelines."
name: "Core Runtime Guidelines"
applyTo: "launch.py, webui.py, installer.py, modules/**/*.py, pipelines/**/*.py, scripts/**/*.py, extensions-builtin/**/*.py"
---
# Core Runtime Guidelines
- Preserve startup ordering and import timing in `launch.py` and `webui.py`; avoid moving initialization steps unless required.
- Treat `modules/shared.py` as the source of truth for global runtime state (`shared.opts`, model references, backend/device flags).
- Prefer narrow changes with explicit side effects; avoid introducing new cross-module mutable globals.
- Keep platform paths neutral: do not assume CUDA-only behavior and preserve ROCm/IPEX/DirectML/OpenVINO compatibility branches.
- Keep extension and script loading resilient: when adding startup scans/hooks, preserve partial-failure tolerance and logging.
- Follow existing API/server patterns under `modules/api/` and reuse shared queue/state helpers rather than ad-hoc request handling.
- Reuse established model-loading and pipeline patterns (`modules/sd_*`, `pipelines/`) instead of creating parallel abstractions.
- For substantial Python changes, run at least relevant checks: `npm run ruff` and `npm run pylint` (or narrower equivalents when appropriate).

14
.github/instructions/ui.instructions.md vendored Normal file
View File

@ -0,0 +1,14 @@
---
description: "Use when editing frontend UI code, JavaScript, HTML, CSS, localization files, or built-in UI extensions including modernui and kanvas."
name: "UI And Frontend Guidelines"
applyTo: "javascript/**/*.js, html/**/*.html, html/**/*.css, html/**/*.js, extensions-builtin/sdnext-modernui/**/*, extensions-builtin/sdnext-kanvas/**/*"
---
# UI And Frontend Guidelines
- Preserve existing UI behavior and wiring between Gradio/Python endpoints and frontend handlers; do not change payload shapes without backend alignment.
- Follow existing project lint and style patterns; prefer consistency with nearby files over introducing new frameworks or architecture.
- Keep localization-friendly UI text changes synchronized with locale resources in `html/locale_*.json` when user-facing strings are added or changed.
- Avoid bundling unrelated visual refactors with functional fixes; keep UI PRs scoped and reviewable.
- For extension UI work, respect each extension's boundaries and avoid cross-extension coupling.
- Validate JavaScript changes with `pnpm eslint`; for modern UI extension changes also run `pnpm eslint-ui`.
- Maintain mobile compatibility when touching layout or interaction behavior.

47
.gitignore vendored
View File

@ -1,7 +1,10 @@
# defaults
venv/
__pycache__
.ruff_cache
/cache.json
.vscode/
.idea/
**/.DS_Store
/*.json
/*.yaml
/params.txt
@ -9,17 +12,15 @@ __pycache__
/user.css
/webui-user.bat
/webui-user.sh
/html/extensions.json
/html/themes.json
config_states
/data/metadata.json
/data/extensions.json
/data/cache.json
/data/themes.json
/data/installer.json
/data/rocm.json
node_modules
pnpm-lock.yaml
package-lock.json
venv
.history
cache
**/.DS_Store
tunableop_results*.csv
# all models and temp files
*.log
@ -42,30 +43,30 @@ tunableop_results*.csv
/*.mp3
/*.lnk
/*.swp
!webui.bat
!webui.sh
!package.json
!requirements.txt
# all dynamic stuff
/extensions/**/*
/outputs/**/*
/embeddings/**/*
/models/**/*
/interrogate/**/*
/train/log/**/*
/textual_inversion/**/*
/detected_maps/**/*
/tmp
/log
/cert
.vscode/
.idea/
/localizations
.*/
cache
tunableop_results*.csv
# force included
!webui.bat
!webui.sh
!package.json
!requirements.txt
!constraints.txt
!/data
!/models/VAE-approx
!/models/VAE-approx/model.pt
!/models/Reference
!/models/Reference/**/*
# copilot instructions
!/.github/
!/.github/copilot-instructions.md
!/.github/instructions/
!/.github/instructions/**/*

8
.gitmodules vendored
View File

@ -10,13 +10,9 @@
path = extensions-builtin/sd-extension-chainner
url = https://github.com/vladmandic/sd-extension-chainner
ignore = dirty
[submodule "extensions-builtin/stable-diffusion-webui-rembg"]
path = extensions-builtin/stable-diffusion-webui-rembg
url = https://github.com/vladmandic/sd-extension-rembg
ignore = dirty
[submodule "extensions-builtin/sdnext-modernui"]
path = extensions-builtin/sdnext-modernui
url = https://github.com/BinaryQuantumSoul/sdnext-modernui
[submodule "extensions-builtin/sdnext-kanvas"]
path = extensions-builtin/sdnext-kanvas
url = https://github.com/vladmandic/sdnext-kanvas
path = extensions-builtin/sdnext-kanvas
url = https://github.com/vladmandic/sdnext-kanvas

View File

@ -13,20 +13,17 @@ repos:
rev: v6.0.0
hooks:
- id: check-added-large-files
- id: check-case-conflict
- id: check-merge-conflict
- id: check-symlinks
- id: check-illegal-windows-names
- id: check-merge-conflict
- id: detect-private-key
- id: check-builtin-literals
- id: check-case-conflict
- id: check-illegal-windows-names
- id: check-merge-conflict
- id: check-symlinks
- id: check-yaml
- id: check-json
- id: check-toml
- id: check-xml
- id: check-yaml
- id: debug-statements
- id: detect-private-key
- id: end-of-file-fixer
- id: mixed-line-ending
- id: check-executables-have-shebangs
@ -41,3 +38,13 @@ repos:
.*\.md|
.github/ISSUE_TEMPLATE/.*\.yml
)$
- repo: https://github.com/oliv5/pre-commit-indents-to-spaces
rev: v0.0.3
hooks:
- id: indents-to-spaces
args: ["--spaces=4"]
types: [python]
- id: indents-to-spaces
args: ["--spaces=2"]
types: [file]
files: \.(json|js|mjs|css|html|md|yaml|toml|sh)$

283
.pylintrc
View File

@ -1,283 +0,0 @@
[MAIN]
analyse-fallback-blocks=no
clear-cache-post-run=no
extension-pkg-allow-list=
prefer-stubs=yes
extension-pkg-whitelist=
fail-on=
fail-under=10
ignore=CVS
ignore-paths=/usr/lib/.*$,
venv,
.git,
.ruff_cache,
.vscode,
modules/apg,
modules/cfgzero,
modules/control/proc,
modules/control/units,
modules/dml,
modules/facelib,
modules/flash_attn_triton_amd,
modules/ggml,
modules/hidiffusion,
modules/hijack/ddpm_edit.py,
modules/intel,
modules/intel/ipex,
modules/framepack/pipeline,
modules/onnx_impl,
modules/pag,
modules/postprocess/aurasr_arch.py,
modules/prompt_parser_xhinker.py,
modules/ras,
modules/seedvr,
modules/rife,
modules/schedulers,
modules/taesd,
modules/teacache,
modules/todo,
pipelines/bria,
pipelines/flex2,
pipelines/f_lite,
pipelines/hidream,
pipelines/hdm,
pipelines/meissonic,
pipelines/omnigen2,
pipelines/segmoe,
pipelines/xomni,
pipelines/chrono,
scripts/consistory,
scripts/ctrlx,
scripts/daam,
scripts/demofusion,
scripts/freescale,
scripts/infiniteyou,
scripts/instantir,
scripts/lbm,
scripts/layerdiffuse,
scripts/mod,
scripts/pixelsmith,
scripts/differential_diffusion.py,
scripts/pulid,
scripts/xadapter,
repositories,
extensions-builtin/sd-extension-chainner/nodes,
extensions-builtin/sd-webui-agent-scheduler,
extensions-builtin/sdnext-modernui/node_modules,
extensions-builtin/sdnext-kanvas/node_modules,
ignore-patterns=.*test*.py$,
.*_model.py$,
.*_arch.py$,
.*_model_arch.py*,
.*_model_arch_v2.py$,
ignored-modules=
jobs=8
limit-inference-results=100
load-plugins=
persistent=no
py-version=3.10
recursive=no
source-roots=
unsafe-load-any-extension=no
[BASIC]
argument-naming-style=snake_case
attr-naming-style=snake_case
bad-names=foo, bar, baz, toto, tutu, tata
bad-names-rgxs=
class-attribute-naming-style=any
class-const-naming-style=UPPER_CASE
class-naming-style=PascalCase
const-naming-style=snake_case
docstring-min-length=-1
function-naming-style=snake_case
good-names=i,j,k,e,ex,ok,p,x,y,id
good-names-rgxs=
include-naming-hint=no
inlinevar-naming-style=any
method-naming-style=snake_case
module-naming-style=snake_case
name-group=
no-docstring-rgx=^_
property-classes=abc.abstractproperty
variable-naming-style=snake_case
[CLASSES]
check-protected-access-in-special-methods=no
defining-attr-methods=__init__, __new__,
exclude-protected=_asdict,_fields,_replace,_source,_make,os._exit
valid-classmethod-first-arg=cls
valid-metaclass-classmethod-first-arg=mcs
[DESIGN]
exclude-too-few-public-methods=
ignored-parents=
max-args=199
max-attributes=99
max-bool-expr=99
max-branches=199
max-locals=99
max-parents=99
max-public-methods=99
max-returns=99
max-statements=199
min-public-methods=1
[EXCEPTIONS]
overgeneral-exceptions=builtins.BaseException,builtins.Exception
[FORMAT]
expected-line-ending-format=
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
indent-after-paren=4
indent-string=' '
max-line-length=200
max-module-lines=9999
single-line-class-stmt=no
single-line-if-stmt=no
[IMPORTS]
allow-any-import-level=
allow-reexport-from-package=no
allow-wildcard-with-all=no
deprecated-modules=
ext-import-graph=
import-graph=
int-import-graph=
known-standard-library=
known-third-party=enchant
preferred-modules=
[LOGGING]
logging-format-style=new
logging-modules=logging
[MESSAGES CONTROL]
confidence=HIGH,
CONTROL_FLOW,
INFERENCE,
INFERENCE_FAILURE,
UNDEFINED
# disable=C,R,W
disable=abstract-method,
bad-inline-option,
bare-except,
broad-exception-caught,
chained-comparison,
consider-iterating-dictionary,
consider-merging-isinstance,
consider-using-dict-items,
consider-using-enumerate,
consider-using-from-import,
consider-using-generator,
consider-using-get,
consider-using-in,
consider-using-max-builtin,
consider-using-min-builtin,
consider-using-sys-exit,
cyclic-import,
dangerous-default-value,
deprecated-pragma,
duplicate-code,
file-ignored,
import-error,
import-outside-toplevel,
invalid-name,
line-too-long,
locally-disabled,
logging-fstring-interpolation,
missing-class-docstring,
missing-function-docstring,
missing-module-docstring,
no-else-raise,
no-else-return,
not-callable,
pointless-string-statement,
raw-checker-failed,
simplifiable-if-expression,
suppressed-message,
too-few-public-methods,
too-many-instance-attributes,
too-many-locals,
too-many-nested-blocks,
too-many-positional-arguments,
too-many-statements,
unidiomatic-typecheck,
unknown-option-value,
unnecessary-dict-index-lookup,
unnecessary-dunder-call,
unnecessary-lambda-assigment,
unnecessary-lambda,
unused-wildcard-import,
unpacking-non-sequence,
unsubscriptable-object,
useless-return,
use-dict-literal,
use-symbolic-message-instead,
useless-suppression,
wrong-import-position,
enable=c-extension-no-member
[METHOD_ARGS]
timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request
[MISCELLANEOUS]
notes=FIXME,
XXX,
TODO
notes-rgx=
[REFACTORING]
max-nested-blocks=5
never-returning-functions=sys.exit,argparse.parse_error
[REPORTS]
evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))
msg-template=
reports=no
score=no
[SIMILARITIES]
ignore-comments=yes
ignore-docstrings=yes
ignore-imports=yes
ignore-signatures=yes
min-similarity-lines=4
[SPELLING]
max-spelling-suggestions=4
spelling-dict=
spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
spelling-ignore-words=
spelling-private-dict-file=
spelling-store-unknown-words=no
[STRING]
check-quote-consistency=no
check-str-concat-over-line-jumps=no
[TYPECHECK]
contextmanager-decorators=contextlib.contextmanager
generated-members=numpy.*,logging.*,torch.*,cv2.*
ignore-none=yes
ignore-on-opaque-inference=yes
ignored-checks-for-mixins=no-member,
not-async-context-manager,
not-context-manager,
attribute-defined-outside-init
ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace
missing-member-hint=yes
missing-member-hint-distance=1
missing-member-max-choices=1
mixin-class-rgx=.*[Mm]ixin
signature-mutators=
[VARIABLES]
additional-builtins=
allow-global-unused-variables=yes
allowed-redefined-builtins=
callbacks=cb_,
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
ignored-argument-names=_.*|^ignored_|^unused_
init-import=no
redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io

View File

@ -1,109 +0,0 @@
exclude = [
"venv",
".git",
".ruff_cache",
".vscode",
"modules/cfgzero",
"modules/facelib",
"modules/flash_attn_triton_amd",
"modules/hidiffusion",
"modules/intel/ipex",
"modules/pag",
"modules/schedulers",
"modules/teacache",
"modules/seedvr",
"modules/control/proc",
"modules/control/units",
"modules/control/units/xs_pipe.py",
"modules/postprocess/aurasr_arch.py",
"pipelines/meissonic",
"pipelines/omnigen2",
"pipelines/hdm",
"pipelines/segmoe",
"pipelines/xomni",
"pipelines/chrono",
"scripts/lbm",
"scripts/daam",
"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",
"extensions-builtin/sdnext-modernui/node_modules",
]
line-length = 250
indent-width = 4
target-version = "py310"
[lint]
select = [
"F",
"E",
"W",
"C",
"B",
"I",
"YTT",
"ASYNC",
"RUF",
"AIR",
"NPY",
"C4",
"T10",
"EXE",
"ISC",
"ICN",
"RSE",
"TCH",
"TID",
"INT",
"PLE",
]
ignore = [
"B006", # Do not use mutable data structures for argument defaults
"B008", # Do not perform function call in argument defaults
"B905", # Strict zip() usage
"C420", # Unnecessary dict comprehension for iterable; use `dict.fromkeys` instead
"C408", # Unnecessary `dict` call
"I001", # Import block is un-sorted or un-formatted
"E402", # Module level import not at top of file
"E501", # Line too long
"E721", # Do not compare types, use `isinstance()`
"E731", # Do not assign a `lambda` expression, use a `def`
"E741", # Ambiguous variable name
"F401", # Imported by unused
"EXE001", # file with shebang is not marked executable
"NPY002", # replace legacy random
"RUF005", # Consider iterable unpacking
"RUF008", # Do not use mutable default values for dataclass
"RUF010", # Use explicit conversion flag
"RUF012", # Mutable class attributes
"RUF013", # PEP 484 prohibits implicit `Optional`
"RUF015", # Prefer `next(...)` over single element slice
"RUF046", # Value being cast to `int` is already an integer
"RUF059", # Unpacked variables are not used
"RUF051", # Prefer pop over del
]
fixable = ["ALL"]
unfixable = []
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
[format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"
docstring-code-format = false
[lint.mccabe]
max-complexity = 150

1
.vscode/launch.json vendored
View File

@ -11,7 +11,6 @@
"env": { "USED_VSCODE_COMMAND_PICKARGS": "1" },
"args": [
"--uv",
"--quick",
"--log", "vscode.log",
"${command:pickArgs}"]
}

View File

@ -1,4 +1,5 @@
{
"files.eol": "\n",
"python.analysis.extraPaths": [".", "./modules", "./scripts", "./pipelines"],
"python.analysis.typeCheckingMode": "off",
"editor.formatOnSave": false,
@ -11,5 +12,8 @@
"css",
"json",
"markdown"
],
"githubPullRequests.ignoredPullRequestBranches": [
"master"
]
}

60
AGENTS.md Normal file
View File

@ -0,0 +1,60 @@
# SD.Next: AGENTS.md Project Guidelines
SD.Next is a complex codebase with specific patterns and conventions.
General app structure is:
- Python backend server
Uses Torch for model inference, FastAPI for API routes and Gradio for creation of UI components.
- JavaScript/CSS frontend
## Tools
- `venv` for Python environment management, activated with `source venv/bin/activate` (Linux) or `venv\Scripts\activate` (Windows).
venv MUST be activated before running any Python commands or scripts to ensure correct dependencies and environment variables.
- `python` 3.10+.
- `pyproject.toml` for Python configuration, including linting and type checking settings.
- `eslint` configured for both core and UI code.
- `pnpm` for managing JavaScript dependencies and scripts, with key commands defined in `package.json`.
- `ruff` and `pylint` for Python linting, with configurations in `pyproject.toml` and executed via `pnpm ruff` and `pnpm pylint`.
- `pre-commit` hooks which also check line-endings and other formatting issues, configured in `.pre-commit-config.yaml`.
## Project Structure
- Entry/startup flow: `webui.sh` -> `launch.py` -> `webui.py` -> modules under `modules/`.
- Install: `installer.py` takes care of installing dependencies and setting up the environment.
- Core runtime state is centralized in `modules/shared.py` (shared.opts, model state, backend/device state).
- API/server routes are under `modules/api/`.
- UI codebase is split between base JS in `javascript/` and actual UI in `extensions-builtin/sdnext-modernui/`.
- Model and pipeline logic is split between `modules/sd_*` and `pipelines/`.
- Additional plug-ins live in `scripts/` and are used only when specified.
- Extensions live in `extensions-builtin/` and `extensions/` and are loaded dynamically.
- Tests and CLI scripts are under `test/` and `cli/`, with some API smoke checks in `test/full-test.sh`.
## Code Style
- Prefer existing project patterns over strict generic style rules;
this codebase intentionally allows patterns often flagged in default linters such as allowing long lines, etc.
## Build And Test
- Activate environment: `source venv/bin/activate` (always ensure this is active when working with Python code).
- Test startup: `python launch.py --test`
- Full startup: `python launch.py`
- Full lint sequence: `pnpm lint`
- Python checks individually: `pnpm ruff`, `pnpm pylint`
- JS checks: `pnpm eslint` and `pnpm eslint-ui`
## Conventions
- Keep PR-ready changes targeted to `dev` branch.
- Use conventions from `CONTRIBUTING`.
- Do not include unrelated edits or submodule changes when preparing contributions.
- Use existing CLI/API tool patterns in `cli/` and `test/` when adding automation scripts.
- Respect environment-driven behavior (`SD_*` flags and options) instead of hardcoding platform/model assumptions.
- For startup/init edits, preserve error handling and partial-failure tolerance in parallel scans and extension loading.
## Pitfalls
- Initialization order matters: startup paths in `launch.py` and `webui.py` are sensitive to import/load timing.
- Shared mutable global state can create subtle regressions; prefer narrow, explicit changes.
- Device/backend-specific code paths (**CUDA/ROCm/IPEX/DirectML/OpenVINO**) should not assume one platform.
- Scripts and extension loading is dynamic; failures may appear only when specific extensions or models are present.

View File

@ -1,7 +1,306 @@
# Change Log for SD.Next
## Update for 2026-04-04
- **Models**
- [AiArtLab SDXS-1B](https://huggingface.co/AiArtLab/sdxs-1b) Simple Diffusion XS *(training still in progress)*
this model combines Qwen3.5-1.8B text encoder with SDXL-style UNET with only 1.6B parameters and custom 32ch VAE
- **Compute**
- **ROCm** futher work on advanced configuration and tuning, thanks @resonantsky
see *main interface -> scripts -> rocm advanced config*
- **Internal**
- additional typing and typechecks, thanks @awsr
- Prohibit python==3.14 unless `--experimental`
- **Fixes**
- UI CSS fixes, thanks @awsr
- detect/warn if space in system path
- add `ftfy` to requirements
## Update for 2026-04-01
### Highlights for 2026-04-01
This release brings massive code refactoring to modernize codebase and removal of some obsolete features. Leaner & Faster!
And since its a bit quieter period when it comes to new models, notable additions would be : *FireRed-Image-Edit*, *SkyWorks-UniPic-3* and new versions of *Anima-Preview*, *Flux-Klein-KV* image models and *LTX 2.3* video model
If you're on Windows platform, we have a brand new [All-in-one Installer & Launcher](https://github.com/vladmandic/sdnext-launcher): simply download [exe or zip](https://github.com/vladmandic/sdnext-launcher/releases) and done!
And we have a new (optional) React-based **UI** [Enso](https://github.com/CalamitousFelicitousness/enso)!
*What else*? Really a lot!
New color grading module, updated localization with new languages and improved translations, new CivitAI integration module, new finetunes loader, several new upscalers, improvements to LLM/VLM in captioning and prompt enhance, a lot of new control preprocessors, new realtime server info panel, some new UI themes
And major work on API hardening: *security, rate limits, secrets handling, new endpoints*, etc.
But also many smaller quality-of-life improvements - for full details, see [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md)
*Note*: Purely due to size of changes, clean install is recommended!
Just how big? Some stats: *~530 commits over 880 files*
[ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) | [Sponsor](https://github.com/sponsors/vladmandic)
### Details for 2026-04-01
- **Models**
- [Google Flash 3.1 Image](https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview) a.k.a. *Nano Banana 2*
- [FireRed Image Edit](https://huggingface.co/FireRedTeam/FireRed-Image-Edit-1.0) *1.0 and 1.1*
*Note*: FireRed is a fine-tune of Qwen-Image-Edit regardless of its claim as a new base-model
- [Skyworks UniPic-3](https://huggingface.co/Skywork/Unipic3), *Consistency and DMD* variants to reference/community section
*Note*: UniPic-3 is a fine-tune of Qwen-Image-Edit with new distillation regardless of its claim of major changes
- [Anima Preview-v2](https://huggingface.co/circlestone-labs/Anima)
- [FLUX.2-Klein-KV](https://huggingface.co/black-forest-labs/FLUX.2-klein-9b-kv), thanks @liutyi
- [LTX-Video 2.3](https://huggingface.co/Lightricks/LTX-2.3) in *Full and Distilled* variants and in both original *FP16 and SDNQ-4bit* quantiztion
*note* ltx-2.3 is a massive 22B parameters and full model is very large (72GB) so use of pre-quantized variant (32GB) is highly recommended
- **Image manipulation**
- new **Color grading** module
apply basic corrections to your images: brightness,contrast,saturation,shadows,highlights
move to professional photo corrections: hue,gamma,sharpness,temperature
correct tone: shadows,midtones,highlights
add effects: vignette,grain
apply professional lut-table using .cube file
*hint* color grading is available as step during generate or as processing item for already existing images
- **Upscaling**
add support for [spandrel](https://github.com/chaiNNer-org/spandrel) engine with suport for new upscaling model families
add two new ai upscalers: *RealPLKSR NomosWebPhoto* and *RealPLKSR AnimeSharpV2*
add two new **interpolation** methods: *HQX* and *ICB*
use high-quality [sharpfin](https://github.com/drhead/Sharpfin) accelerated library
extend `chainner` support for additional models
- update **Latent corrections** *(former HDR Corrections)*
expand allowed models
- **Captioning / Prompt Enhance**
- new models: **Qwen-3.5**, **Mistral-3** in multiple variations
- new models: multiple *heretic* and *abliterated* finetunes for **Qwen, Gemma, Mistral**
- **captioning** and **prompt enhance**: add support for all cloud-based Gemini models
*3.1/3.0/2.5 pro/flash/flash-lite*
- improve captioning and prompt enhance memory handling/offloading
- **Features**
- **Secrets** handling: new `secrets.json` and special handling for tokens/keys/passwords
used to be treated like any other `config.json` param which can cause security issues
- **Control**: many new **pre-processors**
*anyline, depth_anything v2, dsine, lotus, marigold normals, oneformer, rtmlib pose, sam2, stablenormal, teed, vitpose*
- pipelines: add **ZImageInpaint**
- rewritten **CivitAI** module
browse/discover mode with sort, period, type/base dropdowns; URL paste; subfolder sorting; auto-browse; dynamic dropdowns
- **HiRes**: allow using different lora in refiner prompt
- **Nunchaku** models are now listed in networks tab as reference models
instead of being used implicitly via quantization
- improve image **Metadata** parser for foreign metadata (e.g. XMP)
- new **CeeTeeDees image-to-image batch inference**, thanks @resonantsky
available in *main interface -> scripts*
- **Compute**
- **ROCm** advanced configuration and tuning, thanks @resonantsky
see *main interface -> scripts -> rocm advanced config*
- **ROCm** support for additional AMD GPUs: `gfx103X`, thanks @crashingalexsan
- **Cuda** update to `torch=2.11` with `cuda=13.0`
- **Ipex** update to `torch==2.11`
- **ROCm/Linux** update to `torch==2.11` with `rocm==7.2`
- **OpenVINO** update to `torch==2.11` and `openvino==2026.0`
- *note* **Cuda** `torch==2.10` removed support for `rtx1000` series and older GPUs
use following before first startup to force installation of `torch==2.9.1` with `cuda==12.6`:
> `set TORCH_COMMAND='torch==2.9.1 torchvision==0.24.1 torchaudio==2.9.1 --index-url https://download.pytorch.org/whl/cu126'`
- *note* **Cuda** `cuda==13.0` requires newer nVidia drivers
use following before first startup to force installation of `torch==2.11.0` with `cuda==12.68`:
> `set TORCH_COMMAND='torch torchvision --index-url https://download.pytorch.org/whl/cu128`
- update installer and support `nunchaku==1.2.1`
- **UI**
- **Enso** new React-based UI, developed by @CalamitousFelicitousness!
with WYSIWYG infinite canvas workspace, command palette, and numerous quality of life improvements across the board
enable using `--enso` flag and access using `/enso` endpoint (e.g. <http://localhost:7860/enso>)
see [Enso Docs](https://vladmandic.github.io/sdnext-docs/Enso/) and [Enso Home](https://github.com/CalamitousFelicitousness/enso) for details
*note* Enso is work-in-progress and alpha-ready
- legacy panels **T2I** and **I2I** are disabled by default
you can re-enable them in *settings -> ui -> hide legacy tabs*
- new panel: **Server Info** with detailed runtime informaton
- rename **Scripts** to **Extras** and reorganize to split internal functionality vs external extensions
- **Networks** add **UNet/DiT**
- **Localization** improved translation quality and new translations locales:
*en, en1, en2, en3, en4, hr, es, it, fr, de, pt, ru, zh, ja, ko, hi, ar, bn, ur, id, vi, tr, sr, po, he, xx, yy, qq, tlh*
yes, this now includes stuff like *latin, esperanto, arabic, hebrew, klingon* and a lot more!
and also introduce some pseudo-locales such as: *techno-babbel*, *for-n00bs*
*hint*: click on locale icon in bottom-left corner to cycle through available locales, or set default in *settings -> ui*
- **Server settings** new section in *settings*
- **Kanvas** add paste image from clipboard
- **Themes** add *CTD-NT64Light*, *CTD-NT64Medium* and *CTD-NT64Dark*, thanks @resonantsky
- **Themes** add *Vlad-Neomorph*
- **Gallery** add option to auto-refresh gallery, thanks @awsr
- **Token counters** add per-section display for supported models, thanks @awsr
- **Colour grading** add hints for all the functions
- **Docs / Wiki**
- updates to to compute sections: *AMD-ROCm, AMD-MIOpen, ZLUDA, OpenVINO, nVidia*
- updates to core sections: *Installation, Python, Schedulers, Launcher, SDNQ, Video*
- added Enso page
- **API**
- prototype **v2 API** (`/sdapi/v2/`)
job-based generation with queue, per-job WebSocket progress, file uploads with TTL, model/network enumeration
and a plethora of other improvements *(work-in-progress)*
for the time being ships with Enso, which must be enabled wih `--enso` flag on startup for v2 API to be available
- **rate limiting**: global for all endpoints, guards against abuse and denial-of-service type of attacks
configurable in *settings -> server settings*
- new `/sdapi/v1/upload` endpoint with support for both POST with form-data or PUT using raw-bytes
- new `/sdapi/v1/torch` endpoint for torch info (backend, version, etc.)
- new `/sdapi/v1/gpu` endpoint for GPU info
- new `/sdapi/v1/rembg` endpoint for background removal
- new `/sdapi/v1/unet` endpoint to list available unets/dits
- use rate limiting for api logging
- **Obsoleted**
- removed support for additional quantization engines: *BitsAndBytes, TorchAO, Optimum-Quanto, NNCF*
*note*: SDNQ is quantization engine of choice for SD.Next
- removed `flux_enhance` script
- **Internal**
- `python==3.13` full support
- `python==3.14` initial support
see [docs](https://vladmandic.github.io/sdnext-docs/Python/) for details
- remove hard-dependnecies:
`clip, numba, skimage, torchsde, omegaconf, antlr, patch-ng, patch-ng, astunparse, addict, inflection, jsonmerge, kornia`,
`resize-right, voluptuous, yapf, sqlalchemy, invisible-watermark, pi-heif, ftfy, blendmodes, PyWavelets, imp`
these are now installed on-demand when needed
- bump `huggingface_hub==1.5.0`
- bump `transformers==5.3.0`
- installer introduce `constraints.txt`
- refactor to/from *image/tensor* logic
- refactor reorganize `cli` scripts
- refactor move tests to dedicated `/test/`
- refactor all image handling to `modules/image/`
- refactor many params that were server-global are now ui params that are handled per-request
*schedulers, todo, tome, etc.*
- refactor error handling during `torch.compile`
- refactor move `rebmg` to core instead of extensions
- remove face restoration
- unified command line parsing
- reinstall `nunchaku` with `--reinstall` flag
- use explicit icon image references in `gallery`, thanks @awsr
- launch use threads to async execute non-critical tasks
- switch from deprecated `pkg_resources` to `importlib`
- modernize typing and type annotations
- improve `pydantic==2.x` compatibility
- refactor entire logging into separate `modules/logger`
- replace `timestamp` based startup checks with state caching
- split monolithic `shared` module and introduce `ui_definitions`
- modularize all imports and avoid re-imports
- use `threading` for deferable operatios
- use `threading` for io-independent parallel operations
- remove requirements: `clip`, `open-clip`
- add new build of `insightface`, thanks @hameerabbasi
- reduce use of generators with ui interactor
- better subprocess execute, thanks @awsr
- better wslopen handling, thanks @awsr
- refactor for PEP-484 compliance, thanks @awsr
- detect active `venv`
- **Obsolete**
- remove `normalbae` pre-processor
- remove `dwpose` pre-processor
- remove `hdm` model support
- remove `xadapter` script
- remove `codeformer` and `gfpgan` face restorers
- **Checks**
- switch to `pyproject.toml` for tool configs
- update `lint` rules, thanks @awsr
- add `ty` to optional lint tooling
- add `pyright` to optional lint tooling
- **Fixes**
- ui `gallery` cache recursive cleanup, thanks @awsr
- ui main results pane sizing
- ui connection monitor
- handle `clip` installer doing unwanted `setuptools` update
- cleanup for `uv` installer fallback
- add `metadata` restore to always-on scripts
- improve `wildcard` weights parsing, thanks @Tillerz
- model detection for `anima`
- handle `lora` unwanted unload
- improve `preview` error handler
- handle `gallery` over remote/unsecure connections
- fix `ltx2-i2v`
- handle missing `preview` image
- kandinsky 5 t2i/i2i model type detection
- kanvas notify core on image size change
- command arg `--reinstall` stricter enforcement
- handle `api` state reset
- processing upscaler refresh button
- simplify and validate `rembg` dependencies
- improve video generation progress tracking
- handle startup with bad `scripts` more gracefully
- thread-safety for `error-limiter`, thanks @awsr
- add `lora` support for flux2-klein
- fix `lora` change when used with `sdnq`
- multiple `sdnq` fixes
- handle `taesd` init errors
## Update for 2026-02-04
### Highlights for 2026-02-04
Refresh release two weeks after prior release, yet we still somehow managed to pack in *~150 commits*!
Highlights would be two new models: **Z-Image-Base** and **Anima**, *captioning* support for **tagger** models and a massive addition of new **schedulers**
Also here are updates to `torch` and additional GPU archs support for `ROCm` backends, plus a lot of internal improvements and fixes.
[ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) | [Sponsor](https://github.com/sponsors/vladmandic)
### Details for 2026-02-04
- **Models**
- [Tongyi-MAI Z-Image Base](https://tongyi-mai.github.io/Z-Image-blog/)
yup, its finally here, the full base model of **Z-Image**
- [CircleStone Anima](https://huggingface.co/circlestone-labs/Anima)
2B anime optimized model based on a modified Cosmos-Predict, using Qwen3-0.6B as a text encoder
- **Features**
- **caption** tab support for Booru tagger models, thanks @CalamitousFelicitousness
- add SmilingWolf WD14/WaifuDiffusion tagger models, thanks @CalamitousFelicitousness
- support comments in wildcard files, using `#`
- support aliases in metadata skip params, thanks @CalamitousFelicitousness
- ui gallery improve cache cleanup and add manual option, thanks @awsr
- selectable options to add system info to metadata, thanks @Athari
see *settings -> image metadata*
- **Schedulers**
- schedulers documentation has new home: <https://vladmandic.github.io/sdnext-docs/Schedulers/>
- add 13(!) new scheduler families
not a port, but more of inspired-by [res4lyf](https://github.com/ClownsharkBatwing/RES4LYF) library
all schedulers should be compatible with both `epsilon` and `flow` prediction style!
*note*: each family may have multiple actual schedulers, so the list total is 56(!) new schedulers
- core family: *RES*
- exponential: *DEIS, ETD, Lawson, ABNorsett*
- integrators: *Runge-Kutta, Linear-RK, Specialized-RK, Lobatto, Radau-IIA, Gauss-Legendre*
- flow: *PEC, Riemannian, Euclidean, Hyperbolic, Lorentzian, Langevin-Dynamics*
- add 3 additional schedulers: *CogXDDIM, DDIMParallel, DDPMParallel*
not originally intended to be a general purpose schedulers, but they work quite nicely and produce good results
- image metadata: always log scheduler class used
- **API**
- add `/sdapi/v1/xyz-grid` to enumerate xyz-grid axis options and their choices
see `/cli/api-xyzenum.py` for example usage
- add `/sdapi/v1/sampler` to get current sampler config
- modify `/sdapi/v1/samplers` to enumerate available samplers possible options
see `/cli/api-samplers.py` for example usage
- **Internal**
- tagged release history: <https://github.com/vladmandic/sdnext/tags>
each major for the past year is now tagged for easier reference
- **torch** update
*note*: may cause slow first startup/generate
**cuda**: update to `torch==2.10.0`
**xpu**: update to `torch==2.10.0`
**rocm**: update to `torch==2.10.0`
**openvino**: update to `torch==2.10.0` and `openvino==2025.4.1`
- rocm: expand available gfx archs, thanks @crashingalexsan
- rocm: set `MIOPEN_FIND_MODE=2` by default, thanks @crashingalexsan
- relocate all json data files to `data/` folder
existing data files are auto-migrated on startup
- refactor and improve connection monitor, thanks @awsr
- further work on type consistency and type checking, thanks @awsr
- log captured exceptions
- improve temp folder handling and cleanup
- remove torch errors/warings on fast server shutdown
- add ui placeholders for future agent-scheduler work, thanks @ryanmeador
- implement abort system on repeated errors, thanks @awsr
currently used by lora and textual-inversion loaders
- update package requirements
- **Fixes**
- add video ui elem_ids, thanks @ryanmeador
- use base steps as-is for non sd/sdxl models
- ui css fixes for modernui
- support lora inside prompt selector
- framepack video save
- metadata save for manual saves
## Update for 2026-01-22
Bugfix refresh
- add `SD_DEVICE_DEBUG` env variable to trace rocm/xpu/directml init failures
- fix detailer double save
- fix lora load when using peft/diffusers loader
@ -43,7 +342,7 @@ For full list of changes, see full changelog.
available in both *original* and *sdnq-dynamic prequantized* variants
thanks @CalamitousFelicitousness
*note*: model requires pre-release versions of `transformers` package:
> pip install --upgrade git+https://github.com/huggingface/transformers.git
> pip install --upgrade git+<https://github.com/huggingface/transformers.git>
> ./webui.sh --experimental
- [Nunchaku Z-Image Turbo](https://huggingface.co/nunchaku-tech/nunchaku-z-image-turbo)
nunchaku optimized z-image turbo
@ -137,7 +436,7 @@ End of year release update, just two weeks after previous one, with several new
- **Models**
- [LongCat Image](https://github.com/meituan-longcat/LongCat-Image) in *Image* and *Image Edit* variants
LongCat is a new 8B diffusion base model using Qwen-2.5 as text encoder
- [Qwen-Image-Edit 2511](Qwen/Qwen-Image-Edit-2511) in *base* and *pre-quantized* variants
- [Qwen-Image-Edit 2511](https://huggingface.co/Qwen/Qwen-Image-Edit-2511) in *base* and *pre-quantized* variants
Key enhancements: mitigate image drift, improved character consistency, enhanced industrial design generation, and strengthened geometric reasoning ability
- [Qwen-Image-Layered](https://huggingface.co/Qwen/Qwen-Image-Layered) in *base* and *pre-quantized* variants
Qwen-Image-Layered, a model capable of decomposing an image into multiple RGBA layers
@ -204,9 +503,9 @@ Plus a lot of internal improvements and fixes
**Z-Image** is a powerful and highly efficient image generation model with 6B parameters and using Qwen-3 as text encoder
unlike most of new models that are far larger, Z-Image architecture allows it to run with good performance even on mid-range hardware
*note*: initial release is *Turbo* variant only with *Base* and *Edit* variants to follow
- [Kandinsky 5.0 Lite]() is a new 6B model using Qwen-2.5 as text encoder
- [Kandinsky 5.0 Lite](https://huggingface.co/kandinskylab/Kandinsky-5.0-I2V-Lite-5s-Diffusers) is a new 6B model using Qwen-2.5 as text encoder
it comes in text-to-image and image-edit variants
- **Google Gemini Nano Banana** [2.5 Flash](https://blog.google/products/gemini/gemini-nano-banana-examples/) and [3.0 Pro](https://deepmind.google/models/gemini-image/pro/)
- **Google Gemini Nano Banana** [2.5 Flash](https://blog.google/products/gemini/gemini-nano-banana-examples/) and [3.0 Pro](https://deepmind.google/models/gemini-image/pro/)
first cloud-based model directly supported in SD.Next UI
*note*: need to set `GOOGLE_API_KEY` environment variable with your key to use this model
- [Photoroom PRX 1024 Beta](https://huggingface.co/Photoroom/prx-1024-t2i-beta)
@ -238,7 +537,7 @@ Plus a lot of internal improvements and fixes
- ui indicator of model capabilities
- support for *prefill* style of prompting/answering
- support for *reasoning* mode for supported models
with option to output answer-only or reasoning-process
with option to output answer-only or reasoning-process
- additional debug logging
- **Other Features**
- **wildcards**: allow recursive inline wildcards using curly braces syntax
@ -297,9 +596,11 @@ Plus a lot of internal improvements and fixes
- control: safe load non-sparse controlnet
- control: fix marigold preprocessor with bfloat16
- auth: fix password being shown in clear text during login
- github: better handling of forks
- firefox: remove obsolete checks, thanks @awsr
- runai streamer: cleanup logging, thanks @CalamitousFelicitousness
- gradio: event handlers, thanks @awsr
- seedvr: handle non-cuda environments, thanks @resonantsky
## Update for 2025-11-06
@ -562,7 +863,7 @@ Highlight are:
requires qwen-image-edit-2509 or its variant as multi-image edits are not available in original qwen-image
in ui control tab: inputs -> separate init image
add image for *input media* and *control media*
can be
can be
- [Cache-DiT](https://github.com/vipshop/cache-dit)
cache-dit is a unified, flexible and training-free cache acceleration framework
compatible with many dit-based models such as FLUX.1, Qwen, HunyuanImage, Wan2.2, Chroma, etc.
@ -777,7 +1078,7 @@ And check out new **history** tab in the right panel, it now shows visualization
- update openvino to `openvino==2025.3.0`
- add deprecation warning for `python==3.9`
- allow setting denoise strength to 0 in control/img2img
this allows to run workflows which only refine or detail existing image without changing it
this allows to run workflows which only refine or detail existing image without changing it
- **Fixes**
- normalize path hanlding when deleting images
- unified compile upscalers
@ -863,7 +1164,7 @@ New release two weeks after the last one and its a big one with over 150 commits
- Several new models: [Qwen-Image](https://qwenlm.github.io/blog/qwen-image/) (plus *Lightning* variant) and [FLUX.1-Krea-Dev](https://www.krea.ai/blog/flux-krea-open-source-release)
- Several updated models: [Chroma](https://huggingface.co/lodestones/Chroma), [SkyReels-V2](https://huggingface.co/Skywork/SkyReels-V2-DF-14B-720P-Diffusers), [Wan-VACE](https://huggingface.co/Wan-AI/Wan2.1-VACE-14B-diffusers), [HunyuanDiT](https://huggingface.co/Tencent-Hunyuan/HunyuanDiT-v1.2-Diffusers-Distilled)
- Plus continuing with major **UI** work with new embedded **Docs/Wiki** search, redesigned real-time **hints**, **wildcards** UI selector, built-in **GPU monitor**, **CivitAI** integration and more!
- On the compute side, new profiles for high-vram GPUs, offloading improvements, parallel-load for large models, support for new `torch` release and improved quality when using low-bit quantization!
- On the compute side, new profiles for high-vram GPUs, offloading improvements, parallel-load for large models, support for new `torch` release and improved quality when using low-bit quantization!
- [SD.Next Model Samples Gallery](https://vladmandic.github.io/sd-samples/compare.html): pre-generated image gallery with 60 models (45 base and 15 finetunes) and 40 different styles resulting in 2,400 high resolution images!
gallery additionally includes model details such as typical load and inference times as well as sizes and types of each model component (*e.g. unet, transformer, text-encoder, vae*)
- And (*as always*) many bugfixes and improvements to existing features!

121
README.md
View File

@ -1,8 +1,14 @@
<div align="center">
<img src="https://github.com/vladmandic/sdnext/raw/master/html/logo-transparent.png" width=200 alt="SD.Next">
<img src="https://github.com/vladmandic/sdnext/raw/master/html/logo-transparent.png" width=200 alt="SD.Next: AI art generator logo">
# SD.Next: All-in-one WebUI for AI generative image and video creation
# SD.Next: All-in-one WebUI
SD.Next is a powerful, open-source WebUI app for AI image and video generation, built on Stable Diffusion and supporting dozens of advanced models. Create, caption, and process images and videos with a modern, cross-platform interface—perfect for artists, researchers, and AI enthusiasts.
![Stars](https://img.shields.io/github/stars/vladmandic/sdnext?style=social)
![Forks](https://img.shields.io/github/forks/vladmandic/sdnext?style=social)
![Contributors](https://img.shields.io/github/contributors/vladmandic/sdnext)
![Last update](https://img.shields.io/github/last-commit/vladmandic/sdnext?svg=true)
![License](https://img.shields.io/github/license/vladmandic/sdnext?svg=true)
[![Discord](https://img.shields.io/discord/1101998836328697867?logo=Discord&svg=true)](https://discord.gg/VjvR2tabEX)
@ -17,65 +23,63 @@
## Table of contents
- [Documentation](https://vladmandic.github.io/sdnext-docs/)
- [SD.Next Features](#sdnext-features)
- [Model support](#model-support)
- [Platform support](#platform-support)
- [SD.Features](#features--capabilities)
- [Supported AI Models](#supported-ai-models)
- [Supported Platforms & Hardware](#supported-platforms--hardware)
- [Getting started](#getting-started)
## SD.Next Features
### Screenshot: Desktop interface
All individual features are not listed here, instead check [ChangeLog](CHANGELOG.md) for full list of changes
- Fully localized:
**English | Chinese | Russian | Spanish | German | French | Italian | Portuguese | Japanese | Korean**
- Multiple UIs!
**Standard | Modern**
- Multiple [diffusion models](https://vladmandic.github.io/sdnext-docs/Model-Support/)!
- Built-in Control for Text, Image, Batch and Video processing!
- Multi-platform!
▹ **Windows | Linux | MacOS | nVidia CUDA | AMD ROCm | Intel Arc / IPEX XPU | DirectML | OpenVINO | ONNX+Olive | ZLUDA**
<div align="center">
<img src="https://github.com/vladmandic/sdnext/raw/dev/html/screenshot-robot.jpg" alt="SD.Next: AI art generator desktop interface screenshot" width="90%">
</div>
### Screenshot: Mobile interface
<div align="center">
<img src="https://github.com/user-attachments/assets/ced9fe0c-d2c2-46d1-94a7-8f9f2307ce38" alt="SD.Next: AI art generator mobile interface screenshot" width="35%">
</div>
</div>
<br>
## Features & Capabilities
SD.Next is feature-rich with a focus on performance, flexibility, and user experience. Key features include:
- [Multi-platform](#platform-support!
- Many [diffusion models](https://vladmandic.github.io/sdnext-docs/Model-Support/)!
- Fully localized to ~15 languages and with support for many [UI themes](https://vladmandic.github.io/sdnext-docs/Themes/)!
- [Desktop](#screenshot-desktop-interface) and [Mobile](#screenshot-mobile-interface) support!
- Platform specific auto-detection and tuning performed on install
- Optimized processing with latest `torch` developments with built-in support for model compile and quantize
Compile backends: *Triton | StableFast | DeepCache | OneDiff | TeaCache | etc.*
Quantization methods: *SDNQ | BitsAndBytes | Optimum-Quanto | TorchAO / LayerWise*
- **Interrogate/Captioning** with 150+ **OpenCLiP** models and 20+ built-in **VLMs**
- Built-in queue management
- Built in installer with automatic updates and dependency management
- Mobile compatible
### Unique features
SD.Next includes many features not found in other WebUIs, such as:
- **SDNQ**: State-of-the-Art quantization engine
Use pre-quantized or run with quantizaion on-the-fly for up to 4x VRAM reduction with no or minimal quality and performance impact
- **Balanced Offload**: Dynamically balance CPU and GPU memory to run larger models on limited hardware
- **Captioning** with 150+ **OpenCLiP** models, **Tagger** with **WaifuDiffusion** and **DeepDanbooru** models, and 25+ built-in **VLMs**
- **Image Processing** with full image correction color-grading suite of tools
<br>
**Desktop** interface
<div align="center">
<img src="https://github.com/user-attachments/assets/d6119a63-6ee5-4597-95f6-29ed0701d3b5" alt="screenshot-modernui-desktop" width="90%">
</div>
**Mobile** interface
<div align="center">
<img src="https://github.com/user-attachments/assets/ced9fe0c-d2c2-46d1-94a7-8f9f2307ce38" alt="screenshot-modernui-mobile" width="35%">
</div>
For screenshots and information on other available themes, see [Themes](https://vladmandic.github.io/sdnext-docs/Themes/)
<br>
## Model support
## Supported AI Models
SD.Next supports broad range of models: [supported models](https://vladmandic.github.io/sdnext-docs/Model-Support/) and [model specs](https://vladmandic.github.io/sdnext-docs/Models/)
## Platform support
## Supported Platforms & Hardware
- *nVidia* GPUs using **CUDA** libraries on both *Windows and Linux*
- *AMD* GPUs using **ROCm** libraries on *Linux*
Support will be extended to *Windows* once AMD releases ROCm for Windows
- *AMD* GPUs using **ROCm** libraries on both *Linux and Windows*
- *AMD* GPUs on Windows using **ZLUDA** libraries
- *Intel Arc* GPUs using **OneAPI** with *IPEX XPU* libraries on both *Windows and Linux*
- Any *CPU/GPU* or device compatible with **OpenVINO** libraries on both *Windows and Linux*
- Any GPU compatible with *DirectX* on *Windows* using **DirectML** libraries
This includes support for AMD GPUs that are not supported by native ROCm libraries
- Any GPU or device compatible with **OpenVINO** libraries on both *Windows and Linux*
- *Apple M1/M2* on *OSX* using built-in support in Torch with **MPS** optimizations
- *ONNX/Olive*
- *AMD* GPUs on Windows using **ZLUDA** libraries
Plus Docker container recipes for: [CUDA, ROCm, Intel IPEX and OpenVINO](https://vladmandic.github.io/sdnext-docs/Docker/)
Plus **Docker** container recipes for: [CUDA, ROCm, Intel IPEX and OpenVINO](https://vladmandic.github.io/sdnext-docs/Docker/)
## Getting started
@ -88,21 +92,37 @@ Plus Docker container recipes for: [CUDA, ROCm, Intel IPEX and OpenVINO](https:/
> And for platform specific information, check out
> [WSL](https://vladmandic.github.io/sdnext-docs/WSL/) | [Intel Arc](https://vladmandic.github.io/sdnext-docs/Intel-ARC/) | [DirectML](https://vladmandic.github.io/sdnext-docs/DirectML/) | [OpenVINO](https://vladmandic.github.io/sdnext-docs/OpenVINO/) | [ONNX & Olive](https://vladmandic.github.io/sdnext-docs/ONNX-Runtime/) | [ZLUDA](https://vladmandic.github.io/sdnext-docs/ZLUDA/) | [AMD ROCm](https://vladmandic.github.io/sdnext-docs/AMD-ROCm/) | [MacOS](https://vladmandic.github.io/sdnext-docs/MacOS-Python/) | [nVidia](https://vladmandic.github.io/sdnext-docs/nVidia/) | [Docker](https://vladmandic.github.io/sdnext-docs/Docker/)
### Quick Start
```shell
git clone https://github.com/vladmandic/sdnext
cd sdnext
./webui.sh # Linux/Mac
webui.bat # Windows
webui.ps1 # PowerShell
```
> [!WARNING]
> If you run into issues, check out [troubleshooting](https://vladmandic.github.io/sdnext-docs/Troubleshooting/) and [debugging](https://vladmandic.github.io/sdnext-docs/Debug/) guides
## Community & Support
If you're unsure how to use a feature, best place to start is [Docs](https://vladmandic.github.io/sdnext-docs/) and if its not there,
check [ChangeLog](https://vladmandic.github.io/sdnext-docs/CHANGELOG/) for when feature was first introduced as it will always have a short note on how to use it
And for any question, reach out on [Discord](https://discord.gg/VjvR2tabEX) or open an [issue](https://github.com/vladmandic/sdnext/issues) or [discussion](https://github.com/vladmandic/sdnext/discussions)
### Contributing
Please see [Contributing](CONTRIBUTING) for details on how to contribute to this project
And for any question, reach out on [Discord](https://discord.gg/VjvR2tabEX) or open an [issue](https://github.com/vladmandic/sdnext/issues) or [discussion](https://github.com/vladmandic/sdnext/discussions)
### Credits
## License & Credits
- SD.Next is licensed under the [Apache License 2.0](LICENSE.txt)
- Main credit goes to [Automatic1111 WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) for the original codebase
- Additional credits are listed in [Credits](https://github.com/AUTOMATIC1111/stable-diffusion-webui/#credits)
- Licenses for modules are listed in [Licenses](html/licenses.html)
### Evolution
## Evolution
<a href="https://star-history.com/#vladmandic/sdnext&Date">
<picture width=640>
@ -113,9 +133,4 @@ And for any question, reach out on [Discord](https://discord.gg/VjvR2tabEX) or o
- [OSS Stats](https://ossinsight.io/analyze/vladmandic/sdnext#overview)
### Docs
If you're unsure how to use a feature, best place to start is [Docs](https://vladmandic.github.io/sdnext-docs/) and if its not there,
check [ChangeLog](https://vladmandic.github.io/sdnext-docs/CHANGELOG/) for when feature was first introduced as it will always have a short note on how to use it
<br>

231
TODO.md
View File

@ -1,137 +1,150 @@
# TODO
## Project Board
- <https://github.com/users/vladmandic/projects>
<https://github.com/huggingface/diffusers/pull/13317>
## Internal
- Feature: Move `nunchaku` models to refernce instead of internal decision
- Update: `transformers==5.0.0`
- Feature: Unify *huggingface* and *diffusers* model folders
- Reimplement `llama` remover for Kanvas
- Deploy: Create executable for SD.Next
- Feature: implement `unload_auxiliary_models`
- Feature: RIFE update
- Feature: RIFE in processing
- Feature: SeedVR2 in processing
- Feature: Add video models to `Reference`
- Deploy: Lite vs Expert mode
- Engine: [mmgp](https://github.com/deepbeepmeep/mmgp)
- Engine: `TensorRT` acceleration
- Feature: Auto handle scheduler `prediction_type`
- Feature: Cache models in memory
- Feature: JSON image metadata
- Validate: Control tab add overrides handling
- Feature: Integrate natural language image search
[ImageDB](https://github.com/vladmandic/imagedb)
- Feature: Remote Text-Encoder support
- Refactor: move sampler options to settings to config
- Feature: Multi-user support
- Feature: Settings profile manager
- Feature: Video tab add full API support
- Refactor: Unify *huggingface* and *diffusers* model folders
- Refactor: [GGUF](https://huggingface.co/docs/diffusers/main/en/quantization/gguf)
- Feature: LoRA add OMI format support for SD35/FLUX.1
- Refactor: remove `CodeFormer`
- Refactor: remove `GFPGAN`
- UI: Lite vs Expert mode
- Video tab: add full API support
- Control tab: add overrides handling
- Engine: `TensorRT` acceleration
- Engine: [mmgp](https://github.com/deepbeepmeep/mmgp)
- Engine: [sharpfin](https://github.com/drhead/sharpfin) instead of `torchvision`
- Reimplement `llama` remover for Kanvas
- Integrate: [Depth3D](https://github.com/vladmandic/sd-extension-depth3d)
## OnHold
- Feature: LoRA add OMI format support for SD35/FLUX.1, on-hold
- Feature: Remote Text-Encoder support, sidelined for the moment
## Modular
*Pending finalization of modular pipelines implementation and development of compatibility layer*
- Switch to modular pipelines
- Feature: Transformers unified cache handler
- Refactor: [Modular pipelines and guiders](https://github.com/huggingface/diffusers/issues/11915)
- [MagCache](https://github.com/lllyasviel/FramePack/pull/673/files)
- [MagCache](https://github.com/huggingface/diffusers/pull/12744)
- [SmoothCache](https://github.com/huggingface/diffusers/issues/11135)
## Features
- [Flux.2 TinyVAE](https://huggingface.co/fal/FLUX.2-Tiny-AutoEncoder)
- [IPAdapter composition](https://huggingface.co/ostris/ip-composition-adapter)
- [IPAdapter negative guidance](https://github.com/huggingface/diffusers/discussions/7167)
- [STG](https://github.com/huggingface/diffusers/blob/main/examples/community/README.md#spatiotemporal-skip-guidance)
- [Video Inpaint Pipeline](https://github.com/huggingface/diffusers/pull/12506)
- [Sonic Inpaint](https://github.com/ubc-vision/sonic)
### New models / Pipelines
## New models / Pipelines
TODO: Investigate which models are diffusers-compatible and prioritize!
- [Bria FiboEdit](https://github.com/huggingface/diffusers/commit/d7a1c31f4f85bae5a9e01cdce49bd7346bd8ccd6)
- [LTXVideo 0.98 LongMulti](https://github.com/huggingface/diffusers/pull/12614)
- [Cosmos-Predict-2.5](https://huggingface.co/nvidia/Cosmos-Predict2.5-2B)
- [NewBie Image Exp0.1](https://github.com/huggingface/diffusers/pull/12803)
- [Sana-I2V](https://github.com/huggingface/diffusers/pull/12634#issuecomment-3540534268)
- [Bria FIBO](https://huggingface.co/briaai/FIBO)
- [Bytedance Lynx](https://github.com/bytedance/lynx)
- [ByteDance OneReward](https://github.com/bytedance/OneReward)
- [ByteDance USO](https://github.com/bytedance/USO)
- [Chroma Radiance](https://huggingface.co/lodestones/Chroma1-Radiance)
- [Chroma Zeta](https://huggingface.co/lodestones/Zeta-Chroma)
- [DiffSynth Studio](https://github.com/modelscope/DiffSynth-Studio)
- [DiffusionForcing](https://github.com/kwsong0113/diffusion-forcing-transformer)
- [Dream0 guidance](https://huggingface.co/ByteDance/DreamO)
- [HunyuanAvatar](https://huggingface.co/tencent/HunyuanVideo-Avatar)
- [HunyuanCustom](https://github.com/Tencent-Hunyuan/HunyuanCustom)
- [Inf-DiT](https://github.com/zai-org/Inf-DiT)
- [Krea Realtime Video](https://huggingface.co/krea/krea-realtime-video)
- [LanDiff](https://github.com/landiff/landiff)
- [Liquid](https://github.com/FoundationVision/Liquid)
- [LongCat-Video](https://huggingface.co/meituan-longcat/LongCat-Video)
- [LucyEdit](https://github.com/huggingface/diffusers/pull/12340)
- [Lumina-DiMOO](https://huggingface.co/Alpha-VLLM/Lumina-DiMOO)
- [Magi](https://github.com/SandAI-org/MAGI-1)(https://github.com/huggingface/diffusers/pull/11713)
- [Ming](https://github.com/inclusionAI/Ming)
- [MUG-V 10B](https://huggingface.co/MUG-V/MUG-V-inference)
- [Ovi](https://github.com/character-ai/Ovi)
- [Phantom HuMo](https://github.com/Phantom-video/Phantom)
- [SD3 UltraEdit](https://github.com/HaozheZhao/UltraEdit)
- [SelfForcing](https://github.com/guandeh17/Self-Forcing)
- [SEVA](https://github.com/huggingface/diffusers/pull/11440)
- [Step1X](https://github.com/stepfun-ai/Step1X-Edit)
- [Wan-2.2 Animate](https://github.com/huggingface/diffusers/pull/12526)
- [Wan-2.2 S2V](https://github.com/huggingface/diffusers/pull/12258)
- [WAN-CausVid-Plus t2v](https://github.com/goatWu/CausVid-Plus/)
- [WAN-CausVid](https://huggingface.co/lightx2v/Wan2.1-T2V-14B-CausVid)
- [WAN-StepDistill](https://huggingface.co/lightx2v/Wan2.1-T2V-14B-StepDistill-CfgDistill)
- [Wan2.2-Animate-14B](https://huggingface.co/Wan-AI/Wan2.2-Animate-14B)
- [WAN2GP](https://github.com/deepbeepmeep/Wan2GP)
### Image-Base
### Asyncio
- [Chroma Zeta](https://huggingface.co/lodestones/Zeta-Chroma): Image and video generator for creative effects and professional filters
- [Chroma Radiance](https://huggingface.co/lodestones/Chroma1-Radiance): Pixel-space model eliminating VAE artifacts for high visual fidelity
- [Bria FIBO](https://huggingface.co/briaai/FIBO): Fully JSON based
- [Liquid](https://github.com/FoundationVision/Liquid): Unified vision-language auto-regressive generation paradigm
- [Lumina-DiMOO](https://huggingface.co/Alpha-VLLM/Lumina-DiMOO): Foundational multi-modal generation and understanding via discrete diffusion
- [nVidia Cosmos-Predict-2.5](https://huggingface.co/nvidia/Cosmos-Predict2.5-2B): Physics-aware world foundation model for consistent scene prediction
- [Liquid (unified multimodal generator)](https://github.com/FoundationVision/Liquid): Auto-regressive generation paradigm across vision and language
- [Lumina-DiMOO](https://huggingface.co/Alpha-VLLM/Lumina-DiMOO): foundational multi-modal multi-task generation and understanding
- Policy system is deprecated and will be removed in **Python 3.16**
- [Python 3.14 removals - asyncio](https://docs.python.org/3.14/whatsnew/3.14.html#id10)
- https://docs.python.org/3.14/library/asyncio-policy.html
- Affected files:
- [`webui.py`](webui.py)
- [`cli/sdapi.py`](cli/sdapi.py)
- Migration:
- [asyncio.run](https://docs.python.org/3.14/library/asyncio-runner.html#asyncio.run)
- [asyncio.Runner](https://docs.python.org/3.14/library/asyncio-runner.html#asyncio.Runner)
### Image-Edit
#### rmtree
- [Bria FIBO-Edit](https://huggingface.co/briaai/Fibo-Edit-RMBG): Fully JSON-based instruction-following image editing framework
- [Meituan LongCat-Image-Edit-Turbo](https://huggingface.co/meituan-longcat/LongCat-Image-Edit-Turbo):6B instruction-following image editing with high visual consistency
- [VIBE Image-Edit](https://huggingface.co/iitolstykh/VIBE-Image-Edit): (Sana+Qwen-VL)Fast visual instruction-based image editing framework
- [LucyEdit](https://github.com/huggingface/diffusers/pull/12340):Instruction-guided video editing while preserving motion and identity
- [Step1X-Edit](https://github.com/stepfun-ai/Step1X-Edit):Multimodal image editing decoding MLLM tokens via DiT
- [OneReward](https://github.com/bytedance/OneReward):Reinforcement learning grounded generative reward model for image editing
- [ByteDance DreamO](https://huggingface.co/ByteDance/DreamO): image customization framework for IP adaptation and virtual try-on
- [nVidia Cosmos-Transfer-2.5](https://github.com/huggingface/diffusers/pull/13066)
- `onerror` deprecated and replaced with `onexc` in **Python 3.12**
``` python
def excRemoveReadonly(func, path, exc: BaseException):
import stat
shared.log.debug(f'Exception during cleanup: {func} {path} {type(exc).__name__}')
if func in (os.rmdir, os.remove, os.unlink) and isinstance(exc, PermissionError):
shared.log.debug(f'Retrying cleanup: {path}')
os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
func(path)
# ...
try:
shutil.rmtree(found.path, ignore_errors=False, onexc=excRemoveReadonly)
```
### Video
- [LTX-Condition](https://github.com/huggingface/diffusers/pull/13058)
- [LTX-Distilled](https://github.com/huggingface/diffusers/pull/12934)
- [OpenMOSS MOVA](https://huggingface.co/OpenMOSS-Team/MOVA-720p): Unified foundation model for synchronized high-fidelity video and audio
- [Wan family (Wan2.1 / Wan2.2 variants)](https://huggingface.co/Wan-AI/Wan2.2-Animate-14B): MoE-based foundational tools for cinematic T2V/I2V/TI2V
example: [Wan2.1-T2V-14B-CausVid](https://huggingface.co/lightx2v/Wan2.1-T2V-14B-CausVid)
distill / step-distill examples: [Wan2.1-StepDistill-CfgDistill](https://huggingface.co/lightx2v/Wan2.1-T2V-14B-StepDistill-CfgDistill)
- [Krea Realtime Video](https://huggingface.co/krea/krea-realtime-video): (Wan2.1)Distilled real-time video diffusion using self-forcing techniques
- [MAGI-1 (autoregressive video)](https://github.com/SandAI-org/MAGI-1): Autoregressive video generation allowing infinite and timeline control
- [MUG-V 10B (video generation)](https://huggingface.co/MUG-V/MUG-V-inference): large-scale DiT-based video generation system trained via flow-matching
- [Ovi (audio/video generation)](https://github.com/character-ai/Ovi): (Wan2.2)Speech-to-video with synchronized sound effects and music
- [HunyuanVideo-Avatar / HunyuanCustom](https://huggingface.co/tencent/HunyuanVideo-Avatar): (HunyuanVideo)MM-DiT based dynamic emotion-controllable dialogue generation
- [Sana Image→Video (Sana-I2V)](https://github.com/huggingface/diffusers/pull/12634#issuecomment-3540534268): (Sana)Compact Linear DiT framework for efficient high-resolution video
- [Wan-2.2 S2V (diffusers PR)](https://github.com/huggingface/diffusers/pull/12258): (Wan2.2)Audio-driven cinematic speech-to-video generation
- [LongCat-Video](https://huggingface.co/meituan-longcat/LongCat-Video): Unified framework for minutes-long coherent video generation via Block Sparse Attention
- [LTXVideo / LTXVideo LongMulti (diffusers PR)](https://github.com/huggingface/diffusers/pull/12614): Real-time DiT-based generation with production-ready camera controls
- [DiffSynth-Studio (ModelScope)](https://github.com/modelscope/DiffSynth-Studio): (Wan2.2)Comprehensive training and quantization tools for Wan video models
- [Phantom (Phantom HuMo)](https://github.com/Phantom-video/Phantom): Human-centric video generation framework focus on subject ID consistency
- [CausVid-Plus / WAN-CausVid-Plus](https://github.com/goatWu/CausVid-Plus/): (Wan2.1)Causal diffusion for high-quality temporally consistent long videos
- [Wan2GP (workflow/GUI for Wan)](https://github.com/deepbeepmeep/Wan2GP): (Wan)Web-based UI focused on running complex video models for GPU-poor setups
- [LivePortrait](https://github.com/KwaiVGI/LivePortrait): Efficient portrait animation system with high stitching and retargeting control
- [Magi (SandAI)](https://github.com/SandAI-org/MAGI-1): High-quality autoregressive video generation framework
- [Ming (inclusionAI)](https://github.com/inclusionAI/Ming): Unified multimodal model for processing text, audio, image, and video
### Other/Unsorted
- [DiffusionForcing](https://github.com/kwsong0113/diffusion-forcing-transformer): Full-sequence diffusion with autoregressive next-token prediction
- [Self-Forcing](https://github.com/guandeh17/Self-Forcing): Framework for improving temporal consistency in long-horizon video generation
- [SEVA](https://github.com/huggingface/diffusers/pull/11440): Stable Virtual Camera for novel view synthesis and 3D-consistent video
- [ByteDance USO](https://github.com/bytedance/USO): Unified Style-Subject Optimized framework for personalized image generation
- [ByteDance Lynx](https://github.com/bytedance/lynx): State-of-the-art high-fidelity personalized video generation based on DiT
- [LanDiff](https://github.com/landiff/landiff): Coarse-to-fine text-to-video integrating Language and Diffusion Models
- [Video Inpaint Pipeline](https://github.com/huggingface/diffusers/pull/12506): Unified inpainting pipeline implementation within Diffusers library
- [Sonic Inpaint](https://github.com/ubc-vision/sonic): Audio-driven portrait animation system focus on global audio perception
- [Make-It-Count](https://github.com/Litalby1/make-it-count): CountGen method for precise numerical control of objects via object identity features
- [ControlNeXt](https://github.com/dvlab-research/ControlNeXt/): Lightweight architecture for efficient controllable image and video generation
- [MS-Diffusion](https://github.com/MS-Diffusion/MS-Diffusion): Layout-guided multi-subject image personalization framework
- [UniRef](https://github.com/FoundationVision/UniRef): Unified model for segmentation tasks designed as foundation model plug-in
- [FlashFace](https://github.com/ali-vilab/FlashFace): High-fidelity human image customization and face swapping framework
- [ReNO](https://github.com/ExplainableML/ReNO): Reward-based Noise Optimization to improve text-to-image quality during inference
### Not Planned
- [LoRAdapter](https://github.com/CompVis/LoRAdapter): Not recently updated
- [SD3 UltraEdit](https://github.com/HaozheZhao/UltraEdit): Based on SD3
- [PowerPaint](https://github.com/open-mmlab/PowerPaint): Based on SD15
- [FreeCustom](https://github.com/aim-uofa/FreeCustom): Based on SD15
- [AnyDoor](https://github.com/ali-vilab/AnyDoor): Based on SD21
- [AnyText2](https://github.com/tyxsspa/AnyText2): Based on SD15
- [DragonDiffusion](https://github.com/MC-E/DragonDiffusion): Based on SD15
- [DenseDiffusion](https://github.com/naver-ai/DenseDiffusion): Based on SD15
- [IC-Light](https://github.com/lllyasviel/IC-Light): Based on SD15
## Code TODO
> npm run todo
- fc: autodetect distilled based on model
- fc: autodetect tensor format based on model
- hypertile: vae breaks when using non-standard sizes
- install: switch to pytorch source when it becomes available
- loader: load receipe
- loader: save receipe
- lora: add other quantization types
- lora: add t5 key support for sd35/f1
- lora: maybe force imediate quantization
- model load: force-reloading entire model as loading transformers only leads to massive memory usage
- model load: implement model in-memory caching
- modernui: monkey-patch for missing tabs.select event
- modules/lora/lora_extract.py:188:9: W0511: TODO: lora: support pre-quantized flux
- modules/modular_guiders.py:65:58: W0511: TODO: guiders
- processing: remove duplicate mask params
- resize image: enable full VAE mode for resize-latent
```code
installer.py:TODO rocm: switch to pytorch source when it becomes available
modules/control/run.py:TODO modernui: monkey-patch for missing tabs.select event
modules/history.py:TODO: apply metadata, preview, load/save
modules/image/resize.py:TODO resize image: enable full VAE mode for resize-latent
modules/lora/lora_apply.py:TODO lora: add other quantization types
modules/lora/lora_apply.py:TODO lora: maybe force imediate quantization
modules/lora/lora_extract.py:TODO: lora: support pre-quantized flux
modules/lora/lora_load.py:TODO lora: add t5 key support for sd35/f1
modules/masking.py:TODO: additional masking algorithms
modules/modular_guiders.py:TODO: guiders
modules/processing_class.py:TODO processing: remove duplicate mask params
modules/sd_hijack_hypertile.py:TODO hypertile: vae breaks when using non-standard sizes
modules/sd_models.py:TODO model load: implement model in-memory caching
modules/sd_samplers_diffusers.py:TODO enso-required
modules/sd_unet.py:TODO model load: force-reloading entire model as loading transformers only leads to massive memory usage
modules/transformer_cache.py:TODO fc: autodetect distilled based on model
modules/transformer_cache.py:TODO fc: autodetect tensor format based on model
modules/ui_models_load.py:TODO loader: load receipe
modules/ui_models_load.py:TODO loader: save receipe
modules/video_models/video_save.py:TODO audio set time-base
```

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python
"""
use clip to interrogate image(s)
use clip to caption image(s)
"""
import io
@ -43,64 +43,63 @@ def print_summary():
log.info({ 'keyword stats': keywords })
async def interrogate(f):
async def caption(f):
if not filetype.is_image(f):
log.info({ 'interrogate skip': f })
log.info({ 'caption skip': f })
return
json = Map({ 'image': encode(f) })
log.info({ 'interrogate': f })
log.info({ 'caption': f })
# run clip
json.model = 'clip'
res = await sdapi.post('/sdapi/v1/interrogate', json)
caption = ""
res = await sdapi.post('/sdapi/v1/caption', json)
result = ""
style = ""
if 'caption' in res:
caption = res.caption
log.info({ 'interrogate caption': caption })
if ', by' in caption:
style = caption.split(', by')[1].strip()
log.info({ 'interrogate style': style })
for word in caption.split(' '):
result = res.caption
log.info({ 'caption result': result })
if ', by' in result:
style = result.split(', by')[1].strip()
log.info({ 'caption style': style })
for word in result.split(' '):
if word not in exclude:
stats['captions'][word] = stats['captions'][word] + 1 if word in stats['captions'] else 1
else:
log.error({ 'interrogate clip error': res })
# run booru
json.model = 'deepdanbooru'
res = await sdapi.post('/sdapi/v1/interrogate', json)
log.error({ 'caption clip error': res })
# run tagger (DeepBooru)
tagger_req = Map({'image': json.image, 'model': 'deepbooru', 'show_scores': True})
res = await sdapi.post('/sdapi/v1/tagger', tagger_req)
keywords = {}
if 'caption' in res:
for term in res.caption.split(', '):
term = term.replace('(', '').replace(')', '').replace('\\', '').split(':')
if len(term) < 2:
continue
keywords[term[0]] = term[1]
keywords = dict(sorted(keywords.items(), key=lambda x:x[1], reverse=True))
for word in keywords.items():
stats['keywords'][word[0]] = stats['keywords'][word[0]] + 1 if word[0] in stats['keywords'] else 1
log.info({ 'interrogate keywords': keywords })
if 'scores' in res and res.scores:
keywords = dict(sorted(res.scores.items(), key=lambda x: x[1], reverse=True))
for word in keywords:
stats['keywords'][word] = stats['keywords'][word] + 1 if word in stats['keywords'] else 1
log.info({'caption keywords': keywords})
elif 'tags' in res:
for tag in res.tags.split(', '):
stats['keywords'][tag] = stats['keywords'][tag] + 1 if tag in stats['keywords'] else 1
log.info({'caption tags': res.tags})
else:
log.error({ 'interrogate booru error': res })
return caption, keywords, style
log.error({'caption tagger error': res})
return result, keywords, style
async def main():
sys.argv.pop(0)
await sdapi.session()
if len(sys.argv) == 0:
log.error({ 'interrogate': 'no files specified' })
log.error({ 'caption': 'no files specified' })
for arg in sys.argv:
if os.path.exists(arg):
if os.path.isfile(arg):
await interrogate(arg)
await caption(arg)
elif os.path.isdir(arg):
for root, _dirs, files in os.walk(arg):
for f in files:
_caption, _keywords, _style = await interrogate(os.path.join(root, f))
_caption, _keywords, _style = await caption(os.path.join(root, f))
else:
log.error({ 'interrogate unknown file type': arg })
log.error({ 'caption unknown file type': arg })
else:
log.error({ 'interrogate file missing': arg })
log.error({ 'caption file missing': arg })
await sdapi.close()
print_summary()

View File

@ -24,7 +24,7 @@ def auth():
return None
def get(endpoint: str, dct: dict = None):
def get(endpoint: str, dct: dict | None = None):
req = requests.get(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -30,7 +30,7 @@ def auth():
return None
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -23,7 +23,7 @@ def auth():
return None
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -24,7 +24,7 @@ def auth():
return None
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -29,7 +29,7 @@ def auth():
return None
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -79,7 +79,7 @@ def generate(x: int, y: int): # pylint: disable=redefined-outer-name
return images
def merge(images: list[Image.Image], horizontal: bool, labels: list[str] = None):
def merge(images: list[Image.Image], horizontal: bool, labels: list[str] | None = None):
rows = 1 if horizontal else len(images)
cols = math.ceil(len(images) / rows)
w = max([i.size[0] for i in images])

View File

@ -29,7 +29,7 @@ def auth():
return None
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -24,7 +24,7 @@ def auth():
return None
def get(endpoint: str, dct: dict = None):
def get(endpoint: str, dct: dict | None = None):
req = requests.get(f'{sd_url}{endpoint}', json=dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }
@ -32,7 +32,7 @@ def get(endpoint: str, dct: dict = None):
return req.json()
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -28,7 +28,7 @@ def auth():
return None
def post(endpoint: str, payload: dict = None):
def post(endpoint: str, payload: dict | None = None):
if 'sdapi' not in endpoint:
endpoint = f'sdapi/v1/{endpoint}'
if 'http' not in endpoint:

View File

@ -26,7 +26,7 @@ def auth():
return None
def get(endpoint: str, dct: dict = None):
def get(endpoint: str, dct: dict | None = None):
req = requests.get(f'{sd_url}{endpoint}', json=dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }
@ -34,7 +34,7 @@ def get(endpoint: str, dct: dict = None):
return req.json()
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -26,7 +26,7 @@ def auth():
return None
def get(endpoint: str, dct: dict = None):
def get(endpoint: str, dct: dict | None = None):
req = requests.get(f'{sd_url}{endpoint}', json=dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }
@ -34,7 +34,7 @@ def get(endpoint: str, dct: dict = None):
return req.json()
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -81,7 +81,7 @@ async function main() {
} else {
const json = await res.json();
console.log('result:', json.info);
for (const i in json.images) { // eslint-disable-line guard-for-in
for (const i in json.images) {
const file = args.output || `/tmp/test-${i}.jpg`;
const data = atob(json.images[i]);
fs.writeFileSync(file, data, 'binary');

35
cli/api-samplers.py Executable file
View File

@ -0,0 +1,35 @@
#!/usr/bin/env python
"""
get list of all samplers and details of current sampler
"""
import sys
import logging
import urllib3
import requests
url = "http://127.0.0.1:7860"
user = ""
password = ""
log_format = '%(asctime)s %(levelname)s: %(message)s'
logging.basicConfig(level = logging.INFO, format = log_format)
log = logging.getLogger("sd")
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
log.info('available samplers')
auth = requests.auth.HTTPBasicAuth(user, password) if len(user) > 0 and len(password) > 0 else None
req = requests.get(f'{url}/sdapi/v1/samplers', verify=False, auth=auth, timeout=60)
if req.status_code != 200:
log.error({ 'url': req.url, 'request': req.status_code, 'reason': req.reason })
exit(1)
res = req.json()
for item in res:
log.info(item)
log.info('current sampler')
req = requests.get(f'{url}/sdapi/v1/sampler', verify=False, auth=auth, timeout=60)
res = req.json()
log.info(res)

View File

@ -41,7 +41,7 @@ async function main() {
} else {
const json = await res.json();
console.log('result:', json.info);
for (const i in json.images) { // eslint-disable-line guard-for-in
for (const i in json.images) {
const f = `/tmp/test-${i}.jpg`;
fs.writeFileSync(f, atob(json.images[i]), 'binary');
console.log('image saved:', f);

View File

@ -28,7 +28,7 @@ def auth():
return None
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -24,7 +24,7 @@ def auth():
return None
def get(endpoint: str, dct: dict = None):
def get(endpoint: str, dct: dict | None = None):
req = requests.get(f'{sd_url}{endpoint}', json=dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }
@ -32,7 +32,7 @@ def get(endpoint: str, dct: dict = None):
return req.json()
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -24,7 +24,7 @@ def auth():
return None
def get(endpoint: str, dct: dict = None):
def get(endpoint: str, dct: dict | None = None):
req = requests.get(f'{sd_url}{endpoint}', json=dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }
@ -32,7 +32,7 @@ def get(endpoint: str, dct: dict = None):
return req.json()
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -30,7 +30,7 @@ def auth():
return None
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

42
cli/api-xyzenum.py Executable file
View File

@ -0,0 +1,42 @@
#!/usr/bin/env python
import os
import logging
import requests
import urllib3
sd_url = os.environ.get('SDAPI_URL', "http://127.0.0.1:7860")
sd_username = os.environ.get('SDAPI_USR', None)
sd_password = os.environ.get('SDAPI_PWD', None)
options = {
"save_images": True,
"send_images": True,
}
logging.basicConfig(level = logging.INFO, format = '%(asctime)s %(levelname)s: %(message)s')
log = logging.getLogger(__name__)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def auth():
if sd_username is not None and sd_password is not None:
return requests.auth.HTTPBasicAuth(sd_username, sd_password)
return None
def get(endpoint: str, dct: dict | None = None):
req = requests.get(f'{sd_url}{endpoint}', json = dct, timeout=300, verify=False, auth=auth())
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }
else:
return req.json()
if __name__ == "__main__":
options = get('/sdapi/v1/xyz-grid')
log.info(f'api-xyzgrid-options: {len(options)}')
for option in options:
log.info(f' {option}')
details = get('/sdapi/v1/xyz-grid?option=upscaler')
for choice in details[0]['choices']:
log.info(f' {choice}')

View File

@ -99,10 +99,10 @@ def search_civitai(
types:str = '', # (Checkpoint, TextualInversion, Hypernetwork, AestheticGradient, LORA, Controlnet, Poses)
sort:str = '', # (Highest Rated, Most Downloaded, Newest)
period:str = '', # (AllTime, Year, Month, Week, Day)
nsfw:bool = None, # optional:bool
nsfw:bool | None = None, # optional:bool
limit:int = 0,
base:list[str] = [], # list
token:str = None,
token:str | None = None,
exact:bool = True,
):
import requests
@ -113,6 +113,11 @@ def search_civitai(
return []
t0 = time.time()
import re
url_match = re.match(r'https?://civitai\.com/models/(\d+)', query.strip())
if url_match:
query = url_match.group(1)
log.info(f'CivitAI: extracted model id={query} from URL')
dct = { 'query': query }
if len(tag) > 0:
dct['tag'] = tag
@ -164,7 +169,7 @@ def search_civitai(
return exact_models if len(exact_models) > 0 else models
def models_to_dct(all_models:list, model_id:int=None):
def models_to_dct(all_models:list, model_id:int | None=None):
dct = []
for model in all_models:
if model_id is not None and model.id != model_id:

View File

@ -1,301 +0,0 @@
#!/usr/bin/env python
# pylint: disable=no-member
import os
import re
import json
import time
import logging
import importlib
import asyncio
import argparse
from pathlib import Path
from util import Map, log
from sdapi import get, post, close
from generate import generate # pylint: disable=import-error
grid = importlib.import_module('image-grid').grid
options = Map({
# used by extra networks
'prompt': 'photo of <keyword> <embedding>, photograph, posing, pose, high detailed, intricate, elegant, sharp focus, skin texture, looking forward, facing camera, 135mm, shot on dslr, canon 5d, 4k, modelshoot style, cinematic lighting',
# used by models
'prompts': [
('photo citiscape', 'cityscape during night, photorealistic, high detailed, sharp focus, depth of field, 4k'),
('photo car', 'photo of a sports car, high detailed, sharp focus, dslr, cinematic lighting, realistic'),
('photo woman', 'portrait photo of beautiful woman, high detailed, dslr, 35mm'),
('photo naked', 'full body photo of beautiful sexy naked woman, high detailed, dslr, 35mm'),
('photo taylor', 'portrait photo of beautiful woman taylor swift, high detailed, sharp focus, depth of field, dslr, 35mm <lora:taylor-swift:1>'),
('photo ti-mia', 'portrait photo of beautiful woman "ti-mia", naked, high detailed, dslr, 35mm'),
('photo ti-vlado', 'portrait photo of man "ti-vlado", high detailed, dslr, 35mm'),
('photo lora-vlado', 'portrait photo of man vlado, high detailed, dslr, 35mm <lora:vlado-original:1>'),
('wlop', 'a stunning portrait of sexy teen girl in a wet t-shirt, vivid color palette, digital painting, octane render, highly detailed, particles, light effect, volumetric lighting, art by wlop'),
('greg rutkowski', 'beautiful woman, high detailed, sharp focus, depth of field, 4k, art by greg rutkowski'),
('carne griffiths', 'beautiful woman taylor swift, high detailed, sharp focus, depth of field, art by carne griffiths <lora:taylor-swift:1>'),
('carne griffiths', 'man vlado, high detailed, sharp focus, depth of field, art by carne griffiths <lora:vlado-full:1>'),
],
# save format
'format': '.jpg',
# used by generate script
'paths': {
"root": "/mnt/c/Users/mandi/OneDrive/Generative/Generate",
"generate": "image",
"upscale": "upscale",
"grid": "grid",
},
# generate params
'generate': {
'detailer': True,
'prompt': '',
'negative_prompt': 'foggy, blurry, blurred, duplicate, ugly, mutilated, mutation, mutated, out of frame, bad anatomy, disfigured, deformed, censored, low res, low resolution, watermark, text, poorly drawn face, poorly drawn hands, signature',
'steps': 20,
'batch_size': 2,
'n_iter': 1,
'seed': -1,
'sampler_name': 'UniPC',
'cfg_scale': 6,
'width': 512,
'height': 512,
},
'lora': {
'strength': 1.0,
},
})
def preview_exists(folder, model):
model = os.path.splitext(model)[0]
for suffix in ['', '.preview']:
for ext in ['.jpg', '.png', '.webp']:
fn = os.path.join(folder, f'{model}{suffix}{ext}')
if os.path.exists(fn):
return True
return False
async def preview_models(params):
data = await get('/sdapi/v1/sd-models')
allmodels = [m['title'] for m in data]
models = []
excluded = []
for m in allmodels: # loop through all registered models
ok = True
for e in params.exclude: # check if model is excluded
if e in m:
excluded.append(m)
ok = False
break
if ok:
short = m.split(' [')[0]
short = short.replace('.ckpt', '').replace('.safetensors', '')
models.append(short)
if len(params.input) > 0: # check if model is included in cmd line
filtered = []
for m in params.input:
if m in models:
filtered.append(m)
else:
log.error({ 'model not found': m })
return
models = filtered
log.info({ 'models preview' })
log.info({ 'models': len(models), 'excluded': len(excluded) })
opt = await get('/sdapi/v1/options')
log.info({ 'total jobs': len(models) * options.generate.batch_size, 'per-model': options.generate.batch_size })
log.info(json.dumps(options, indent=2))
for model in models:
if preview_exists(opt['ckpt_dir'], model) and len(params.input) == 0: # if model preview exists and not manually included
log.info({ 'model preview exists': model })
continue
fn = os.path.join(opt['ckpt_dir'], os.path.splitext(model)[0] + options.format)
log.info({ 'model load': model })
opt['sd_model_checkpoint'] = model
del opt['sd_lora']
del opt['sd_lyco']
await post('/sdapi/v1/options', opt)
opt = await get('/sdapi/v1/options')
images = []
labels = []
t0 = time.time()
for label, p in options.prompts:
options.generate.prompt = p
log.info({ 'model generating': model, 'label': label, 'prompt': options.generate.prompt })
data = await generate(options = options, quiet=True)
if 'image' in data:
for img in data['image']:
images.append(img)
labels.append(label)
else:
log.error({ 'model': model, 'error': data })
t1 = time.time()
if len(images) == 0:
log.error({ 'model': model, 'error': 'no images generated' })
continue
image = grid(images = images, labels = labels, border = 8)
log.info({ 'saving preview': fn, 'images': len(images), 'size': [image.width, image.height] })
image.save(fn)
t = t1 - t0
its = 1.0 * options.generate.steps * len(images) / t
log.info({ 'model preview created': model, 'image': fn, 'images': len(images), 'grid': [image.width, image.height], 'time': round(t, 2), 'its': round(its, 2) })
opt = await get('/sdapi/v1/options')
if opt['sd_model_checkpoint'] != params.model:
log.info({ 'model set default': params.model })
opt['sd_model_checkpoint'] = params.model
del opt['sd_lora']
del opt['sd_lyco']
await post('/sdapi/v1/options', opt)
async def lora(params):
opt = await get('/sdapi/v1/options')
folder = opt['lora_dir']
if not os.path.exists(folder):
log.error({ 'lora directory not found': folder })
return
models1 = list(Path(folder).glob('**/*.safetensors'))
models2 = list(Path(folder).glob('**/*.ckpt'))
models = [os.path.splitext(f)[0] for f in models1 + models2]
log.info({ 'loras': len(models) })
for model in models:
if preview_exists('', model) and len(params.input) == 0: # if model preview exists and not manually included
log.info({ 'lora preview exists': model })
continue
fn = model + options.format
model = os.path.basename(model)
images = []
labels = []
t0 = time.time()
keywords = re.sub(r'\d', '', model)
keywords = keywords.replace('-v', ' ').replace('-', ' ').strip().split(' ')
keyword = '\"' + '\" \"'.join(keywords) + '\"'
options.generate.prompt = options.prompt.replace('<keyword>', keyword)
options.generate.prompt = options.generate.prompt.replace('<embedding>', '')
options.generate.prompt += f' <lora:{model}:{options.lora.strength}>'
log.info({ 'lora generating': model, 'keyword': keyword, 'prompt': options.generate.prompt })
data = await generate(options = options, quiet=True)
if 'image' in data:
for img in data['image']:
images.append(img)
labels.append(keyword)
else:
log.error({ 'lora': model, 'keyword': keyword, 'error': data })
t1 = time.time()
if len(images) == 0:
log.error({ 'model': model, 'error': 'no images generated' })
continue
image = grid(images = images, labels = labels, border = 8)
log.info({ 'saving preview': fn, 'images': len(images), 'size': [image.width, image.height] })
image.save(fn)
t = t1 - t0
its = 1.0 * options.generate.steps * len(images) / t
log.info({ 'lora preview created': model, 'image': fn, 'images': len(images), 'grid': [image.width, image.height], 'time': round(t, 2), 'its': round(its, 2) })
async def lyco(params):
opt = await get('/sdapi/v1/options')
folder = opt['lyco_dir']
if not os.path.exists(folder):
log.error({ 'lyco directory not found': folder })
return
models1 = list(Path(folder).glob('**/*.safetensors'))
models2 = list(Path(folder).glob('**/*.ckpt'))
models = [os.path.splitext(f)[0] for f in models1 + models2]
log.info({ 'lycos': len(models) })
for model in models:
if preview_exists('', model) and len(params.input) == 0: # if model preview exists and not manually included
log.info({ 'lyco preview exists': model })
continue
fn = model + options.format
model = os.path.basename(model)
images = []
labels = []
t0 = time.time()
keywords = re.sub(r'\d', '', model)
keywords = keywords.replace('-v', ' ').replace('-', ' ').strip().split(' ')
keyword = '\"' + '\" \"'.join(keywords) + '\"'
options.generate.prompt = options.prompt.replace('<keyword>', keyword)
options.generate.prompt = options.generate.prompt.replace('<embedding>', '')
options.generate.prompt += f' <lyco:{model}:{options.lora.strength}>'
log.info({ 'lyco generating': model, 'keyword': keyword, 'prompt': options.generate.prompt })
data = await generate(options = options, quiet=True)
if 'image' in data:
for img in data['image']:
images.append(img)
labels.append(keyword)
else:
log.error({ 'lyco': model, 'keyword': keyword, 'error': data })
t1 = time.time()
if len(images) == 0:
log.error({ 'model': model, 'error': 'no images generated' })
continue
image = grid(images = images, labels = labels, border = 8)
log.info({ 'saving preview': fn, 'images': len(images), 'size': [image.width, image.height] })
image.save(fn)
t = t1 - t0
its = 1.0 * options.generate.steps * len(images) / t
log.info({ 'lyco preview created': model, 'image': fn, 'images': len(images), 'grid': [image.width, image.height], 'time': round(t, 2), 'its': round(its, 2) })
async def embedding(params):
opt = await get('/sdapi/v1/options')
folder = opt['embeddings_dir']
if not os.path.exists(folder):
log.error({ 'embeddings directory not found': folder })
return
models = [os.path.splitext(f)[0] for f in Path(folder).glob('**/*.pt')]
log.info({ 'embeddings': len(models) })
for model in models:
if preview_exists(folder, model) and len(params.input) == 0: # if model preview exists and not manually included
log.info({ 'embedding preview exists': model })
continue
fn = os.path.join(folder, model + '.preview' + options.format)
images = []
labels = []
t0 = time.time()
keyword = '\"' + re.sub(r'\d', '', model) + '\"'
options.generate.batch_size = 4
options.generate.prompt = options.prompt.replace('<keyword>', keyword)
options.generate.prompt = options.generate.prompt.replace('<embedding>', '')
log.info({ 'embedding generating': model, 'keyword': keyword, 'prompt': options.generate.prompt })
data = await generate(options = options, quiet=True)
if 'image' in data:
for img in data['image']:
images.append(img)
labels.append(keyword)
else:
log.error({ 'embeding': model, 'keyword': keyword, 'error': data })
t1 = time.time()
if len(images) == 0:
log.error({ 'model': model, 'error': 'no images generated' })
continue
image = grid(images = images, labels = labels, border = 8)
log.info({ 'saving preview': fn, 'images': len(images), 'size': [image.width, image.height] })
image.save(fn)
t = t1 - t0
its = 1.0 * options.generate.steps * len(images) / t
log.info({ 'embeding preview created': model, 'image': fn, 'images': len(images), 'grid': [image.width, image.height], 'time': round(t, 2), 'its': round(its, 2) })
async def create_previews(params):
await preview_models(params)
await lora(params)
await lyco(params)
await embedding(params)
await close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description = 'generate model previews')
parser.add_argument('--model', default='best/icbinp-icantbelieveIts-final.safetensors [73f48afbdc]', help="model used to create extra network previews")
parser.add_argument('--exclude', default=['sd-v20', 'sd-v21', 'inpainting', 'pix2pix'], help="exclude models with keywords")
parser.add_argument('--debug', default = False, action='store_true', help = 'print extra debug information')
parser.add_argument('input', type = str, nargs = '*')
args = parser.parse_args()
if args.debug:
log.setLevel(logging.DEBUG)
log.debug({ 'debug': True })
log.debug({ 'args': args.__dict__ })
asyncio.run(create_previews(args))

View File

@ -33,7 +33,7 @@ def pil_to_b64(img: Image, size: int, quality: int):
return f'data:image/jpeg;base64,{b64encoded}'
def post(endpoint: str, dct: dict = None):
def post(endpoint: str, dct: dict | None = None):
req = requests.post(endpoint, json = dct, timeout=300, verify=False)
if req.status_code != 200:
return { 'error': req.status_code, 'reason': req.reason, 'url': req.url }

View File

@ -24,10 +24,7 @@
{
"upscaler_1": "SwinIR_4x",
"upscaler_2": "None",
"upscaling_resize": 0,
"gfpgan_visibility": 0,
"codeformer_visibility": 0,
"codeformer_weight": 0.5
"upscaling_resize": 0
},
"options":
{

View File

@ -65,8 +65,6 @@ def exif(info, i = None, op = 'generate'):
seed = ', '.join([str(x) for x in seed]) # int list to str list to single str
template = '{prompt} | negative {negative_prompt} | seed {s} | steps {steps} | cfgscale {cfg_scale} | sampler {sampler_name} | batch {batch_size} | timestamp {job_timestamp} | model {model} | vae {vae}'.format(s = seed, model = sd.options['sd_model_checkpoint'], vae = sd.options['sd_vae'], **info) # pylint: disable=consider-using-f-string
if op == 'upscale':
template += ' | faces gfpgan' if sd.upscale.gfpgan_visibility > 0 else ''
template += ' | faces codeformer' if sd.upscale.codeformer_visibility > 0 else ''
template += ' | upscale {resize}x {upscaler}'.format(resize = sd.upscale.upscaling_resize, upscaler = sd.upscale.upscaler_1) if sd.upscale.upscaler_1 != 'None' else '' # pylint: disable=consider-using-f-string
template += ' | upscale {resize}x {upscaler}'.format(resize = sd.upscale.upscaling_resize, upscaler = sd.upscale.upscaler_2) if sd.upscale.upscaler_2 != 'None' else '' # pylint: disable=consider-using-f-string
if op == 'grid':
@ -221,7 +219,7 @@ def args(): # parse cmd arguments
global random # pylint: disable=global-statement
parser = argparse.ArgumentParser(description = 'sd pipeline')
parser.add_argument('--config', type = str, default = 'generate.json', required = False, help = 'configuration file')
parser.add_argument('--random', type = str, default = 'random.json', required = False, help = 'prompt file with randomized sections')
parser.add_argument('--random', type = str, default = 'generate-random.json', required = False, help = 'prompt file with randomized sections')
parser.add_argument('--max', type = int, default = 1, required = False, help = 'maximum number of generated images')
parser.add_argument('--prompt', type = str, default = 'dynamic', required = False, help = 'prompt')
parser.add_argument('--negative', type = str, default = 'dynamic', required = False, help = 'negative prompt')
@ -309,7 +307,6 @@ def args(): # parse cmd arguments
sd.generate.height = params.height if params.height > 0 else sd.generate.height
sd.generate.steps = params.steps if params.steps > 0 else sd.generate.steps
sd.upscale.upscaling_resize = params.upscale if params.upscale > 0 else sd.upscale.upscaling_resize
sd.upscale.codeformer_visibility = 1 if params.detailer else sd.upscale.codeformer_visibility
sd.options.sd_vae = params.vae if params.vae != '' else sd.options.sd_vae
sd.options.sd_model_checkpoint = params.model if params.model != '' else sd.options.sd_model_checkpoint
sd.upscale.upscaler_1 = 'SwinIR_4x' if params.upscale > 1 else sd.upscale.upscaler_1

View File

@ -14,7 +14,6 @@ if __name__ == "__main__":
full=True,
limit=100,
sort="downloads",
direction=-1,
)
res = sorted(res, key=lambda x: x.id)
exact = [m for m in res if keyword.lower() in m.id.lower()]

View File

@ -19,7 +19,7 @@ class ImageDB:
def __init__(self,
name:str='db',
fmt:str='json',
cache_dir:str=None,
cache_dir:str | None=None,
dtype:torch.dtype=torch.float16,
device:torch.device=torch.device('cpu'),
model:str='openai/clip-vit-large-patch14', # 'facebook/dinov2-small'
@ -123,8 +123,8 @@ class ImageDB:
self.df = rec
self.index.add(embed)
def search(self, filename: str = None, metadata: str = None, embed: np.ndarray = None, k=10, d=1.0): # search by filename/metadata/prompt-embed/image-embed
def dct(record: pd.DataFrame, mode: str, distance: float = None):
def search(self, filename: str | None = None, metadata: str | None = None, embed: np.ndarray = None, k=10, d=1.0): # search by filename/metadata/prompt-embed/image-embed
def dct(record: pd.DataFrame, mode: str, distance: float | None = None):
if distance is not None:
return {'type': mode, 'filename': record[1]['filename'], 'metadata': record[1]['metadata'], 'distance': round(distance, 2)}
else:

View File

@ -1,67 +0,0 @@
#!/usr/bin/env node
// script used to localize sdnext ui and hints to multiple languages using google gemini ai
const fs = require('node:fs');
const { GoogleGenerativeAI } = require('@google/generative-ai');
const api_key = process.env.GOOGLE_AI_API_KEY;
const model = 'gemini-2.5-flash';
const prompt = `Translate attached JSON from English to {language} using following rules: fields id, label and reload should be preserved from original, field localized should be a translated version of field label and field hint should be translated in-place.
if field is less than 3 characters, do not translate it and keep it as is.
Every JSON entry should have id, label, localized, reload and hint fields.
Output should be pure JSON without any additional text. To better match translation, context of the text is related to Stable Diffusion and topic of Generative AI.`;
const languages = {
hr: 'Croatian',
de: 'German',
es: 'Spanish',
fr: 'French',
it: 'Italian',
pt: 'Portuguese',
zh: 'Chinese',
ja: 'Japanese',
ko: 'Korean',
ru: 'Russian',
};
const chunkLines = 100;
async function localize() {
if (!api_key || api_key.length < 10) {
console.error('localize: set GOOGLE_AI_API_KEY env variable with your API key');
process.exit();
}
const genAI = new GoogleGenerativeAI(api_key);
const instance = genAI.getGenerativeModel({ model });
const raw = fs.readFileSync('html/locale_en.json');
const json = JSON.parse(raw);
for (const locale of Object.keys(languages)) {
const lang = languages[locale];
const target = prompt.replace('{language}', lang).trim();
const output = {};
const fn = `html/locale_${locale}.json`;
for (const section of Object.keys(json)) {
const data = json[section];
output[section] = [];
for (let i = 0; i < data.length; i += chunkLines) {
let markdown;
try {
const chunk = data.slice(i, i + chunkLines);
const result = await instance.generateContent([target, JSON.stringify(chunk)]);
markdown = result.response.text();
const text = markdown.replaceAll('```', '').replace(/^.*\n/, '');
const parsed = JSON.parse(text);
output[section].push(...parsed);
console.log(`localize: locale=${locale} lang=${lang} section=${section} chunk=${chunk.length} output=${output[section].length} fn=${fn}`);
} catch (err) {
console.error('localize:', err);
console.error('localize input:', { target, section, i });
console.error('localize output:', { markdown });
}
}
const txt = JSON.stringify(output, null, 2);
fs.writeFileSync(fn, txt);
}
}
}
localize();

View File

@ -13,9 +13,8 @@ def get_nvidia_smi(output='dict'):
if smi is None:
log.error("nvidia-smi not found")
return None
result = subprocess.run(f'"{smi}" -q -x', shell=True, check=False, env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
xml = result.stdout.decode(encoding="utf8", errors="ignore")
d = xmltodict.parse(xml)
result = subprocess.run(f'"{smi}" -q -x', shell=True, check=False, env=os.environ, capture_output=True, text=True)
d = xmltodict.parse(result.stdout)
if 'nvidia_smi_log' in d:
d = d['nvidia_smi_log']
if 'gpu' in d and 'supported_clocks' in d['gpu']:

View File

@ -6,13 +6,12 @@ import base64
import numpy as np
import mediapipe as mp
from PIL import Image, ImageOps
from pi_heif import register_heif_opener
from skimage.metrics import structural_similarity as ssim
from scipy.stats import beta
import util
import sdapi
import options
import process_options as options
face_model = None
body_model = None
@ -22,7 +21,7 @@ all_images_by_type = {}
class Result():
def __init__(self, typ: str, fn: str, tag: str = None, requested: list = []):
def __init__(self, typ: str, fn: str, tag: str | None = None, requested: list = []):
self.type = typ
self.input = fn
self.output = ''
@ -42,7 +41,7 @@ def detect_blur(image: Image):
cx, cy = image.size[0] // 2, image.size[1] // 2
fft = np.fft.fft2(bw)
fftShift = np.fft.fftshift(fft)
fftShift[cy - options.process.blur_samplesize: cy + options.process.blur_samplesize, cx - options.process.blur_samplesize: cx + options.process.blur_samplesize] = 0
fftShift[cy - options.process.blur_samplesize: cy + options.process.blur_samplesize, cx - options.process.blur_samplesize: cx + options.process.blur_samplesize] = 0 # pylint: disable=unsupported-assignment-operation
fftShift = np.fft.ifftshift(fftShift)
recon = np.fft.ifft2(fftShift)
magnitude = np.log(np.abs(recon))
@ -126,11 +125,9 @@ def reset():
all_images = []
def upscale_restore_image(res: Result, upscale: bool = False, restore: bool = False):
def upscale_restore_image(res: Result, upscale: bool = False):
kwargs = util.Map({
'image': encode(res.image),
'codeformer_visibility': 0.0,
'codeformer_weight': 0.0,
})
if res.image.width >= options.process.target_size and res.image.height >= options.process.target_size:
upscale = False
@ -138,25 +135,21 @@ def upscale_restore_image(res: Result, upscale: bool = False, restore: bool = Fa
kwargs.upscaler_1 = 'SwinIR_4x'
kwargs.upscaling_resize = 2
res.ops.append('upscale')
if restore:
kwargs.codeformer_visibility = 1.0
kwargs.codeformer_weight = 0.2
res.ops.append('restore')
if upscale or restore:
if upscale:
result = sdapi.postsync('/sdapi/v1/extra-single-image', kwargs)
if 'image' not in result:
res.message = 'failed to upscale/restore image'
res.message = 'failed to upscale image'
else:
res.image = Image.open(io.BytesIO(base64.b64decode(result['image'])))
return res
def interrogate_image(res: Result, tag: str = None):
def caption_image(res: Result, tag: str | None = None):
caption = ''
tags = []
for model in options.process.interrogate_model:
for model in options.process.caption_model:
json = util.Map({ 'image': encode(res.image), 'model': model })
result = sdapi.postsync('/sdapi/v1/interrogate', json)
result = sdapi.postsync('/sdapi/v1/caption', json)
if model == 'clip':
caption = result.caption if 'caption' in result else ''
caption = caption.split(',')[0].replace(' a ', ' ').strip()
@ -176,7 +169,7 @@ def interrogate_image(res: Result, tag: str = None):
tags = tags[:options.process.tag_limit]
res.caption = caption
res.tags = tags
res.ops.append('interrogate')
res.ops.append('caption')
return res
@ -267,7 +260,6 @@ def file(filename: str, folder: str, tag = None, requested = []):
res = Result(fn = filename, typ='unknown', tag=tag, requested = requested)
# open image
try:
register_heif_opener()
res.image = Image.open(filename)
if res.image.mode == 'RGBA':
res.image = res.image.convert('RGB')
@ -309,13 +301,13 @@ def file(filename: str, folder: str, tag = None, requested = []):
if res.image is None:
return res
# post processing steps
res = upscale_restore_image(res, 'upscale' in requested, 'restore' in requested)
res = upscale_restore_image(res, 'upscale' in requested)
if res.image.width < options.process.target_size or res.image.height < options.process.target_size:
res.message = f'low resolution: [{res.image.width}, {res.image.height}]'
res.image = None
return res
if 'interrogate' in requested:
res = interrogate_image(res, tag)
if 'caption' in requested:
res = caption_image(res, tag)
if 'resize' in requested:
res = resize_image(res)
if 'square' in requested:

View File

@ -130,9 +130,9 @@ process = Map({
'body_pad': 0.2, # pad body image percentage
'body_model': 2, # body model to use 0/low 1/medium 2/high
# similarity detection settings
# interrogate settings
'interrogate': False, # interrogate images
'interrogate_model': ['clip', 'deepdanbooru'], # interrogate models
# caption settings
'caption': False, # caption images
'caption_model': ['clip', 'deepdanbooru'], # caption models
'tag_limit': 5, # number of tags to extract
# validations
# tbd

View File

@ -93,7 +93,7 @@ def resultsync(req: requests.Response):
return res
async def get(endpoint: str, json: dict = None):
async def get(endpoint: str, json: dict | None = None):
global sess # pylint: disable=global-statement
sess = sess if sess is not None else await session()
try:
@ -105,7 +105,7 @@ async def get(endpoint: str, json: dict = None):
return {}
def getsync(endpoint: str, json: dict = None):
def getsync(endpoint: str, json: dict | None = None):
try:
req = requests.get(f'{sd_url}{endpoint}', json=json, verify=False, auth=authsync()) # pylint: disable=missing-timeout
res = resultsync(req)
@ -115,7 +115,7 @@ def getsync(endpoint: str, json: dict = None):
return {}
async def post(endpoint: str, json: dict = None):
async def post(endpoint: str, json: dict | None = None):
global sess # pylint: disable=global-statement
# sess = sess if sess is not None else await session()
if sess and not sess.closed:
@ -130,7 +130,7 @@ async def post(endpoint: str, json: dict = None):
return {}
def postsync(endpoint: str, json: dict = None):
def postsync(endpoint: str, json: dict | None = None):
req = requests.post(f'{sd_url}{endpoint}', json=json, verify=False, auth=authsync()) # pylint: disable=missing-timeout
res = resultsync(req)
return res

View File

@ -89,7 +89,7 @@ class Page():
return ''
def __str__(self):
return f'Page(title="{self.title.strip()}" fn="{self.fn}" mtime={self.mtime} h1={[h.strip() for h in self.h1]} h2={len(self.h2)} h3={len(self.h3)} lines={len(self.lines)} size={self.size})'
return f'Page(title="{self.title.strip()}" file="{self.fn}" mtime={self.mtime} h1={[h.strip() for h in self.h1]} h2={len(self.h2)} h3={len(self.h3)} lines={len(self.lines)} size={self.size})'
class Pages():
@ -129,16 +129,14 @@ if __name__ == "__main__":
sys.argv.pop(0)
if len(sys.argv) < 1:
log.error("Usage: python cli/docs.py <search_term>")
text = ' '.join(sys.argv)
topk = 10
full = True
log.info(f'Search: "{text}" topk={topk}, full={full}')
term = ' '.join(sys.argv)
log.info(f'Search: "{term}" topk=10, full=True')
t0 = time.time()
results = index.search(text, topk=topk, full=full)
results = index.search(term, topk=10, full=True)
t1 = time.time()
log.info(f'Results: pages={len(results)} size={index.size} time={t1-t0:.3f}')
for score, page in results:
log.info(f'Score: {score:.2f} {page}')
for _score, _page in results:
log.info(f'Score: {_score:.2f} {_page}')
# if len(results) > 0:
# log.info('Top result:')
# log.info(results[0][1].get())

3
constraints.txt Normal file
View File

@ -0,0 +1,3 @@
fastapi==0.124.4
numpy==2.1.2
Pillow==10.4.0

View File

@ -1,11 +1,18 @@
{
"Google Gemini 2.5 Flash Nano Banana": {
"Google Gemini 2.5 Flash Nano Banana": {
"path": "gemini-2.5-flash-image",
"desc": "Gemini can generate and process images conversationally. You can prompt Gemini with text, images, or a combination of both allowing you to create, edit, and iterate on visuals with unprecedented control.",
"preview": "gemini-2.5-flash-image.jpg",
"tags": "cloud",
"skip": true
},
"Google Gemini 3.1 Flash Nano Banana": {
"path": "gemini-3.1-flash-image-preview",
"desc": "Gemini can generate and process images conversationally. You can prompt Gemini with text, images, or a combination of both allowing you to create, edit, and iterate on visuals with unprecedented control.",
"preview": "gemini-3.1-flash-image-preview.jpg",
"tags": "cloud",
"skip": true
},
"Google Gemini 3.0 Pro Nano Banana": {
"path": "gemini-3-pro-image-preview",
"desc": "Built on Gemini 3. Create and edit images with studio-quality levels of precision and control",

View File

@ -106,20 +106,22 @@
"desc": "Pony V7 is a versatile character generation model based on AuraFlow architecture. It supports a wide range of styles and species types (humanoid, anthro, feral, and more) and handles character interactions through natural language prompts.",
"extras": "",
"tags": "community",
"date": "October September"
"date": "2025 October"
},
"ShuttleAI Shuttle 3.0 Diffusion": {
"path": "shuttleai/shuttle-3-diffusion",
"desc": "Shuttle uses Flux.1 Schnell as its base. It can produce images similar to Flux Dev or Pro in just 4 steps, and it is licensed under Apache 2. The model was partially de-distilled during training. When used beyond 10 steps, it enters refiner mode enhancing image details without altering the composition",
"preview": "shuttleai--shuttle-3-diffusion.jpg",
"tags": "community",
"date": "2024 November",
"skip": true
},
"ShuttleAI Shuttle 3.1 Aesthetic": {
"path": "shuttleai/shuttle-3.1-aesthetic",
"desc": "Shuttle uses Flux.1 Schnell as its base. It can produce images similar to Flux Dev or Pro in just 4 steps, and it is licensed under Apache 2. The model was partially de-distilled during training. When used beyond 10 steps, it enters refiner mode enhancing image details without altering the composition",
"preview": "shuttleai--shuttle-3_1-aestetic.jpg",
"preview": "shuttleai--shuttle-3.1-aesthetic.jpg",
"tags": "community",
"date": "2024 November",
"skip": true
},
"ShuttleAI Shuttle Jaguar": {
@ -127,6 +129,55 @@
"desc": "Shuttle uses Flux.1 Schnell as its base. It can produce images similar to Flux Dev or Pro in just 4 steps, and it is licensed under Apache 2. The model was partially de-distilled during training. When used beyond 10 steps, it enters refiner mode enhancing image details without altering the composition",
"preview": "shuttleai--shuttle-jaguar.jpg",
"tags": "community",
"date": "2025 January",
"skip": true
},
"Anima Preview 1": {
"path": "CalamitousFelicitousness/Anima-sdnext-diffusers",
"preview": "CalamitousFelicitousness--Anima-sdnext-diffusers.jpg",
"desc": "Modified Cosmos-Predict-2B that replaces the T5-11B text encoder with Qwen3-0.6B. Anima is a 2 billion parameter text-to-image model created via a collaboration between CircleStone Labs and Comfy Org. It is focused mainly on anime concepts, characters, and styles, but is also capable of generating a wide variety of other non-photorealistic content. The model is designed for making illustrations and artistic images, and will not work well at realism.",
"tags": "community",
"date": "2026 January",
"skip": true
},
"Anima Preview 2": {
"path": "CalamitousFelicitousness/Anima-Preview-2-sdnext-diffusers",
"preview": "CalamitousFelicitousness--Anima-Preview-2-sdnext-diffusers.jpg",
"desc": "Anima Preview V2 with improved hyperparameters, extended medium-resolution training for more character knowledge, and a regularization dataset for better natural language comprehension. A 2B parameter anime-focused text-to-image model based on modified Cosmos-Predict-2B with Qwen3-0.6B text encoder.",
"tags": "community",
"date": "2026 March",
"skip": true
},
"FireRed Image Edit 1.0": {
"path": "FireRedTeam/FireRed-Image-Edit-1.0",
"preview": "FireRedTeam--FireRed-Image-Edit-1.0.jpg",
"desc": "FireRed-Image-Edit is a general-purpose image editing model that delivers high-fidelity and consistent editing across a wide range of scenarios. FireRed is a fine-tune of Qwen-Image-Edit.",
"tags": "community",
"date": "2026 February",
"skip": true
},
"FireRed Image Edit 1.1": {
"path": "FireRedTeam/FireRed-Image-Edit-1.1",
"preview": "FireRedTeam--FireRed-Image-Edit-1.1.jpg",
"desc": "FireRed-Image-Edit is a general-purpose image editing model that delivers high-fidelity and consistent editing across a wide range of scenarios. FireRed is a fine-tune of Qwen-Image-Edit.",
"tags": "community",
"date": "2026 February",
"skip": true
},
"Skywork UniPic3": {
"path": "Skywork/Unipic3",
"preview": "Skywork--Unipic3.jpg",
"desc": "UniPic3 is an image editing and multi-image composition model based. It is a fine-tune of Qwen-Image-Edit.",
"tags": "community",
"date": "2026 February",
"skip": true
},
"Skywork/Unipic3-DMD": {
"path": "Skywork/Unipic3-DMD",
"preview": "Skywork--Unipic3-DMD.jpg",
"desc": "UniPic3-DMD-Model is a few-step image editing and multi-image composition model trained using Distribution Matching Distillation (DMD) and is a fine-tune of Qwen-Image-Edit.",
"tags": "community",
"date": "2026 February",
"skip": true
}
}

View File

@ -170,7 +170,7 @@
"tags": "distilled",
"extras": "sampler: Default, cfg_scale: 1.0, steps: 4",
"size": 8.5,
"date": "2025 January"
"date": "2026 January"
},
"Black Forest Labs FLUX.2 Klein 9B": {
"path": "black-forest-labs/FLUX.2-klein-9B",
@ -180,6 +180,25 @@
"tags": "distilled",
"extras": "sampler: Default, cfg_scale: 1.0, steps: 4",
"size": 18.5,
"date": "2025 January"
"date": "2026 January"
},
"Black Forest Labs FLUX.2 Klein 9B KV": {
"path": "black-forest-labs/FLUX.2-klein-9b-kv",
"preview": "black-forest-labs--FLUX.2-klein-9b-kv.jpg",
"desc": "FLUX.2 klein 9B KV is an optimized variant of FLUX.2 klein 9B with KV-cache support for accelerated multi-reference editing. This variant caches key-value pairs from reference images during the first denoising step, eliminating redundant computation in subsequent steps for significantly faster multi-image editing workflows.",
"skip": true,
"tags": "distilled",
"extras": "sampler: Default, cfg_scale: 1.0, steps: 4",
"size": 18.5,
"date": "2026 March"
},
"Meituan LongCat Image-Edit Turbo": {
"path": "meituan-longcat/LongCat-Image-Edit-Turbo",
"preview": "meituan-longcat--LongCat-Image-Edit.jpg",
"desc": "LongCat-Image-Edit-Turbo, the distilled version of LongCat-Image-Edit. It achieves high-quality image editing with only 8 NFEs (Number of Function Evaluations) , offering extremely low inference latency.",
"skip": true,
"extras": "",
"size": 27.30,
"date": "2026 February"
}
}

View File

@ -0,0 +1,209 @@
{
"FLUX.1-Dev Nunchaku SVDQuant": {
"path": "black-forest-labs/FLUX.1-dev",
"subfolder": "nunchaku",
"preview": "black-forest-labs--FLUX.1-dev.jpg",
"desc": "Nunchaku SVDQuant quantization of FLUX.1-dev transformer with INT4 and SVD rank 32",
"skip": true,
"nunchaku": ["Model", "TE"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"FLUX.1-Schnell Nunchaku SVDQuant": {
"path": "black-forest-labs/FLUX.1-schnell",
"subfolder": "nunchaku",
"preview": "black-forest-labs--FLUX.1-schnell.jpg",
"desc": "Nunchaku SVDQuant quantization of FLUX.1-schnell transformer with INT4 and SVD rank 32",
"skip": true,
"nunchaku": ["Model", "TE"],
"tags": "nunchaku",
"extras": "sampler: Default, cfg_scale: 1.0, steps: 4",
"size": 0,
"date": "2025 June"
},
"FLUX.1-Kontext Nunchaku SVDQuant": {
"path": "black-forest-labs/FLUX.1-Kontext-dev",
"subfolder": "nunchaku",
"preview": "black-forest-labs--FLUX.1-Kontext-dev.jpg",
"desc": "Nunchaku SVDQuant quantization of FLUX.1-Kontext-dev transformer with INT4 and SVD rank 32",
"skip": true,
"nunchaku": ["Model", "TE"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"FLUX.1-Krea Nunchaku SVDQuant": {
"path": "black-forest-labs/FLUX.1-Krea-dev",
"subfolder": "nunchaku",
"preview": "black-forest-labs--FLUX.1-Krea-dev.jpg",
"desc": "Nunchaku SVDQuant quantization of FLUX.1-Krea-dev transformer with INT4 and SVD rank 32",
"skip": true,
"nunchaku": ["Model", "TE"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"FLUX.1-Fill Nunchaku SVDQuant": {
"path": "black-forest-labs/FLUX.1-Fill-dev",
"subfolder": "nunchaku",
"preview": "black-forest-labs--FLUX.1-Fill-dev.jpg",
"desc": "Nunchaku SVDQuant quantization of FLUX.1-Fill-dev transformer for inpainting",
"skip": true,
"hidden": true,
"nunchaku": ["Model", "TE"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"FLUX.1-Depth Nunchaku SVDQuant": {
"path": "black-forest-labs/FLUX.1-Depth-dev",
"subfolder": "nunchaku",
"preview": "black-forest-labs--FLUX.1-Depth-dev.jpg",
"desc": "Nunchaku SVDQuant quantization of FLUX.1-Depth-dev transformer for depth-conditioned generation",
"skip": true,
"hidden": true,
"nunchaku": ["Model", "TE"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"Shuttle Jaguar Nunchaku SVDQuant": {
"path": "shuttleai/shuttle-jaguar",
"subfolder": "nunchaku",
"preview": "shuttleai--shuttle-jaguar.jpg",
"desc": "Nunchaku SVDQuant quantization of Shuttle Jaguar transformer",
"skip": true,
"nunchaku": ["Model", "TE"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"Qwen-Image Nunchaku SVDQuant": {
"path": "Qwen/Qwen-Image",
"subfolder": "nunchaku",
"preview": "Qwen--Qwen-Image.jpg",
"desc": "Nunchaku SVDQuant quantization of Qwen-Image transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"Qwen-Lightning (8-step) Nunchaku SVDQuant": {
"path": "vladmandic/Qwen-Lightning",
"subfolder": "nunchaku",
"preview": "vladmandic--Qwen-Lightning.jpg",
"desc": "Nunchaku SVDQuant quantization of Qwen-Lightning (8-step distilled) transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"extras": "steps: 8",
"size": 0,
"date": "2025 June"
},
"Qwen-Lightning (4-step) Nunchaku SVDQuant": {
"path": "vladmandic/Qwen-Lightning",
"subfolder": "nunchaku-4step",
"preview": "vladmandic--Qwen-Lightning.jpg",
"desc": "Nunchaku SVDQuant quantization of Qwen-Lightning (4-step distilled) transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"extras": "steps: 4",
"size": 0,
"date": "2025 June"
},
"Qwen-Image-Edit Nunchaku SVDQuant": {
"path": "Qwen/Qwen-Image-Edit",
"subfolder": "nunchaku",
"preview": "Qwen--Qwen-Image-Edit.jpg",
"desc": "Nunchaku SVDQuant quantization of Qwen-Image-Edit transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"Qwen-Lightning-Edit (8-step) Nunchaku SVDQuant": {
"path": "vladmandic/Qwen-Lightning-Edit",
"subfolder": "nunchaku",
"preview": "vladmandic--Qwen-Lightning-Edit.jpg",
"desc": "Nunchaku SVDQuant quantization of Qwen-Lightning-Edit (8-step distilled editing) transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"extras": "steps: 8",
"size": 0,
"date": "2025 June"
},
"Qwen-Lightning-Edit (4-step) Nunchaku SVDQuant": {
"path": "vladmandic/Qwen-Lightning-Edit",
"subfolder": "nunchaku-4step",
"preview": "vladmandic--Qwen-Lightning-Edit.jpg",
"desc": "Nunchaku SVDQuant quantization of Qwen-Lightning-Edit (4-step distilled editing) transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"extras": "steps: 4",
"size": 0,
"date": "2025 June"
},
"Qwen-Image-Edit-2509 Nunchaku SVDQuant": {
"path": "Qwen/Qwen-Image-Edit-2509",
"subfolder": "nunchaku",
"preview": "Qwen--Qwen-Image-Edit-2509.jpg",
"desc": "Nunchaku SVDQuant quantization of Qwen-Image-Edit-2509 transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"size": 0,
"date": "2025 September"
},
"Sana 1.6B 1k Nunchaku SVDQuant": {
"path": "Efficient-Large-Model/Sana_1600M_1024px_BF16_diffusers",
"subfolder": "nunchaku",
"preview": "Efficient-Large-Model--Sana_1600M_1024px_BF16_diffusers.jpg",
"desc": "Nunchaku SVDQuant quantization of Sana 1.6B 1024px transformer with INT4 and SVD rank 32",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"Z-Image-Turbo Nunchaku SVDQuant": {
"path": "Tongyi-MAI/Z-Image-Turbo",
"subfolder": "nunchaku",
"preview": "Tongyi-MAI--Z-Image-Turbo.jpg",
"desc": "Nunchaku SVDQuant quantization of Z-Image-Turbo transformer with INT4 and SVD rank 128",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"extras": "sampler: Default, cfg_scale: 1.0, steps: 9",
"size": 0,
"date": "2025 June"
},
"SDXL Base Nunchaku SVDQuant": {
"path": "stabilityai/stable-diffusion-xl-base-1.0",
"subfolder": "nunchaku",
"preview": "stabilityai--stable-diffusion-xl-base-1.0.jpg",
"desc": "Nunchaku SVDQuant quantization of SDXL Base 1.0 UNet with INT4 and SVD rank 32",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"size": 0,
"date": "2025 June"
},
"SDXL Turbo Nunchaku SVDQuant": {
"path": "stabilityai/sdxl-turbo",
"subfolder": "nunchaku",
"preview": "stabilityai--sdxl-turbo.jpg",
"desc": "Nunchaku SVDQuant quantization of SDXL Turbo UNet with INT4 and SVD rank 32",
"skip": true,
"nunchaku": ["Model"],
"tags": "nunchaku",
"extras": "sampler: Default, cfg_scale: 1.0, steps: 4",
"size": 0,
"date": "2025 June"
}
}

View File

@ -143,6 +143,15 @@
"date": "2025 January"
},
"Z-Image": {
"path": "Tongyi-MAI/Z-Image",
"preview": "Tongyi-MAI--Z-Image.jpg",
"desc": "Z-Image, an efficient image generation foundation model built on a Single-Stream Diffusion Transformer architecture. It preserves the complete training signal with full CFG support, enabling aesthetic versatility from hyper-realistic photography to anime, enhanced output diversity, and robust negative prompting for artifact suppression. Ideal base for LoRA training, ControlNet, and semantic conditioning.",
"skip": true,
"extras": "sampler: Default, cfg_scale: 4.0, steps: 50",
"size": 20.3,
"date": "2026 January"
},
"Z-Image-Turbo": {
"path": "Tongyi-MAI/Z-Image-Turbo",
"preview": "Tongyi-MAI--Z-Image-Turbo.jpg",
@ -855,6 +864,16 @@
"extras": "sampler: Default, cfg_scale: 1.5, steps: 50",
"size": 15.3,
"date": "2025 January"
},
"AiArtLab SDXS-1B": {
"path": "AiArtLab/sdxs-1b",
"preview": "AiArtLab--sdxs-1b.jpg",
"desc": "Simple Diffusion XS (train in progress) combines Qwen3.5-1.8B text encoder with SDXL-style UNET with only 1.6B parameters and custom 32ch VAE",
"skip": true,
"extras": "sampler: Default",
"size": 15.3,
"date": "2026 January"
}
}

View File

@ -25,11 +25,13 @@ const jsConfig = defineConfig([
ecmaVersion: 'latest',
},
globals: { // Set per project
...globals.node,
...globals.builtin,
...globals.browser,
...globals.jquery,
panzoom: 'readonly',
authFetch: 'readonly',
initServerInfo: 'readonly',
log: 'readonly',
debug: 'readonly',
error: 'readonly',
@ -53,6 +55,7 @@ const jsConfig = defineConfig([
generateForever: 'readonly',
showContributors: 'readonly',
opts: 'writable',
monitorOption: 'readonly',
sortUIElements: 'readonly',
all_gallery_buttons: 'readonly',
selected_gallery_button: 'readonly',
@ -92,12 +95,15 @@ const jsConfig = defineConfig([
initGPU: 'readonly',
startGPU: 'readonly',
disableNVML: 'readonly',
hash: 'readonly',
idbGet: 'readonly',
idbPut: 'readonly',
idbDel: 'readonly',
idbAdd: 'readonly',
idbCount: 'readonly',
idbFolderCleanup: 'readonly',
idbClearAll: 'readonly',
idbIsReady: 'readonly',
initChangelog: 'readonly',
sendNotification: 'readonly',
monitorConnection: 'readonly',
@ -124,6 +130,7 @@ const jsConfig = defineConfig([
camelcase: 'off',
'default-case': 'off',
'max-classes-per-file': 'warn',
'guard-for-in': 'off',
'no-await-in-loop': 'off',
'no-bitwise': 'off',
'no-continue': 'off',
@ -141,6 +148,7 @@ const jsConfig = defineConfig([
'prefer-rest-params': 'off',
'prefer-template': 'warn',
'promise/no-nesting': 'off',
'@typescript-eslint/no-for-in-array': 'off',
radix: 'off',
'@stylistic/brace-style': [
'error',
@ -241,6 +249,9 @@ const jsonConfig = defineConfig([
plugins: { json },
language: 'json/json',
extends: ['json/recommended'],
rules: {
'json/no-empty-keys': 'off',
},
},
]);
@ -327,6 +338,7 @@ export default defineConfig([
'**/exifr.js',
'**/jquery.js',
'**/sparkline.js',
'**/sha256.js',
'**/iframeResizer.min.js',
]),
...jsConfig,

@ -1 +1 @@
Subproject commit 2a7005fbcf8985644b66121365fa7228a65f34b0
Subproject commit d4eab2166e4d9b52e42924cc942198f9e22eb916

@ -1 +1 @@
Subproject commit 9942ea11aa7f23e8ad70ab81a4b411aae333081f
Subproject commit 006f08f499bbe69c484f0f1cc332bbf0e75526c2

@ -1 +1 @@
Subproject commit 79cae1944646e57cfbfb126a971a04e44e45d776
Subproject commit 1e840033b040d8915ddfb5dbf62c80f411bcec0a

@ -1 +1 @@
Subproject commit f8cb233f39e406befe70f2130f626bfa413e641a
Subproject commit e3720332f2301fa597c94b40897aa6e983020f1f

@ -1 +0,0 @@
Subproject commit 3ec8f9eb796be519a98de985bac03645d0040ede

View File

@ -4,46 +4,6 @@
#licenses pre { margin: 1em 0 2em 0;}
</style>
<h2><a href="https://github.com/sczhou/CodeFormer/blob/master/LICENSE">CodeFormer</a></h2>
<small>Parts of CodeFormer code had to be copied to be compatible with GFPGAN.</small>
<pre>
S-Lab License 1.0
Copyright 2022 S-Lab
Redistribution and use for non-commercial purpose in source and
binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
In the event that redistribution and/or use for commercial purpose in
source or binary forms, with or without modification is required,
please contact the contributor(s) of the work.
</pre>
<h2><a href="https://github.com/victorca25/iNNfer/blob/main/LICENSE">ESRGAN</a></h2>
<small>Code for architecture and reading models copied.</small>

11298
html/locale_ar.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_bn.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

11298
html/locale_he.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_hi.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

11298
html/locale_id.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

11298
html/locale_nb.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_po.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

11298
html/locale_qq.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

11298
html/locale_sr.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_tb.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_tlh.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_tr.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_ur.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_vi.json Normal file

File diff suppressed because it is too large Load Diff

11298
html/locale_xx.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

7
html/logo-dark.svg Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:svg="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<!-- Generator: Adobe Illustrator 30.2.0, SVG Export Plug-In . SVG Version: 2.1.1 Build 105) -->
<path d="M333.62,470.26l-9.4,4.63-39.05-21.52,16.16,32.8-9.4,4.63-24.4-49.52,9.4-4.63,39.09,21.59-16.19-32.87,9.4-4.63,24.4,49.52h-.01ZM442.86,365.07h0ZM334.71,418.37l6.05,12.27h.01l22.32-11.01,4.03,8.18-22.32,11,6.26,12.7,38.07-18.76,3.55-23.51-18.59-10.28-39.38,19.41h0ZM457.12,338.1l-205,101,31.64,65.17,205.12-100.53-31.76-65.64h0ZM423.12,426.16l-21.57-12.47-2.75,24.46-11.34,5.59h0l-41.79,20.59-24.4-49.52,43.06-21.21.19.07-.16-.09h-.01.01l11.54-5.68,19.04,10.95,2.2-21.42,11.34-5.59-4.76,31.42,30.96,17.21-11.55,5.69h-.01ZM433.46,369.7l-14.85,7.32-4.03-8.18,39.11-19.27,4.03,8.18-14.86,7.32,20.37,41.34-9.4,4.63-20.37-41.34h0Z" fill="#231f20"/>
<polygon points="248.11 427.73 453.11 326.73 453.11 113.73 248.11 7.73 248.11 117.73 333.11 167.73 333.11 267.73 248.11 317.73 248.11 427.73" fill="#231f20"/>
<polygon points="23.11 150.73 23.11 275.73 103.11 319.73 103.11 331.73 23.11 375.73 23.11 500.73 228.11 386.73 228.11 261.73 143.11 221.73 143.11 209.73 228.11 161.73 228.11 36.73 23.11 150.73" fill="#231f20"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

7
html/logo-light.svg Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:svg="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<!-- Generator: Adobe Illustrator 30.2.0, SVG Export Plug-In . SVG Version: 2.1.1 Build 105) -->
<path d="M333.62,470.26l-9.4,4.63-39.05-21.52,16.16,32.8-9.4,4.63-24.4-49.52,9.4-4.63,39.09,21.59-16.19-32.87,9.4-4.63,24.4,49.52h-.01ZM442.86,365.07h0ZM334.71,418.37l6.05,12.27h.01l22.32-11.01,4.03,8.18-22.32,11,6.26,12.7,38.07-18.76,3.55-23.51-18.59-10.28-39.38,19.41h0ZM457.12,338.1l-205,101,31.64,65.17,205.12-100.53-31.76-65.64h0ZM423.12,426.16l-21.57-12.47-2.75,24.46-11.34,5.59h0l-41.79,20.59-24.4-49.52,43.06-21.21.19.07-.16-.09h-.01.01l11.54-5.68,19.04,10.95,2.2-21.42,11.34-5.59-4.76,31.42,30.96,17.21-11.55,5.69h-.01ZM433.46,369.7l-14.85,7.32-4.03-8.18,39.11-19.27,4.03,8.18-14.86,7.32,20.37,41.34-9.4,4.63-20.37-41.34h0Z" fill="#fff"/>
<polygon points="248.11 427.73 453.11 326.73 453.11 113.73 248.11 7.73 248.11 117.73 333.11 167.73 333.11 267.73 248.11 317.73 248.11 427.73" fill="#fff"/>
<polygon points="23.11 150.73 23.11 275.73 103.11 319.73 103.11 331.73 23.11 375.73 23.11 500.73 228.11 386.73 228.11 261.73 143.11 221.73 143.11 209.73 228.11 161.73 228.11 36.73 23.11 150.73" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

19
html/logo-robot.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 473 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Some files were not shown because too many files have changed in this diff Show More