V 2.0.0 - Auto config #23 - new params
This commit is contained in:
+66
-4
@@ -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']
|
||||
|
||||
+8
-8
@@ -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
|
||||
|
||||
@@ -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 |
|
||||
Reference in New Issue
Block a user