Nodes/WarpPipe Nodes/πŸŒ€ Unwarp
ComfyUI Node

πŸŒ€ Unwarp

Unwarp hands your data back

By gregory-richardΒ·Created 11 months agoΒ·Updated 2 days agoΒ· 0
πŸŒ€ Unwarp
  • warp
  • model_1
  • model_2
  • image
  • mask
  • clip
  • clip_vision
  • vae
  • conditioning_positive
  • conditioning_negative
  • latent
  • prompt_positive
  • prompt_negative
  • batch_size
  • seed
  • steps_1
  • steps_2
  • steps_3
  • cfg
  • sampler_name
  • scheduler
  • width
  • height

If Warp is the pipe you stuff your workflow into, Unwarp is where it all comes back out. It takes a single WARPPIPE bundle and unpacks it into 22 individual outputs - models, conditioning, latent, prompts, and every sampling parameter - so the rest of your graph can keep working exactly as it would have if you'd wired everything by hand. You rarely use one without the other, and the whole trick of the pack is that the middle of the workflow stays one clean wire instead of a rat's nest.

How it works

Unwarp is the mirror of Warp. It reads the id inside the bundle you hand it, looks that ID up in WarpPipe's server-side store, and copies whatever was saved there into its outputs. Since the bundle is just a handle, nothing travels over the wire at execution time beyond a lookup - which is also why the pack's storage is capped (256 entries, 1-hour expiry) and thread-safe. Miss the lookup and it shrugs instead of crashing: if no warp is connected, or the ID is gone, Unwarp returns None for every output rather than throwing an error. That grace under pressure is nice when you're still building the workflow and haven't wired the Warp yet.

The outputs that matter

All 22 outputs are always present; the ones that are None just weren't bundled. In practice you'll wire these into your sampler:

  • model_1, model_2 β†’ the MODEL inputs on your KSampler (or a model_2-aware node).
  • conditioning_positive, conditioning_negative β†’ KSampler's conditioning slots.
  • latent β†’ the latent slot, replacing what you'd normally get from Empty Latent Image.
  • seed, steps_1, cfg, sampler_name, scheduler β†’ the parameters, matched to the same KSampler enums Warp accepted.
  • width, height β†’ dimensions, handy for an Empty Latent or image-size-aware nodes downstream.

It also outputs image, mask, clip, clip_vision, vae, prompt_positive/prompt_negative (as STRING), and steps_2/steps_3 for multi-pass schemes. Note that sampler and scheduler are coerced again on the way out to values ComfyUI accepts, so whatever exotic enum went in gets normalized - you'll see the safe equivalent, not the raw string.

Installing it

Same single install as the whole pack - it's one repo with no external dependencies:

cd ComfyUI/custom_nodes
git clone https://github.com/gregory-richard/ComfyUI-WarpPipe.git

Restart ComfyUI and search "WarpPipe" in ComfyUI Manager, or use the registry (comfy node install warppipe). No models to download, nothing extra to pip.

Where people get tripped up

The most common confusion is expecting every output to be filled. Unwarp returns whatever the matching Warp bundled - if you never connected an image on the Warp side, image here will be None, and a downstream node wired to it will complain. That's not a bug; it's the optional-input design working as intended. Second: the data lives in memory, so the bundle is tied to the current session. Re-run a workflow from its saved JSON and the Warp re-populates the store fine - but if you ever find Unwarp returning all-None on a reload, the fix is to let the Warp run first (or re-run the whole thing). If you're loading a pre-v3.0 workflow, the old CONTROL type was renamed to WARPPIPE, so reconnect the Warp→Unwarp link once and you're set.

CategoryCustom/WarpPipe Nodes

Inputs (1)

NameTypeDefaultDescription
warpoptWARPPIPEβ€”

Outputs (22)

NameTypeDescription
model_1MODELβ€”
model_2MODELβ€”
imageIMAGEβ€”
maskMASKβ€”
clipCLIPβ€”
clip_visionCLIP_VISIONβ€”
vaeVAEβ€”
conditioning_positiveCONDITIONINGβ€”
conditioning_negativeCONDITIONINGβ€”
latentLATENTβ€”
prompt_positiveSTRINGβ€”
prompt_negativeSTRINGβ€”
batch_sizeINTβ€”
seedINTβ€”
steps_1INTβ€”
steps_2INTβ€”
steps_3INTβ€”
cfgFLOATβ€”
sampler_nameeuler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2β€”
schedulersimple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal,beta57,bong_tangentβ€”
widthINTβ€”
heightINTβ€”