EzFlex-ParamPresetControl
Preset Whole Parameter Sets, Not Just Widgets
Nine times out of ten, "I want my settings back the way they were" is a lie you tell yourself while re-typing steps, CFG, sampler name, seed and a LoRA weight into five different nodes. ComfyUI has no built-in preset system. What it has is the ability to convert a widget into an input - and that's the crack this node walks through.
EzFlex-ParamPresetControl lets you define groups of typed parameters in a panel, then emits each group as a port. Drop EzFlex-ParamPresetOutput on the other end of that wire, and the group explodes back out into ordinary INT / FLOAT / BOOLEAN / STRING sockets you wire into whatever needs them.
The mechanism: a group is a data object
The node's only input is config (STRING, multiline, default "{}" - "parameter group list + current preset name", per its own tooltip). What comes out is one port per group card, of a custom type EZFLEX_PARAM_GROUP. That type carries the group's parameters as data, not as a wire bundle - the whole group travels down one link, and the receiving node unpacks it.
Port names and types are re-synced per run, and this is where the plumbing gets genuinely engine-level: ComfyUI validates a link by reading the upstream class's RETURN_TYPES[slot], and since a class's return types are shared globally across every instance on the canvas, a node with a variable port count has to keep rewriting them and tell the frontend when it does. That's why the pack registers an output-sync route the panel POSTs to when you add, delete or reorder a group. When a dynamic-port pack misbehaves, this class-shared-state detail is usually the culprit.
Parameter types you can declare: int, float, bool, string, complex, tuple, list, set, dictionary. The first four map straight onto ComfyUI socket types on the output end; the collection types come out as JSON strings, which is the honest way to move a dict through a graph.
The green/red toggle, which is the actual UI
Every parameter card has a green/red button. Green means it's part of the output list and appears in the group's dropdown; red means it's stored but not emitted. That's how one group can serve several downstream consumers without emitting twelve ports you mostly don't use - and the group dropdown next to it picks whether the group outputs everything or one specific parameter.
Groups and parameter cards both drag to reorder, and order matters, because port order follows card order. Multi-parameter groups render red on the canvas, single-parameter groups gray - a small thing that makes a wall of these readable at a glance.
What you wire it to
The EZFLEX_PARAM_GROUP output is a custom type, so it only connects to EzFlex-ParamPresetOutput - deliberate, since it stops you feeding a group object into a built-in node that expects an INT. Want the numbers? Go through the Output node, where the sampler-facing sockets live.
Presets - named sets of parameter values - are saved from the panel into the pack's user_data/EzFlex-ParamPresetControl.json, which means they're per install, not per workflow. Copying the workflow to another machine does not bring your presets.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/blackbossokok/Comfyui-EzFlex-Presets
pip install -r requirements.txt
Manager users: search EzFlex and restart afterwards. The only mandatory extra is mutagen (the pack uses it for audio/video metadata elsewhere in the suite); this node needs nothing beyond what ComfyUI ships. No models, no API keys. ComfyUI 0.3.13+ per the pack's metadata, for the i18n endpoint the panels use.
Common issues
"Cannot validate input" / the graph refuses to queue after switching presets. This is a known one, and it was fixed in v1.2.2 - the bug was the dynamic output layout going stale when a preset flipped which parameters were active. If you're on anything older, update before debugging.
A parameter you added doesn't show up downstream. It's red in the Control node. Green the button, then re-check the Output node - the two ends have separate enable state, and a parameter disabled locally on the Output side emits a neutral default rather than erroring.
A float arrives as a string. The Output node flags this: if the value stored in the parameter doesn't match the declared type, it degrades to STRING and highlights itself red. That usually means a preset saved a text value into a numeric slot.
Everything renders but ports don't line up. Reorder is visual and structural. Drag a group card and the canvas port order follows the card order - if you rearranged while a link was attached, re-check the wiring.
Panel fragility. All of this lives in a custom DOM panel rather than canvas widgets - the category ComfyUI's Nodes 2.0 frontend rewrite has been hardest on. If buttons stop responding, the legacy canvas remains the practical workaround.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| config | STRING | {} | Config JSON produced by the Param Preset Control panel (parameter group list + current preset name). |
Outputs (0)
No outputs