ComfyUI Node

toobusy Z-Image Turbo

The entire Z-Image Turbo graph, collapsed into one node

By nicekriss·Created about a year ago·Updated 3 days ago· 16
toobusy Z-Image Turbo
  • image
  • model_override
  • clip_override
  • vae_override
  • positive_override
  • negative_override
  • latent_override
  • zit_control
  • image
  • latent
  • width
  • height
  • model
  • model_clean
  • clip
  • vae
  • positive
  • negative
model_nameZIT/zImage_turbo.safetensors
clip_nameZIT/zImage_textEncoder.safetensors
vae_nameFLUX1/ae.safetensors
positive
negative
ratio_preset2:3
megapixels1.00
divisible_by32
batch_size1
seed1
steps8
cfg1.0
sampler_nameres_multistep
schedulersimple
denoise1.00
aura_shift3.0
lora_slots0
lora_1_enablefalse
lora_1_nameLora/ZIT/ZIT_Neobabae_v1.safetensors
lora_1_strength1.00
lora_2_enablefalse
lora_2_nameNone
lora_2_strength1.00
lora_3_enablefalse
lora_3_nameNone
lora_3_strength1.00
lora_4_enablefalse
lora_4_nameNone
lora_4_strength1.00
lora_5_enablefalse
lora_5_nameNone
lora_5_strength1.00
width0
height0

Z-Image Turbo is Alibaba's Apache 2.0 model that took the local photorealism default by late 2025 - it's fast on 12GB cards, and realism families like Juggernaut and epiCRealism rebuilt their lines on it. But a full Z-Image Turbo graph in vanilla ComfyUI is loaders plus LoRA plus text-encode plus sampler plus decode, strung across half the canvas. toobusy Z-Image Turbo folds all of that into one node: model, CLIP and VAE loaders, up to five LoRA slots, conditioning, sampling, and decoding, with the whole chain inside.

The README's before/after table says it plainly: "UNET/CLIP/VAE loader + LoRA + encoding + sampler + decode → 1 node." And because it's a fold rather than a wrapper around an API, every sub-piece is still accessible - the node passes the loaded model, clip, vae, and the final positive/negative conditioning out of its outputs so you can reuse them downstream without re-loading anything.

How it works, and the inputs that matter

Model auto-detection: since v0.2.10 the node does a fuzzy filename scan of your model folders, so it usually finds the right Z-Image diffusion model, lumina2 text encoder, and VAE on its own. If it grabs the wrong file, set model_name / clip_name / vae_name explicitly. The default VAE is FLUX1/ae.safetensors - that's not a mistake, Z-Image shares Flux's VAE.

The three fields you'll touch most:

  • positive / negative - plain text; the node encodes them with the internal lumina2 CLIP.
  • ratio_preset + megapixels - the resolution system, 2:3 at 1MP by default. Set both width and height to positive values to override.
  • steps, cfg, denoise - the sampling knobs. Defaults are 8 steps, cfg 1, denoise 1. Z-Image's LoRA-stacking ceiling is real (about two LoRAs at strength ≤1.4 before things melt), so don't expect to pile on five at full strength and keep the photorealism.

The outputs are the story

Beyond image, it exposes latent, width, height, and - the point for power users - model, model_clean, clip, vae, positive, negative. That's the whole pipeline out for the picking. The README's recommended hires loop is:

Z-Image Turbo -> toobusy Hires Upscale -> Z-Image Turbo (latent_override)

Where people get burned: model vs model_clean. If you're continuing at the same resolution and same control conditions, model is fine. If you're doing a second pass at a different resolution or swapping LoRAs, use model_clean - the README calls it "safer" and it is. Also note latent_override beats both the image input and the empty latent when connected.

Connect an image and the node switches to img2img (VAE-encoded start latent, denoise becomes change strength). Connect a zit_control from toobusy ZIT ControlNet and you get depth/canny/pose control. Leave both unconnected and it's plain text-to-image. That tri-mode behavior is why this node collapses a whole graph - it's not a button, it's a pipeline with the plumbing exposed.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/nicekriss/toobusy.git toobusy

or search "toobusy" in ComfyUI Manager, then restart and hard-refresh. You supply the model files yourself: ZIT/zImage_turbo.safetensors, the lumina2 text encoder, and the Flux VAE in your model folders. The example workflow is docs/workflows/z_image_turbo.json.

If you already have a working Z-Image Turbo graph you love, this node is optional - you're not gaining quality, you're gaining a shorter canvas and a reusable one-node pipeline. If you're setting up Z-Image from scratch, it removes most of the setup pain in one drop.

Categorytoobusy/Make

Inputs (42)

NameTypeDefaultDescription
model_nameCOMBOZIT/zImage_turbo.safetensors1 options: ZIT/zImage_turbo.safetensors
clip_nameCOMBOZIT/zImage_textEncoder.safetensors1 options: ZIT/zImage_textEncoder.safetensors
vae_nameCOMBOFLUX1/ae.safetensors1 options: FLUX1/ae.safetensors
positiveSTRING
negativeSTRING
ratio_presetCOMBO2:39 options: 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, +3
megapixelsFLOAT1.000.1–4
divisible_byINT328–128
batch_sizeINT11–64
seedINT10–18446744073709550000
stepsINT81–100
cfgFLOAT1.00–30
sampler_nameCOMBOres_multistep44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBOsimple9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoiseFLOAT1.000–1
aura_shiftFLOAT3.00–20
lora_slotsINT00–5
lora_1_enableBOOLEANfalse
lora_1_nameCOMBOLora/ZIT/ZIT_Neobabae_v1.safetensors2 options: None, Lora/ZIT/ZIT_Neobabae_v1.safetensors
lora_1_strengthFLOAT1.00-10–10
lora_2_enableBOOLEANfalse
lora_2_nameCOMBONone2 options: None, Lora/ZIT/ZIT_Neobabae_v1.safetensors
lora_2_strengthFLOAT1.00-10–10
lora_3_enableBOOLEANfalse
lora_3_nameCOMBONone2 options: None, Lora/ZIT/ZIT_Neobabae_v1.safetensors
lora_3_strengthFLOAT1.00-10–10
lora_4_enableBOOLEANfalse
lora_4_nameCOMBONone2 options: None, Lora/ZIT/ZIT_Neobabae_v1.safetensors
lora_4_strengthFLOAT1.00-10–10
lora_5_enableBOOLEANfalse
lora_5_nameCOMBONone2 options: None, Lora/ZIT/ZIT_Neobabae_v1.safetensors
lora_5_strengthFLOAT1.00-10–10
imageoptIMAGEConnect an image to switch this node to img2img. The image is VAE-encoded as the starting latent and 'denoise' becomes the change strength (lower = closer to the source). Leave unconnected for plain text-to-image.
widthoptINT00–81920 = use ratio_preset + megapixels. Set width AND height > 0 to enter the resolution directly (rounded to divisible_by). In img2img this scales the source image to the given size.
heightoptINT00–81920 = use ratio_preset + megapixels. Set width AND height > 0 to enter the resolution directly (rounded to divisible_by). In img2img this scales the source image to the given size.
model_overrideoptMODEL
clip_overrideoptCLIP
vae_overrideoptVAE
positive_overrideoptCONDITIONINGExternal positive conditioning. Connected = the positive prompt text is ignored (and the internal CLIP is not even loaded when both overrides are connected and no LoRA is active).
negative_overrideoptCONDITIONINGExternal negative conditioning. Connected = the negative prompt text is ignored.
latent_overrideoptLATENTExternal starting latent (e.g. from toobusy Hires Upscale). Connected = wins over the image input and the empty latent; 'denoise' is the change strength. Width/height follow the latent.
zit_controloptZIT_CONTROLConnect a 'toobusy ZIT ControlNet' module to apply depth/canny/pose Fun-ControlNet-Union model patches. Leave unconnected for plain generation.

Outputs (10)

NameTypeDescription
imageIMAGE
latentLATENT
widthINT
heightINT
modelMODEL
model_cleanMODEL
clipCLIP
vaeVAE
positiveCONDITIONING
negativeCONDITIONING