Z-Image Turbo (TJ)
The whole Z-Image pipeline in one node, LoRAs and ControlNet included
- 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
A distilled-model one-shot: loader, encoder, sampler, and LoRA stack in one node
Z-Image Turbo (TJ) is a self-contained generation node for the Z-Image Turbo model: it loads the diffusion model, the Qwen3 text encoder, and the VAE; encodes your prompt; applies up to five LoRAs; optionally runs ZIT ControlNet; samples; decodes; and hands you the image - plus the model, latent, and conditioning for whatever you want to do next. It's the "everything from prompt to pixels" node, Z-Image edition.
Why a single node for this? Because Z-Image Turbo is a distilled, few-step model (the defaults: 8 steps, cfg 1.0, euler/simple - the classic turbo recipe where CFG stays low and steps stay short), and for a fast iterative model, the friction of wiring the standard loader→CLIP→sampler graph for every test kills the whole point. This collapses that graph into one node, and its setnode_name defaults to "Z-Image" because it's built to also be a wireless provider.
How it works
The node wraps the standard Z-Image Turbo graph. ratio_preset + megapixels + divisible_by compute your width/height (leave width/height at 0 and it does the math), and aura_shift (default 3) is the Z-Image-specific sampling tweak. The lora_1_enable...lora_5_strength slots stack up to five LoRAs inline - no separate LoRA loader nodes cluttering the graph.
The overrides are where it gets flexible: image flips it to img2img, latent_override wins over image/empty-latent, positive_override/negative_override replace the text with ready-made conditioning, and zit_control accepts the bundle from ZIT ControlNet (TJ) for depth/canny/pose control. You can also bypass the built-in loaders entirely with model_override/clip_override/vae_override.
The outputs that matter
The headline one is image. But it also passes through latent, model, clip, vae, and positive/negative conditioning, plus width/height - so you can chain a second pass (upscale, img2img refinement) without re-running the whole pipeline, and model_clean gives you the un-LoRA'd model for comparison. That output breadth is the difference between "a generator" and "a pipeline component."
Install it and get the models
Install the pack, then place the models exactly where the node expects them:
cd ComfyUI/custom_nodes
git clone https://github.com/designloves2/ComfyUI-TJ_NODE.git
Model paths from the README: models/diffusion_models/ZIT/z_Image_turbo_bf16.safetensors, models/text_encoders/Qwen3/qwen_3_4b.safetensors, models/vae/z-image-Vae.safetensors, and optionally models/loras/Lora/lina/LINA_ZIT.safetensors. Drop the model files in those spots, restart, and the dropdowns populate.
Where people get burned
The settings are the trap for people coming from full-scale models: Z-Image Turbo is a turbo, so cranking cfg to 7 and steps to 30 is actively wrong - keep them low (the defaults are the point) and tune aura_shift instead if output feels off. Second, the LoRA slots are per-slot toggles, not auto-applied: enable lora_N_enable or you'll wonder why your LoRA did nothing. And if you connect zit_control but nothing changes, check that ZIT ControlNet actually has a condition enabled - an empty bundle is a no-op. On an 8GB card this model is genuinely usable because it's distilled and fast - that's the whole reason this one-node wrap exists.
Inputs (45)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | ZIT/z_Image_turbo_bf16.safetensors | 1 options: ZIT/z_Image_turbo_bf16.safetensors |
| clip_name | COMBO | Qwen3/qwen_3_4b.safetensors | 1 options: Qwen3/qwen_3_4b.safetensors |
| vae_name | COMBO | z-image-Vae.safetensors | 1 options: z-image-Vae.safetensors |
| positive | STRING | — | |
| negative | STRING | 拒绝, 限制, 不应答, lowres, error, cropped, worst quality, low quality, jpeg artifacts, heterochromia, out of frame, disfigured, blurry, fat, (ugly:1.3), deformed, mutilated, fingers cut, face cut, head cut, bad anatomy, bad proportions, two heads, two faces, deformed hands, (twisted fingers:1.22), extra fingers, poorly drawn, grainy, poorly drawn face, mutation, poor facial details, cropped head, poorly drawn eyes, unclear eyes, cross-eyes, malformed limbs, poorly drawn hands, fused hands, mutated hands, malformed hands, (mutated fingers:1.4), (fused fingers:1.313), interlocked fingers, extra or missing fingers, (one hand with more than 5 fingers), (one hand with less than 5 fingers), one hand with more than 5 digits, one hand with less than 5 digits, extra digits, fewer digits, bad hair, poorly drawn hair, fused hair, poorly drawn feet, malformed feet, extra or missing feet, fused feet, missing or extra limbs, disfigured, mutilated hands, extra hands, extra arms, extra legs, missing arms, missing hands, missing legs, fingers of different thickness, pointed fingers, thick fingers, (long thumbs:1.35), sharp fingernails, (greyscale:1.3), grain, (monochrome:1.3), Text, Watermark | — |
| get_name | COMBO | (none) | 1 options: (none) |
| auto_set | BOOLEAN | false | — |
| setnode_name | STRING | Z-Image | — |
| ratio_preset | COMBO | 2:3 | 9 options: 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, +3 |
| megapixels | FLOAT | 1.600.1–4 | — |
| divisible_by | INT | 328–128 | — |
| seed | INT | 10–18446744073709550000 | — |
| steps | INT | 81–100 | — |
| width | INT | 00–8192 | — |
| height | INT | 00–8192 | — |
| batch_size | INT | 11–64 | — |
| cfg | FLOAT | 1.00–30 | — |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| denoise | FLOAT | 1.000–1 | — |
| aura_shift | FLOAT | 3.00–20 | — |
| lora_slots | INT | 00–5 | — |
| lora_1_enable | BOOLEAN | false | — |
| lora_1_name | COMBO | Lora/lina/LINA_ZIT.safetensors | 2 options: None, Lora/lina/LINA_ZIT.safetensors |
| lora_1_strength | FLOAT | 1.00-10–10 | — |
| lora_2_enable | BOOLEAN | false | — |
| lora_2_name | COMBO | None | 2 options: None, Lora/lina/LINA_ZIT.safetensors |
| lora_2_strength | FLOAT | 1.00-10–10 | — |
| lora_3_enable | BOOLEAN | false | — |
| lora_3_name | COMBO | None | 2 options: None, Lora/lina/LINA_ZIT.safetensors |
| lora_3_strength | FLOAT | 1.00-10–10 | — |
| lora_4_enable | BOOLEAN | false | — |
| lora_4_name | COMBO | None | 2 options: None, Lora/lina/LINA_ZIT.safetensors |
| lora_4_strength | FLOAT | 1.00-10–10 | — |
| lora_5_enable | BOOLEAN | false | — |
| lora_5_name | COMBO | None | 2 options: None, Lora/lina/LINA_ZIT.safetensors |
| lora_5_strength | FLOAT | 1.00-10–10 | — |
| imageopt | IMAGE | Embedded GET / image input. Connected image switches to img2img. | |
| model_overrideopt | MODEL | — | |
| clip_overrideopt | CLIP | — | |
| vae_overrideopt | VAE | — | |
| positive_overrideopt | CONDITIONING | Connected = positive text is ignored. | |
| negative_overrideopt | CONDITIONING | Connected = negative text is ignored. | |
| latent_overrideopt | LATENT | Connected = latent wins over image and empty latent. | |
| zit_controlopt | ZIT_CONTROL | Connect ZIT ControlNet (TJ). |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| latent | LATENT | — |
| width | INT | — |
| height | INT | — |
| model | MODEL | — |
| model_clean | MODEL | — |
| clip | CLIP | — |
| vae | VAE | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |