clip_skip and the uni_pc_* opts live in opts.data without an OptionInfo in
data_labels (compatibility_opts). Options.set() read data_labels[key].onchange
unconditionally, so setting clip_skip via /sdapi/v1/options raised KeyError and
returned 500; the override_settings restore path had the same unguarded
data_labels[k] access for falsy-valued compat opts.
Guard the onchange lookup and read the stored value via getattr(opts, k), which
already falls back through data then data_labels.
The vendored encode_prompt copies in the PAG, APG, ControlNet-XS and differential
diffusion pipelines dereference the .text_model wrapper that transformers 5.6
removed from CLIPTextModel, so their clip-skip path crashes on SD1.5 and SDXL TE1.
Apply the same getattr(te, 'text_model', te) fix as the core parser.
Mirrors upstream diffusers, which still carries this deref in pipeline
encode_prompt; only the single-file loader was fixed there.
transformers 5.6 flattened CLIPTextModel, removing the .text_model wrapper that
compel_hijack and the xhinker parser dereference on the normalized clip-skip path.
On SD1.5 at clip-skip >= 2 this raised AttributeError, which processing_prompt
caught and silently fell back to fixed-attention encoding, dropping textual
inversion and prompt weighting.
Resolve the submodule via getattr(te, 'text_model', te), correct for flattened
CLIPTextModel, CLIPTextModelWithProjection (still nested), and transformers < 5.6.
transformers 5 defaults tokenizer.add_tokens() to normalized=True, so the CLIP
tokenizer lowercases added embedding names. tokenizer.tokenize() then returns the
lowercased surface, maybe_convert_prompt never matches mixed-case names in
added_tokens_encoder, and multi-vector expansion is skipped. Every mixed-case
multi-vector embedding collapsed to its first vector and looked ignored.
Add embedding tokens as AddedToken(name, normalized=False) so they stay
case-sensitive and tokenize() surfaces them verbatim. Valid on transformers 4.x
and 5.x; convert_tokens_to_ids and encoding are unaffected.
Route nn.Embedding targets (and the SDNQEmbedding / ScaledWordEmbedding subclasses) through the linear LoRA path: the weight delta is up@down over the [vocab, dim] table, same shape and merge as a Linear.
Apply a companion bias delta (diff_b) as ex_bias on the same module rather than dropping it; collect diff_b into the LoRA group so it rides the existing module instead of a separate Full module that would collide on the network key.
Krea 2 is a 12.9B single-stream flow-matching DiT trained from scratch, using a Qwen3-VL-4B text encoder and the Qwen-Image VAE. The transformer is vendored as a diffusers ModelMixin whose module tree mirrors the checkpoint, so weights load with no key conversion; the pipeline ports the reference encode, flow-matching denoise, and VAE decode. The text encoder is shared at runtime via the existing dedup registry, so Base and Turbo reuse one Qwen3-VL-4B copy.
Covers text-to-image, image-to-image, native LoRA, and the single-file UNET override. Also completes SD.Next's partial Qwen-Image VAE support (5D decode input and TAESD preview mapping) that K2 shares.
In get_mask() Edge mode, largest_size is set to 0 when there are no
contours, but the luminance loop is also entered when contours exist
whose largest has zero area (e.g. thin 1px / degenerate features whose
cv2.contourArea is 0). That path divides by largest_size and raises
ZeroDivisionError, crashing auto-masking. Guard the divide: when
largest_size is 0 the scaled luminance is 0, so the loop breaks on the
first iteration and yields an empty mask (the sensible no-region result).
Co-Authored-By: Claude <noreply@anthropic.com>