Qwen-Image 2512 (bf16) steered by the InstantX ControlNets, SFW only, in two modes: union (generate from a prepared control map) and inpaint (repaint the white region of a mask). Renders on the RunPod VIDEO endpoint and bills the video ledger while returning a still (heavy-image, A.02.05). union is translated from Comfy-Org/workflow_templates@aaac56dd templates/image_qwen_image_instantx_controlnet.json: FluxKontextImageScale on the control image, ControlNetApplyAdvanced (strength 1, start 0, end 1, with the VAE) on the prompt and an empty negative, the latent VAE-encoded from the scaled control image, ModelSamplingAuraFlow 3.1, KSampler euler/simple. That template samples at 4 steps and CFG 1 only because it applies the Lightning 4-step LoRA, which has no manifest row, so this graph uses the family's no-LoRA values, 20 steps at CFG 2.5 (see sampler_note). Its Lotus depth preprocessor has no manifest rows either, so the graph takes a ready map. inpaint is translated from templates/image_qwen_image_instantx_inpainting_controlnet.json without its bypassed outpaint branch and LoRA: ImageScaleToMaxDimension (area, 1536), the Grow and Blur Mask chain (GrowMask 0 tapered, ImageBlur 31/1), SetLatentNoiseMask, ControlNetInpaintingAliMamaApply (1, 0, 1), KSampler euler/simple 20 steps CFG 2.5, a single-space negative, and ImageCompositeMasked over the scaled source as the output. The mask is a separate black-and-white image (white = repaint) rather than the template's MaskEditor alpha. Both templates load the original Qwen-Image transformer (qwen_image_fp8_e4m3fn); the volume carries Qwen-Image 2512 bf16, the same architecture.
Tags: heavy-imagerunpod-serverlessvolume-backedimage-to-imagecontrolnetinpaintqwen-image
Inputs (12)#
The typed parameter surface callers bind when they request this workflow. Enum options and numeric bounds are the values the workflow document declares.
promptstringrequireddefault Post-apocalyptic style clothing, long wavy hair, rough texture, exotic woman, tattered coarse-woven linen fabric, wearing a hood, mechanical aesthetics, mainly in dark gray tones, low-saturation earthy yellow, sense of impact and rebellion, doomsday aesthetics, grotesque aesthetics, works of art, backlighting, film photography, professional photography works, clear visible face, emotional and atmospheric dynamic photography, Fujichrome color positive film, shot with a 17mm Hasselblad ultra-wide-angle lens, f/1.2 large aperture, side backlighting, artistic light, hair light, Rembrandt light, 8K high-definition image quality, delicate real human skin texture.negative_promptstringdefault modeenumdefault unionunioninpaintcontrol_imageimagesource_imageimagemask_imageimagecontrol_strengthfloatdefault 1.0min 0.0max 2.0mask_growintegerdefault 0min 0max 64mask_blur_radiusintegerdefault 31min 1max 31stepsintegerdefault 20min 1max 60cfgfloatdefault 2.5min 1.0max 10.0seedintegerdefault -1ComfyUI node graph (26)#
The executable ComfyUI prompt graph: 26 nodes across 21 distinct node classes, wired by 33 data dependencies. Nodes tinted green come from a custom node pack this workflow declares; the rest are ComfyUI core / baked-community classes.
Nodes (26)#
1UNETLoadercoreunet_name = qwen_image_2512_bf16.safetensorsweight_dtype = defaultMODEL2CLIPLoadercoreclip_name = qwen_2.5_vl_7b.safetensorstype = qwen_imagedevice = defaultCLIP3VAELoadercorevae_name = qwen_image_vae.safetensorsVAE4ModelSamplingAuraFlowcoremodel = ◂ node 1 · out[0]shift = 3.1MODEL5CLIPTextEncodecoretext = {{constructed_prompt}} tmplclip = ◂ node 2 · out[0]CONDITIONING6CLIPTextEncodecoretext = {{negative_prompt or mode_profile[mode].negative}} tmplclip = ◂ node 2 · out[0]CONDITIONING7ControlNetLoadercorecontrol_net_name = {{mode_profile[mode].controlnet}} tmplCONTROL_NET10LoadImagecoreimage = {{control_image}} tmplIMAGEMASK11FluxKontextImageScalecoreimage = ◂ node 10 · out[0]IMAGE12VAEEncodecorepixels = ◂ node 11 · out[0]vae = ◂ node 3 · out[0]LATENT13ControlNetApplyAdvancedcorepositive = ◂ node 5 · out[0]negative = ◂ node 6 · out[0]control_net = ◂ node 7 · out[0]image = ◂ node 11 · out[0]vae = ◂ node 3 · out[0]strength = {{control_strength}} tmplstart_percent = 0.0end_percent = 1.0CONDITIONINGCONDITIONING20LoadImagecoreimage = {{source_image}} tmplIMAGEMASK21ImageScaleToMaxDimensioncoreimage = ◂ node 20 · out[0]upscale_method = arealargest_size = 1536IMAGE22LoadImagecoreimage = {{mask_image}} tmplIMAGEMASK23ImageToMaskcoreimage = ◂ node 22 · out[0]channel = redMASK24GrowMaskcoremask = ◂ node 23 · out[0]expand = {{mask_grow}} tmpltapered_corners = trueMASK25MaskToImagecoremask = ◂ node 24 · out[0]IMAGE26ImageBlurcoreimage = ◂ node 25 · out[0]blur_radius = {{mask_blur_radius}} tmplsigma = 1.0IMAGE27ImageToMaskcoreimage = ◂ node 26 · out[0]channel = redMASK28VAEEncodecorepixels = ◂ node 21 · out[0]vae = ◂ node 3 · out[0]LATENT29SetLatentNoiseMaskcoresamples = ◂ node 28 · out[0]mask = ◂ node 27 · out[0]LATENT30ControlNetInpaintingAliMamaApplycorepositive = ◂ node 5 · out[0]negative = ◂ node 6 · out[0]control_net = ◂ node 7 · out[0]vae = ◂ node 3 · out[0]image = ◂ node 21 · out[0]mask = ◂ node 27 · out[0]strength = {{control_strength}} tmplstart_percent = 0.0end_percent = 1.0CONDITIONINGCONDITIONING40KSamplercoremodel = ◂ node 4 · out[0]seed = {{seed}} tmplsteps = {{steps}} tmplcfg = {{cfg}} tmplsampler_name = eulerscheduler = simplepositive = {{mode_profile[mode].positive}} tmplnegative = {{mode_profile[mode].negative_ref}} tmpllatent_image = {{mode_profile[mode].latent}} tmpldenoise = 1.0LATENT41VAEDecodecoresamples = ◂ node 40 · out[0]vae = ◂ node 3 · out[0]IMAGE42ImageCompositeMaskedcoredestination = ◂ node 21 · out[0]source = ◂ node 41 · out[0]x = 0y = 0resize_source = falsemask = ◂ node 27 · out[0]IMAGE43SaveImagecoreimages = {{mode_profile[mode].output}} tmplfilename_prefix = isis/qwen-edit-controlPrompt construction#
template{base_prompt}Variables (1)#
base_prompt{{prompt}} tmplParameter 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.
mode_profile (2)#
union{"controlnet": "Qwen-Image-InstantX-ControlNet-Union.safetensors", "negative": "", "positive": ["13", 0], "negative_ref": ["13", 1], "latent": ["12", 0], "output": ["41", 0]}inpaint{"controlnet": "Qwen-Image-InstantX-ControlNet-Inpainting.safetensors", "negative": " ", "positive": ["30", 0], "negative_ref": ["30", 1], "latent": ["29", 0], "output": ["42", 0]}requires_families (2)#
qwen-imageqwen-image-controlModels & dependencies#
Models required (5)#
qwen_image_2512_bf16.safetensorsqwen_2.5_vl_7b.safetensorsqwen_image_vae.safetensorsQwen-Image-InstantX-ControlNet-Union.safetensorsQwen-Image-InstantX-ControlNet-Inpainting.safetensorsOutput contract#
What a successful run of this workflow returns.
typeimageformatpngTaxonomy & 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.
assetFamilyportrait-hero-image-bundleoutputPackageProfileimage-single-profilecontrolModalitiescontrolnet-depthcontrolnet-inpaintmodel-locksampler-scheduler-lockseed-lockconsistencyDimensionsidentitylightingenvironmentnotesQwen-Image 2512 with the InstantX union ControlNet (from a prepared control map) or inpainting ControlNet (mask, composited back), a still rendered on the RunPod video endpoint (heavy-image), SFW only.