π BV Smart Pipe Merge
The rejoin point for BV Smart Pipes β where branches come home
- pipe_001
- pipe_002
- pipe_003
- pipe_004
- pipe_005
- pipe_006
- pipe_007
- pipe_008
- pipe_009
- pipe_010
- pipe_011
- pipe_012
- pipe_013
- pipe_014
- pipe_015
- pipe_016
- pipe
So your workflow finally got big enough to fork. One BV Smart Pipe carries your model, clip, VAE, positive, negative and latent down a chain, then you split it - a low-res pass on one branch, a detail pass on another, an A/B sampler test on a third. And now you need them back in one wire. That's exactly what π BV Smart Pipe Merge is: the node that recombines ordered Smart Pipe branches, wired or wireless, into a single pipe for whatever comes next.
It exists because BV Smart Pipe is deliberately not a "one port list on every node" system like the older pipe packs. Each pipe node only shows the inputs it needs at that point in the chain, and every slot keeps a stable logical identity so downstream connections survive labels changing or an upstream slot going temporarily missing. That's great while the graph runs in a straight line. The moment you branch, you need a deliberate merge - and this is it. Missing sources and cycles fail closed rather than silently passing garbage, which is the right call for plumbing you'll stop thinking about.
How it works
The node has 16 optional inputs (pipe_001 through pipe_016) and one output: a single pipe you wire into the next Smart Pipe node. But you don't plug in all sixteen and hope. The one field that actually matters is bv_smart_pipe_merge_json - a multiline JSON list that declares which sources participate and in what order:
[
{"key": "pipe_001", "mode": "wired", "address": "root/base"},
{"key": "pipe_002", "mode": "wireless", "address": "root/detail"}
]
The key names the input, mode says wired or wireless, and address identifies the branch for wireless routing. Order is the whole point of the node: sources merge in the order you list them, and later divergent writes win. That's backed by real provenance tracking - each slot remembers where its value came from, so a branch that merely inherited an ancestor value can't clobber a genuine write another branch made. Only two genuinely divergent writes resolve by list order. Same-named, type-compatible slots coalesce; same name with incompatible types stays separate (the second gets a _2 suffix). You'll rarely touch the JSON by hand - the pack's config dialog writes it for you - but now you know what it's doing.
Installing it
Same as the rest of the pack, no special steps. In ComfyUI Manager, search BV Node Pack and install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/BlackVortexAI/bv_nodepack.git
Then restart ComfyUI and hard-refresh the browser (Ctrl + F5) - the pack ships frontend extensions, and skipping the refresh is the classic "node installed but missing" moment. There's no requirements.txt, no model downloads, nothing heavy for this node. The pack is GPL v3, by BlackVortex.
Where people get burned
- "Sources are missing: pipe_002" - you listed a source in the JSON but never connected that input. Plug it in, or remove it from the list.
- Broken JSON in the config field - the node validates on load and tells you exactly what's invalid, so the failure is readable, but it will refuse to run.
- Mixing wireless branches across Subgraph boundaries - wireless Smart Pipe routing is materialized at prompt time because ComfyUI still has no official pre-prompt hook. It works, but keep physical wire links in workflows where compatibility is critical.
- Forgetting order rules the conflict - if two branches both genuinely write the same slot, the last one in your JSON list wins. That's a feature; read your merge as top-down priority.
If you only need to recombine two straight lines and never branch, you don't need this node - a plain pipe chain does it. But the moment your graph grows legs, this is where they come back together.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| bv_smart_pipe_merge_json | STRING | [] | β |
| pipe_001opt | BV_SMART_PIPE | β | |
| pipe_002opt | BV_SMART_PIPE | β | |
| pipe_003opt | BV_SMART_PIPE | β | |
| pipe_004opt | BV_SMART_PIPE | β | |
| pipe_005opt | BV_SMART_PIPE | β | |
| pipe_006opt | BV_SMART_PIPE | β | |
| pipe_007opt | BV_SMART_PIPE | β | |
| pipe_008opt | BV_SMART_PIPE | β | |
| pipe_009opt | BV_SMART_PIPE | β | |
| pipe_010opt | BV_SMART_PIPE | β | |
| pipe_011opt | BV_SMART_PIPE | β | |
| pipe_012opt | BV_SMART_PIPE | β | |
| pipe_013opt | BV_SMART_PIPE | β | |
| pipe_014opt | BV_SMART_PIPE | β | |
| pipe_015opt | BV_SMART_PIPE | β | |
| pipe_016opt | BV_SMART_PIPE | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pipe | BV_SMART_PIPE | β |