Concat Pipe Multi
Merge several pipes into one, with rules for the collisions
- pipe_1
- pipe_2
- pipe
Concat Pipe Multi merges multiple pipe inputs into one unified pipe - the Eclipse-specific version of the context-bus pattern that runs through the whole plumbing layer. A pipe is a Python dict with canonical keys: model, clip, vae, latent, conditioning, settings, prompts. This node takes two or more of those bundles and folds them into a single dict that downstream nodes can pull from. It's how you combine, say, a context pipe carrying the model stack with a settings pipe carrying sampler parameters, and hand the result to one consumer.
The two decisions that make or break a merge
Because a merge is only interesting when the pipes disagree, the node hands you two explicit policy dials - and these are where you should actually think.
merge_strategy decides who wins on conflicting keys:
overwrite- later pipes replace earlier values.preserve- the first valid value wins; later conflicts are ignored.merge(default) - combines lists where possible and uses later values for scalar conflicts.
tensor_size_mismatch decides what to do when image/mask tensors don't share dimensions (real when you merge a context holding 512² images into one holding 1024²):
match- stretch-resize to the first image's dimensions.crop- center-crop to the first image's dimensions.letterbox(default) - scale to fit while preserving aspect ratio, padding with black.ignore- keep the mismatched tensors as a list (only if your downstream can handle lists).
The defaults (merge + letterbox) are the sensible "just combine it" choices; you'll touch these dials the first time a merge produces a stretched image or a dropped value.
How it works under the hood
The node is typed-aware rather than blindly copying dicts: tensor-valued keys (images, masks) are concatenated with torch.cat across the incoming pipes, known list keys (audio, LoRA names, embeddings, positive/negative lists) get list-combined, and everything else follows the merge strategy. That distinction is why merging two pipes holding image batches produces one bigger batch instead of a nested mess.
Inputs and output
inputcount- how many pipe sockets to expose (2–64, default 2); sockets update as you change it.pipe_1…pipe_N- the pipes to merge.merge_strategy,tensor_size_mismatch- the two policy dials.- Output - a single
pipe(aPIPE-typed dict).
When it's the right tool
Reach for it when you're assembling a context from parts - the modular pattern where you define settings once in a settings pipe and reuse it across workflows, or where a video context needs to absorb audio and frame parameters from a second source. It's also the concrete answer to the context-bus caveat from the plumbing docs: merging is where stale values sneak in, so merge after each pipe is updated, not before.
Installing it
Part of ComfyUI_Eclipse, installed once:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
Restart ComfyUI (or ComfyUI Manager → search "ComfyUI Eclipse"). Requires torch (present) and nothing else special.
Gotchas
Pack-wide: ComfyUI_Eclipse was formerly RvTools, and v4.0.0 removed all legacy nodes - old workflows need the Workflow Migration Tool node (or python tools/migrate_workflow.py <workflow.json>) to rewrite old IDs with a backup. And one honest warning about the pipe pattern in general: the merged pipe is only as current as its inputs. If a pipe in the stack carries stale values, the merge happily propagates them - check what's inside the pipes when output looks wrong, not just the merge settings.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| inputcount | INT | 22–64 | — |
| pipe_1opt | PIPE | — | |
| pipe_2opt | PIPE | — | |
| merge_strategyopt | COMBO | merge | How to handle conflicting keys: 'overwrite' replaces earlier values, 'preserve' keeps first valid values, 'merge' combines lists and uses later values for conflicts |
| tensor_size_mismatchopt | COMBO | letterbox | When merging image/mask tensors with different sizes: 'match' resizes (stretch) to the first image's dimensions, 'crop' center-crops to the first image's dimensions, 'letterbox' scales to fit preserving aspect ratio and pads with black, 'ignore' stores them as a list (requires downstream support) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pipe | PIPE | — |