Generated reference · ComfyUI workflow · chroma

FLUX.2 klein 4B Text-to-Image

FLUX.2 klein 4B (the distilled 4-step model, bf16) text-to-image on the RunPod image endpoint, SFW only. Translated from Comfy-Org/workflow_templates@aaac56dd templates/image_flux2_klein_text_to_image.json, its "Text to Image (Flux.2 Klein …

chroma13nodesGPU A5000out image~73sv1.0.0

On this page

FLUX.2 klein 4B (the distilled 4-step model, bf16) text-to-image on the RunPod image endpoint, SFW only. Translated from Comfy-Org/workflow_templates@aaac56dd templates/image_flux2_klein_text_to_image.json, its "Text to Image (Flux.2 Klein 4B Distilled)" subgraph, which is the one that loads flux-2-klein-4b.safetensors (the template's enabled subgraph loads the undistilled flux-2-klein-base-4b, which is not on the volume): UNETLoader, CLIPLoader qwen_3_4b in flux2 mode, VAELoader flux2-vae, CFGGuider at CFG 1 with the negative zeroed by ConditioningZeroOut, KSamplerSelect euler, Flux2Scheduler at 4 steps, EmptyFlux2LatentImage 1024x1024, SamplerCustomAdvanced.

13Graph nodes
13Node classes
4Inputs
3Models

Tags: chromarunpod-serverlessvolume-backedtext-to-imageflux2-klein

Inputs (4)#

The typed parameter surface callers bind when they request this workflow. Enum options and numeric bounds are the values the workflow document declares.

promptstringrequireddefault A hedgehog wearing a tiny party hat surrounded by confetti, early digital camera style, slight noise, flash photography, candid moment, 2000s digicam aesthetic, festive birthday celebration atmosphere
Positive prompt in natural prose (the default is the upstream template's prompt). There is no negative prompt: the distilled model samples at CFG 1 with the negative zeroed, as the template does.
seedintegerdefault -1
Random seed (-1 = random)
aspectenumdefault square_1024
Output size. square_1024 is the upstream template's 1024x1024; the other four are chroma-txt2img's presets, all multiples of 16 as EmptyFlux2LatentImage's step asks (the FLUX.2 latent is 1/16 of the frame).
options: square_1024portrait_896x1152landscape_1152x896portrait_832x1216landscape_1216x832
batch_sizeintegerdefault 1min 1max 1
Images per run. Pinned to 1: the executor's resolution-scaled batch cap (C.12.19) allows a second latent only below ~0.5 MP, and every size here is ~1 MP.

ComfyUI node graph (13)#

The executable ComfyUI prompt graph: 13 nodes across 13 distinct node classes, wired by 13 data dependencies. Nodes tinted green come from a custom node pack this workflow declares; the rest are ComfyUI core / baked-community classes.

flowchart TD n0["1: UNETLoader"] n1["2: CLIPLoader"] n2["3: VAELoader"] n3["4: CLIPTextEncode"] n4["5: ConditioningZeroOut"] n5["6: CFGGuider"] n6["7: KSamplerSelect"] n7["8: Flux2Scheduler"] n8["9: RandomNoise"] n9["10: EmptyFlux2LatentImage"] n10["11: SamplerCustomAdvanced"] n11["12: VAEDecode"] n12["13: SaveImage"] n1 -->|clip| n3 n3 -->|conditioning| n4 n0 -->|model| n5 n3 -->|positive| n5 n4 -->|negative| n5 n8 -->|noise| n10 n5 -->|guider| n10 n6 -->|sampler| n10 n7 -->|sigmas| n10 n9 -->|latent_image| n10 n10 -->|samples| n11 n2 -->|vae| n11 n11 -->|images| n12
Data-flow DAG — scroll to zoom, drag to pan.

Nodes (13)#

1UNETLoadercore
unet_name = flux-2-klein-4b.safetensorsweight_dtype = default
outputs: MODEL
2CLIPLoadercore
clip_name = qwen_3_4b.safetensorstype = flux2device = default
outputs: CLIP
3VAELoadercore
vae_name = flux2-vae.safetensors
outputs: VAE
4CLIPTextEncodecore
text = {{constructed_prompt}} tmplclip = ◂ node 2 · out[0]
outputs: CONDITIONING
5ConditioningZeroOutcore
conditioning = ◂ node 4 · out[0]
outputs: CONDITIONING
6CFGGuidercore
model = ◂ node 1 · out[0]positive = ◂ node 4 · out[0]negative = ◂ node 5 · out[0]cfg = 1.0
outputs: GUIDER
7KSamplerSelectcore
sampler_name = euler
outputs: SAMPLER
8Flux2Schedulercore
steps = 4width = {{aspect_map[aspect].width}} tmplheight = {{aspect_map[aspect].height}} tmpl
outputs: SIGMAS
9RandomNoisecore
noise_seed = {{seed}} tmpl
outputs: NOISE
10EmptyFlux2LatentImagecore
width = {{aspect_map[aspect].width}} tmplheight = {{aspect_map[aspect].height}} tmplbatch_size = {{batch_size}} tmpl
outputs: LATENT
11SamplerCustomAdvancedcore
noise = ◂ node 9 · out[0]guider = ◂ node 6 · out[0]sampler = ◂ node 7 · out[0]sigmas = ◂ node 8 · out[0]latent_image = ◂ node 10 · out[0]
outputs: LATENTLATENT
12VAEDecodecore
samples = ◂ node 11 · out[0]vae = ◂ node 3 · out[0]
outputs: IMAGE
13SaveImagecore
images = ◂ node 12 · out[0]filename_prefix = isis/klein4b-txt2img

Prompt construction#

template
{base_prompt}

Variables (1)#

base_prompt
{{prompt}} tmpl

Parameter banks (2)#

The prompt / configuration lookup tables this workflow keys into from its inputs — the vocabulary that turns a style / palette / preset selection into graph parameters.

aspect_map (5)#

square_1024
{"width": 1024, "height": 1024}
portrait_896x1152
{"width": 896, "height": 1152}
landscape_1152x896
{"width": 1152, "height": 896}
portrait_832x1216
{"width": 832, "height": 1216}
landscape_1216x832
{"width": 1216, "height": 832}

requires_families (1)#

klein4b

Models & dependencies#

Models required (3)#

flux-2-klein-4b.safetensors
qwen_3_4b.safetensors
flux2-vae.safetensors

Output contract#

What a successful run of this workflow returns.

type
image
format
png

Taxonomy & routing#

How the control plane classifies this workflow — from the committed workflow-taxonomy-registry.json. It drives the consistency / control surface the agentic director can exercise over the workflow.

assetFamily
portrait-hero-image-bundle
outputPackageProfile
image-single-profile
controlModalities
model-locksampler-scheduler-lockseed-lockprompt-template-lock
consistencyDimensions
identitylightinglens
notes
FLUX.2 klein 4B distilled text-to-image on RunPod serverless, SFW only.