Combine Properties
Merge Your Metadata Into One Bundle
- prop_a
- prop_b
- prop_c
- prop_d
- existing_properties
- combined_properties
- combined_properties_json
The property pipeline in TinyBee - encode values as named properties, carry them through the graph, save them with your image - lives and dies on one merge step: turning several individual properties into a single bundle. That's Combine Properties. You give it up to four TINYPROPs and optionally an existing TINYPROPS bundle, and it merges them into one dictionary, plus a ready-to-serialize JSON string. If Encode Any Property creates the metadata, Combine Properties is where it gets collected into something a save node can actually use.
How it works
prop_athroughprop_d- up to four individualTINYPROPs (the output of Encode Any Property). All optional; wire as many as you have.existing_properties- aTINYPROPSbundle to merge on top of, or use as the base. This is how you combine bundles with bundles, or start from a bundle produced elsewhere (say, from a queue or from the Dynamic encoder).override_existing(default on) - the merge policy. On: a later property with the same name replaces the existing one. Off: existing names are preserved and new properties only fill in the gaps.
Two outputs:
combined_properties- the mergedTINYPROPSdictionary (name → property object).combined_properties_json- the same thing as a JSON string, ready for a save node or a text output.
The merge order matters and is easy to get backwards: existing_properties is loaded first, then each prop is added in order - so with override_existing on, prop_a..prop_d win over the existing bundle. With it off, the existing bundle wins and props only add keys that aren't there yet. The "which side wins" question is entirely determined by that toggle, and it's the one knob that surprises people.
A property only gets added if it's a valid dict with a name and value, and the final bundle is keyed by property name - so two props with the same name can't coexist; the toggle decides who survives.
Where you'd actually use it
- Final metadata assembly: combine your encoded seed, prompt, and model properties, then hand
combined_properties_jsonto a save-with-metadata node or an output text box. - Layered metadata: merge a defaults bundle (
existing_properties) with per-run props, usingoverride_existingoff so defaults fill gaps without clobbering run values. - Queue payloads: produce the bundle this pack's Queue category consumes.
Installing it
Part of ComfyUI-TinyBee under 🐝TinyBee/Util:
- ComfyUI Manager → Install Custom Nodes → search "ComfyUI-TinyBee" → Install, then restart ComfyUI.
cd ComfyUI/custom_nodes
git clone https://github.com/TinyBeeman/ComfyUI-TinyBee
Restart. No models; it's dict merging plus a json.dumps - pure standard library.
Gotchas
The override_existing toggle is the merge policy - flipping it inverts which side wins, so write your workflow knowing you're committing to one. If a prop comes through as something other than a name/value dict (say, an UNKNOWN type that mis-inferred), it's silently skipped; no error, just an absent key. And remember the output keys are property names, so duplicate names collapse - if you genuinely need two same-named values, rename one upstream. The JSON-string output is the same data, so pick whichever your downstream node wants; they'll never disagree.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| prop_aopt | TINYPROP | — | |
| prop_bopt | TINYPROP | — | |
| prop_copt | TINYPROP | — | |
| prop_dopt | TINYPROP | — | |
| existing_propertiesopt | TINYPROPS | [object Object] | — |
| override_existingopt | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| combined_properties | TINYPROPS | — |
| combined_properties_json | STRING | — |