ComfyUI Node

D2 Pipe

The bus that carries your whole generation across the graph

By da2el-ai·Created 2 years ago·Updated 30 days ago· 66
D2 Pipe
  • d2_pipe
  • model
  • clip
  • vae
  • positive_cond
  • negative_cond
  • d2_pipe
  • ckpt_name
  • positive
  • negative
  • seed
  • steps
  • cfg
  • sampler_name
  • scheduler
  • denoise
  • width
  • height
  • model
  • clip
  • vae
  • positive_cond
  • negative_cond
ckpt_name
positive
negative
seed
steps
cfg
sampler_name
scheduler
denoise
width
height

D2 Pipe is not a node that does a dramatic thing. It's a plumbing node, and it's the reason the rest of the D2 pack feels so tidy. The D2 ecosystem moves a bundle of generation settings around in one object - the d2_pipe - and this node is where you reach in, read values out, and patch values in. If you've ever wished you could grab "the seed from wherever it lives" without drawing five wires across the graph, this is the tool.

What a d2_pipe holds

Think of d2_pipe as a traveling backpack that every D2 node hands to the next. It carries the checkpoint name, positive/negative prompts, seed, steps, cfg, sampler, scheduler, denoise, width, height - and, since the pack's later versions, the actual model, clip, vae and the positive/negative conditioning too. D2 XY Plot Easy fills the backpack, D2 KSampler reads from it, D2 Save Image Eagle pulls the generation parameters out of it to write metadata. The pipe is what lets you connect a plot to a sampler to a save node with one wire each instead of ten.

How this node works

Every input is optional, and every input that's connected overwrites the corresponding slot in the incoming pipe. Anything left unconnected passes through unchanged. So you can take a pipe from an XY plot, override just the cfg, and hand the result onward without touching any other value. The full list of inputs: d2_pipe, ckpt_name, positive, negative, seed, steps, cfg, sampler_name, scheduler, denoise, width, height, model, clip, vae, positive_cond, negative_cond.

The outputs mirror the inputs, all 17 of them. You don't have to use them all - the first output, d2_pipe, passes the (possibly modified) backpack along, and the rest are just the individual values unwrapped, for when you need a single number somewhere else. The pattern that works: wire the incoming pipe in, wire the outgoing d2_pipe to the next D2 node, and only pull out the individual outputs you actually need.

The gotcha to remember

Because unconnected inputs pass through, an empty value in your head might not be an empty value in the pipe. If the incoming pipe has steps: 15 and you expect to be overriding it but accidentally left the steps input disconnected, you get 15. This is the same "pipe takes priority" rule that D2 KSampler warns about - the pipe is the source of truth, direct inputs are the exception that overrides it. Once that clicks, the whole pack's behavior becomes predictable.

Also worth noting: the node copies the pipe rather than mutating it, so reusing a pipe from one source into several downstream branches won't cause one branch to poison the others.

Installing

Part of D2 Nodes ComfyUI:

cd ComfyUI/custom_nodes
git clone https://github.com/da2el-ai/D2-nodes-ComfyUI

or search "D2 Nodes ComfyUI" in ComfyUI Manager. No models, light dependencies.

Honestly, you may never touch this node directly - most workflows get by with the pipe flowing invisibly between the plot, sampler, and save nodes. But the moment you want to override a single parameter mid-pipeline or split a pipe in two directions, you'll be glad it's there. It's the boring, invisible node that keeps the flashy ones from turning into a rat's nest.

CategoryD2

Inputs (17)

NameTypeDefaultDescription
d2_pipeoptD2_TD2Pipe
ckpt_nameoptSTRING
positiveoptSTRING
negativeoptSTRING
seedoptINT
stepsoptINT
cfgoptFLOAT
sampler_nameoptSTRING
scheduleroptSTRING
denoiseoptFLOAT
widthoptINT
heightoptINT
modeloptMODEL
clipoptCLIP
vaeoptVAE
positive_condoptCONDITIONING
negative_condoptCONDITIONING

Outputs (17)

NameTypeDescription
d2_pipeD2_TD2Pipe
ckpt_nameSTRING
positiveSTRING
negativeSTRING
seedINT
stepsINT
cfgFLOAT
sampler_nameSTRING
schedulerSTRING
denoiseFLOAT
widthINT
heightINT
modelMODEL
clipCLIP
vaeVAE
positive_condCONDITIONING
negative_condCONDITIONING