@@ -38,6 +38,7 @@ ignore-paths=/usr/lib/.*$,
|
||||
pipelines/flex2,
|
||||
pipelines/f_lite,
|
||||
pipelines/hidream,
|
||||
pipelines/hdm,
|
||||
pipelines/meissonic,
|
||||
pipelines/omnigen2,
|
||||
pipelines/segmoe,
|
||||
|
||||
@@ -20,6 +20,7 @@ exclude = [
|
||||
|
||||
"pipelines/meissonic",
|
||||
"pipelines/omnigen2",
|
||||
"pipelines/hdm",
|
||||
"pipelines/segmoe",
|
||||
|
||||
"scripts/lbm",
|
||||
@@ -84,6 +85,7 @@ ignore = [
|
||||
"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"]
|
||||
|
||||
@@ -1,5 +1,129 @@
|
||||
# Change Log for SD.Next
|
||||
|
||||
## Update for 2025-09-15
|
||||
|
||||
### Highlights for 2025-09-15
|
||||
|
||||
*What's new*? Big one is that we're (*finally*) switching the default UI to **ModernUI**, for both desktop and mobile use!
|
||||
**StandardUI** is still available and can be selected in settings, but ModernUI is now the default for new installs
|
||||
|
||||
*What's else*? **Chroma** is in its final form, there are several new **Qwen-Image** variants and **Nunchaku** hit version 1.0!
|
||||
Also, there are quite a few offloading improvements and many quality-of-life changes to UI and overal workflows
|
||||
And check out new **history** tab in the right panel, it now shows visualization of entire processing timeline!
|
||||
|
||||

|
||||
|
||||
[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 2025-09-15
|
||||
|
||||
- **Models**
|
||||
- **Chroma** final versions: [Chroma1-HD](https://huggingface.co/lodestones/Chroma1-HD), [Chroma1-Base](https://huggingface.co/lodestones/Chroma1-Base) and [Chroma1-Flash](https://huggingface.co/lodestones/Chroma1-Flash)
|
||||
- **Qwen-Image** [InstantX ControlNet Union](https://huggingface.co/InstantX/Qwen-Image-ControlNet-Union) support
|
||||
*note* qwen-image is already a very large model and controlnet adds 3.5GB on top of that so quantization and offloading are highly recommended!
|
||||
- [Qwen-Lightning-Edit](https://huggingface.co/vladmandic/Qwen-Lightning-Edit) and [Qwen-Image-Distill](https://huggingface.co/SahilCarterr/Qwen-Image-Distill-Full) variants
|
||||
- **Nuchaku** variants of [Qwen-Image-Lightning](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image), [Qwen-Image-Edit](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit), [Nunchaku-Qwen-Image-Edit-Lightning](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit)
|
||||
- **Nunchaku** variant of [Flux.1-Krea-Dev](https://huggingface.co/nunchaku-tech/nunchaku-flux.1-krea-dev)
|
||||
if you have a compatible nVidia GPU, Nunchaku is the fastest quantization & inference engine
|
||||
- [HunyuanDiT ControlNet](https://huggingface.co/Tencent-Hunyuan/HYDiT-ControlNet-v1.2) Canny, Depth, Pose
|
||||
- [KBlueLeaf/HDM-xut-340M-anime](https://huggingface.co/KBlueLeaf/HDM-xut-340M-anime)
|
||||
highly experimental: HDM *Home-made-Diffusion-Model* is a project to investigate specialized training recipe/scheme
|
||||
for pretraining T2I model at home based on super-light architecture
|
||||
*requires*: generator=cpu, dtype=float16, offload=none, both positive and negative prompts are required and must be long & detailed
|
||||
- [Apple FastVLM](https://huggingface.co/apple/FastVLM-0.5B) in 0.5B, 1.5B and 7B variants
|
||||
available in captioning tab
|
||||
- updated [SD.Next Model Samples Gallery](https://vladmandic.github.io/sd-samples/compare.html)
|
||||
- **UI**
|
||||
- default to **ModernUI**
|
||||
standard ui is still available via *settings -> user interface -> theme type*
|
||||
- mobile-friendly!
|
||||
- new **History** section in the right panel
|
||||
shows detailed job history plus timeline of the execution
|
||||
- make hints touch-friendly: hold touch to display hint
|
||||
- improved image scaling in img2img and control interfaces
|
||||
- add base model type to networks display, thanks @Artheriax
|
||||
- additional hints to ui, thanks @Artheriax
|
||||
- add video support to gallery, thanks @CalamitousFelicitousness
|
||||
- additional artwork for reference models in networks, thanks @liutyi
|
||||
- improve ui hints display
|
||||
- restyled all toolbuttons to be modernui native
|
||||
- reodered system settings
|
||||
- dynamic direction of dropdowns
|
||||
- improve process tab layout
|
||||
- improve detection of active tab
|
||||
- configurable horizontal vs vertical panel layout
|
||||
in settings -> user interface -> panel min width
|
||||
*example*: if panel width is less than specified value, layout switches to verical
|
||||
- configurable grid images size
|
||||
in *settings -> user interface -> grid image size*
|
||||
- gallery now includes reference model images
|
||||
- reference models now include indicator if they are *ready* or *need download*
|
||||
- **Offloading**
|
||||
- **balanced**
|
||||
- enable offload during pre-forward by default
|
||||
- improve offloading of models with multiple dits
|
||||
- improve offloading of models with impliciy vae processing
|
||||
- improve offloading of models with controlnet
|
||||
- more aggressive offloading of controlnets with lowvram flag
|
||||
- **group**
|
||||
- new offloading method, using *type=leaf* works on a similar level as sequential offloading
|
||||
and can present siginificant savings on low-vram gpus, but comes at the higher performace cost
|
||||
- **Quantization**
|
||||
- option to specify models types not to quantize: *settings -> quantization*
|
||||
allows for having quantization enabled, but skipping specific model types that do not need it
|
||||
*example*: `sd, sdxl`
|
||||
- **sdnq**
|
||||
- add quantized matmul support for all quantization types and group sizes
|
||||
- improve the performance of low bit quants
|
||||
- **nunchaku**: update to `nunchaku==1.0.0`
|
||||
*note*: nunchaku updated the repo which will trigger re-download of nunchaku models when first used
|
||||
nunchaku is currently available for: *Flux.1 Dev/Schnell/Kontext/Krea/Depth/Fill*, *Qwen-Image/Qwen-Lightning*, *SANA-1.6B*
|
||||
- **tensorrt**: new quantization engine from nvidia
|
||||
*experimental*: requires new pydantic package which *may* break other things, to enable start sdnext with `--new` flag
|
||||
*note*: this is model quantization only, no support for tensorRT inference yet
|
||||
- **Other**
|
||||
- refactor reuse-seed and add functionality to all tabs
|
||||
- refactor modernui js codebase
|
||||
- move zluda flash attenion to *Triton Flash attention* option
|
||||
- remove samplers filtering
|
||||
- allow both flow-matching and discrete samplers for sdxl models
|
||||
- cleanup command line parameters
|
||||
- add `--new` command line flag to enable testing of new packages without breaking existing installs
|
||||
- downgrade rocm to `torch==2.7.1`
|
||||
- set the minimum supported rocm version on linux to `rocm==6.0`
|
||||
- disallow `zluda` and `directml` on non-windows platforms
|
||||
- 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
|
||||
- **Detailer** allow manually setting processing resolution
|
||||
*note*: this does not impact the actual image resolution, only the resolution at which detailer internally operates
|
||||
- **Fixes**
|
||||
- normalize path hanlding when deleting images
|
||||
- unified compile upscalers
|
||||
- fix OpenVINO with ControlNet
|
||||
- fix hidden model tags in networks display
|
||||
- fix networks reference models display on windows
|
||||
- fix handling of pre-quantized `flux` models
|
||||
- fix `wan` use correct pipeline for i2v models
|
||||
- fix `qwen-image` with hires
|
||||
- fix `omnigen-2` failure
|
||||
- fix `auraflow` quantization
|
||||
- fix `kandinsky-3` noise
|
||||
- fix `infiniteyou` pipeline offloading
|
||||
- fix `skyreels-v2` image-to-video
|
||||
- fix `flex2` img2img denoising strength
|
||||
- fix `flex2` contronet vs inpaint image selection, thanks @alerikaisattera
|
||||
- fix some use cases with access via reverse-proxy
|
||||
- fix segfault on startup with `rocm==6.4.3` and `torch==2.8`
|
||||
- fix wildcards folders traversal, thanks @dymil
|
||||
- fix zluda flash attention with enable_gqa
|
||||
- fix `wan a14b` quantization
|
||||
- fix reprocess workflow for control with hires
|
||||
- fix samplers set timesteps vs sigmas
|
||||
- fix `detailer` missing metadata
|
||||
- fix `infiniteyou` lora load with
|
||||
|
||||
## Update for 2025-08-20
|
||||
|
||||
A quick service release with several important hotfixes, improved localization support and adding new **Qwen** model variants...
|
||||
@@ -14,14 +138,14 @@ A quick service release with several important hotfixes, improved localization s
|
||||
*note*: release version of `nunchaku==0.3.2` does NOT include support, so you need to build [nunchaku](https://nunchaku.tech/docs/nunchaku/installation/installation.html) from source
|
||||
- [SD.Next Model Samples Gallery](https://vladmandic.github.io/sd-samples/compare.html)
|
||||
- updated with new models
|
||||
- **Features**
|
||||
- **Features**
|
||||
- new *setting -> huggingface -> download method*
|
||||
default is `rust` as new `xet` is known to cause issues
|
||||
- support for `flux.1-kontext` lora
|
||||
- support for `qwen-image` lora
|
||||
- new *setting -> quantization -> modules dtype dict*
|
||||
used to manually override quant types per module
|
||||
- **UI**
|
||||
- **UI**
|
||||
- new artwork for reference models in networks
|
||||
thanks @liutyi
|
||||
- updated [localization](https://vladmandic.github.io/sdnext-docs/Locale/) for all 8 languages
|
||||
@@ -30,10 +154,10 @@ A quick service release with several important hotfixes, improved localization s
|
||||
double-click on locale resets locale to `en`
|
||||
- exclude ModernUI from list of extensions
|
||||
ModernUI is enabled in settings, not by manually enabling extension
|
||||
- **Docs**
|
||||
- **Docs**
|
||||
- Models and Video pages updated with links to original model repos, model licenses and original release dates
|
||||
thanks @alerikaisattera
|
||||
- **Fixes**
|
||||
- **Fixes**
|
||||
- nunchaku use new download links and default to `0.3.2`
|
||||
nunchaku wheels: <https://huggingface.co/nunchaku-tech/nunchaku/tree/main>
|
||||
- fix OpenVINO with offloading
|
||||
@@ -1140,6 +1264,7 @@ Models...And support for new models: **CogView-4**, **SANA 1.5**,
|
||||
- fix paste incorrect float to int cast
|
||||
- fix server restart from ui
|
||||
- fix style apply params
|
||||
- fix `wan22-i2v`
|
||||
- do not allow edit of built-in styles
|
||||
- improve lora compatibility with balanced offload
|
||||
|
||||
|
||||
@@ -43,12 +43,15 @@ All individual features are not listed here, instead check [ChangeLog](CHANGELOG
|
||||
|
||||
<br>
|
||||
|
||||
*Main interface using **StandardUI***:
|
||||

|
||||
**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>
|
||||
|
||||
*Main interface using **ModernUI***:
|
||||
|
||||

|
||||
**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 informations on other available themes, see [Themes](https://vladmandic.github.io/sdnext-docs/Themes/)
|
||||
|
||||
|
||||
@@ -5,31 +5,23 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma
|
||||
## Future Candidates
|
||||
|
||||
- Remote TE
|
||||
- Mobile ModernUI
|
||||
- [Canvas](https://konvajs.org/)
|
||||
|
||||
- [Modular pipelines and guiders](https://github.com/huggingface/diffusers/issues/11915)
|
||||
- Refactor: [Modular pipelines and guiders](https://github.com/huggingface/diffusers/issues/11915)
|
||||
- Refactor: Sampler options
|
||||
- Refactor: [GGUF](https://huggingface.co/docs/diffusers/main/en/quantization/gguf)
|
||||
- Feature: Diffusers [group offloading](https://github.com/vladmandic/sdnext/issues/4049)
|
||||
- Feature: Common repo for `T5` and `CLiP`
|
||||
- Feature: LoRA add OMI format support for SD35/FLUX.1
|
||||
- Video: Generic API support
|
||||
- Video: LTX TeaCache and others
|
||||
- Video: LTX API
|
||||
- Video: LTX PromptEnhance
|
||||
- Video: LTX Conditioning preprocess
|
||||
- [WanAI-2.1 VACE](https://huggingface.co/Wan-AI/Wan2.1-VACE-14B)(https://github.com/huggingface/diffusers/pull/11582)
|
||||
- [Cosmos-Predict2-Video](https://huggingface.co/nvidia/Cosmos-Predict2-2B-Video2World)(https://github.com/huggingface/diffusers/pull/11695)
|
||||
- Video Core: API
|
||||
- Video LTX: TeaCache and others, API, Conditioning preprocess Video: LTX API
|
||||
|
||||
### Blocked items
|
||||
|
||||
- Upgrade: unblock `pydantic` and `albumentations`
|
||||
- see <https://github.com/Cschlaefli/automatic>
|
||||
- blocked by `insightface`
|
||||
- Upgrade: `albumentations`
|
||||
- blocked by `insightface`
|
||||
|
||||
### Under Consideration
|
||||
|
||||
- [X-Omni](https://github.com/X-Omni-Team/X-Omni/blob/main/README.md)
|
||||
- [DiffSynth Studio](https://github.com/modelscope/DiffSynth-Studio)
|
||||
- [IPAdapter negative guidance](https://github.com/huggingface/diffusers/discussions/7167)
|
||||
- [IPAdapter composition](https://huggingface.co/ostris/ip-composition-adapter)
|
||||
- [STG](https://github.com/huggingface/diffusers/blob/main/examples/community/README.md#spatiotemporal-skip-guidance)
|
||||
@@ -38,26 +30,25 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma
|
||||
- [Nunchaku PulID](https://github.com/mit-han-lab/nunchaku/pull/274)
|
||||
- [Dream0 guidance](https://huggingface.co/ByteDance/DreamO)
|
||||
- [SUPIR upscaler](https://github.com/Fanghua-Yu/SUPIR)
|
||||
- Remove: Agent Scheduler
|
||||
- Remove: CodeFormer
|
||||
- Remove: GFPGAN
|
||||
- [ByteDance OneReward](https://github.com/bytedance/OneReward)
|
||||
- [ByteDance USO](https://github.com/bytedance/USO)
|
||||
- Remove: `Agent Scheduler`
|
||||
- Remove: `CodeFormer`
|
||||
- Remove: `GFPGAN`
|
||||
- ModernUI: Lite vs Expert mode
|
||||
|
||||
### Future Considerations
|
||||
- [TensorRT](https://github.com/huggingface/diffusers/pull/11173)
|
||||
- Engine: TensorRT acceleration
|
||||
|
||||
### New models
|
||||
|
||||
#### Pending
|
||||
- [HunyuanImage](https://huggingface.co/tencent/HunyuanImage-2.1)
|
||||
- [Lumina-DiMOO](https://huggingface.co/Alpha-VLLM/Lumina-DiMOO)
|
||||
- [Wan2.2 Fun](https://huggingface.co/collections/alibaba-pai/wan22-fun-68958eabec343b948f1225c5) (includes VACE, Control, etc)
|
||||
- [Magi](https://github.com/SandAI-org/MAGI-1)(https://github.com/huggingface/diffusers/pull/11713)
|
||||
- [SEVA](https://github.com/huggingface/diffusers/pull/11440)
|
||||
#### External:Unified/MultiModal
|
||||
- [Ming](https://github.com/inclusionAI/Ming)
|
||||
- [Liquid](https://github.com/FoundationVision/Liquid)
|
||||
#### External:Image2Image/Editing
|
||||
- [Step1X](https://github.com/stepfun-ai/Step1X-Edit)
|
||||
- [SD3 UltraEdit](https://github.com/HaozheZhao/UltraEdit)
|
||||
#### External:Video
|
||||
- [WAN2GP](https://github.com/deepbeepmeep/Wan2GP)
|
||||
- [SelfForcing](https://github.com/guandeh17/Self-Forcing)
|
||||
- [DiffusionForcing](https://github.com/kwsong0113/diffusion-forcing-transformer)
|
||||
@@ -83,7 +74,6 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma
|
||||
- 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: group offload
|
||||
- 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
|
||||
|
||||
@@ -8,6 +8,7 @@ const { GoogleGenerativeAI } = require('@google/generative-ai');
|
||||
const api_key = process.env.GOOGLE_AI_API_KEY;
|
||||
const model = 'gemini-2.5-flash';
|
||||
const prompt = `
|
||||
// eslint-disable-next-line max-len
|
||||
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',
|
||||
|
||||
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 301 KiB |
|
Before Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 215 KiB |
@@ -1,7 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<filter id='shadow' color-interpolation-filters="sRGB">
|
||||
<feDropShadow flood-color="black" dx="0" dy="0" flood-opacity="0.9" stdDeviation="0.5"/>
|
||||
<feDropShadow flood-color="black" dx="0" dy="0" flood-opacity="0.9" stdDeviation="0.5"/>
|
||||
</filter>
|
||||
<path style="filter:url(#shadow);" fill="#FFFFFF" d="M13.18 19C13.35 19.72 13.64 20.39 14.03 21H5C3.9 21 3 20.11 3 19V5C3 3.9 3.9 3 5 3H19C20.11 3 21 3.9 21 5V11.18C20.5 11.07 20 11 19.5 11C19.33 11 19.17 11 19 11.03V5H5V19H13.18M11.21 15.83L9.25 13.47L6.5 17H13.03C13.14 15.54 13.73 14.22 14.64 13.19L13.96 12.29L11.21 15.83M19 13.5V12L16.75 14.25L19 16.5V15C20.38 15 21.5 16.12 21.5 17.5C21.5 17.9 21.41 18.28 21.24 18.62L22.33 19.71C22.75 19.08 23 18.32 23 17.5C23 15.29 21.21 13.5 19 13.5M19 20C17.62 20 16.5 18.88 16.5 17.5C16.5 17.1 16.59 16.72 16.76 16.38L15.67 15.29C15.25 15.92 15 16.68 15 17.5C15 19.71 16.79 21.5 19 21.5V23L21.25 20.75L19 18.5V20Z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 989 B |
|
Before Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 255 KiB |
@@ -32,6 +32,7 @@
|
||||
{"id":"","label":"","localized":"","reload":"","hint":"Sort by time, descending"}
|
||||
],
|
||||
"main": [
|
||||
{"id":"","label":"SD.Next","localized":"","reload":"","hint":"SD.Next<br>All-in-one WebUI for AI generative image and video creation"},
|
||||
{"id":"","label":"Prompt","localized":"","reload":"","hint":"Describe image you want to generate"},
|
||||
{"id":"","label":"Start","localized":"","reload":"","hint":"Start"},
|
||||
{"id":"","label":"End","localized":"","reload":"","hint":"End"},
|
||||
@@ -41,10 +42,14 @@
|
||||
{"id":"","label":"Text","localized":"","reload":"","hint":"Create image from text"},
|
||||
{"id":"","label":"Image","localized":"","reload":"","hint":"Create image from image"},
|
||||
{"id":"","label":"Control","localized":"","reload":"","hint":"Create image with full guidance"},
|
||||
{"id":"","label":"Process","localized":"","reload":"","hint":"Process existing image"},
|
||||
{"id":"","label":"Images","localized":"","reload":"","hint":"Create images<br>Unified interface<br>Supports T2I and I2I<br>With optional control guidance"},
|
||||
{"id":"","label":"T2I","localized":"","reload":"","hint":"Create image from text<br>Legacy interface that mimics original text-to-image interface and behavior"},
|
||||
{"id":"","label":"I2I","localized":"","reload":"","hint":"Create image from image<br>Legacy interface that mimics original image-to-image interface and behavior"},
|
||||
{"id":"","label":"Process","localized":"","reload":"","hint":"Process existing image<br>Can be used to upscale images, remove backgrounds, obfuscate NSFW content, apply various filters and effects"},
|
||||
{"id":"","label":"Caption","localized":"","reload":"","hint":"Analyze existing images and create text descriptions"},
|
||||
{"id":"","label":"Interrogate","localized":"","reload":"","hint":"Run interrogate to get description of your image"},
|
||||
{"id":"","label":"Models","localized":"","reload":"","hint":"Download, convert or merge your models and manage models metadata"},
|
||||
{"id":"","label":"Sampler","localized":"","reload":"","hint":"Settings related to sampler and seed selection and configuration. Samplers guide the process of turning noise into an image over multiple steps."},
|
||||
{"id":"","label":"Agent Scheduler","localized":"","reload":"","hint":"Enqueue your generate requests and run them in the background"},
|
||||
{"id":"","label":"AgentScheduler","localized":"","reload":"","hint":"Enqueue your generate requests and run them in the background"},
|
||||
{"id":"","label":"System","localized":"","reload":"","hint":"System settings and information"},
|
||||
@@ -97,7 +102,7 @@
|
||||
{"id":"","label":"Denoise","localized":"","reload":"","hint":"Denoising settings. Higher denoise means that more of existing image content is allowed to change during generate"},
|
||||
{"id":"","label":"Mask","localized":"","reload":"","hint":"Image masking and mask options"},
|
||||
{"id":"","label":"Input","localized":"","reload":"","hint":"Selection of input media"},
|
||||
{"id":"","label":"Video","localized":"","reload":"","hint":"Create video using guidance"},
|
||||
{"id":"","label":"Video","localized":"","reload":"","hint":"Create videos using different methods<br>Supports text-to-image, image-to-image first-last-frame, etc."},
|
||||
{"id":"","label":"Control elements","localized":"","reload":"","hint":"Control elements are advanced models that can guide generation towards desired outcome"},
|
||||
{"id":"","label":"IP adapter","localized":"","reload":"","hint":"Guide generation towards desired outcome using IP adapters plugin models"},
|
||||
{"id":"","label":"IP adapters","localized":"","reload":"","hint":"IP adapters are plugin models that can guide generation towards desired outcome"},
|
||||
@@ -192,7 +197,14 @@
|
||||
{"id":"","label":"Control Only","localized":"","reload":"","hint":"This uses only the Control input below as the source for any ControlNet or IP Adapter type tasks based on any of our various options."},
|
||||
{"id":"","label":"Init Image Same As Control","localized":"","reload":"","hint":"Will additionally treat any image placed into the Control input window as a source for img2img type tasks, an image to modify for example."},
|
||||
{"id":"","label":"Separate Init Image","localized":"","reload":"","hint":"Creates an additional window next to Control input labeled Init input, so you can have a separate image for both Control operations and an init source."},
|
||||
{"id":"","label":"Override settings","localized":"","reload":"","hint":"If generation parameters deviate from your system settings override settings populated with those settings to override your system configuration for this workflow"}
|
||||
{"id":"","label":"Override settings","localized":"","reload":"","hint":"If generation parameters deviate from your system settings override settings populated with those settings to override your system configuration for this workflow"},
|
||||
{"id":"","label":"sigma method","localized":"","reload":"","hint":"Controls how noise levels (sigmas) are distributed across diffusion steps. Options:\n- default: the model default\n- karras: smoother noise schedule, higher quality with fewer steps\n- beta: based on beta schedule values\n- exponential: exponential decay of noise\n- lambdas: experimental, balances signal-to-noise\n- flowmatch: tuned for flow-matching models"},
|
||||
{"id":"","label":"timestep spacing","localized":"","reload":"","hint":"Determines how timesteps are spaced across the diffusion process. Options:\n- default: the model default\n- leading: creates evenly spaced steps\n- linspace: includes the first and last steps and evenly selects the remaining intermediate steps\n- trailing: only includes the last step and evenly selects the remaining intermediate steps starting from the end"},
|
||||
{"id":"","label":"beta schedule","localized":"","reload":"","hint":"Defines how beta (noise strength per step) grows. Options:\n- default: the model default\n- linear: evenly decays noise per step\n- scaled: squared version of linear, used only by Stable Diffusion\n- cosine: smoother decay, often better results with fewer steps\n- sigmoid: sharp transition, experimental"},
|
||||
{"id":"","label":"prediction method","localized":"","reload":"","hint":"Defines what the model predicts at each step. Options:\n- default: the model default\n- epsilon: noise (most common for Stable Diffusion)\n- sample: direct denoised image prediction, also called as x0 prediction\n- v_prediction: velocity prediction, used by CosXL and NoobAI VPred models\n- flow_prediction: used with newer flow-matching models like SD3 and Flux"},
|
||||
{"id":"","label":"sampler order","localized":"","reload":"","hint":"Order of solver updates in the sampler. Higher order improves stability/accuracy but increases compute cost."},
|
||||
{"id":"","label":"flow shift","localized":"","reload":"","hint":"Adjustment for flow-based samplers. Shifts noise distribution during generation, useful for fine-tuning balance between detail and consistency."},
|
||||
{"id":"","label":"resize mode","localized":"","reload":"","hint":"Defines how the input is resized or adapted in second-pass refinement:\n- none: no resizing, keep original resolution\n- fixed: force resize to target resolution (may distort)\n- crop: center-crop to fit target while keeping aspect ratio\n- fill: resize to fit and pad empty space with borders\n- outpaint: extend canvas beyond image borders\n- context aware: smart resize that blends or adapts surrounding areas"}
|
||||
],
|
||||
"other": [
|
||||
{"id":"","label":"Install","localized":"","reload":"","hint":"Install"},
|
||||
@@ -358,15 +370,26 @@
|
||||
{"id":"","label":"ONNX allow fallback to CPU","localized":"","reload":"","hint":"Allow fallback to CPU when selected execution provider failed"},
|
||||
{"id":"","label":"ONNX cache converted models","localized":"","reload":"","hint":"Save the models that are converted to ONNX format as a cache. You can manage them in ONNX tab"},
|
||||
{"id":"","label":"ONNX unload base model when processing refiner","localized":"","reload":"","hint":"Unload base model when the refiner is being converted/optimized/processed"},
|
||||
{"id":"","label":"Inference-mode","localized":"","reload":"","hint":"Use torch.inference_mode"},
|
||||
{"id":"","label":"no-grad","localized":"","reload":"","hint":"Use torch.no_grad"},
|
||||
{"id":"","label":"Model compile precompile","localized":"","reload":"","hint":"Run model compile immediately on model load instead of first use"},
|
||||
{"id":"","label":"Use zeros for prompt padding","localized":"","reload":"","hint":"Force full zero tensor when prompt is empty to remove any residual noise"},
|
||||
{"id":"","label":"Include invisible watermark","localized":"","reload":"","hint":"Add invisible watermark to image by altering some pixel values"},
|
||||
{"id":"","label":"invisible watermark string","localized":"","reload":"","hint":"Watermark string to add to image. Keep very short to avoid image corruption."},
|
||||
{"id":"","label":"show log view","localized":"","reload":"","hint":"Show log view at the bottom of the main window"},
|
||||
{"id":"","label":"Log view update period","localized":"","reload":"","hint":"Log view update period, in milliseconds"},
|
||||
{"id":"","label":"PAG layer names","localized":"","reload":"","hint":"Space separated list of layers<br>Available: d[0-5], m[0], u[0-8]<br>Default: m0"}
|
||||
{"id":"","label":"PAG layer names","localized":"","reload":"","hint":"Space separated list of layers<br>Available: d[0-5], m[0], u[0-8]<br>Default: m0"},
|
||||
{"id":"","label":"prompt attention normalization","localized":"","reload":"","hint":"Balances prompt token weights to avoid overly strong/weak influence. Helps stabilize outputs."},
|
||||
{"id":"","label":"ck flash attention","localized":"","reload":"","hint":"Custom Flash Attention kernel. Very fast, but may be unstable or hardware-dependent."},
|
||||
{"id":"","label":"flash attention","localized":"","reload":"","hint":"Highly optimized attention algorithm. Greatly reduces VRAM use and speeds up inference, but can be non-deterministic."},
|
||||
{"id":"","label":"memory attention","localized":"","reload":"","hint":"Uses less VRAM by chunking attention computation. Slower but allows bigger batches or images."},
|
||||
{"id":"","label":"math attention","localized":"","reload":"","hint":"Fallback pure-math attention implementation. Stable and predictable but very slow."},
|
||||
{"id":"","label":"dynamic attention","localized":"","reload":"","hint":"Adjusts attention computation dynamically per step. Saves VRAM but slows generation."},
|
||||
{"id":"","label":"sage attention","localized":"","reload":"","hint":"Experimental attention optimization method. May improve speed but less tested and can cause bugs."},
|
||||
{"id":"","label":"batch matrix-matrix","localized":"","reload":"","hint":"Standard batched matrix multiplication for attention. Reliable but not VRAM-efficient."},
|
||||
{"id":"","label":"split attention","localized":"","reload":"","hint":"Splits attention layers into smaller chunks. Helps with very large images at the cost of slower inference."},
|
||||
{"id":"","label":"deterministic mode","localized":"","reload":"","hint":"Forces deterministic output across runs. Useful for reproducibility, but may disable some optimizations."},
|
||||
{"id":"","label":"no-grad","localized":"","reload":"","hint":"Disables gradient tracking with torch.no_grad. Reduces memory usage and speeds up inference."},
|
||||
{"id":"","label":"Inference-mode","localized":"","reload":"","hint":"Like no-grad but stricter. Ensures model runs only in inference mode for safety and speed."},
|
||||
{"id":"","label":"cudamallocasync","localized":"","reload":"","hint":"Uses CUDA async memory allocator. Improves performance and VRAM fragmentation, but may cause instability on some GPUs."}
|
||||
],
|
||||
"missing": [
|
||||
{"id":"","label":"1st stage","localized":"","reload":"","hint":"1st stage"},
|
||||
@@ -455,7 +478,6 @@
|
||||
{"id":"","label":"batch interogate","localized":"","reload":"","hint":"batch interogate"},
|
||||
{"id":"","label":"batch interrogate","localized":"","reload":"","hint":"batch interrogate"},
|
||||
{"id":"","label":"batch mask directory","localized":"","reload":"","hint":"batch mask directory"},
|
||||
{"id":"","label":"batch matrix-matrix","localized":"","reload":"","hint":"batch matrix-matrix"},
|
||||
{"id":"","label":"batch mode uses sequential seeds","localized":"","reload":"","hint":"batch mode uses sequential seeds"},
|
||||
{"id":"","label":"batch output directory","localized":"","reload":"","hint":"batch output directory"},
|
||||
{"id":"","label":"batch uses original name","localized":"","reload":"","hint":"batch uses original name"},
|
||||
@@ -466,7 +488,6 @@
|
||||
{"id":"","label":"beta block weight preset","localized":"","reload":"","hint":"beta block weight preset"},
|
||||
{"id":"","label":"beta end","localized":"","reload":"","hint":"beta end"},
|
||||
{"id":"","label":"beta ratio","localized":"","reload":"","hint":"beta ratio"},
|
||||
{"id":"","label":"beta schedule","localized":"","reload":"","hint":"beta schedule"},
|
||||
{"id":"","label":"beta start","localized":"","reload":"","hint":"beta start"},
|
||||
{"id":"","label":"bh1","localized":"","reload":"","hint":"bh1"},
|
||||
{"id":"","label":"bh2","localized":"","reload":"","hint":"bh2"},
|
||||
@@ -495,7 +516,6 @@
|
||||
{"id":"","label":"chunk size","localized":"","reload":"","hint":"chunk size"},
|
||||
{"id":"","label":"civitai model type","localized":"","reload":"","hint":"civitai model type"},
|
||||
{"id":"","label":"civitai token","localized":"","reload":"","hint":"civitai token"},
|
||||
{"id":"","label":"ck flash attention","localized":"","reload":"","hint":"ck flash attention"},
|
||||
{"id":"","label":"ckpt","localized":"","reload":"","hint":"ckpt"},
|
||||
{"id":"","label":"cleanup temporary folder on startup","localized":"","reload":"","hint":"cleanup temporary folder on startup"},
|
||||
{"id":"","label":"clip model","localized":"","reload":"","hint":"clip model"},
|
||||
@@ -563,7 +583,6 @@
|
||||
{"id":"","label":"create zip archive","localized":"","reload":"","hint":"create zip archive"},
|
||||
{"id":"","label":"cross-attention","localized":"","reload":"","hint":"cross-attention"},
|
||||
{"id":"","label":"cudagraphs","localized":"","reload":"","hint":"cudagraphs"},
|
||||
{"id":"","label":"cudamallocasync","localized":"","reload":"","hint":"cudamallocasync"},
|
||||
{"id":"","label":"custom pipeline","localized":"","reload":"","hint":"custom pipeline"},
|
||||
{"id":"","label":"dark","localized":"","reload":"","hint":"dark"},
|
||||
{"id":"","label":"dc solver","localized":"","reload":"","hint":"dc solver"},
|
||||
@@ -591,7 +610,6 @@
|
||||
{"id":"","label":"depth threshold","localized":"","reload":"","hint":"depth threshold"},
|
||||
{"id":"","label":"description","localized":"","reload":"","hint":"description"},
|
||||
{"id":"","label":"details","localized":"","reload":"","hint":"details"},
|
||||
{"id":"","label":"deterministic mode","localized":"","reload":"","hint":"deterministic mode"},
|
||||
{"id":"","label":"device info","localized":"","reload":"","hint":"device info"},
|
||||
{"id":"","label":"diffusers","localized":"","reload":"","hint":"diffusers"},
|
||||
{"id":"","label":"dilate","localized":"","reload":"","hint":"dilate"},
|
||||
@@ -635,7 +653,6 @@
|
||||
{"id":"","label":"duration","localized":"","reload":"","hint":"duration"},
|
||||
{"id":"","label":"dwpose","localized":"","reload":"","hint":"dwpose"},
|
||||
{"id":"","label":"dynamic","localized":"","reload":"","hint":"dynamic"},
|
||||
{"id":"","label":"dynamic attention","localized":"","reload":"","hint":"dynamic attention"},
|
||||
{"id":"","label":"dynamic attention slicing rate in gb","localized":"","reload":"","hint":"dynamic attention slicing rate in gb"},
|
||||
{"id":"","label":"dynamic attention trigger rate in gb","localized":"","reload":"","hint":"dynamic attention trigger rate in gb"},
|
||||
{"id":"","label":"edge","localized":"","reload":"","hint":"edge"},
|
||||
@@ -682,9 +699,7 @@
|
||||
{"id":"","label":"filename","localized":"","reload":"","hint":"filename"},
|
||||
{"id":"","label":"first-block cache enabled","localized":"","reload":"","hint":"first-block cache enabled"},
|
||||
{"id":"","label":"fixed unet precision","localized":"","reload":"","hint":"fixed unet precision"},
|
||||
{"id":"","label":"flash attention","localized":"","reload":"","hint":"flash attention"},
|
||||
{"id":"","label":"flavors","localized":"","reload":"","hint":"flavors"},
|
||||
{"id":"","label":"flow shift","localized":"","reload":"","hint":"flow shift"},
|
||||
{"id":"","label":"folder","localized":"","reload":"","hint":"folder"},
|
||||
{"id":"","label":"folder for control generate","localized":"","reload":"","hint":"folder for control generate"},
|
||||
{"id":"","label":"folder for control grids","localized":"","reload":"","hint":"folder for control grids"},
|
||||
@@ -848,7 +863,6 @@
|
||||
{"id":"","label":"mask only","localized":"","reload":"","hint":"mask only"},
|
||||
{"id":"","label":"mask strength","localized":"","reload":"","hint":"mask strength"},
|
||||
{"id":"","label":"masked","localized":"","reload":"","hint":"masked"},
|
||||
{"id":"","label":"math attention","localized":"","reload":"","hint":"math attention"},
|
||||
{"id":"","label":"max faces","localized":"","reload":"","hint":"max faces"},
|
||||
{"id":"","label":"max flavors","localized":"","reload":"","hint":"max flavors"},
|
||||
{"id":"","label":"max guidance","localized":"","reload":"","hint":"max guidance"},
|
||||
@@ -866,7 +880,6 @@
|
||||
{"id":"","label":"medium","localized":"","reload":"","hint":"medium"},
|
||||
{"id":"","label":"mediums","localized":"","reload":"","hint":"mediums"},
|
||||
{"id":"","label":"memory","localized":"","reload":"","hint":"memory"},
|
||||
{"id":"","label":"memory attention","localized":"","reload":"","hint":"memory attention"},
|
||||
{"id":"","label":"memory limit","localized":"","reload":"","hint":"memory limit"},
|
||||
{"id":"","label":"memory optimization","localized":"","reload":"","hint":"memory optimization"},
|
||||
{"id":"","label":"merge alpha","localized":"","reload":"","hint":"merge alpha"},
|
||||
@@ -987,7 +1000,6 @@
|
||||
{"id":"","label":"postprocessing operation order","localized":"","reload":"","hint":"postprocessing operation order"},
|
||||
{"id":"","label":"power","localized":"","reload":"","hint":"power"},
|
||||
{"id":"","label":"predefined question","localized":"","reload":"","hint":"predefined question"},
|
||||
{"id":"","label":"prediction method","localized":"","reload":"","hint":"prediction method"},
|
||||
{"id":"","label":"preset","localized":"","reload":"","hint":"preset"},
|
||||
{"id":"","label":"preset block merge","localized":"","reload":"","hint":"preset block merge"},
|
||||
{"id":"","label":"preview","localized":"","reload":"","hint":"preview"},
|
||||
@@ -998,7 +1010,6 @@
|
||||
{"id":"","label":"processor move to cpu after use","localized":"","reload":"","hint":"processor move to cpu after use"},
|
||||
{"id":"","label":"processor settings","localized":"","reload":"","hint":"processor settings"},
|
||||
{"id":"","label":"processor unload after use","localized":"","reload":"","hint":"processor unload after use"},
|
||||
{"id":"","label":"prompt attention normalization","localized":"","reload":"","hint":"prompt attention normalization"},
|
||||
{"id":"","label":"prompt ex","localized":"","reload":"","hint":"prompt ex"},
|
||||
{"id":"","label":"prompt processor","localized":"","reload":"","hint":"prompt processor"},
|
||||
{"id":"","label":"prompt strength","localized":"","reload":"","hint":"prompt strength"},
|
||||
@@ -1035,13 +1046,12 @@
|
||||
{"id":"","label":"reprocess face","localized":"","reload":"","hint":"reprocess face"},
|
||||
{"id":"","label":"reprocess refine","localized":"","reload":"","hint":"reprocess refine"},
|
||||
{"id":"","label":"request browser notifications","localized":"","reload":"","hint":"request browser notifications"},
|
||||
{"id":"","label":"rescale","localized":"","reload":"","hint":"rescale"},
|
||||
{"id":"","label":"rescale","localized":"","reload":"","hint":"rescale betas with zero terminal snr"},
|
||||
{"id":"","label":"rescale betas with zero terminal snr","localized":"","reload":"","hint":"rescale betas with zero terminal snr"},
|
||||
{"id":"","label":"reset anchors","localized":"","reload":"","hint":"reset anchors"},
|
||||
{"id":"","label":"residual diff threshold","localized":"","reload":"","hint":"residual diff threshold"},
|
||||
{"id":"","label":"resize background color","localized":"","reload":"","hint":"resize background color"},
|
||||
{"id":"","label":"resize method","localized":"","reload":"","hint":"resize method"},
|
||||
{"id":"","label":"resize mode","localized":"","reload":"","hint":"resize mode"},
|
||||
{"id":"","label":"resize scale","localized":"","reload":"","hint":"resize scale"},
|
||||
{"id":"","label":"restart step","localized":"","reload":"","hint":"restart step"},
|
||||
{"id":"","label":"restore faces: codeformer","localized":"","reload":"","hint":"restore faces: codeformer"},
|
||||
@@ -1057,13 +1067,11 @@
|
||||
{"id":"","label":"run benchmark","localized":"","reload":"","hint":"run benchmark"},
|
||||
{"id":"","label":"sa solver","localized":"","reload":"","hint":"sa solver"},
|
||||
{"id":"","label":"safetensors","localized":"","reload":"","hint":"safetensors"},
|
||||
{"id":"","label":"sage attention","localized":"","reload":"","hint":"sage attention"},
|
||||
{"id":"","label":"same as primary","localized":"","reload":"","hint":"same as primary"},
|
||||
{"id":"","label":"same latent","localized":"","reload":"","hint":"same latent"},
|
||||
{"id":"","label":"sample","localized":"","reload":"","hint":"sample"},
|
||||
{"id":"","label":"sampler","localized":"","reload":"","hint":"sampler"},
|
||||
{"id":"","label":"sampler dynamic shift","localized":"","reload":"","hint":"sampler dynamic shift"},
|
||||
{"id":"","label":"sampler order","localized":"","reload":"","hint":"sampler order"},
|
||||
{"id":"","label":"sampler shift","localized":"","reload":"","hint":"sampler shift"},
|
||||
{"id":"","label":"sana: use complex human instructions","localized":"","reload":"","hint":"sana: use complex human instructions"},
|
||||
{"id":"","label":"saturation","localized":"","reload":"","hint":"saturation"},
|
||||
@@ -1129,7 +1137,6 @@
|
||||
{"id":"","label":"sigma","localized":"","reload":"","hint":"sigma"},
|
||||
{"id":"","label":"sigma churn","localized":"","reload":"","hint":"sigma churn"},
|
||||
{"id":"","label":"sigma max","localized":"","reload":"","hint":"sigma max"},
|
||||
{"id":"","label":"sigma method","localized":"","reload":"","hint":"sigma method"},
|
||||
{"id":"","label":"sigma min","localized":"","reload":"","hint":"sigma min"},
|
||||
{"id":"","label":"sigma noise","localized":"","reload":"","hint":"sigma noise"},
|
||||
{"id":"","label":"sigma tmin","localized":"","reload":"","hint":"sigma tmin"},
|
||||
@@ -1148,7 +1155,6 @@
|
||||
{"id":"","label":"spatial frequency","localized":"","reload":"","hint":"spatial frequency"},
|
||||
{"id":"","label":"specify model revision","localized":"","reload":"","hint":"specify model revision"},
|
||||
{"id":"","label":"specify model variant","localized":"","reload":"","hint":"specify model variant"},
|
||||
{"id":"","label":"split attention","localized":"","reload":"","hint":"split attention"},
|
||||
{"id":"","label":"stable-fast","localized":"","reload":"","hint":"stable-fast"},
|
||||
{"id":"","label":"standard","localized":"","reload":"","hint":"standard"},
|
||||
{"id":"","label":"start","localized":"","reload":"","hint":"start"},
|
||||
@@ -1209,7 +1215,6 @@
|
||||
{"id":"","label":"timestep","localized":"","reload":"","hint":"timestep"},
|
||||
{"id":"","label":"timestep skip end","localized":"","reload":"","hint":"timestep skip end"},
|
||||
{"id":"","label":"timestep skip start","localized":"","reload":"","hint":"timestep skip start"},
|
||||
{"id":"","label":"timestep spacing","localized":"","reload":"","hint":"timestep spacing"},
|
||||
{"id":"","label":"timesteps","localized":"","reload":"","hint":"timesteps"},
|
||||
{"id":"","label":"timesteps override","localized":"","reload":"","hint":"timesteps override"},
|
||||
{"id":"","label":"timesteps presets","localized":"","reload":"","hint":"timesteps presets"},
|
||||
|
||||
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 157 KiB |
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"sd-v21-512-ema": "models/Reference/stabilityai--stable-diffusion-2-1-base.jpg",
|
||||
"stabilityai--stable-diffusion-xl-base-1.0": "models/Reference/sd_xl_base_1.0.jpg",
|
||||
"stabilityai--stable-diffusion-3-medium-diffusers": "models/Reference/stabilityai--stable-diffusion-3.jpg",
|
||||
"stabilityai--stable-diffusion-3.5-medium": "models/Reference/stabilityai--stable-diffusion-3_5.jpg",
|
||||
"stabilityai--stable-diffusion-3.5-large": "models/Reference/stabilityai--stable-diffusion-3_5.jpg",
|
||||
"stabilityai--stable-diffusion-3.5-large-turbo": "models/Reference/stabilityai--stable-diffusion-3_5.jpg",
|
||||
"stabilityai--stable-diffusion-3.5-medium": "models/Reference/stabilityai--stable-diffusion-3_5-medium.jpg",
|
||||
"stabilityai--stable-diffusion-3.5-large": "models/Reference/stabilityai--stable-diffusion-3_5-large.jpg",
|
||||
"stabilityai--stable-diffusion-3.5-large-turbo": "models/Reference/stabilityai--stable-diffusion-3_5-large-turbo.jpg",
|
||||
"Disty0--FLUX.1-dev-qint8": "models/Reference/black-forest-labs--FLUX.1-dev.jpg",
|
||||
"Disty0--FLUX.1-dev-qint4": "models/Reference/black-forest-labs--FLUX.1-dev.jpg",
|
||||
"sayakpaul--flux.1-dev-nf4": "models/Reference/black-forest-labs--FLUX.1-dev.jpg",
|
||||
@@ -15,7 +17,13 @@
|
||||
"Efficient-Large-Model--Sana_600M_1024px_diffusers": "models/Reference/Efficient-Large-Model--Sana_1600M_1024px_diffusers.jpg",
|
||||
"stabilityai--stable-video-diffusion-img2vid-xt-1-1": "models/Reference/stabilityai--stable-video-diffusion-img2vid-xt.jpg",
|
||||
"shuttleai--shuttle-3-diffusion": "models/Reference/shuttleai--shuttle-3-diffusion.jpg",
|
||||
"HiDream-ai/HiDream-I1-Full": "models/Reference/HiDream-I1 Full",
|
||||
"vladmandic/chroma-unlocked-v50": "models/Reference/lodestones Chroma Unlocked HD",
|
||||
"vladmandic/chroma-unlocked-v50-annealed": "models/Reference/lodestones Chroma Unlocked HD"
|
||||
"HiDream-I1-Full": "models/Reference/HiDream-I1 Full",
|
||||
"lodestones--Chroma1-Base": "models/Reference/lodestones--Chroma-Base.jpg",
|
||||
"lodestones--Chroma1-HD": "models/Reference/lodestones--Chroma-HD.jpg",
|
||||
"chroma-unlocked-v50": "models/Reference/lodestones Chroma Unlocked HD",
|
||||
"chroma-unlocked-v50-annealed": "models/Reference/lodestones Chroma Unlocked HD",
|
||||
"vladmandic--Qwen-Lightning": "models/Reference/Qwen-Lightning.jpg",
|
||||
"vladmandic--Qwen-Lightning-Edit": "models/Reference/Qwen-Lightning.jpg",
|
||||
"Wan-AI--Wan2.2-T2V-A14B-Diffusers": "models/Reference/Wan2.2-T2V-A14B.jpg",
|
||||
"Wan-AI--Wan2.1-T2V-14B-Diffusers": "models/Reference/Wan-AI--Wan2.1.jpg"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
{
|
||||
"Tempest-by-Vlad XL": {
|
||||
"path": "tempestByVlad_baseV01.safetensors@https://civitai.com/api/download/models/1301775",
|
||||
@@ -140,40 +139,47 @@
|
||||
"extras": "sampler: Default, cfg_scale: 4.5"
|
||||
},
|
||||
|
||||
"lodestones Chroma Unlocked HD": {
|
||||
"lodestones Chroma1 HD": {
|
||||
"path": "lodestones/Chroma1-HD",
|
||||
"preview": "lodestones--Chroma-HD.jpg",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. The model is still training right now, and I’d love to hear your thoughts! Your input and feedback are really appreciated.",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. This is the high-res fine-tune of the Chroma1-Base at a 1024x1024 resolution.",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default, cfg_scale: 3.5"
|
||||
"extras": ""
|
||||
},
|
||||
"lodestones Chroma Unlocked HD Annealed": {
|
||||
"path": "vladmandic/chroma-unlocked-v50-annealed",
|
||||
"preview": "lodestones--Chroma-annealed.jpg",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. The model is still training right now, and I’d love to hear your thoughts! Your input and feedback are really appreciated.",
|
||||
"lodestones Chroma1 Base": {
|
||||
"path": "lodestones/Chroma1-Base",
|
||||
"preview": "lodestones--Chroma-Base.jpg",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. This is the core 512x512 model. It's a solid, all-around foundation for pretty much any creative project.",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default, cfg_scale: 3.5"
|
||||
"extras": ""
|
||||
},
|
||||
"lodestones Chroma Unlocked HD Flash": {
|
||||
"lodestones Chroma1 Flash": {
|
||||
"path": "lodestones/Chroma1-Flash",
|
||||
"preview": "lodestones--Chroma-flash.jpg",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. The model is still training right now, and I’d love to hear your thoughts! Your input and feedback are really appreciated.",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. A fine-tuned version of the Chroma1-Base made to find the best way to make these flow matching models faster.",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default, cfg_scale: 1.0"
|
||||
"extras": ""
|
||||
},
|
||||
"lodestones Chroma Unlocked v48": {
|
||||
"lodestones Chroma1 v50 Preview Annealed": {
|
||||
"path": "vladmandic/chroma-unlocked-v50-annealed",
|
||||
"preview": "lodestones--Chroma-annealed.jpg",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. Re-tweaked variant with extra noise added.",
|
||||
"skip": true,
|
||||
"extras": ""
|
||||
},
|
||||
"lodestones Chroma1 v48 Preview": {
|
||||
"path": "vladmandic/chroma-unlocked-v48",
|
||||
"preview": "lodestones--Chroma.jpg",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. The model is still training right now, and I’d love to hear your thoughts! Your input and feedback are really appreciated.",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. Last raw version of Chroma before final finetuning.",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default, cfg_scale: 1.0"
|
||||
"extras": ""
|
||||
},
|
||||
"lodestones Chroma Unlocked v48 Detail Calibrated": {
|
||||
"lodestones Chroma1 v48 Preview Calibrated": {
|
||||
"path": "vladmandic/chroma-unlocked-v48-detail-calibrated",
|
||||
"preview": "lodestones--Chroma-detail.jpg",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. The model is still training right now, and I’d love to hear your thoughts! Your input and feedback are really appreciated.",
|
||||
"desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. Last raw version of Chroma before final finetuning but with some detail calibration.",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default, cfg_scale: 1.0"
|
||||
"extras": ""
|
||||
},
|
||||
|
||||
"Qwen-Image": {
|
||||
@@ -185,15 +191,29 @@
|
||||
},
|
||||
"Qwen-Image-Edit": {
|
||||
"path": "Qwen/Qwen-Image-Edit",
|
||||
"preview": "Qwen--Qwen-Image.jpg",
|
||||
"desc": " Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.",
|
||||
"preview": "Qwen--Qwen-Image-Edit.jpg",
|
||||
"desc": "Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.",
|
||||
"skip": true,
|
||||
"extras": ""
|
||||
},
|
||||
"Qwen-Lightning": {
|
||||
"Qwen-Image-Lightning": {
|
||||
"path": "vladmandic/Qwen-Lightning",
|
||||
"preview": "Qwen-Lightning.jpg",
|
||||
"desc": " Qwen-Lightning is step-distilled from Qwen-Image to allow for generation in 8 steps.",
|
||||
"preview": "vladmandic--Qwen-Lightning.jpg",
|
||||
"desc": "Qwen-Lightning is step-distilled from Qwen-Image to allow for generation in 8 steps.",
|
||||
"skip": true,
|
||||
"extras": "steps: 8"
|
||||
},
|
||||
"Qwen-Image-Distill": {
|
||||
"path": "SahilCarterr/Qwen-Image-Distill-Full",
|
||||
"preview": "SahilCarterr--Qwen-Image-Distill-Full.jpg",
|
||||
"desc": "Qwen-Image-Distill is a distilled and accelerated version of Qwen-Image by DiffSynth-Studio.",
|
||||
"skip": true,
|
||||
"extras": "steps: 15"
|
||||
},
|
||||
"Qwen-Image-Lightning-Edit": {
|
||||
"path": "vladmandic/Qwen-Lightning-Edit",
|
||||
"preview": "vladmandic--Qwen-Lightning-Edit.jpg",
|
||||
"desc": " Qwen-Lightning-Edit is step-distilled from Qwen-Image-Edit to allow for generation in 8 steps.",
|
||||
"skip": true,
|
||||
"extras": "steps: 8"
|
||||
},
|
||||
@@ -215,28 +235,35 @@
|
||||
|
||||
"Wan-AI Wan2.1 1.3B": {
|
||||
"path": "Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
|
||||
"preview": "Wan-AI--Wan2.1-1_3B.jpg",
|
||||
"preview": "Wan-AI--Wan2.1-T2V-1.3B-Diffusers.jpg",
|
||||
"desc": "Wan is an advanced and powerful visual generation model developed by Tongyi Lab of Alibaba Group. It can generate videos based on text, images, and other control signals. The Wan2.1 series models are now fully open-source.",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
"Wan-AI Wan2.1 14B": {
|
||||
"path": "Wan-AI/Wan2.1-T2V-14B-Diffusers",
|
||||
"preview": "Wan-AI--Wan2.1.jpg",
|
||||
"preview": "Wan-AI--Wan2.1-T2V-14B-Diffusers.jpg",
|
||||
"desc": "Wan is an advanced and powerful visual generation model developed by Tongyi Lab of Alibaba Group. It can generate videos based on text, images, and other control signals. The Wan2.1 series models are now fully open-source.",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
"Wan-AI Wan2.2 5B": {
|
||||
"path": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
|
||||
"preview": "Wan-AI--Wan2.2_5B.jpg",
|
||||
"preview": "Wan-AI--Wan2.2-TI2V-5B-Diffusers.jpg",
|
||||
"desc": "Wan2.2, offering more powerful capabilities, better performance, and superior visual quality. With Wan2.2, we have focused on incorporating the following technical innovations: MoE Architecture, Data Scalling, Cinematic Aesthetics, Efficient High-Definition Hybrid",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
"Wan-AI Wan2.2 A14B": {
|
||||
"Wan-AI Wan2.2 A14B T2I": {
|
||||
"path": "Wan-AI/Wan2.2-T2V-A14B-Diffusers",
|
||||
"preview": "Wan2.2-T2V-A14B.jpg",
|
||||
"preview": "Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg",
|
||||
"desc": "Wan2.2, offering more powerful capabilities, better performance, and superior visual quality. With Wan2.2, we have focused on incorporating the following technical innovations: MoE Architecture, Data Scalling, Cinematic Aesthetics, Efficient High-Definition Hybrid",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
"Wan-AI Wan2.2 A14B I2I": {
|
||||
"path": "Wan-AI/Wan2.2-I2V-A14B-Diffusers",
|
||||
"preview": "Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg",
|
||||
"desc": "Wan2.2, offering more powerful capabilities, better performance, and superior visual quality. With Wan2.2, we have focused on incorporating the following technical innovations: MoE Architecture, Data Scalling, Cinematic Aesthetics, Efficient High-Definition Hybrid",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default"
|
||||
@@ -281,13 +308,13 @@
|
||||
"NVLabs Sana 1.5 1.6B 1k": {
|
||||
"path": "Efficient-Large-Model/SANA1.5_1.6B_1024px_diffusers",
|
||||
"desc": "Sana is an efficient model with scaling of training-time and inference time techniques. SANA-1.5 delivers: efficient model growth from 1.6B Sana-1.0 model to 4.8B, achieving similar or better performance than training from scratch and saving 60% training cost; efficient model depth pruning, slimming any model size as you want; powerful VLM selection based inference scaling, smaller model+inference scaling > larger model.",
|
||||
"preview": "Efficient-Large-Model--Sana15_1600M_1024px_diffusers.jpg",
|
||||
"preview": "Efficient-Large-Model--SANA1.5_1.6B_1024px_diffusers.jpg",
|
||||
"skip": true
|
||||
},
|
||||
"NVLabs Sana 1.5 4.8B 1k": {
|
||||
"path": "Efficient-Large-Model/SANA1.5_4.8B_1024px_diffusers",
|
||||
"desc": "Sana is an efficient model with scaling of training-time and inference time techniques. SANA-1.5 delivers: efficient model growth from 1.6B Sana-1.0 model to 4.8B, achieving similar or better performance than training from scratch and saving 60% training cost; efficient model depth pruning, slimming any model size as you want; powerful VLM selection based inference scaling, smaller model+inference scaling > larger model.",
|
||||
"preview": "Efficient-Large-Model--Sana15_4800M_1024px_diffusers.jpg",
|
||||
"preview": "Efficient-Large-Model--SANA1.5_4.8B_1024px_diffusers.jpg",
|
||||
"skip": true
|
||||
},
|
||||
"NVLabs Sana 1.5 1.6B 1k Sprint": {
|
||||
@@ -299,28 +326,27 @@
|
||||
"NVLabs Sana 1.0 1.6B 4k": {
|
||||
"path": "Efficient-Large-Model/Sana_1600M_4Kpx_BF16_diffusers",
|
||||
"desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.",
|
||||
"preview": "Efficient-Large-Model--Sana15_1600M_4Kpx_diffusers.jpg",
|
||||
"preview": "Efficient-Large-Model--Sana_1600M_4Kpx_BF16_diffusers.jpg",
|
||||
"skip": true
|
||||
},
|
||||
"NVLabs Sana 1.0 1.6B 2k": {
|
||||
"path": "Efficient-Large-Model/Sana_1600M_2Kpx_BF16_diffusers",
|
||||
"desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.",
|
||||
"preview": "Efficient-Large-Model--Sana1_1600M_2Kpx_diffusers.jpg",
|
||||
"preview": "Efficient-Large-Model--Sana_1600M_2Kpx_BF16_diffusers.jpg",
|
||||
"skip": true
|
||||
},
|
||||
"NVLabs Sana 1.0 1.6B 1k": {
|
||||
"path": "Efficient-Large-Model/Sana_1600M_1024px_diffusers",
|
||||
"desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.",
|
||||
"preview": "Efficient-Large-Model--Sana1_1600M_1024px_diffusers.jpg",
|
||||
"preview": "Efficient-Large-Model--Sana_1600M_1024px_diffusers.jpg",
|
||||
"skip": true
|
||||
},
|
||||
"NVLabs Sana 1.0 0.6B 0.5k": {
|
||||
"path": "Efficient-Large-Model/Sana_600M_512px_diffusers",
|
||||
"desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.",
|
||||
"preview": "Efficient-Large-Model--Sana1_600M_1024px_diffusers.jpg",
|
||||
"preview": "Efficient-Large-Model--Sana_600M_512px_diffusers.jpg",
|
||||
"skip": true
|
||||
},
|
||||
|
||||
"nVidia Cosmos-Predict2 T2I 2B": {
|
||||
"path": "nvidia/Cosmos-Predict2-2B-Text2Image",
|
||||
"desc": "Cosmos-Predict2: A family of highly performant pre-trained world foundation models purpose-built for generating physics-aware images, videos and world states for physical AI development.",
|
||||
@@ -340,7 +366,6 @@
|
||||
"preview": "Shitao--OmniGen-v1.jpg",
|
||||
"skip": true
|
||||
},
|
||||
|
||||
"VectorSpaceLab OmniGen v2": {
|
||||
"path": "OmniGen2/OmniGen2",
|
||||
"desc": "OmniGen2 is a powerful and efficient unified multimodal model. Unlike OmniGen v1, OmniGen2 features two distinct decoding pathways for text and image modalities, utilizing unshared parameters and a decoupled image tokenizer.",
|
||||
@@ -395,7 +420,6 @@
|
||||
"desc": "SegMoE-4x2-v0 is an untrained Segmind Mixture of Diffusion Experts Model generated using segmoe from 4 Expert SDXL models. SegMoE is a powerful framework for dynamically combining Stable Diffusion Models into a Mixture of Experts within minutes without training",
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
|
||||
"Pixart-α XL 2 Medium": {
|
||||
"path": "PixArt-alpha/PixArt-XL-2-512x512",
|
||||
"desc": "PixArt-α is a Transformer-based T2I diffusion model whose image generation quality is competitive with state-of-the-art image generators (e.g., Imagen, SDXL, and even Midjourney), and the training speed markedly surpasses existing large-scale T2I models. Extensive experiments demonstrate that PIXART-α excels in image quality, artistry, and semantic control. It can directly generate 512px images from text prompts within a single sampling process.",
|
||||
@@ -411,21 +435,21 @@
|
||||
"Pixart-Σ Small": {
|
||||
"path": "huggingface/PixArt-alpha/PixArt-Sigma-XL-2-512-MS",
|
||||
"desc": "PixArt-Σ, a Diffusion Transformer model (DiT) capable of directly generating images at 4K resolution. PixArt-Σ represents a significant advancement over its predecessor, PixArt-α, offering images of markedly higher fidelity and improved alignment with text prompts.",
|
||||
"preview": "PixArt-alpha--pixart_sigma_sdxl2-512.jpg",
|
||||
"preview": "PixArt-alpha--PixArt-Sigma-XL-2-512-MS.jpg",
|
||||
"skip": true,
|
||||
"extras": "width: 512, height: 512, sampler: Default, cfg_scale: 2.0"
|
||||
},
|
||||
"Pixart-Σ Medium": {
|
||||
"path": "huggingface/PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
|
||||
"desc": "PixArt-Σ, a Diffusion Transformer model (DiT) capable of directly generating images at 4K resolution. PixArt-Σ represents a significant advancement over its predecessor, PixArt-α, offering images of markedly higher fidelity and improved alignment with text prompts.",
|
||||
"preview": "PixArt-alpha--pixart_sigma_sdxl2-1024.jpg",
|
||||
"preview": "PixArt-alpha--PixArt-Sigma-XL-2-1024-MS.jpg",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default, cfg_scale: 2.0"
|
||||
},
|
||||
"Pixart-Σ Large": {
|
||||
"path": "huggingface/PixArt-alpha/PixArt-Sigma-XL-2-2K-MS",
|
||||
"desc": "PixArt-Σ, a Diffusion Transformer model (DiT) capable of directly generating images at 4K resolution. PixArt-Σ represents a significant advancement over its predecessor, PixArt-α, offering images of markedly higher fidelity and improved alignment with text prompts.",
|
||||
"preview": "PixArt-alpha--pixart_sigma_sdxl2-2K.jpg",
|
||||
"preview": "PixArt-alpha--PixArt-Sigma-XL-2-2K-MS.jpg",
|
||||
"skip": true,
|
||||
"extras": "sampler: Default, cfg_scale: 2.0"
|
||||
},
|
||||
@@ -439,7 +463,7 @@
|
||||
"Tencent HunyuanDiT 1.2 Distilled": {
|
||||
"path": "Tencent-Hunyuan/HunyuanDiT-v1.2-Diffusers-Distilled",
|
||||
"desc": "Hunyuan-DiT : A Powerful Multi-Resolution Diffusion Transformer with Fine-Grained Chinese Understanding.",
|
||||
"preview": "Tencent-Hunyuan--HunyuanDiT-v1.2-Distilled.jpg",
|
||||
"preview": "Tencent-Hunyuan--HunyuanDiT-v1.2-Diffusers-Distilled.jpg",
|
||||
"extras": "sampler: Default, cfg_scale: 2.0"
|
||||
},
|
||||
"Tencent HunyuanDiT 1.1": {
|
||||
@@ -451,7 +475,7 @@
|
||||
"Tencent HunyuanDiT 1.1 Distilled": {
|
||||
"path": "Tencent-Hunyuan/HunyuanDiT-v1.1-Diffusers-Distilled",
|
||||
"desc": "Hunyuan-DiT : A Powerful Multi-Resolution Diffusion Transformer with Fine-Grained Chinese Understanding.",
|
||||
"preview": "Tencent-Hunyuan--HunyuanDiT-v1.1-Distilled.jpg",
|
||||
"preview": "Tencent-Hunyuan--HunyuanDiT-v1.1-Diffusers-Distilled.jpg",
|
||||
"extras": "sampler: Default, cfg_scale: 2.0"
|
||||
},
|
||||
|
||||
@@ -462,7 +486,6 @@
|
||||
"skip": true,
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
|
||||
"AlphaVLLM Lumina 2": {
|
||||
"path": "Alpha-VLLM/Lumina-Image-2.0",
|
||||
"desc": "A Unified and Efficient Image Generative Model. Lumina-Image-2.0 is a 2 billion parameter flow-based diffusion transformer capable of generating images from text descriptions.",
|
||||
@@ -553,9 +576,10 @@
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
"Playground v2.5": {
|
||||
"path": "playground-v2.5-1024px-aesthetic.fp16.safetensors@https://huggingface.co/playgroundai/playground-v2.5-1024px-aesthetic/resolve/main/playground-v2.5-1024px-aesthetic.fp16.safetensors?download=true",
|
||||
"desc": "Playground v2.5 is a diffusion-based text-to-image generative model, and a successor to Playground v2. Playground v2.5 is the state-of-the-art open-source model in aesthetic quality. Our user studies demonstrate that our model outperforms SDXL, Playground v2, PixArt-α, DALL-E 3, and Midjourney 5.2.",
|
||||
"path": "playgroundai/playground-v2.5-1024px-aesthetic",
|
||||
"desc": "Playground v2.5 is a diffusion-based text-to-image generative model, and a successor to Playground v2. Playground v2.5 is the state-of-the-art open-source model in aesthetic quality.",
|
||||
"preview": "playgroundai--playground-v2_5-1024px-aesthetic.jpg",
|
||||
"variant": "fp16",
|
||||
"extras": "sampler: DPM++ 2M EDM"
|
||||
},
|
||||
|
||||
@@ -604,6 +628,7 @@
|
||||
"preview": "MeissonFlow--Meissonic.jpg",
|
||||
"skip": true
|
||||
},
|
||||
|
||||
"aMUSEd 256": {
|
||||
"path": "huggingface/amused/amused-256",
|
||||
"skip": true,
|
||||
@@ -624,6 +649,7 @@
|
||||
"preview": "warp-ai--wuerstchen.jpg",
|
||||
"extras": "sampler: Default, cfg_scale: 4.0, image_cfg_scale: 0.0"
|
||||
},
|
||||
|
||||
"KOALA 700M": {
|
||||
"path": "huggingface/etri-vilab/koala-700m-llava-cap",
|
||||
"variant": "fp16",
|
||||
@@ -632,22 +658,34 @@
|
||||
"preview": "etri-vilab--koala-700m-llava-cap.jpg",
|
||||
"extras": "sampler: Default"
|
||||
},
|
||||
|
||||
"HDM-XUT 340M Anime": {
|
||||
"path": "KBlueLeaf/HDM-xut-340M-anime",
|
||||
"skip": true,
|
||||
"desc": "HDM(Home made Diffusion Model) is a project to investigate specialized training recipe/scheme for pretraining T2I model at home which require the training setup should be exectuable on customer level hardware or cheap enough second handed server hardware.",
|
||||
"preview": "KBlueLeaf--HDM-xut-340M-anime.jpg",
|
||||
"extras": ""
|
||||
},
|
||||
|
||||
"Tsinghua UniDiffuser": {
|
||||
"path": "thu-ml/unidiffuser-v1",
|
||||
"desc": "UniDiffuser is a unified diffusion framework to fit all distributions relevant to a set of multi-modal data in one transformer. UniDiffuser is able to perform image, text, text-to-image, image-to-text, and image-text pair generation by setting proper timesteps without additional overhead.\nSpecifically, UniDiffuser employs a variation of transformer, called U-ViT, which parameterizes the joint noise prediction network. Other components perform as encoders and decoders of different modalities, including a pretrained image autoencoder from Stable Diffusion, a pretrained image ViT-B/32 CLIP encoder, a pretrained text ViT-L CLIP encoder, and a GPT-2 text decoder finetuned by ourselves.",
|
||||
"preview": "thu-ml--unidiffuser-v1.jpg",
|
||||
"extras": "width: 512, height: 512, sampler: Default"
|
||||
},
|
||||
|
||||
"SalesForce BLIP-Diffusion": {
|
||||
"path": "salesforce/blipdiffusion",
|
||||
"desc": "BLIP-Diffusion, a new subject-driven image generation model that supports multimodal control which consumes inputs of subject images and text prompts. Unlike other subject-driven generation models, BLIP-Diffusion introduces a new multimodal encoder which is pre-trained to provide subject representation.",
|
||||
"preview": "salesforce--blipdiffusion.jpg"
|
||||
},
|
||||
|
||||
"InstaFlow 0.9B": {
|
||||
"path": "XCLiu/instaflow_0_9B_from_sd_1_5",
|
||||
"desc": "InstaFlow is an ultra-fast, one-step image generator that achieves image quality close to Stable Diffusion. This efficiency is made possible through a recent Rectified Flow technique, which trains probability flows with straight trajectories, hence inherently requiring only a single step for fast inference.",
|
||||
"preview": "XCLiu--instaflow_0_9B_from_sd_1_5.jpg"
|
||||
},
|
||||
|
||||
"DeepFloyd IF Medium": {
|
||||
"path": "DeepFloyd/IF-I-M-v1.0",
|
||||
"desc": "DeepFloyd-IF is a pixel-based text-to-image triple-cascaded diffusion model, that can generate pictures with new state-of-the-art for photorealism and language understanding. The result is a highly efficient model that outperforms current state-of-the-art models, achieving a zero-shot FID-30K score of 6.66 on the COCO dataset. It is modular and composed of frozen text mode and three pixel cascaded diffusion modules, each designed to generate images of increasing resolution: 64x64, 256x256, and 1024x1024.",
|
||||
|
||||
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 160 KiB |
@@ -447,6 +447,8 @@ def git(arg: str, folder: str = None, ignore: bool = False, optional: bool = Fal
|
||||
stdout += ('\n' if len(stdout) > 0 else '') + result.stderr.decode(encoding="utf8", errors="ignore")
|
||||
stdout = stdout.strip()
|
||||
if result.returncode != 0 and not ignore:
|
||||
if folder is None:
|
||||
folder = 'root'
|
||||
if "couldn't find remote ref" in stdout: # not a git repo
|
||||
log.error(f'Git: folder="{folder}" could not identify repository')
|
||||
elif "no submodule mapping found" in stdout:
|
||||
@@ -581,6 +583,8 @@ def check_python(supported_minors=[], experimental_minors=[], reason=None):
|
||||
sys.exit(1)
|
||||
if int(sys.version_info.minor) == 12:
|
||||
os.environ.setdefault('SETUPTOOLS_USE_DISTUTILS', 'local') # hack for python 3.11 setuptools
|
||||
if int(sys.version_info.minor) == 9:
|
||||
log.warning("Python 3.9 support is scheduled to be removed")
|
||||
if not args.skip_git:
|
||||
git_cmd = os.environ.get('GIT', "git")
|
||||
if shutil.which(git_cmd) is None:
|
||||
@@ -601,7 +605,7 @@ def check_diffusers():
|
||||
if args.skip_git:
|
||||
install('diffusers')
|
||||
return
|
||||
sha = '4fcd0bc7ebb934a1559d0b516f09534ba22c8a0d' # diffusers commit hash
|
||||
sha = '5e181eddfe7e44c1444a2511b0d8e21d177850a0' # diffusers commit hash
|
||||
pkg = pkg_resources.working_set.by_key.get('diffusers', None)
|
||||
minor = int(pkg.version.split('.')[1] if pkg is not None else -1)
|
||||
cur = opts.get('diffusers_version', '') if minor > -1 else ''
|
||||
@@ -622,18 +626,22 @@ def check_transformers():
|
||||
t_start = time.time()
|
||||
if args.skip_all or args.skip_git or args.experimental:
|
||||
return
|
||||
pkg = pkg_resources.working_set.by_key.get('transformers', None)
|
||||
pkg_transofmers = pkg_resources.working_set.by_key.get('transformers', None)
|
||||
pkg_tokenizers = pkg_resources.working_set.by_key.get('tokenizers', None)
|
||||
if args.use_directml:
|
||||
target = '4.52.4'
|
||||
target_transformers = '4.52.4'
|
||||
target_tokenizers = '0.21.4'
|
||||
else:
|
||||
target = '4.55.2'
|
||||
if (pkg is None) or ((pkg.version != target) and (not args.experimental)):
|
||||
if pkg is None:
|
||||
log.info(f'Transformers install: version={target}')
|
||||
target_transformers = '4.56.1'
|
||||
target_tokenizers = '0.22.0'
|
||||
if (pkg_transofmers is None) or ((pkg_transofmers.version != target_transformers) or (pkg_tokenizers is None) or ((pkg_tokenizers.version != target_tokenizers) and (not args.experimental))):
|
||||
if pkg_transofmers is None:
|
||||
log.info(f'Transformers install: version={target_transformers}')
|
||||
else:
|
||||
log.info(f'Transformers update: current={pkg.version} target={target}')
|
||||
log.info(f'Transformers update: current={pkg_transofmers.version} target={target_transformers}')
|
||||
pip('uninstall --yes transformers', ignore=True, quiet=True, uv=False)
|
||||
pip(f'install --upgrade transformers=={target}', ignore=False, quiet=True, uv=False)
|
||||
pip(f'install --upgrade tokenizers=={target_tokenizers}', ignore=False, quiet=True, uv=False)
|
||||
pip(f'install --upgrade transformers=={target_transformers}', ignore=False, quiet=True, uv=False)
|
||||
ts('transformers', t_start)
|
||||
|
||||
|
||||
@@ -707,7 +715,7 @@ def install_rocm_zluda():
|
||||
log.info(msg)
|
||||
|
||||
if sys.platform == "win32": # TODO install: enable ROCm for windows when available
|
||||
#check_python(supported_minors=[9, 10, 11, 12, 13], reason='ZLUDA backend requires a Python version between 3.9 and 3.13')
|
||||
#check_python(supported_minors=[10, 11, 12, 13], reason='ZLUDA backend requires a Python version between 3.10 and 3.13')
|
||||
|
||||
if args.device_id is not None:
|
||||
if os.environ.get('HIP_VISIBLE_DEVICES', None) is not None:
|
||||
@@ -737,7 +745,7 @@ def install_rocm_zluda():
|
||||
log.info('Using CPU-only torch')
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision')
|
||||
else:
|
||||
#check_python(supported_minors=[9, 10, 11, 12, 13], reason='ROCm backend requires a Python version between 3.9 and 3.13')
|
||||
#check_python(supported_minors=[10, 11, 12, 13], reason='ROCm backend requires a Python version between 3.10 and 3.13')
|
||||
|
||||
if os.environ.get("TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL", None) is None:
|
||||
os.environ.setdefault('TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL', '1')
|
||||
@@ -749,28 +757,23 @@ def install_rocm_zluda():
|
||||
torch_command = os.environ.get('TORCH_COMMAND', '--upgrade --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/rocm6.3')
|
||||
else:
|
||||
if rocm.version is None or float(rocm.version) >= 6.4: # assume the latest if version check fails
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0+rocm6.4 torchvision==0.23.0+rocm6.4 --index-url https://download.pytorch.org/whl/rocm6.4')
|
||||
# Torch 2.8 with ROCm has common segfaults, memory access violations and accuracy issues
|
||||
#torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0+rocm6.4 torchvision==0.23.0+rocm6.4 --index-url https://download.pytorch.org/whl/rocm6.4')
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+rocm6.3 torchvision==0.22.1+rocm6.3 --index-url https://download.pytorch.org/whl/rocm6.3')
|
||||
elif rocm.version == "6.3":
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0+rocm6.3 torchvision==0.23.0+rocm6.3 --index-url https://download.pytorch.org/whl/rocm6.3')
|
||||
#torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0+rocm6.3 torchvision==0.23.0+rocm6.3 --index-url https://download.pytorch.org/whl/rocm6.3')
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+rocm6.3 torchvision==0.22.1+rocm6.3 --index-url https://download.pytorch.org/whl/rocm6.3')
|
||||
elif rocm.version == "6.2":
|
||||
# use rocm 6.2.4 instead of 6.2 as torch==2.7.1+rocm6.2 doesn't exists
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+rocm6.2.4 torchvision==0.22.1+rocm6.2.4 --index-url https://download.pytorch.org/whl/rocm6.2.4')
|
||||
elif rocm.version == "6.1":
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.6.0+rocm6.1 torchvision==0.21.0+rocm6.1 --index-url https://download.pytorch.org/whl/rocm6.1')
|
||||
elif rocm.version == "6.0":
|
||||
else:
|
||||
# lock to 2.4.1 instead of 2.5.1 for performance reasons there are no support for torch 2.6.0 for rocm 6.0
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.4.1+rocm6.0 torchvision==0.19.1+rocm6.0 --index-url https://download.pytorch.org/whl/rocm6.0')
|
||||
elif float(rocm.version) < 5.5: # oldest supported version is 5.5
|
||||
log.warning(f"ROCm: unsupported version={rocm.version}")
|
||||
log.warning("ROCm: minimum supported version=5.5")
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision --index-url https://download.pytorch.org/whl/rocm5.5')
|
||||
else:
|
||||
# older rocm (5.7) uses torch 2.3 or older
|
||||
torch_command = os.environ.get('TORCH_COMMAND', f'torch torchvision --index-url https://download.pytorch.org/whl/rocm{rocm.version}')
|
||||
|
||||
if device is not None and rocm.version != "6.2" and rocm.get_blaslt_enabled():
|
||||
log.debug(f'ROCm hipBLASLt: arch={device.name} available={device.blaslt_supported}')
|
||||
rocm.set_blaslt_enabled(device.blaslt_supported)
|
||||
if float(rocm.version) < 6.0:
|
||||
log.warning(f"ROCm: unsupported version={rocm.version}")
|
||||
log.warning("ROCm: minimum supported version=6.0")
|
||||
|
||||
if device is None or os.environ.get("HSA_OVERRIDE_GFX_VERSION", None) is not None:
|
||||
log.info(f'ROCm: HSA_OVERRIDE_GFX_VERSION auto config skipped: device={device.name if device is not None else None} version={os.environ.get("HSA_OVERRIDE_GFX_VERSION", None)}')
|
||||
@@ -786,7 +789,7 @@ def install_rocm_zluda():
|
||||
|
||||
def install_ipex():
|
||||
t_start = time.time()
|
||||
#check_python(supported_minors=[9, 10, 11, 12, 13], reason='IPEX backend requires a Python version between 3.9 and 3.13')
|
||||
#check_python(supported_minors=[10, 11, 12, 13], reason='IPEX backend requires a Python version between 3.10 and 3.13')
|
||||
args.use_ipex = True # pylint: disable=attribute-defined-outside-init
|
||||
log.info('IPEX: Intel OneAPI toolkit detected')
|
||||
|
||||
@@ -802,6 +805,9 @@ def install_ipex():
|
||||
if os.environ.get("PYTORCH_ENABLE_XPU_FALLBACK", None) is None:
|
||||
os.environ.setdefault('PYTORCH_ENABLE_XPU_FALLBACK', '1') # CPU fallback for unsupported ops
|
||||
|
||||
if os.environ.get("UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS", None) is None:
|
||||
os.environ.setdefault('UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS', '1') # Work around the 4G alloc limit on Alchemist
|
||||
|
||||
# FP64 emulation causes random UR Errors
|
||||
#if os.environ.get("OverrideDefaultFP64Settings", None) is None:
|
||||
# os.environ.setdefault('OverrideDefaultFP64Settings', '1')
|
||||
@@ -820,15 +826,16 @@ def install_ipex():
|
||||
|
||||
def install_openvino():
|
||||
t_start = time.time()
|
||||
#check_python(supported_minors=[9, 10, 11, 12, 13], reason='OpenVINO backend requires a Python version between 3.9 and 3.13')
|
||||
log.info('OpenVINO: selected')
|
||||
#check_python(supported_minors=[10, 11, 12, 13], reason='OpenVINO backend requires a Python version between 3.10 and 3.13')
|
||||
|
||||
if sys.platform == 'darwin':
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0 torchvision==0.23.0')
|
||||
else:
|
||||
torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0+cpu torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cpu')
|
||||
|
||||
install(os.environ.get('OPENVINO_COMMAND', 'openvino==2025.2.0'), 'openvino')
|
||||
install(os.environ.get('NNCF_COMMAND', 'nncf==2.17.0'), 'nncf')
|
||||
install(os.environ.get('OPENVINO_COMMAND', 'openvino==2025.3.0'), 'openvino')
|
||||
install(os.environ.get('NNCF_COMMAND', 'nncf==2.18.0'), 'nncf')
|
||||
os.environ.setdefault('PYTORCH_TRACING_MODE', 'TORCHFX')
|
||||
if os.environ.get("NEOReadDebugKeys", None) is None:
|
||||
os.environ.setdefault('NEOReadDebugKeys', '1')
|
||||
@@ -905,6 +912,16 @@ def check_torch():
|
||||
# log.debug(f'Torch allowed: cuda={allow_cuda} rocm={allow_rocm} ipex={allow_ipex} diml={allow_directml} openvino={allow_openvino}')
|
||||
torch_command = os.environ.get('TORCH_COMMAND', '')
|
||||
|
||||
if sys.platform != 'win32':
|
||||
if args.use_zluda:
|
||||
log.error('ZLUDA is only supported on Windows')
|
||||
if not args.ignore:
|
||||
sys.exit(1)
|
||||
if args.use_directml:
|
||||
log.error('DirectML is only supported on Windows')
|
||||
if not args.ignore:
|
||||
sys.exit(1)
|
||||
|
||||
if torch_command != '':
|
||||
pass
|
||||
else:
|
||||
@@ -1242,25 +1259,32 @@ def install_gradio():
|
||||
install(pkg, quiet=True)
|
||||
|
||||
|
||||
def install_pydantic():
|
||||
if args.new:
|
||||
install('pydantic==2.11.7', ignore=True, quiet=True)
|
||||
reload('pydantic', '2.11.7')
|
||||
else:
|
||||
install('pydantic==1.10.21', ignore=True, quiet=True)
|
||||
reload('pydantic', '1.10.21')
|
||||
|
||||
|
||||
def install_optional():
|
||||
t_start = time.time()
|
||||
log.info('Installing optional requirements...')
|
||||
install('git+https://github.com/Disty0/BasicSR@2b6a12c28e0c81bfb13b7e984144f0b0f5461484', 'basicsr')
|
||||
install('git+https://github.com/Disty0/GFPGAN@09b1190eabbc77e5f15c61fa7c38a2064b403e20', 'gfpgan')
|
||||
install('--no-build-isolation git+https://github.com/Disty0/BasicSR@23c1fb6f5c559ef5ce7ad657f2fa56e41b121754', 'basicsr')
|
||||
install('--no-build-isolation git+https://github.com/Disty0/GFPGAN@ae0f7e44fafe0ef4716f3c10067f8f379b74c21c', 'gfpgan')
|
||||
install('clean-fid', quiet=True)
|
||||
install('pillow-jxl-plugin==1.3.4', ignore=True, quiet=True)
|
||||
install('optimum-quanto==0.2.7', ignore=True, quiet=True)
|
||||
install('torchao==0.10.0', ignore=True, quiet=True)
|
||||
install('bitsandbytes==0.46.1', ignore=True, quiet=True)
|
||||
install('pynvml', ignore=True, quiet=True)
|
||||
install('bitsandbytes==0.47.0', ignore=True, quiet=True)
|
||||
install('nvidia-ml-py', ignore=True, quiet=True)
|
||||
install('ultralytics==8.3.40', ignore=True, quiet=True)
|
||||
install('Cython', ignore=True, quiet=True)
|
||||
install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches
|
||||
install('albumentations==1.4.3', ignore=True, quiet=True)
|
||||
install('pydantic==1.10.21', ignore=True, quiet=True)
|
||||
reload('pydantic', '1.10.21')
|
||||
install('gguf', ignore=True)
|
||||
install('av', ignore=True, quiet=True)
|
||||
install('gguf', ignore=True)
|
||||
try:
|
||||
import gguf
|
||||
scripts_dir = os.path.join(os.path.dirname(gguf.__file__), '..', 'scripts')
|
||||
@@ -1271,21 +1295,6 @@ def install_optional():
|
||||
ts('optional', t_start)
|
||||
|
||||
|
||||
def install_sentencepiece():
|
||||
if installed('sentencepiece', quiet=True):
|
||||
pass
|
||||
elif int(sys.version_info.minor) >= 13:
|
||||
backup_cmake_policy = os.environ.get('CMAKE_POLICY_VERSION_MINIMUM', None)
|
||||
backup_cxxflags = os.environ.get('CXXFLAGS', None)
|
||||
os.environ.setdefault('CMAKE_POLICY_VERSION_MINIMUM', '3.5')
|
||||
os.environ.setdefault('CXXFLAGS', '-include cstdint')
|
||||
install('git+https://github.com/google/sentencepiece#subdirectory=python', 'sentencepiece')
|
||||
os.environ.setdefault('CMAKE_POLICY_VERSION_MINIMUM', backup_cmake_policy)
|
||||
os.environ.setdefault('CXXFLAGS', backup_cxxflags)
|
||||
else:
|
||||
install('sentencepiece', 'sentencepiece')
|
||||
|
||||
|
||||
def install_requirements():
|
||||
t_start = time.time()
|
||||
if args.profile:
|
||||
@@ -1305,11 +1314,14 @@ def install_requirements():
|
||||
install_optional()
|
||||
installed('torch', reload=True) # reload packages cache
|
||||
log.info('Install: verifying requirements')
|
||||
if args.new:
|
||||
log.debug('Install: flag=new')
|
||||
with open('requirements.txt', 'r', encoding='utf8') as f:
|
||||
lines = [line.strip() for line in f.readlines() if line.strip() != '' and not line.startswith('#') and line is not None]
|
||||
for line in lines:
|
||||
if not installed(line, quiet=True):
|
||||
_res = install(line)
|
||||
install_pydantic()
|
||||
if args.profile:
|
||||
pr.disable()
|
||||
print_profile(pr, 'Requirements')
|
||||
@@ -1582,39 +1594,66 @@ def check_timestamp():
|
||||
|
||||
|
||||
def add_args(parser):
|
||||
group_setup = parser.add_argument_group('Setup')
|
||||
group_setup.add_argument('--reset', default=os.environ.get("SD_RESET",False), action='store_true', help="Reset main repository to latest version, default: %(default)s")
|
||||
group_setup.add_argument('--upgrade', '--update', default=os.environ.get("SD_UPGRADE",False), action='store_true', help="Upgrade main repository to latest version, default: %(default)s")
|
||||
group_setup.add_argument('--requirements', default=os.environ.get("SD_REQUIREMENTS",False), action='store_true', help="Force re-check of requirements, default: %(default)s")
|
||||
group_setup.add_argument('--reinstall', default=os.environ.get("SD_REINSTALL",False), action='store_true', help="Force reinstallation of all requirements, default: %(default)s")
|
||||
group_setup.add_argument('--optional', default=os.environ.get("SD_OPTIONAL",False), action='store_true', help="Force installation of optional requirements, default: %(default)s")
|
||||
group_setup.add_argument('--uv', default=os.environ.get("SD_UV",False), action='store_true', help="Use uv instead of pip to install the packages")
|
||||
|
||||
group_startup = parser.add_argument_group('Startup')
|
||||
group_startup.add_argument('--quick', default=os.environ.get("SD_QUICK",False), action='store_true', help="Bypass version checks, default: %(default)s")
|
||||
group_startup.add_argument('--skip-requirements', default=os.environ.get("SD_SKIPREQUIREMENTS",False), action='store_true', help="Skips checking and installing requirements, default: %(default)s")
|
||||
group_startup.add_argument('--skip-extensions', default=os.environ.get("SD_SKIPEXTENSION",False), action='store_true', help="Skips running individual extension installers, default: %(default)s")
|
||||
group_startup.add_argument('--skip-git', default=os.environ.get("SD_SKIPGIT",False), action='store_true', help="Skips running all GIT operations, default: %(default)s")
|
||||
group_startup.add_argument('--skip-torch', default=os.environ.get("SD_SKIPTORCH",False), action='store_true', help="Skips running Torch checks, default: %(default)s")
|
||||
group_startup.add_argument('--skip-all', default=os.environ.get("SD_SKIPALL",False), action='store_true', help="Skips running all checks, default: %(default)s")
|
||||
group_startup.add_argument('--skip-env', default=os.environ.get("SD_SKIPENV",False), action='store_true', help="Skips setting of env variables during startup, default: %(default)s")
|
||||
import argparse
|
||||
group_install = parser.add_argument_group('Install')
|
||||
group_install.add_argument('--quick', default=os.environ.get("SD_QUICK",False), action='store_true', help="Bypass version checks, default: %(default)s")
|
||||
group_install.add_argument('--reset', default=os.environ.get("SD_RESET",False), action='store_true', help="Reset main repository to latest version, default: %(default)s")
|
||||
group_install.add_argument('--upgrade', '--update', default=os.environ.get("SD_UPGRADE",False), action='store_true', help="Upgrade main repository to latest version, default: %(default)s")
|
||||
group_install.add_argument('--requirements', default=os.environ.get("SD_REQUIREMENTS",False), action='store_true', help="Force re-check of requirements, default: %(default)s")
|
||||
group_install.add_argument('--reinstall', default=os.environ.get("SD_REINSTALL",False), action='store_true', help="Force reinstallation of all requirements, default: %(default)s")
|
||||
group_install.add_argument('--uv', default=os.environ.get("SD_UV",False), action='store_true', help="Use uv instead of pip to install the packages")
|
||||
group_install.add_argument('--optional', default=os.environ.get("SD_OPTIONAL",False), action='store_true', help="Force installation of optional requirements, default: %(default)s")
|
||||
group_install.add_argument('--skip-requirements', default=os.environ.get("SD_SKIPREQUIREMENTS",False), action='store_true', help="Skips checking and installing requirements, default: %(default)s")
|
||||
group_install.add_argument('--skip-extensions', default=os.environ.get("SD_SKIPEXTENSION",False), action='store_true', help="Skips running individual extension installers, default: %(default)s")
|
||||
group_install.add_argument('--skip-git', default=os.environ.get("SD_SKIPGIT",False), action='store_true', help="Skips running all GIT operations, default: %(default)s")
|
||||
group_install.add_argument('--skip-torch', default=os.environ.get("SD_SKIPTORCH",False), action='store_true', help="Skips running Torch checks, default: %(default)s")
|
||||
group_install.add_argument('--skip-all', default=os.environ.get("SD_SKIPALL",False), action='store_true', help="Skips running all checks, default: %(default)s")
|
||||
group_install.add_argument('--skip-env', default=os.environ.get("SD_SKIPENV",False), action='store_true', help="Skips setting of env variables during startup, default: %(default)s")
|
||||
|
||||
group_compute = parser.add_argument_group('Compute Engine')
|
||||
group_compute.add_argument('--use-directml', default=os.environ.get("SD_USEDIRECTML",False), action='store_true', help="Use DirectML if no compatible GPU is detected, default: %(default)s")
|
||||
group_compute.add_argument("--use-openvino", default=os.environ.get("SD_USEOPENVINO",False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s")
|
||||
group_compute.add_argument("--use-ipex", default=os.environ.get("SD_USEIPEX",False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s")
|
||||
group_compute.add_argument("--device-id", type=str, default=os.environ.get("SD_DEVICEID", None), help="Select the default CUDA device to use, default: %(default)s")
|
||||
group_compute.add_argument("--use-cuda", default=os.environ.get("SD_USECUDA",False), action='store_true', help="Force use nVidia CUDA backend, default: %(default)s")
|
||||
group_compute.add_argument("--use-nightly", default=os.environ.get("SD_USENIGHTLY",False), action='store_true', help="Force use nightly torch builds, default: %(default)s")
|
||||
group_compute.add_argument("--use-ipex", default=os.environ.get("SD_USEIPEX",False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s")
|
||||
group_compute.add_argument("--use-rocm", default=os.environ.get("SD_USEROCM",False), action='store_true', help="Force use AMD ROCm backend, default: %(default)s")
|
||||
group_compute.add_argument('--use-zluda', default=os.environ.get("SD_USEZLUDA", False), action='store_true', help="Force use ZLUDA, AMD GPUs only, default: %(default)s")
|
||||
group_compute.add_argument("--use-openvino", default=os.environ.get("SD_USEOPENVINO",False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s")
|
||||
group_compute.add_argument('--use-directml', default=os.environ.get("SD_USEDIRECTML",False), action='store_true', help="Use DirectML if no compatible GPU is detected, default: %(default)s")
|
||||
group_compute.add_argument("--use-xformers", default=os.environ.get("SD_USEXFORMERS",False), action='store_true', help="Force use xFormers cross-optimization, default: %(default)s")
|
||||
group_compute.add_argument("--use-nightly", default=os.environ.get("SD_USENIGHTLY",False), action='store_true', help="Force use nightly torch builds, default: %(default)s")
|
||||
|
||||
group_paths = parser.add_argument_group('Paths')
|
||||
group_paths.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s")
|
||||
group_paths.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s")
|
||||
group_paths.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", 'models'), help="Base path where all models are stored, default: %(default)s",)
|
||||
group_paths.add_argument("--extensions-dir", type=str, default=os.environ.get("SD_EXTENSIONSDIR", None), help="Base path where all extensions are stored, default: %(default)s",)
|
||||
|
||||
group_http = parser.add_argument_group('HTTP')
|
||||
group_http.add_argument('--theme', type=str, default=os.environ.get("SD_THEME", None), help='Override UI theme')
|
||||
group_http.add_argument('--locale', type=str, default=os.environ.get("SD_LOCALE", None), help='Override UI locale')
|
||||
group_http.add_argument("--server-name", type=str, default=os.environ.get("SD_SERVERNAME", None), help="Sets hostname of server, default: %(default)s")
|
||||
group_http.add_argument("--tls-keyfile", type=str, default=os.environ.get("SD_TLSKEYFILE", None), help="Enable TLS and specify key file, default: %(default)s")
|
||||
group_http.add_argument("--tls-certfile", type=str, default=os.environ.get("SD_TLSCERTFILE", None), help="Enable TLS and specify cert file, default: %(default)s")
|
||||
group_http.add_argument("--tls-selfsign", action="store_true", default=os.environ.get("SD_TLSSELFSIGN", False), help="Enable TLS with self-signed certificates, default: %(default)s")
|
||||
group_http.add_argument("--cors-origins", type=str, default=os.environ.get("SD_CORSORIGINS", None), help="Allowed CORS origins as comma-separated list, default: %(default)s")
|
||||
group_http.add_argument("--cors-regex", type=str, default=os.environ.get("SD_CORSREGEX", None), help="Allowed CORS origins as regular expression, default: %(default)s")
|
||||
group_http.add_argument('--subpath', type=str, default=os.environ.get("SD_SUBPATH", None), help='Customize the URL subpath for usage with reverse proxy')
|
||||
group_http.add_argument("--autolaunch", default=os.environ.get("SD_AUTOLAUNCH", False), action='store_true', help="Open the UI URL in the system's default browser upon launch")
|
||||
group_http.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help = "Mount API docs, default: %(default)s")
|
||||
group_http.add_argument("--auth", type=str, default=os.environ.get("SD_AUTH", None), help='Set access authentication like "user:pwd,user:pwd""')
|
||||
group_http.add_argument("--auth-file", type=str, default=os.environ.get("SD_AUTHFILE", None), help='Set access authentication using file, default: %(default)s')
|
||||
group_http.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access")
|
||||
group_http.add_argument("--share", default=os.environ.get("SD_SHARE", False), action='store_true', help="Enable UI accessible through Gradio site, default: %(default)s")
|
||||
group_http.add_argument("--insecure", default=os.environ.get("SD_INSECURE", False), action='store_true', help="Enable extensions tab regardless of other options, default: %(default)s")
|
||||
group_http.add_argument("--listen", default=os.environ.get("SD_LISTEN", False), action='store_true', help="Launch web server using public IP address, default: %(default)s")
|
||||
group_http.add_argument("--port", type=int, default=os.environ.get("SD_PORT", 7860), help="Launch web server with given server port, default: %(default)s")
|
||||
|
||||
group_diag = parser.add_argument_group('Diagnostics')
|
||||
group_diag.add_argument('--safe', default=os.environ.get("SD_SAFE",False), action='store_true', help="Run in safe mode with no user extensions")
|
||||
group_diag.add_argument('--experimental', default=os.environ.get("SD_EXPERIMENTAL",False), action='store_true', help="Allow unsupported versions of libraries, default: %(default)s")
|
||||
group_diag.add_argument('--ignore', default=os.environ.get("SD_IGNORE",False), action='store_true', help="Ignore any errors and attempt to continue")
|
||||
group_diag.add_argument('--new', default=os.environ.get("SD_NEW",False), action='store_true', help="Force newer/untested version of libraries, default: %(default)s")
|
||||
group_diag.add_argument('--safe', default=os.environ.get("SD_SAFE",False), action='store_true', help="Run in safe mode with no user extensions")
|
||||
group_diag.add_argument('--test', default=os.environ.get("SD_TEST",False), action='store_true', help="Run test only and exit")
|
||||
group_diag.add_argument('--version', default=False, action='store_true', help="Print version information")
|
||||
group_diag.add_argument('--ignore', default=os.environ.get("SD_IGNORE",False), action='store_true', help="Ignore any errors and attempt to continue")
|
||||
group_diag.add_argument("--monitor", default=os.environ.get("SD_MONITOR", 0), help="Run memory monitor, default: %(default)s")
|
||||
group_diag.add_argument("--status", default=os.environ.get("SD_STATUS", 120), help="Run server is-alive status, default: %(default)s")
|
||||
|
||||
@@ -1627,7 +1666,7 @@ def add_args(parser):
|
||||
group_log.add_argument("--api-log", default=os.environ.get("SD_APILOG", False), action='store_true', help="Log all API requests")
|
||||
|
||||
group_nargs = parser.add_argument_group('Other')
|
||||
group_nargs.add_argument('args', type=str, nargs='*')
|
||||
group_nargs.add_argument('args', type=str, nargs='*', help=argparse.SUPPRESS)
|
||||
|
||||
|
||||
def parse_args(parser):
|
||||
|
||||
@@ -98,7 +98,7 @@ table.settings-value-table td { padding: 0.4em; border: 1px solid #ccc; max-widt
|
||||
.extra-network-cards .card:hover .overlay { background: rgba(0, 0, 0, 0.40); }
|
||||
.extra-network-cards .card:hover .preview { box-shadow: none; filter: grayscale(100%); }
|
||||
.extra-network-cards .card:hover .overlay { background: rgba(0, 0, 0, 0.40); }
|
||||
.extra-network-cards .card .tags { margin: 4px; display: none; overflow-wrap: break-word; }
|
||||
.extra-network-cards .card .tags { margin: 4px; display: none; overflow-wrap: anywhere; }
|
||||
.extra-network-cards .card .tag { padding: 2px; margin: 2px; background: var(--neutral-700); cursor: pointer; display: inline-block; }
|
||||
.extra-network-cards .card .actions > span { padding: 4px; }
|
||||
.extra-network-cards .card:hover .actions { display: block; }
|
||||
@@ -128,8 +128,8 @@ div:has(>#tab-browser-folders) { flex-grow: 0 !important; background-color: var(
|
||||
|
||||
/* loader */
|
||||
.splash { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 1000; display: block; text-align: center; }
|
||||
.motd { margin-top: 2em; color: var(--body-text-color-subdued); font-family: monospace; font-variant: all-petite-caps; }
|
||||
.splash-img { margin: 10% auto 0 auto; width: 512px; background-repeat: no-repeat; height: 512px; animation: color 10s infinite alternate; max-width: 80vw; background-size: contain; }
|
||||
.motd { margin-top: 2em; color: var(--body-text-color-subdued); font-family: monospace; font-variant: all-petite-caps; font-size: 1.2em; }
|
||||
.splash-img { margin: 10% auto 0 auto; width: 512px; background-repeat: no-repeat; height: 512px; animation: hue 5s infinite alternate; max-width: 80vw; background-size: contain; }
|
||||
.loading { color: white; position: absolute; top: 20%; left: 50%; transform: translateX(-50%); }
|
||||
.loader { width: 300px; height: 300px; border: var(--spacing-md) solid transparent; border-radius: 50%; border-top: var(--spacing-md) solid var(--primary-600); animation: spin 4s linear infinite; position: relative; }
|
||||
.loader::before, .loader::after { content: ""; position: absolute; top: 6px; bottom: 6px; left: 6px; right: 6px; border-radius: 50%; border: var(--spacing-md) solid transparent; }
|
||||
@@ -137,4 +137,4 @@ div:has(>#tab-browser-folders) { flex-grow: 0 !important; background-color: var(
|
||||
.loader::after { border-top-color: var(--primary-300); animation: spin 1.5s linear infinite; }
|
||||
@keyframes move { from { background-position-x: 0, -40px; } to { background-position-x: 0, 40px; } }
|
||||
@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
|
||||
@keyframes color { from { filter: hue-rotate(0deg) } to { filter: hue-rotate(360deg) } }
|
||||
@keyframes hue { from { filter: hue-rotate(0deg) } to { filter: hue-rotate(360deg) } }
|
||||
|
||||
@@ -932,7 +932,7 @@ svg.feather.feather-image,
|
||||
.extra-network-cards .card .version {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 2px;
|
||||
font-weight: bolder;
|
||||
text-shadow: 1px 1px black;
|
||||
@@ -953,7 +953,7 @@ svg.feather.feather-image,
|
||||
}
|
||||
|
||||
/* No Preview Card Styles */
|
||||
.extra-network-cards .card:has(>img[src*="card-no-preview.png"])::before {
|
||||
.extra-network-cards .card:has(>img[src*="missing.png"])::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
@@ -1007,11 +1007,11 @@ svg.feather.feather-image,
|
||||
}
|
||||
|
||||
.splash-img {
|
||||
margin: 0;
|
||||
margin: 10% auto 0 auto;
|
||||
width: 512px;
|
||||
height: 512px;
|
||||
background-repeat: no-repeat;
|
||||
animation: color 8s infinite alternate, move 3s infinite alternate;
|
||||
animation: hue 5s infinite alternate;
|
||||
}
|
||||
|
||||
.loading {
|
||||
|
||||
@@ -107,7 +107,7 @@ async function modelCardClick(id) {
|
||||
downloads: data.downloads?.toString() || '',
|
||||
creator,
|
||||
desc: data.desc || 'no description available',
|
||||
image: images.length > 0 ? images[0] : '/sdapi/v1/network/thumb?filename=html/card-no-preview.png',
|
||||
image: images.length > 0 ? images[0] : '/sdapi/v1/network/thumb?filename=html/missing.png',
|
||||
versions: versionsHTML || '',
|
||||
});
|
||||
el.innerHTML = modelHTML;
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
// allows drag-dropping files into gradio image elements, and also pasting images from clipboard
|
||||
|
||||
function isValidImageList(files) {
|
||||
return files && files?.length === 1 && ['image/png', 'image/gif', 'image/jpeg'].includes(files[0].type);
|
||||
}
|
||||
|
||||
function dropReplaceImage(imgWrap, files) {
|
||||
log('dropReplaceImage', imgWrap, files);
|
||||
if (!isValidImageList(files)) return;
|
||||
const tmpFile = files[0];
|
||||
imgWrap.querySelector('.modify-upload button + button, .touch-none + div button + button')?.click();
|
||||
@@ -23,7 +22,6 @@ function dropReplaceImage(imgWrap, files) {
|
||||
};
|
||||
|
||||
if (imgWrap.closest('#pnginfo_image')) {
|
||||
// special treatment for PNG Info tab, wait for fetch request to finish
|
||||
const oldFetch = window.fetch;
|
||||
window.fetch = async (input, options) => {
|
||||
const response = await oldFetch(input, options);
|
||||
@@ -57,6 +55,7 @@ window.document.addEventListener('dragover', (e) => {
|
||||
|
||||
window.document.addEventListener('drop', (e) => {
|
||||
const target = e.composedPath()[0];
|
||||
log('dropEvent', e, target);
|
||||
if (!target.placeholder) return;
|
||||
if (target.placeholder.indexOf('Prompt') === -1) return;
|
||||
const imgWrap = target.closest('[data-testid="image"]');
|
||||
@@ -69,6 +68,7 @@ window.document.addEventListener('drop', (e) => {
|
||||
});
|
||||
|
||||
window.addEventListener('paste', (e) => {
|
||||
log('pasteEvent', e);
|
||||
const { files } = e.clipboardData;
|
||||
if (!isValidImageList(files)) return;
|
||||
const visibleImageFields = [...gradioApp().querySelectorAll('[data-testid="image"]')]
|
||||
|
||||
@@ -7,15 +7,20 @@ let lastTab = 'control';
|
||||
|
||||
const getENActiveTab = () => {
|
||||
let tabName = '';
|
||||
if (gradioApp().getElementById('txt2img_prompt')?.checkVisibility()) tabName = 'txt2img';
|
||||
else if (gradioApp().getElementById('img2img_prompt')?.checkVisibility()) tabName = 'img2img';
|
||||
else if (gradioApp().getElementById('control_prompt')?.checkVisibility()) tabName = 'control';
|
||||
else if (gradioApp().getElementById('video_prompt')?.checkVisibility()) tabName = 'video';
|
||||
if (gradioApp().getElementById('txt2img_prompt')?.checkVisibility() || gradioApp().getElementById('txt2img_generate')?.checkVisibility()) tabName = 'txt2img';
|
||||
else if (gradioApp().getElementById('img2img_prompt')?.checkVisibility() || gradioApp().getElementById('img2img_generate')?.checkVisibility()) tabName = 'img2img';
|
||||
else if (gradioApp().getElementById('control_prompt')?.checkVisibility() || gradioApp().getElementById('control_generate')?.checkVisibility()) tabName = 'control';
|
||||
else if (gradioApp().getElementById('video_prompt')?.checkVisibility() || gradioApp().getElementById('video_generate')?.checkVisibility()) tabName = 'video';
|
||||
else if (gradioApp().getElementById('extras_image')?.checkVisibility()) tabName = 'process';
|
||||
else if (gradioApp().getElementById('interrogate_image')?.checkVisibility()) tabName = 'caption';
|
||||
else if (gradioApp().getElementById('tab-gallery-search')?.checkVisibility()) tabName = 'gallery';
|
||||
if (tabName in ['process', 'caption', 'gallery']) tabName = lastTab;
|
||||
else lastTab = tabName;
|
||||
|
||||
if (['process', 'caption', 'gallery'].includes(tabName)) {
|
||||
tabName = lastTab;
|
||||
} else if (tabName !== '') {
|
||||
lastTab = tabName;
|
||||
}
|
||||
|
||||
if (tabName !== '') return tabName;
|
||||
// legacy method
|
||||
if (gradioApp().getElementById('tab_txt2img')?.style.display === 'block') tabName = 'txt2img';
|
||||
@@ -173,7 +178,7 @@ async function filterExtraNetworksForTab(searchTerm) {
|
||||
found += cards.filter((elem) => elem.style.display === '').length;
|
||||
}
|
||||
const t1 = performance.now();
|
||||
log(`filterExtraNetworks: text="${searchTerm}" items=${items} match=${found} time=${Math.round(1000 * (t1 - t0)) / 1000000}`);
|
||||
log(`filterExtraNetworks: text="${searchTerm}" items=${items} match=${found} time=${Math.round(t1 - t0)}`);
|
||||
}
|
||||
|
||||
function tryToRemoveExtraNetworkFromPrompt(textarea, text) {
|
||||
@@ -209,6 +214,7 @@ function tryToRemoveExtraNetworkFromPrompt(textarea, text) {
|
||||
}
|
||||
|
||||
function sortExtraNetworks(fixed = 'no') {
|
||||
const t0 = performance.now();
|
||||
const sortDesc = ['Default', 'Name [A-Z]', 'Name [Z-A]', 'Date [Newest]', 'Date [Oldest]', 'Size [Largest]', 'Size [Smallest]'];
|
||||
const pagename = getENActivePage();
|
||||
if (!pagename) return 'sort error: unknown page';
|
||||
@@ -236,7 +242,8 @@ function sortExtraNetworks(fixed = 'no') {
|
||||
for (const card of cards) pg.appendChild(card);
|
||||
}
|
||||
const desc = sortDesc[sortVal];
|
||||
log('sortNetworks', { name: pagename, val: sortVal, order: desc, fixed: fixed === 'fixed', items: num });
|
||||
const t1 = performance.now();
|
||||
log('sortNetworks', { name: pagename, val: sortVal, order: desc, fixed: fixed === 'fixed', items: num, time: Math.round(t1 - t0) });
|
||||
return desc;
|
||||
}
|
||||
|
||||
@@ -277,8 +284,30 @@ function extraNetworksSearchButton(event) {
|
||||
const tabName = getENActiveTab();
|
||||
const searchTextarea = gradioApp().querySelector(`#${tabName}_extra_search textarea`);
|
||||
const button = event.target;
|
||||
searchTextarea.value = `${button.textContent.trim()}/`;
|
||||
updateInput(searchTextarea);
|
||||
if (searchTextarea) {
|
||||
searchTextarea.value = `${button.textContent.trim()}/`;
|
||||
updateInput(searchTextarea);
|
||||
} else {
|
||||
console.error(`Could not find the search textarea for the tab: ${tabName}`);
|
||||
}
|
||||
}
|
||||
|
||||
function extraNetworksFilterVersion(event) {
|
||||
// log('extraNetworksFilterVersion', event);
|
||||
const version = event.target.textContent.trim();
|
||||
const activeTab = getENActiveTab();
|
||||
const cardContainer = gradioApp().querySelector(`#${activeTab}_model_cards`);
|
||||
if (!cardContainer) return;
|
||||
if (cardContainer.dataset.activeVersion === version) {
|
||||
cardContainer.dataset.activeVersion = '';
|
||||
cardContainer.querySelectorAll('.card').forEach((card) => card.style.display = '');
|
||||
} else {
|
||||
cardContainer.dataset.activeVersion = version;
|
||||
cardContainer.querySelectorAll('.card').forEach((card) => {
|
||||
if (card.dataset.version === version) card.style.display = '';
|
||||
else card.style.display = 'none';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let desiredStyle = '';
|
||||
|
||||
@@ -44,7 +44,6 @@ async function updateGPU() {
|
||||
}
|
||||
const gpuTbody = gpuTable.querySelector('tbody');
|
||||
for (const gpu of data) {
|
||||
console.log(gpu);
|
||||
let rows = `<tr><td>GPU</td><td>${gpu.name}</td></tr>`;
|
||||
for (const item of Object.entries(gpu.data)) rows += `<tr><td>${item[0]}</td><td>${item[1]}</td></tr>`;
|
||||
gpuTbody.innerHTML = rows;
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
const inferenceTypes = ['inference', 'vae', 'te'];
|
||||
const ioTypes = ['load', 'save'];
|
||||
|
||||
function refreshHistory() {
|
||||
log('refreshHistory');
|
||||
fetch(`${window.api}/history`, { priority: 'low' }).then((res) => {
|
||||
const timeline = document.getElementById('history_timeline');
|
||||
const table = document.getElementById('history_table');
|
||||
timeline.innerHTML = '';
|
||||
res.json().then((data) => {
|
||||
if (!data || !data.length) {
|
||||
table.innerHTML = '<p>No history data available.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
// build table
|
||||
let html = '<table><thead><tr><th>Time</th><th>ID</th><th>Job</th><th>Action</th><th>Duration</th><th>Outputs</th></tr></thead><tbody>';
|
||||
for (const entry of data) {
|
||||
const ts = new Date(1000 * entry.timestamp).toLocaleString();
|
||||
const duration = entry.duration ? `${(entry.duration).toFixed(3)}` : '';
|
||||
const outputs = entry.outputs.join(', ');
|
||||
html += `<tr><td>${ts}</td><td>${entry.id}</td><td>${entry.job}</td><td>${entry.op}</td><td>${duration}</td><td>${outputs}</td></tr>`;
|
||||
}
|
||||
html += '</tbody></table>';
|
||||
table.innerHTML = html;
|
||||
|
||||
// crop data to last processing session
|
||||
let startIdx = -1;
|
||||
for (let i = data.length - 1; i >= 0; --i) {
|
||||
const e = data[i];
|
||||
if ((e.job === 'control' || e.job === 'text' || e.job === 'control' || e.job === 'image') && (e.op === 'begin')) {
|
||||
startIdx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (startIdx >= 0) data = data.slice(startIdx);
|
||||
|
||||
// build timeline
|
||||
const ts = [];
|
||||
for (const entry of data) {
|
||||
if (entry.op === 'begin') {
|
||||
const start = entry.timestamp;
|
||||
const end = data.find((e) => (e.id === entry.id && e.op === 'end')) || data[data.length - 1].timestamp;
|
||||
if (end.timestamp - start < 0.02) continue; // skip very short entries
|
||||
if (inferenceTypes.some((type) => entry.job.toLowerCase().startsWith(type))) entry.type = 'inference';
|
||||
else if (ioTypes.some((type) => entry.job.toLowerCase().startsWith(type))) entry.type = 'io';
|
||||
else entry.type = 'default';
|
||||
ts.push({ start, end: end.timestamp, label: entry.job, type: entry.type });
|
||||
}
|
||||
}
|
||||
if (!ts.length) return;
|
||||
new Timesheet(timeline, ts); // eslint-disable-line no-undef, no-new
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -4,14 +4,10 @@ async function initDragDrop() {
|
||||
const target = e.composedPath()[0];
|
||||
if (!target.placeholder) return;
|
||||
if (target.placeholder.indexOf('Prompt') === -1) return;
|
||||
const tab = get_tab_index('tabs');
|
||||
let promptTarget = '';
|
||||
if (tab === 0) promptTarget = 'txt2img_prompt_image';
|
||||
else if (tab === 1) promptTarget = 'img2img_prompt_image';
|
||||
else if (tab === 2) promptTarget = 'control_prompt_image';
|
||||
else if (tab === 3) promptTarget = 'video_prompt_image';
|
||||
else return;
|
||||
const tabName = getENActiveTab();
|
||||
const promptTarget = `${tabName}_prompt_image`;
|
||||
const imgParent = gradioApp().getElementById(promptTarget);
|
||||
log('dropEvent', target, promptTarget, imgParent);
|
||||
const fileInput = imgParent.querySelector('input[type="file"]');
|
||||
if (!imgParent || !fileInput) return;
|
||||
if ((e.dataTransfer?.files?.length || 0) > 0) {
|
||||
|
||||
@@ -30,7 +30,7 @@ async function removeSplash() {
|
||||
const splash = document.getElementById('splash');
|
||||
if (splash) splash.remove();
|
||||
log('removeSplash');
|
||||
const t = Math.round(performance.now() - appStartTime) / 1000;
|
||||
const t = Math.round(performance.now() - appStartTime);
|
||||
log('startupTime', t);
|
||||
xhrPost(`${window.api}/log`, { message: `ready time=${t}` });
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ async function logMonitor() {
|
||||
for (const line of lines) addLogLine(line);
|
||||
if (!logConnected) {
|
||||
logConnected = true;
|
||||
xhrPost('/sdapi/v1/log', { debug: 'connected' });
|
||||
xhrPost(`${window.api}/log`, { debug: 'connected' });
|
||||
}
|
||||
} else {
|
||||
logConnected = false;
|
||||
|
||||
@@ -14,7 +14,7 @@ function logFn(func) {
|
||||
const t0 = performance.now();
|
||||
const returnValue = func(...arguments);
|
||||
const t1 = performance.now();
|
||||
log(func.name, Math.round(t1 - t0) / 1000);
|
||||
log(func.name, `time=${Math.round(t1 - t0)}`);
|
||||
return returnValue;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -17,6 +17,67 @@
|
||||
--sd-image-fit: contain;
|
||||
}
|
||||
|
||||
:root {
|
||||
--sd-primary-h: 180deg;
|
||||
--color-blue: paleturquoise;
|
||||
--color-debug: #7F7F7F;
|
||||
--color-error: #9E2020;
|
||||
--color-green: palegreen;
|
||||
--color-info: #D4D4D4;
|
||||
--color-red: palevioletred;
|
||||
--color-trace: #666666;
|
||||
--color-warning: #FF9900;
|
||||
--sd-border-radius: 5px;
|
||||
--sd-border-size: 2px;
|
||||
--sd-button-hover-color: var(--sd-button-selected-color);
|
||||
--sd-button-hover-text-color: var(--sd-button-selected-text-color);
|
||||
--sd-button-normal-color: var(--sd-input-background-color);
|
||||
--sd-button-normal-text-color: var(--sd-input-text-color);
|
||||
--sd-button-selected-color: var(--sd-main-accent-color);
|
||||
--sd-button-selected-text-color: var(--sd-input-hover-text-color);
|
||||
--sd-gap-size: max(var(--sd-gap-size-val), var(--sd-border-size));
|
||||
--sd-gap-size-val: 5px;
|
||||
--sd-group-background-color: hsl(0deg 0% 16%);
|
||||
--sd-group-border-color: hsl(0deg 0% 16%);
|
||||
--sd-group-border-radius: 7px;
|
||||
--sd-group-border-size: 2px;
|
||||
--sd-button-height: 2.4em;
|
||||
--sd-group-gap: 6px;
|
||||
--sd-group-padding: 2px;
|
||||
--sd-input-background-color: rgba(0, 0, 0, 0.25);
|
||||
--sd-input-border-color: rgba(0, 0, 0, 0.1);
|
||||
--sd-input-border-size: 2px;
|
||||
--sd-input-font-size: var(--font-size);
|
||||
--sd-input-height: 35px;
|
||||
--sd-input-hover-text-color: var(--sd-input-text-color);
|
||||
--sd-input-icon-height: calc(var(--sd-input-height) - var(--sd-input-border-size) * 2);
|
||||
--sd-input-line-height: 23px;
|
||||
--sd-input-padding: 5px;
|
||||
--sd-input-placeholder-text-color: rgba(255, 255, 255, 0.35);
|
||||
--sd-input-secondary-text-color: var(--sd-input-text-color);
|
||||
--sd-input-slider-height: 0.6;
|
||||
--sd-input-text-color: rgba(255, 255, 255, 0.75);
|
||||
--sd-label-color: rgba(255, 255, 255, 0.75);
|
||||
--sd-muted-color: rgba(255, 255, 255, 0.50);
|
||||
--sd-main-accent-color: #7950ab;
|
||||
--sd-main-background-color: rgb(32 32 32);
|
||||
--sd-outline-color: var(--sd-button-hover-color);
|
||||
--sd-outline-size: calc(var(--sd-border-size) * 0.8);
|
||||
--sd-outside-gap-size: 8px;
|
||||
--sd-extra-gap: 0;
|
||||
--sd-panel-background-color: rgba(64, 64, 64, 0.5);
|
||||
--sd-panel-border-color: rgba(64, 64, 64, 0.75);
|
||||
--sd-panel-padding: 5px;
|
||||
--sd-scrollbar-color: var(--sd-panel-border-color);
|
||||
--sd-tooltip-text-color: var(--sd-input-background-color);
|
||||
--sd-body-font: 'IBM Plex Mono', monospace;
|
||||
--sd-text-font: 'IBM Plex Mono', monospace;
|
||||
--sd-button-font: 'NotoSans', sans-serif;
|
||||
--sd-image-fit: scale-down;
|
||||
--sd-panel-min-width: 30em;
|
||||
--sd-grid-image-size: 150px;
|
||||
}
|
||||
|
||||
a {
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
@@ -413,6 +474,15 @@ color: var(--primary-500) !important
|
||||
height: 50vh;
|
||||
}
|
||||
|
||||
#history_table {
|
||||
font-size: 0.9em;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
max-height: 50vh;
|
||||
overflow: auto;
|
||||
background-color: var(--sd-main-background-color);
|
||||
}
|
||||
|
||||
#control-result {
|
||||
background: var(--button-secondary-background-fill);
|
||||
padding: 0.2em;
|
||||
@@ -1197,7 +1267,7 @@ table.settings-value-table td {
|
||||
}
|
||||
|
||||
.extra-networks .search textarea {
|
||||
width: calc(120px / 1.1);
|
||||
width: calc(140px / 1.1);
|
||||
resize: none;
|
||||
margin-right: 2px;
|
||||
}
|
||||
@@ -1233,7 +1303,7 @@ table.settings-value-table td {
|
||||
padding: 3px 3px 3px 12px;
|
||||
text-align: left;
|
||||
text-indent: -6px;
|
||||
width: 120px;
|
||||
width: 140px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@@ -1249,7 +1319,7 @@ table.settings-value-table td {
|
||||
.extra-network-subdirs {
|
||||
background: var(--input-background-fill);
|
||||
border-radius: 4px;
|
||||
min-width: max(15%, 120px);
|
||||
min-width: max(15%, 140px);
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
padding-top: 0.5em;
|
||||
@@ -1357,7 +1427,7 @@ table.settings-value-table td {
|
||||
.extra-network-cards .card .version {
|
||||
background: gray;
|
||||
font-weight: bolder;
|
||||
left: 0;
|
||||
right: 0;
|
||||
line-height: 0.9rem;
|
||||
margin: 4px;
|
||||
opacity: 75%;
|
||||
@@ -1376,7 +1446,17 @@ table.settings-value-table td {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.extra-network-cards .card:has(>img[src*="card-no-preview.png"])::before {
|
||||
.extra-network-cards .card:hover {
|
||||
z-index: 100;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.extra-network-cards .card:hover .tags {
|
||||
display: block;
|
||||
z-index: 101; /* Optional: ensure tags are above everything */
|
||||
}
|
||||
|
||||
.extra-network-cards .card:has(>img[src*="missing.png"])::before {
|
||||
background-color: var(--data-color);
|
||||
content: '';
|
||||
height: 100%;
|
||||
@@ -1461,7 +1541,6 @@ table.settings-value-table td {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
|
||||
.extra-details td:first-child {
|
||||
font-weight: bold;
|
||||
vertical-align: top;
|
||||
@@ -1471,6 +1550,29 @@ table.settings-value-table td {
|
||||
max-height: 50vh;
|
||||
}
|
||||
|
||||
.network-folder::before {
|
||||
content: " ";
|
||||
margin-right: 0.8em;
|
||||
}
|
||||
|
||||
.network-reference {
|
||||
filter: contrast(0.9);
|
||||
}
|
||||
|
||||
.network-reference::before {
|
||||
content: " ";
|
||||
margin-right: 0.8em;
|
||||
}
|
||||
|
||||
.network-model {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.network-model::before {
|
||||
content: " ";
|
||||
margin-right: 0.8em;
|
||||
}
|
||||
|
||||
.input-accordion-checkbox {
|
||||
display: none !important;
|
||||
}
|
||||
@@ -1716,6 +1818,13 @@ background: var(--background-color)
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
#tab-gallery-files gallery-file {
|
||||
/* Add a vertical gutter between items (left/right), matching existing small row spacing */
|
||||
display: inline-block;
|
||||
margin-right: 0.2em;
|
||||
vertical-align: top; /* keep rows aligned on the top edge */
|
||||
}
|
||||
|
||||
#tab-gallery-files {
|
||||
display: block;
|
||||
height: 75vh;
|
||||
@@ -1813,6 +1922,24 @@ div:has(>#tab-gallery-folders) {
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
/* Gallery video preview matches image preview sizing and layout */
|
||||
#tab-gallery-video {
|
||||
height: 63vh;
|
||||
}
|
||||
|
||||
/* Ensure the <video> element fills the preview column and preserves aspect */
|
||||
#tab-gallery-video video {
|
||||
width: 100%;
|
||||
height: 100% !important;
|
||||
object-fit: contain;
|
||||
background: none;
|
||||
}
|
||||
|
||||
/* Gradio container around the video should not add extra spacing */
|
||||
#tab-gallery-video .wrap {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.gallery-sort {
|
||||
background: var(--input-background-fill) !important;
|
||||
margin: 0 !important;
|
||||
@@ -1867,70 +1994,73 @@ div:has(>#tab-gallery-folders) {
|
||||
}
|
||||
|
||||
.splash {
|
||||
display: block;
|
||||
height: 100vh;
|
||||
left: 0;
|
||||
position: fixed;
|
||||
text-align: center;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
z-index: 1000;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.motd {
|
||||
margin-top: 1em;
|
||||
color: var(--body-text-color-subdued);
|
||||
font-family: monospace;
|
||||
font-variant: all-petite-caps;
|
||||
margin-top: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.splash-img {
|
||||
animation: color 10s infinite alternate;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
height: 512px;
|
||||
margin: 10% auto 0 auto;
|
||||
max-width: 80vw;
|
||||
width: 512px;
|
||||
height: 512px;
|
||||
background-repeat: no-repeat;
|
||||
animation: hue 5s infinite alternate;
|
||||
}
|
||||
|
||||
.loading {
|
||||
color: white;
|
||||
left: 50%;
|
||||
position: absolute;
|
||||
top: 20%;
|
||||
transform: translateX(-50%);
|
||||
position: border-box;
|
||||
top: 85%;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.loader {
|
||||
animation: spin 4s linear infinite;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: var(--spacing-md) solid transparent;
|
||||
border-radius: 50%;
|
||||
border-top: var(--spacing-md) solid var(--primary-600);
|
||||
height: 300px;
|
||||
position: relative;
|
||||
width: 300px;
|
||||
animation: spin 2s linear infinite, hue 5s infinite alternate;
|
||||
position: border-box;
|
||||
}
|
||||
|
||||
.loader::before, .loader::after {
|
||||
border: var(--spacing-md) solid transparent;
|
||||
border-radius: 50%;
|
||||
bottom: 6px;
|
||||
.loader::before,
|
||||
.loader::after {
|
||||
content: "";
|
||||
left: 6px;
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
top: 6px;
|
||||
bottom: 6px;
|
||||
left: 6px;
|
||||
right: 6px;
|
||||
border-radius: 50%;
|
||||
border: var(--spacing-md) solid transparent;
|
||||
animation: hue 5s infinite alternate;
|
||||
}
|
||||
|
||||
.loader::before {
|
||||
animation: 3s spin linear infinite;
|
||||
border-top-color: var(--primary-900);
|
||||
animation: spin 3s linear infinite;
|
||||
}
|
||||
|
||||
.loader::after {
|
||||
animation: spin 1.5s linear infinite;
|
||||
border-top-color: var(--primary-300);
|
||||
animation: spin 1.5s linear infinite;
|
||||
}
|
||||
|
||||
.docs-search textarea {
|
||||
@@ -2087,35 +2217,21 @@ div:has(>#tab-gallery-folders) {
|
||||
filter: blur(0);
|
||||
}
|
||||
|
||||
@keyframes move {
|
||||
from {
|
||||
background-position-x: 0, -40px;
|
||||
}
|
||||
|
||||
to {
|
||||
background-position-x: 0, 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes color {
|
||||
from {
|
||||
|
||||
filter: hue-rotate(0deg)
|
||||
@keyframes hue {
|
||||
0% {
|
||||
filter: hue-rotate(0deg);
|
||||
}
|
||||
|
||||
to {
|
||||
|
||||
filter: hue-rotate(360deg)
|
||||
100% {
|
||||
filter: hue-rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,10 +9,12 @@ const localeData = {
|
||||
type: 2,
|
||||
hint: null,
|
||||
btn: null,
|
||||
expandTimeout: null, // New property for expansion timeout
|
||||
expandTimeout: null, // Property for expansion timeout
|
||||
currentElement: null, // Track current element for expansion
|
||||
observer: null, // MutationObserver for DOM changes
|
||||
};
|
||||
let localeTimeout = null;
|
||||
const isTouchDevice = 'ontouchstart' in window;
|
||||
|
||||
async function cycleLocale() {
|
||||
clearTimeout(localeTimeout);
|
||||
@@ -62,43 +64,49 @@ async function tooltipCreate() {
|
||||
if (window.opts.tooltips === 'None') localeData.type = 0;
|
||||
if (window.opts.tooltips === 'Browser default') localeData.type = 1;
|
||||
if (window.opts.tooltips === 'UI tooltips') localeData.type = 2;
|
||||
|
||||
if (localeData.type === 2) { // setup event delegation for tooltips instead of individual listeners
|
||||
if (isTouchDevice) {
|
||||
gradioApp().addEventListener('touchstart', tooltipShowDelegated); // eslint-disable-line no-use-before-define
|
||||
gradioApp().addEventListener('touchend', tooltipHideDelegated); // eslint-disable-line no-use-before-define
|
||||
}
|
||||
gradioApp().addEventListener('pointerover', tooltipShowDelegated); // eslint-disable-line no-use-before-define
|
||||
gradioApp().addEventListener('pointerout', tooltipHideDelegated); // eslint-disable-line no-use-before-define
|
||||
}
|
||||
if (!localeData.observer) initializeDOMObserver(); // eslint-disable-line no-use-before-define
|
||||
}
|
||||
|
||||
async function expandTooltip(element, longHint) {
|
||||
if (localeData.currentElement === element && localeData.hint.classList.contains('tooltip-show')) {
|
||||
// Hide the progress ring
|
||||
const ring = localeData.hint.querySelector('.tooltip-progress-ring');
|
||||
if (ring) {
|
||||
ring.style.opacity = '0';
|
||||
}
|
||||
|
||||
// Expand the container
|
||||
if (ring) ring.style.opacity = '0';
|
||||
localeData.hint.classList.add('tooltip-expanded');
|
||||
|
||||
// After container starts expanding, reveal the long content
|
||||
setTimeout(() => {
|
||||
const longContent = localeData.hint.querySelector('.long-content');
|
||||
if (longContent) {
|
||||
longContent.classList.add('show');
|
||||
}
|
||||
if (longContent) longContent.classList.add('show');
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
async function tooltipShowDelegated(e) { // use event delegation to handle dynamically created elements
|
||||
if (e.target.dataset && e.target.dataset.hint) tooltipShow(e); // eslint-disable-line no-use-before-define
|
||||
}
|
||||
|
||||
async function tooltipHideDelegated(e) {
|
||||
if (e.target.dataset && e.target.dataset.hint) tooltipHide(e); // eslint-disable-line no-use-before-define
|
||||
}
|
||||
|
||||
async function tooltipShow(e) {
|
||||
// Clear any existing expansion timeout
|
||||
if (localeData.expandTimeout) {
|
||||
if (localeData.expandTimeout) { // clear any existing expansion timeout
|
||||
clearTimeout(localeData.expandTimeout);
|
||||
localeData.expandTimeout = null;
|
||||
}
|
||||
|
||||
// Remove expanded class and reset current element
|
||||
localeData.hint.classList.remove('tooltip-expanded');
|
||||
localeData.hint.classList.remove('tooltip-expanded'); // remove expanded class and reset current element
|
||||
localeData.currentElement = e.target;
|
||||
|
||||
if (e.target.dataset.hint) {
|
||||
// Create progress ring SVG
|
||||
const progressRing = `
|
||||
const progressRing = ` // create progress ring SVG
|
||||
<div class="tooltip-progress-ring">
|
||||
<svg viewBox="0 0 12 12">
|
||||
<circle class="ring-background" cx="6" cy="6" r="5"></circle>
|
||||
@@ -106,8 +114,7 @@ async function tooltipShow(e) {
|
||||
</svg>
|
||||
</div>
|
||||
`;
|
||||
|
||||
// Set up the complete content structure from the start
|
||||
// set up the complete content structure from the start
|
||||
let content = `
|
||||
<div class="tooltip-header">
|
||||
<b>${e.target.textContent}</b>
|
||||
@@ -116,21 +123,12 @@ async function tooltipShow(e) {
|
||||
<div class="separator"></div>
|
||||
${e.target.dataset.hint}
|
||||
`;
|
||||
|
||||
// Add long content if available, but keep it hidden
|
||||
if (e.target.dataset.longHint) {
|
||||
content += `<div class="long-content"><div class="separator"></div>${e.target.dataset.longHint}</div>`;
|
||||
}
|
||||
|
||||
// Add reload notice if needed
|
||||
if (e.target.dataset.reload) {
|
||||
if (e.target.dataset.longHint) content += `<div class="long-content"><div class="separator"></div>${e.target.dataset.longHint}</div>`; // add long content if available, but keep it hidden
|
||||
if (e.target.dataset.reload) { // add reload notice if needed
|
||||
const reloadType = e.target.dataset.reload;
|
||||
let reloadText = '';
|
||||
if (reloadType === 'model') {
|
||||
reloadText = 'Requires model reload';
|
||||
} else if (reloadType === 'server') {
|
||||
reloadText = 'Requires server restart';
|
||||
}
|
||||
if (reloadType === 'model') reloadText = 'Requires model reload';
|
||||
else if (reloadType === 'server') reloadText = 'Requires server restart';
|
||||
if (reloadText) {
|
||||
content += `
|
||||
<div class="tooltip-reload-notice">
|
||||
@@ -144,40 +142,28 @@ async function tooltipShow(e) {
|
||||
localeData.hint.innerHTML = content;
|
||||
localeData.hint.classList.add('tooltip-show');
|
||||
|
||||
if (e.clientX > window.innerWidth / 2) {
|
||||
localeData.hint.classList.add('tooltip-left');
|
||||
} else {
|
||||
localeData.hint.classList.remove('tooltip-left');
|
||||
}
|
||||
if (e.clientX > window.innerWidth / 2) localeData.hint.classList.add('tooltip-left');
|
||||
else localeData.hint.classList.remove('tooltip-left');
|
||||
|
||||
// Set up expansion timer if long hint is available
|
||||
if (e.target.dataset.longHint) {
|
||||
// Start progress ring animation
|
||||
const ring = localeData.hint.querySelector('.tooltip-progress-ring');
|
||||
if (e.target.dataset.longHint) { // set up expansion timer if long hint is available
|
||||
const ring = localeData.hint.querySelector('.tooltip-progress-ring'); // start progress ring animation
|
||||
const ringProgress = localeData.hint.querySelector('.ring-progress');
|
||||
|
||||
if (ring && ringProgress) {
|
||||
// Show the ring and start animation
|
||||
setTimeout(() => {
|
||||
ring.classList.add('active');
|
||||
ringProgress.classList.add('animate');
|
||||
}, 100);
|
||||
}
|
||||
|
||||
localeData.expandTimeout = setTimeout(() => {
|
||||
expandTooltip(e.target, e.target.dataset.longHint);
|
||||
}, 3000);
|
||||
localeData.expandTimeout = setTimeout(() => expandTooltip(e.target, e.target.dataset.longHint), 3000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function tooltipHide(e) {
|
||||
// Clear expansion timeout when hiding
|
||||
if (localeData.expandTimeout) {
|
||||
clearTimeout(localeData.expandTimeout);
|
||||
localeData.expandTimeout = null;
|
||||
}
|
||||
|
||||
localeData.hint.classList.remove('tooltip-show', 'tooltip-expanded');
|
||||
localeData.currentElement = null;
|
||||
}
|
||||
@@ -294,8 +280,6 @@ async function setHint(el, entry) {
|
||||
el.dataset.hint = entry.hint;
|
||||
if (entry.longHint && entry.longHint.length > 0) el.dataset.longHint = entry.longHint;
|
||||
if (entry.reload && entry.reload.length > 0) el.dataset.reload = entry.reload;
|
||||
el.addEventListener('mouseover', tooltipShow);
|
||||
el.addEventListener('mouseout', tooltipHide);
|
||||
} else {
|
||||
// tooltips disabled
|
||||
}
|
||||
@@ -345,6 +329,7 @@ async function setHints(analyze = false) {
|
||||
localeData.initial = false;
|
||||
const t1 = performance.now();
|
||||
// localeData.btn.style.backgroundColor = localeData.locale !== 'en' ? 'var(--primary-500)' : '';
|
||||
log('touchDevice', isTouchDevice);
|
||||
log('setHints', { type: localeData.type, locale: localeData.locale, elements: elements.length, localized, hints, data: localeData.data.length, override: overrideData.length, time: Math.round(t1 - t0) });
|
||||
// sortUIElements();
|
||||
if (analyze) {
|
||||
@@ -359,3 +344,80 @@ const analyzeHints = async () => {
|
||||
localeData.data = [];
|
||||
await setHints(true);
|
||||
};
|
||||
|
||||
// Apply hints to a single element immediately
|
||||
async function applyHintToElement(el) {
|
||||
if (!localeData.data || localeData.data.length === 0) return;
|
||||
if (!el.textContent) return;
|
||||
|
||||
// check if element matches our selector criteria
|
||||
const isValidElement = el.tagName === 'BUTTON'
|
||||
|| el.tagName === 'H2'
|
||||
|| (el.tagName === 'SPAN' && (el.parentElement?.tagName === 'LABEL' || el.parentElement?.classList.contains('label-wrap')));
|
||||
if (!isValidElement) return;
|
||||
|
||||
let found; // find matching hint data
|
||||
if (el.dataset.original) found = localeData.data.find((l) => l.label.toLowerCase().trim() === el.dataset.original.toLowerCase().trim());
|
||||
else found = localeData.data.find((l) => l.label.toLowerCase().trim() === el.textContent.toLowerCase().trim());
|
||||
|
||||
if (found?.localized?.length > 0) { // apply localization if found
|
||||
if (!el.dataset.original) el.dataset.original = el.textContent;
|
||||
replaceTextContent(el, found.localized);
|
||||
}
|
||||
|
||||
if (found?.hint?.length > 0) setHint(el, found); // apply hint if found
|
||||
}
|
||||
|
||||
// Initialize MutationObserver for immediate hint application
|
||||
function initializeDOMObserver() {
|
||||
if (localeData.observer) {
|
||||
localeData.observer.disconnect();
|
||||
}
|
||||
|
||||
localeData.observer = new MutationObserver((mutations) => {
|
||||
// Process added nodes immediately
|
||||
for (const mutation of mutations) {
|
||||
if (mutation.type === 'childList') {
|
||||
for (const node of mutation.addedNodes) {
|
||||
if (node.nodeType === Node.ELEMENT_NODE) {
|
||||
// Apply hints to the node itself
|
||||
applyHintToElement(node);
|
||||
|
||||
// Apply hints to all relevant children
|
||||
const elements = [
|
||||
...Array.from(node.querySelectorAll('button')),
|
||||
...Array.from(node.querySelectorAll('h2')),
|
||||
...Array.from(node.querySelectorAll('label > span')),
|
||||
...Array.from(node.querySelectorAll('.label-wrap > span')),
|
||||
];
|
||||
|
||||
// Include the node itself if it matches
|
||||
if (node.matches && (
|
||||
node.matches('button')
|
||||
|| node.matches('h2')
|
||||
|| node.matches('label > span')
|
||||
|| node.matches('.label-wrap > span')
|
||||
)) {
|
||||
elements.push(node);
|
||||
}
|
||||
|
||||
// Apply hints immediately to all found elements
|
||||
elements.forEach((el) => applyHintToElement(el));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Start observing the entire gradio app for changes
|
||||
const targetNode = gradioApp();
|
||||
if (targetNode) {
|
||||
localeData.observer.observe(targetNode, {
|
||||
childList: true,
|
||||
subtree: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Export for external use if needed
|
||||
const forceReapplyHints = () => setHints();
|
||||
|
||||
@@ -18,10 +18,12 @@ const AppyOpts = [
|
||||
];
|
||||
|
||||
async function updateOpts(json_string) {
|
||||
const t0 = performance.now();
|
||||
const settings_data = JSON.parse(json_string);
|
||||
const new_opts = settings_data.values;
|
||||
opts_metadata = settings_data.metadata;
|
||||
|
||||
const t1 = performance.now();
|
||||
for (const op of monitoredOpts) {
|
||||
const key = Object.keys(op)[0];
|
||||
const callback = op[key];
|
||||
@@ -37,8 +39,9 @@ async function updateOpts(json_string) {
|
||||
if (callback) callback(new_opts[key], opts[key]);
|
||||
}
|
||||
|
||||
const t2 = performance.now();
|
||||
window.opts = new_opts;
|
||||
log('updateOpts', Object.keys(new_opts).length);
|
||||
log('updateOpts', `settings=${Object.keys(new_opts).length} callbacks=${Math.round(t2 - t1)} apply=${Math.round(t1 - t0)}`);
|
||||
Object.entries(opts_metadata).forEach(([opt, meta]) => {
|
||||
if (!opts_tabs[meta.tab_name]) opts_tabs[meta.tab_name] = {};
|
||||
if (!opts_tabs[meta.tab_name].unsaved_keys) opts_tabs[meta.tab_name].unsaved_keys = new Set();
|
||||
|
||||
@@ -4,22 +4,23 @@ window.subpath = '';
|
||||
|
||||
async function initStartup() {
|
||||
const t0 = performance.now();
|
||||
log('gradio', `time=${Math.round(t0 - appStartTime)}`);
|
||||
log('initStartup');
|
||||
if (window.setupLogger) await setupLogger();
|
||||
|
||||
// all items here are non-blocking async calls
|
||||
initModels();
|
||||
getUIDefaults();
|
||||
initPromptChecker();
|
||||
initContextMenu();
|
||||
initDragDrop();
|
||||
initAccordions();
|
||||
initSettings();
|
||||
initImageViewer();
|
||||
initGallery();
|
||||
initiGenerationParams();
|
||||
initChangelog();
|
||||
setupControlUI();
|
||||
await initModels();
|
||||
await getUIDefaults();
|
||||
await initPromptChecker();
|
||||
await initContextMenu();
|
||||
await initDragDrop();
|
||||
await initAccordions();
|
||||
await initSettings();
|
||||
await initImageViewer();
|
||||
await initGallery();
|
||||
await initiGenerationParams();
|
||||
await initChangelog();
|
||||
await setupControlUI();
|
||||
|
||||
// reconnect server session
|
||||
await reconnectUI();
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
.timesheet {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.timesheet {
|
||||
background-color: var(--sd-main-background-color);
|
||||
position: relative;
|
||||
}
|
||||
.timesheet .scale {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
float: left;
|
||||
}
|
||||
.timesheet .scale section {
|
||||
float: left;
|
||||
text-align: center;
|
||||
color: rgba(250, 250, 250, 0.8);
|
||||
font-size: 13px;
|
||||
line-height: 24px;
|
||||
font-weight: lighter;
|
||||
border-left: 1px dashed rgba(250, 250, 250, 0.2);
|
||||
height: 100%;
|
||||
}
|
||||
.timesheet .data {
|
||||
margin: 10px 0 10px 0;
|
||||
padding: 0;
|
||||
text-align: left;
|
||||
list-style-type: none;
|
||||
color: rgba(250, 250, 250, 0.8);
|
||||
font-size: 13px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.timesheet .data li {
|
||||
margin: 0 0 3px 0;
|
||||
line-height: 22px;
|
||||
height: 21px;
|
||||
display: block;
|
||||
clear: both;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.timesheet .data li:hover .bubble {
|
||||
opacity: 1;
|
||||
}
|
||||
.timesheet .data li .date {
|
||||
color: #b5b5b5;
|
||||
font-size: 14px;
|
||||
}
|
||||
.timesheet .data li .label {
|
||||
font-weight: lighter;
|
||||
font-size: 14px;
|
||||
padding-left: 5px;
|
||||
line-height: 21px;
|
||||
color: #979796;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.timesheet .data li .bubble {
|
||||
width: 24px;
|
||||
height: 7px;
|
||||
display: block;
|
||||
float: left;
|
||||
position: relative;
|
||||
top: 7px;
|
||||
border-radius: 2px;
|
||||
margin: 0 10px 0 0;
|
||||
opacity: 0.7;
|
||||
}
|
||||
.bubble-default {
|
||||
background: var(--sd-main-accent-color);
|
||||
}
|
||||
.bubble-inference {
|
||||
background-color: violet;
|
||||
}
|
||||
.bubble-io {
|
||||
background-color: rgb(75, 75, 150);
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/* eslint max-classes-per-file: ["error", 2] */
|
||||
|
||||
class Bubble {
|
||||
constructor(min, start, end, label, scale, type) {
|
||||
this.type = type;
|
||||
this.label = label;
|
||||
this.min = min;
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
this.scale = scale;
|
||||
this.offset = Math.round(this.scale * (this.start - this.min));
|
||||
this.width = Math.round(this.scale * (this.end - this.start));
|
||||
this.duration = Math.round(1000 * (this.end - this.start)) / 1000;
|
||||
this.title = `Job: ${this.label}\nDuration: ${this.duration}s\nStart: ${new Date(1000 * this.start).toLocaleString()}\nEnd: ${new Date(1000 * this.end).toLocaleString()}`;
|
||||
}
|
||||
|
||||
getDateLabel() {
|
||||
return Math.round(1000 * (this.end - this.start)) / 1000;
|
||||
}
|
||||
}
|
||||
|
||||
class Timesheet {
|
||||
constructor(container, data) {
|
||||
this.min = Math.floor(data[0].start);
|
||||
this.max = Math.round(data[data.length - 1].end + 0.5);
|
||||
this.data = data;
|
||||
this.container = container;
|
||||
const box = container.getBoundingClientRect();
|
||||
const width = box.width - 140;
|
||||
this.scale = width / (this.max - this.min);
|
||||
|
||||
// draw sections
|
||||
let html = [];
|
||||
for (let c = 0; c <= this.max - this.min; c++) html.push(`<section style="width: ${this.scale}px;"></section>`);
|
||||
container.className = 'timesheet color-scheme-default';
|
||||
container.innerHTML = `<div class="scale"">${html.join('')}</div>`;
|
||||
|
||||
// insert data
|
||||
html = [];
|
||||
for (let n = 0, m = this.data.length; n < m; n++) {
|
||||
const cur = this.data[n];
|
||||
const bubble = new Bubble(this.min, cur.start, cur.end, cur.label, this.scale, cur.type);
|
||||
const line = [
|
||||
`<span title="${bubble.title}" style="margin-left: ${bubble.offset}px; width: ${bubble.width}px;" class="bubble bubble-${bubble.type}" data-duration="${bubble.duration}"></span>`,
|
||||
`<span class="date" title="${bubble.title}">${bubble.duration}</span> `,
|
||||
`<span class="label" title="${bubble.title}">${bubble.label}</span>`,
|
||||
].join('');
|
||||
html.push(`<li>${line}</li>`);
|
||||
}
|
||||
this.container.innerHTML += `<ul class="data">${html.join('')}</ul>`;
|
||||
}
|
||||
}
|
||||
|
||||
window.Timesheet = Timesheet;
|
||||
@@ -296,7 +296,6 @@ function submit_video_wrapper(...args) {
|
||||
log('submitVideoWrapper', id);
|
||||
const btn = gradioApp().getElementById(`${id}_generate_btn`);
|
||||
if (btn) btn.click();
|
||||
else console.log('submit_video_wrapper: no button found', id);
|
||||
}
|
||||
|
||||
function submit_postprocessing(...args) {
|
||||
|
||||
@@ -262,7 +262,6 @@ def main():
|
||||
installer.check_onnx()
|
||||
installer.check_transformers()
|
||||
installer.check_diffusers()
|
||||
installer.install_sentencepiece()
|
||||
installer.check_modified_files()
|
||||
if args.test:
|
||||
installer.log.info('Startup: test mode')
|
||||
|
||||
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 37 KiB |