Nodes/ComfyUI-FunPack/FunPack Modifier Settings
ComfyUI Node

FunPack Modifier Settings

One JSON box instead of forty sliders nobody can wire

By digital-garbage·Created about a year ago·Updated about 13 hours ago· 20
FunPack Modifier Settings
    • settings
    • status
    ◄settings{}►

    A node whose entire job is to hold a string of JSON sounds like a design failure until you look at the alternative. FunPack has dozens of sampling modules - ALG, DynaShift, STAS, REINS, momentum, decisiveness, score slider, velocity bias, Q-steer, the lot - and each has its own handful of settings. Give every one of those its own socket and the node's shape changes every time any module gains an option, and every saved workflow ends up pointing at a socket that moved. So the author did the pragmatic thing: one multiline text field, one typed payload, and a validator.

    How it works

    settings is a plain string of the form {"module_id": {"setting": value}}. FunPack's app writes it when you flip switches in the UI. You can also type it yourself, which is the reason this article exists.

    The output is a FUNPACK_SETTINGS payload that plugs into FunPackLoadModifiers, FunPackSampler, and FunPackShotCamera - anywhere a module wants to know what you asked for. Those sockets are all the same type, so one payload can fan out to several nodes.

    A worked example. ALG, the anchor de-staticking modifier, has three settings, and its defaults are visible in the source:

    {"alg": {"enabled": true, "strength": 4.0, "until_sigma": 0.6}}
    

    enabled is off by default, strength runs 1–16 and is "how much" - higher frees up more motion and keeps less of the original detail - and until_sigma is when the sharp anchor comes back, from 0 (blurred for the whole run) to 1 (never blur). That's the shape of every entry: a module id matching a module folder, then its own keys.

    The payload also carries the switches that turn individual modules off for a project, and one that disables the enhancements wholesale. That's how the studio's per-project settings get into a graph without the graph knowing what a project is.

    The bit that's actually clever

    Validation happens at queue time, not execution time. The node checks the JSON and the module ids before ComfyUI will accept the prompt, which matters more than it sounds if you rent a GPU: without it, a typo'd module id would surface after the checkpoint had already loaded and burned a couple of minutes. The payload is an opaque string to ComfyUI's own validator, so this node is the only place it can be understood before the queue takes it. Mistakes are reported, by module name.

    It's also worth knowing the failure mode: a saved "turn this off" for a module that is no longer loaded is logged as a warning and ignored, not treated as an error. That's the difference between a config that survives a pack update and one that refuses to queue.

    Inputs and outputs

    One required input, settings, multiline, defaulting to {}. Two outputs: settings (the typed payload) and status (what the validator made of it). That status output is a string, so it'll wire to any text display node - do that while you're hand-editing JSON.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/olivv-cs/ComfyUI-FunPack
    pip install -r ComfyUI-FunPack/requirements.txt
    

    Restart after. ComfyUI Manager can do it too - search ComfyUI-FunPack - but Manager serves the Registry copy, so confirm the version in Settings ▸ About FunPack. Nothing extra is needed for this particular node: no models, no add-ons. The pack's own requirements.txt adds comfy-kitchen>=0.2.32 and gguf, plus spaCy and nvidia-vfx as opt-in add-ons that install on the next start after you enable them in Settings ▸ Modules.

    Troubleshooting

    Strict JSON, no exceptions. Double quotes, no trailing commas, no comments. If you're pasting from a chat window, check for smart quotes - that's the classic.

    "settings must be an object keyed by module id." You've handed FunPackLoadModifiers or the sampler something that isn't a dict - usually a raw string from a text node. This node is what turns the string into the object.

    JSON is valid but nothing happens. Right module id? They're the module folder names (alg, dynashift, stas, reins, momentum, …), not the display titles. Also check the individual enabled keys - most modules default to off, and a payload that only contains a strength value enables nothing.

    And a heads-up: with the pack's guards switched off, a bad value is treated as your business - the queue accepts it and the complaint happens at execution instead. If a setting is being ignored rather than rejected, look at whether you turned the guards off.

    CategoryFunPack/Sampling

    Inputs (1)

    NameTypeDefaultDescription
    settingsSTRING{}{"module_id": {"setting": value}}. The app writes this; editing it by hand is fine, and mistakes are reported.

    Outputs (2)

    NameTypeDescription
    settingsFUNPACK_SETTINGS—
    statusSTRING—