Conditioning Concat Optional (Citron Image Saver)
The concat node that shrugs when the second input is missing
- conditioning_to
- conditioning_from
- CONDITIONING
ComfyUI's core Conditioning (Concat) has one annoying property: both inputs are required. Leave the second one unconnected and the graph won't queue. That's fine in a fixed workflow and miserable in one where the second conditioning is sometimes there - an IP-Adapter cond you only want on some runs, a style branch you switch off, a LoRA-trigger cond that only exists in one variant. Conditioning Concat Optional is the same concatenation with the second input optional: if nothing's plugged in, conditioning_to comes out untouched.
It's the fallback-switch pattern applied to conditioning, and it's the small kind of node that saves you from duplicating half a graph.
How it works
Two inputs. conditioning_to is required - "base conditioning to concat to (or pass through, if second is empty)". conditioning_from is optional, described as "conditioning to concat to conditioning_to, if empty, then conditioning_to is passed through unchanged".
Mechanically, if conditioning_from is empty it returns conditioning_to as-is. Otherwise it takes the first entry of conditioning_from and concatenates its conditioning tensor to each entry of conditioning_to along the channel dimension, then copies conditioning_to's metadata dict onto the result. That's the same trick the core node uses, and it has the same consequence: the two conditionings' token sequences get glued end to end. You are not blending strengths; you are making one longer conditioning. The dict - areas, masks, strength - comes from conditioning_to, so anything set on conditioning_from's dict is dropped.
One output, CONDITIONING, which you feed into a sampler like any other.
Two behaviours worth flagging before you build around it. First, it only ever uses the first conditioning in conditioning_from - if that input carries several, it prints a warning and silently drops the rest. If you need to concat a batch, you're using the wrong node. Second, torch.cat needs matching hidden dimensions. Concatenating an SDXL conditioning with a Flux one will throw rather than do something clever, because those aren't the same shape of thing.
Where it earns its keep: an optional style/IP-Adapter branch that you mute with a bypass instead of rewiring, or a graph with two variants where one adds a trigger-word conditioning on top of the base prompt encode. Bypass the upstream branch and the concat node quietly passes the base through, no group muting required.
And yes, this is one of only two nodes in the pack that aren't about saving files - the category really is conditioning, not Citron_ImageSaver/utils, so it's filed with the rest of your conditioning nodes in the right-click menu.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/citronlegacy/ComfyUI-CitronNodes
# restart ComfyUI
Manager search may not find this pack - the README lists Manager support as "coming soon" and the repo metadata is still placeholder - so clone it. The pack's only pip dependency is piexif, pulled in by the savers; if it's missing the whole pack fails to import, this node included:
pip install piexif
No model files involved.
Common issues
- Nothing changed when I plugged the second input in. Check that the upstream branch actually produced a conditioning - a bypassed node passes nothing, which is exactly the case this node is designed to swallow.
- Error: tensors must be the same size. You're concatenating across model families or across differently-shaped conditionings. Concat wants same-architecture conditioning on both sides.
- Only one of my conditionings came through.
conditioning_fromhad more than one entry; only the first is used, and the console warns about it. - Masks or areas stopped applying. They live in the dict, and the output takes
conditioning_to's dict. Set region/area stuff on thetoside, or apply it after the concat.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning_to | CONDITIONING | base conditioning to concat to (or pass through, if second is empty) | |
| conditioning_fromopt | CONDITIONING | conditioning to concat to conditioning_to, if empty, then conditioning_to is passed through unchanged |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |