From 76cefc176a35f64372ce73bda3cba6ebe1b323b6 Mon Sep 17 00:00:00 2001 From: "DESKTOP-TVBJISQ\\Primere" Date: Sun, 15 Mar 2026 19:50:25 +0100 Subject: [PATCH] V 2.0.0 - Auto config #23 - new params --- Nodes/Dashboard.py | 70 ++++++- Nodes/Outputs.py | 16 +- .../nodes/model_control_compatibility.md | 189 ++++++++++++++++++ 3 files changed, 263 insertions(+), 12 deletions(-) create mode 100644 Workflow/Manual/nodes/model_control_compatibility.md diff --git a/Nodes/Dashboard.py b/Nodes/Dashboard.py index fd4ecb7..c29506f 100644 --- a/Nodes/Dashboard.py +++ b/Nodes/Dashboard.py @@ -709,7 +709,7 @@ class PrimereModelControl: "encoder_2": (list(dict.fromkeys(["None"] + cls.TEXT_ENCODERS + cls.CLIPLIST + cls.UNETLIST + cls.TEXT_ENCODERS_PATHS)),), "encoder_3": (list(dict.fromkeys(["None"] + cls.TEXT_ENCODERS + cls.CLIPLIST + cls.UNETLIST + cls.TEXT_ENCODERS_PATHS)),), - "attn_preset": (["Custom", "Auto"] + list(clipping.ATTN_PRESETS.keys()), {"default": "Off"}), + "attn_preset": (["Custom"] + list(clipping.ATTN_PRESETS.keys()), {"default": "Off"}), "attn_query": ('FLOAT', {"default": 1.00, "min": 0.80, "max": 1.20, "step": 0.01}), "attn_key": ('FLOAT', {"default": 1.00, "min": 0.80, "max": 1.20, "step": 0.01}), "attn_value": ('FLOAT', {"default": 1.00, "min": 0.80, "max": 1.20, "step": 0.01}), @@ -718,6 +718,7 @@ class PrimereModelControl: "attn_cross_key": ("FLOAT", {"default": 1.0, "min": 0.80, "max": 1.20, "step": 0.01}), "attn_cross_value": ("FLOAT", {"default": 1.0, "min": 0.80, "max": 1.20, "step": 0.01}), "attn_cross_output": ("FLOAT", {"default": 1.0, "min": 0.80, "max": 1.20, "step": 0.01}), + "attn_expander": ("FLOAT", {"default": 1.00, "min": 0.10, "max": 3.00, "step": 0.01}), "sampler": (["custom_advanced", "ksampler"], {"default": "ksampler"}), "align_your_steps": ("BOOLEAN", {"default": False, "label_on": "Use AlignYourSteps", "label_off": "Ignore AlignYourSteps"}), @@ -831,6 +832,7 @@ class PrimereModelControl: attn_cross_key = kwargs.pop('attn_cross_key', 1.0) attn_cross_value = kwargs.pop('attn_cross_value', 1.0) attn_cross_output = kwargs.pop('attn_cross_output', 1.0) + attn_expander = kwargs.pop('attn_expander', 1.0) if attn_preset == 'Auto': attn_preset = clipping.detect_attn_preset(model_name) attn_q, attn_k, attn_v, attn_out, cross_q, cross_k, cross_v, cross_out = clipping.ATTN_PRESETS.get(attn_preset, (1.0,)*8) @@ -839,6 +841,11 @@ class PrimereModelControl: cross_q, cross_k, cross_v, cross_out = attn_cross_query, attn_cross_key, attn_cross_value, attn_cross_output else: attn_q, attn_k, attn_v, attn_out, cross_q, cross_k, cross_v, cross_out = clipping.ATTN_PRESETS.get(attn_preset, (1.0,)*8) + if attn_expander != 1.0: + attn_q, attn_k, attn_v, attn_out, cross_q, cross_k, cross_v, cross_out = ( + round(1.0 + (v - 1.0) * attn_expander, 2) + for v in (attn_q, attn_k, attn_v, attn_out, cross_q, cross_k, cross_v, cross_out) + ) suppressed = [k + "_" for k, v in kwargs.items() if v == "None" or v is False] kwargs = {k: v for k, v in kwargs.items() if v != "None" and not any(k.startswith(p) for p in suppressed)} kwargs['encoders'] = [kwargs[k] for k in ('encoder_1', 'encoder_2', 'encoder_3') if kwargs.get(k) not in (None, 'None')] @@ -1180,6 +1187,16 @@ class PrimereFractalLatent: return {'samples': latents}, tensors, control_data +CLIP_SAVE_KEYS = frozenset({ + 'negative_strength', 'adv_encode', 'token_normalization', 'weight_interpretation', + 'use_int_style', 'int_style_pos', 'int_style_pos_strength', 'int_style_neg', 'int_style_neg_strength', + 'enhanced_prompt_usage', 'enhanced_prompt_strength', + 'opt_pos_strength', 'opt_neg_strength', + 'style_handling', 'style_position', 'style_swap', + 'style_pos_strength', 'style_neg_strength', + 'l_strength', 'width', 'height' +}) + class PrimereCLIP: RETURN_TYPES = ("CONDITIONING", "CONDITIONING", "STRING", "STRING", "STRING", "STRING", "STRING", "TUPLE") RETURN_NAMES = ("COND+", "COND-", "PROMPT+", "PROMPT-", "T5XXL_PROMPT", "PROMPT L+", "PROMPT L-", "CONTROL_DATA") @@ -1209,7 +1226,6 @@ class PrimereCLIP: return { "required": { "clip": ("CLIP", {"forceInput": True}), - "control_data": ("TUPLE", {"default": None, "forceInput": True}), "positive_prompt": ("STRING", {"forceInput": True}), "negative_prompt": ("STRING", {"forceInput": True}), "negative_strength": ("FLOAT", {"default": 1.2, "min": 0.0, "max": 10.0, "step": 0.01}), @@ -1253,7 +1269,7 @@ class PrimereCLIP: "l_strength": ("FLOAT", {"default": 1, "min": 0.0, "max": 10.0, "step": 0.01}), "width": ("INT", {"default": 1024.0, "min": 0, "max": MAX_RESOLUTION, "forceInput": True}), "height": ("INT", {"default": 1024.0, "min": 0, "max": MAX_RESOLUTION, "forceInput": True}), - "control_data": ("TUPLE", {"default": None}), + "control_data": ("TUPLE", {"default": None, "forceInput": True}), }, "hidden": { "extra_pnginfo": "EXTRA_PNGINFO", @@ -1261,7 +1277,53 @@ class PrimereCLIP: } } - def clip_encode(self, clip, negative_strength, int_style_pos_strength, int_style_neg_strength, opt_pos_strength, opt_neg_strength, style_pos_strength, style_neg_strength, style_handling, style_swap, enhanced_prompt_strength, int_style_pos, int_style_neg, adv_encode, token_normalization, weight_interpretation, l_strength, extra_pnginfo, prompt, copy_prompt_to_l=True, width=1024, height=1024, positive_prompt="", negative_prompt="", enhanced_prompt="", enhanced_prompt_usage="T5-XXL", clip_model='Default', longclip_model='Default', model_keywords=None, lora_keywords=None, lycoris_keywords=None, embedding_pos=None, embedding_neg=None, opt_pos_prompt="", opt_neg_prompt="", style_position=False, style_neg_prompt="", style_pos_prompt="", positive_l="", negative_l="", use_int_style=False, edit_image_list=None, edit_vae=None, control_data=None): + def clip_encode(self, clip, extra_pnginfo, prompt, control_data=None, **kwargs): + if control_data and control_data.get('exif_status') == 'SUCCEED': + if 'prompt_encoder' in control_data and control_data.get('setup_states', {}).get('clip_encoder_setup') == True: + kwargs.update(control_data['prompt_encoder']) + + negative_strength = kwargs.get('negative_strength', 1.2) + use_int_style = kwargs.get('use_int_style', False) + int_style_pos = kwargs.get('int_style_pos', 'None') + int_style_pos_strength = kwargs.get('int_style_pos_strength', 1) + int_style_neg = kwargs.get('int_style_neg', 'None') + int_style_neg_strength = kwargs.get('int_style_neg_strength', 1) + adv_encode = kwargs.get('adv_encode', False) + token_normalization = kwargs.get('token_normalization', 'mean') + weight_interpretation = kwargs.get('weight_interpretation', 'comfy++') + enhanced_prompt_usage = kwargs.get('enhanced_prompt_usage', 'T5-XXL') + enhanced_prompt_strength = kwargs.get('enhanced_prompt_strength', 1) + style_handling = kwargs.get('style_handling', False) + style_position = kwargs.get('style_position', False) + style_swap = kwargs.get('style_swap', False) + opt_pos_strength = kwargs.get('opt_pos_strength', 1) + opt_neg_strength = kwargs.get('opt_neg_strength', 1) + style_pos_strength = kwargs.get('style_pos_strength', 1) + style_neg_strength = kwargs.get('style_neg_strength', 1) + l_strength = kwargs.get('l_strength', 1) + positive_prompt = kwargs.get('positive_prompt', '') + negative_prompt = kwargs.get('negative_prompt', '') + enhanced_prompt = kwargs.get('enhanced_prompt', '') + model_keywords = kwargs.get('model_keywords', None) + lora_keywords = kwargs.get('lora_keywords', None) + lycoris_keywords = kwargs.get('lycoris_keywords', None) + embedding_pos = kwargs.get('embedding_pos', None) + embedding_neg = kwargs.get('embedding_neg', None) + opt_pos_prompt = kwargs.get('opt_pos_prompt', '') + opt_neg_prompt = kwargs.get('opt_neg_prompt', '') + style_pos_prompt = kwargs.get('style_pos_prompt', '') + style_neg_prompt = kwargs.get('style_neg_prompt', '') + positive_l = kwargs.get('positive_l', '') + negative_l = kwargs.get('negative_l', '') + width = kwargs.get('width', 1024) + height = kwargs.get('height', 1024) + edit_image_list = kwargs.get('edit_image_list', None) + edit_vae = kwargs.get('edit_vae', None) + + if control_data is not None: + _lv = locals() + control_data['prompt_encoder'] = {k: _lv[k] for k in CLIP_SAVE_KEYS} + model_concept = control_data.get('model_concept', 'SD1') advanced_default = ['StableCascade', 'Chroma', 'KwaiKolors', 'Flux', "Z-Image", 'Pony', 'SD1', 'SD2', 'SD3', 'Lightning', 'Hunyuan', 'QwenGen', 'QwenEdit', 'AuraFlow'] diff --git a/Nodes/Outputs.py b/Nodes/Outputs.py index 9c721a9..c375eac 100644 --- a/Nodes/Outputs.py +++ b/Nodes/Outputs.py @@ -384,20 +384,16 @@ class PrimereMetaCollector: INPUT_DICT = { "required": { - "model_name": ('CHECKPOINT_NAME', {"forceInput": True, "default": None}), "positive": ('STRING', {"forceInput": True, "default": "Red sportcar racing on the street of metropolis"}), "negative": ('STRING', {"forceInput": True, "default": "Cute cat, nsfw, nude, nudity, porn"}) }, "optional": { - "model_concept": ("STRING", {"default": "Auto", "forceInput": True}), + "positive_decoded": ('STRING', {"forceInput": True, "default": "Red sportcar racing on the street of metropolis"}), + "negative_decoded": ('STRING', {"forceInput": True, "default": "Cute cat, nsfw, nude, nudity, porn"}), "control_data": ("TUPLE", {"default": None, "forceInput": True}), "seed": ('INT', {"forceInput": True, "default": 1}), "t5_xxl_prompt": ('STRING', {"forceInput": True}), "positive_l": ('STRING', {"forceInput": True}), "negative_l": ('STRING', {"forceInput": True}), - "sampler": (comfy.samplers.KSampler.SAMPLERS, {"forceInput": True, "default": "euler"}), - "scheduler": (comfy.samplers.KSampler.SCHEDULERS, {"forceInput": True, "default": "normal"}), - "cfg": ('FLOAT', {"forceInput": True, "default": 7}), - "steps": ('INT', {"forceInput": True, "default": 12}), "width": ('INT', {"forceInput": True, "default": 512}), "height": ('INT', {"forceInput": True, "default": 512}), "preferred": ("TUPLE", {"default": None, "forceInput": True}), @@ -424,6 +420,10 @@ class PrimereMetaCollector: else: data_json[key_l2] = kwargs[key_l2] + nested_control = data_json.pop('control_data', None) + if nested_control and isinstance(nested_control, dict): + data_json.update(nested_control) + return (data_json,) class PrimereKSampler: @@ -979,6 +979,7 @@ class PrimereAestheticCKPTScorer: score = str(int(style_ascore_list[1]) + int(final_prediction)) utility.add_value_to_cache('styles_ascores', selectedStyle, counter + '|' + score) + result_int = int(final_prediction) if final_prediction.isdigit() else 0 if isinstance(final_prediction, str) and final_prediction.isdigit(): if AE_SCORE_MIN is not None and AE_SCORE_MAX is not None: final_prediction = max(0, min(100, int(((int(final_prediction) - AE_SCORE_MIN) / (AE_SCORE_MAX - AE_SCORE_MIN)) * 100))) @@ -987,8 +988,7 @@ class PrimereAestheticCKPTScorer: else: final_prediction = '*** Aesthetic scorer error ***' - result_int = final_prediction if isinstance(final_prediction, int) else 0 - return {"ui": {"text": [final_prediction]}, "result": (result_int,)} + return {"ui": {"text": [f'{result_int} / {final_prediction}%']}, "result": (result_int,)} class DebugToFile(): CATEGORY = TREE_OUTPUTS diff --git a/Workflow/Manual/nodes/model_control_compatibility.md b/Workflow/Manual/nodes/model_control_compatibility.md new file mode 100644 index 0000000..5fba443 --- /dev/null +++ b/Workflow/Manual/nodes/model_control_compatibility.md @@ -0,0 +1,189 @@ +# PrimereModelControl — Parameter × Model Compatibility + +**Symbols:** ✅ Supported   ❌ Not applicable   ⚠️ Conditional (see notes)   ? Unknown / future + +--- + +## Table 1 — Core Sampling & Loading + +| Model | sampler_name | scheduler_name | steps | override_steps | cfg | rescale_cfg | vae | vae_selection | clip_selection | last_layer | weight_dtype | precision | +|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| SD1 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| SD2 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| SDXL | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| Illustrious | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| Pony | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| Turbo | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| LCM | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| Lightning | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| Hyper | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| Playground | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| SD3 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | +| Flux | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| Flux2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| Nunchaku | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| Chroma | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| StableCascade | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| AuraFlow | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| PixartSigma | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | +| SANA1024 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| SANA512 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| KwaiKolors | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| Hunyuan | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| Z-Image | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| QwenGen | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| QwenEdit | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| SSD | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| SegmindVega | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| KOALA | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| StableZero | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| SD09 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | +| HiDream | ? | ? | ✅ | ✅ | ? | ❌ | ? | ❌ | ❌ | ❌ | ✅ | ❌ | +| Cosmos | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ? | ❌ | ❌ | ❌ | ? | ❌ | +| WanImg | ? | ? | ✅ | ✅ | ? | ❌ | ? | ❌ | ❌ | ❌ | ? | ❌ | +| WanT2V | ? | ? | ✅ | ✅ | ? | ❌ | ? | ❌ | ❌ | ❌ | ? | ❌ | +| WanI2V | ? | ? | ✅ | ✅ | ? | ❌ | ? | ❌ | ❌ | ❌ | ? | ❌ | +| Mochi | ? | ? | ✅ | ✅ | ? | ❌ | ? | ❌ | ❌ | ❌ | ? | ❌ | +| SV3D | ? | ? | ✅ | ✅ | ? | ❌ | ? | ❌ | ❌ | ❌ | ? | ❌ | +| StableAudio | ? | ? | ✅ | ✅ | ? | ❌ | ❌ | ❌ | ❌ | ❌ | ? | ❌ | + +**Notes — Table 1:** +- `rescale_cfg`: applied via `RescaleCFG.patch` only in Flux and Chroma loaders. +- `clip_selection`: SD3 can switch between baked and custom triple-CLIP loader. +- `last_layer`: applies CLIP stop layer; only relevant when CLIP is loaded from the checkpoint. +- `weight_dtype`: used by UNET/diffusion model loaders that accept a dtype argument (Flux family, SANA, Kolors, etc.). +- `precision`: maps to `ModelComputeDtype` (fp16/fp32 only); skipped for quant types. +- PixartSigma VAE: baked into main checkpoint; overridden by refiner checkpoint VAE when refiner is active. +- SSD, SegmindVega, KOALA, StableZero, SD09: treated as SD1/SDXL-family checkpoints. + +--- + +## Table 2 — Encoders & Attention + +| Model | encoder_1 | encoder_2 | encoder_3 | attn_preset | attn_self (q/k/v/out) | attn_cross (q/k/v/out) | sampler_type | align_your_steps | +|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| SD1 | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| SD2 | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| SDXL | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| Illustrious | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| Pony | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| Turbo | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| LCM | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| Lightning | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| Hyper | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| Playground | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| SD3 | ✅ T5-XXL | ✅ CLIP-G | ✅ CLIP-L | ✅ CLIP | ❌ | ❌ | ksampler | ❌ | +| Flux | ✅ T5-XXL | ✅ CLIP-L | ❌ | ✅ CLIP | ❌ | ❌ | both | ❌ | +| Flux2 | ✅ T5-XXL | ✅ CLIP-L | ❌ | ✅ CLIP | ❌ | ❌ | both | ❌ | +| Nunchaku | ✅ T5-XXL | ✅ CLIP-L | ❌ | ✅ CLIP | ❌ | ❌ | both | ❌ | +| Chroma | ✅ T5-XXL | ❌ | ❌ | ❌ | ❌ | ❌ | ksampler | ❌ | +| StableCascade | ✅ Stage-B | ❌ | ✅ CLIP | ✅ CLIP | ❌ | ❌ | ksampler | ❌ | +| AuraFlow | ✅ | ❌ | ❌ | ✅ CLIP | ❌ | ❌ | ksampler | ❌ | +| PixartSigma | ✅ T5 | ❌ | ❌ | ❌ | ❌ | ❌ | ksampler | ❌ | +| SANA1024 | ✅ | ❌ | ❌ | ✅ CLIP | ❌ | ❌ | ksampler | ❌ | +| SANA512 | ✅ | ❌ | ❌ | ✅ CLIP | ❌ | ❌ | ksampler | ❌ | +| KwaiKolors | ✅ ChatGLM | ❌ | ❌ | ❌ | ❌ | ❌ | ksampler | ❌ | +| Hunyuan | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ksampler | ❌ | +| Z-Image | ✅ | ❌ | ❌ | ✅ CLIP | ❌ | ❌ | ksampler | ❌ | +| QwenGen | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ksampler | ❌ | +| QwenEdit | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ksampler | ❌ | +| SSD | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| SegmindVega | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| KOALA | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| StableZero | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| SD09 | ❌ | ❌ | ❌ | ✅ CLIP | ✅ | ✅ | ksampler | ✅ | +| HiDream | ? | ? | ? | ? | ❌ | ❌ | ? | ❌ | +| Cosmos | ? | ❌ | ❌ | ? | ❌ | ❌ | ksampler | ❌ | +| WanImg | ? | ❌ | ❌ | ? | ❌ | ❌ | ? | ❌ | +| WanT2V | ? | ❌ | ❌ | ? | ❌ | ❌ | ? | ❌ | +| WanI2V | ? | ❌ | ❌ | ? | ❌ | ❌ | ? | ❌ | +| Mochi | ? | ❌ | ❌ | ? | ❌ | ❌ | ? | ❌ | +| SV3D | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ? | ❌ | +| StableAudio | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ? | ❌ | + +**Notes — Table 2:** +- `attn_self`: shared input values with CLIP attention (`attn_query/key/value/output`). Applies UNet `attn1` only for UNET_CONCEPTS models. +- `attn_cross`: applies UNet `attn2` only for UNET_CONCEPTS = {SD1, SD2, SDXL, Illustrious, Turbo, Pony, Hyper, Lightning, Playground, LCM}. +- `attn_preset`: CLIP-side attention (`CLIPAttentionMultiply`) applies to any model with a CLIP text encoder. UNet side only for UNET_CONCEPTS. +- `sampler_type = both`: Flux can use `custom_advanced` (guidance-based) or `ksampler` depending on workflow. +- SD1/SDXL family: encoder is baked into the checkpoint; `encoder_1/2/3` are ignored unless loading a UNET-only model via symlink. + +--- + +## Table 3 — Advanced Model Sampling + +| Model | model_sampling | edm_sampling | discrete_sampling | discrete_zsnr | sigma_max | sigma_min | flux_max_shift | flux_base_shift | beta_alpha | beta_beta | guidance | +|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| SD1 | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| SD2 | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| SDXL | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| Illustrious | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| Pony | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| Turbo | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| LCM | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| Lightning | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| Hyper | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| Playground | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | +| SD3 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| Flux | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | +| Flux2 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | +| Nunchaku | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | +| Chroma | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | +| StableCascade | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| AuraFlow | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| PixartSigma | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| SANA1024 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| SANA512 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| KwaiKolors | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Hunyuan | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Z-Image | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| QwenGen | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| QwenEdit | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| SSD | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| SegmindVega | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| KOALA | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| StableZero | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| SD09 | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| HiDream | ? | ? | ❌ | ❌ | ❌ | ❌ | ? | ? | ? | ? | ? | +| Cosmos | ❌ | ✅ cosmos_rflow | ❌ | ❌ | ? | ? | ❌ | ❌ | ? | ? | ❌ | +| WanImg | ? | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ? | ? | ❌ | +| WanT2V | ? | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ? | ? | ❌ | +| WanI2V | ? | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ? | ? | ❌ | +| Mochi | ? | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ? | ? | ❌ | +| SV3D | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| StableAudio | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | + +**Notes — Table 3:** +- `model_sampling`: patches `ModelSamplingSD3` shift at sampling time. Effective for SD3 (shift=3.0 typical), AuraFlow, KwaiKolors. Set to 0 to disable. +- `edm_sampling`: patches `ModelSamplingContinuousEDM` at model load time. Options: `edm_playground_v2.5` (Playground), `cosmos_rflow` (Cosmos). Other options (`edm`, `v_prediction`, `eps`) are generic aliases. +- `discrete_sampling`: patches `ModelSamplingDiscrete` at model load time. Only active for DISCRETE_CONCEPTS: SD1, SD2, SDXL, Illustrious, Turbo, Pony, Hyper, Lightning. +- `sigma_max / sigma_min`: paired with `edm_sampling` for `ContinuousEDM`. Only meaningful for Playground (and future Cosmos). +- `flux_max_shift / flux_base_shift`: patches `ModelSamplingFlux` at model load time. Flux, Flux2, Nunchaku (all Flux-architecture). +- `beta_alpha / beta_beta`: used when `scheduler_name = beta`. Applies to any model routed through PKSampler. +- `guidance`: Flux uses `FluxGuidance` conditioning. Chroma uses `CFGGuider`. Value is ignored for all other models. + +--- + +## Quick Reference — Parameter Groups + +| Group | Parameters | Key Models | +|---|---|---| +| Core | sampler_name, scheduler_name, steps, cfg | All | +| override_steps | override_steps | All | +| rescale_cfg | rescale_cfg | Flux, Chroma | +| VAE | vae, vae_selection | SD family, Flux, SD3, most others | +| CLIP layer | clip_selection, last_layer | SD family (last_layer), SD3 (clip_selection) | +| Load dtype | weight_dtype | Flux family, SANA, Kolors, Hunyuan, Qwen, Chroma | +| Precision | precision | SD1/SDXL family (fp16/fp32 only) | +| Encoders | encoder_1/2/3 | SD3, Flux, StableCascade, PixartSigma, others with external encoders | +| Attention CLIP | attn_preset, attn_query/key/value/output | All models with CLIP encoders | +| Attention UNet self | attn_query/key/value/output | UNET_CONCEPTS only (SD1/SDXL family + Playground/LCM) | +| Attention UNet cross | attn_cross_query/key/value/output | UNET_CONCEPTS only | +| Sampler type | sampler (custom_advanced/ksampler) | custom_advanced for Flux; ksampler for all others | +| Align Your Steps | align_your_steps | SD1/SDXL family (PKSampler path) | +| SD3 shift | model_sampling | SD3, AuraFlow, KwaiKolors | +| EDM | edm_sampling, sigma_max, sigma_min | Playground, Cosmos | +| Discrete | discrete_sampling, discrete_zsnr | SD1, SD2, SDXL, Illustrious, Turbo, Pony, Hyper, Lightning | +| Flux shift | flux_max_shift, flux_base_shift | Flux, Flux2, Nunchaku | +| Beta scheduler | beta_alpha, beta_beta | Any model via PKSampler when scheduler=beta | +| Guidance | guidance | Flux family, Chroma |