Combine Extras
Merge two metadata bags, right side wins
- extras1
- extras2
- extras
A lot of ComfyUI packs ship a "tag bag" node - a free-form key/value dict that rides along with an image's metadata. In this pack it's called extras (IPT-ImageInfoExtras), and it's where the pack stashes anything that doesn't have a fixed field: sampler parameters, margins, custom settings, your own notes. Combine Extras is the node that merges two of those bags, and its entire behavior fits in one sentence: the second bag's keys overwrite the first's.
That's it. It's the smallest idea in the pack, and - like Combine Lora Stacks - its value comes from being in a metadata-carrying ecosystem rather than from doing anything clever.
How it works
The two inputs are extras1 (the base bag) and extras2 (the overlay). The node merges them, with extras2 winning any key conflicts. So if extras1 has {"sampler": "euler", "cfg": 6} and extras2 has {"cfg": 8}, you get {"sampler": "euler", "cfg": 8}. Nothing is renamed, nothing is reordered, nothing is type-checked - it's a dictionary update.
If one input is unconnected, the node passes the other through; if both are empty, output is empty. The single output is extras, ready for any node in the pack that consumes the metadata bag.
Why a merge node exists for a dict
Because the pack treats extras as a composable value, not a mutable scratchpad. The README describes the pattern for Image Info Context: extras get merged into existing image_info, with duplicate keys overwritten by the input side. Combine Extras is the same merge, exposed standalone so you can build the bag before it hits a context node.
The concrete use: keep a base extras bag with your default sampler settings and a per-run bag with the deviations for this particular generation, merge them, and the run inherits the defaults except where overridden. Same shape as Image Info Fallback (which fills only missing fields from a fallback) - except here the merge direction is explicit, with the right side deliberately taking precedence, which is exactly what you want for "defaults plus overrides."
The honest caveat
This is a flat, last-write-wins merge - no deep merging. If a value is itself a nested dict and both sides set it, the whole right-side value replaces the left side rather than merging recursively. For the pack's flat extras (which are mostly scalars and short lists) that's correct behavior and not a limitation you'll hit; just don't expect Combine Extras to reconcile two bags of nested structures.
Also worth knowing: Image Info Context already merges extras internally when you connect one, so you only need this node when you want to assemble a combined bag before handing it in, or when you're building the bag from two independent sources. Used in a simple one-extras workflow, it's dead weight - add it when you actually have two bags to reconcile.
Installing
Part of kinorax/comfyui-info-prompt-toolkit:
cd ComfyUI/custom_nodes
git clone https://github.com/kinorax/comfyui-info-prompt-toolkit.git
cd comfyui-info-prompt-toolkit
pip install -r requirements.txt
or install "Info-Prompt-Toolkit" via ComfyUI Manager, then restart. No model files, no dependencies beyond base ComfyUI. It lives under Info-Prompt-Toolkit/ImageInfo and only makes sense if you're already using the pack's image_info machinery - on its own it's a dictionary-merge node looking for a home.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| extras1opt | IPT-ImageInfoExtras | Base extras | |
| extras2opt | IPT-ImageInfoExtras | Merged extras. Keys here overwrite matching keys from extras1. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| extras | IPT-ImageInfoExtras | — |