Nodes/ComfyUI-MAINodes/MAI Concept Inject Delta (alpha)
ComfyUI Node

MAI Concept Inject Delta (alpha)

Put a measured capture back into the model

By matlowai·Created 17 days ago·Updated about 18 hours ago· 112
MAI Concept Inject Delta (alpha)
  • model
  • model
pack_path
blocks
alpha1.00
step_modecaptured_only
modeframe
controlnone
control_seed0
cond_onlytrue
enabledtrue

The mirror of the capture tap. MAI Concept Capture Arm measures what a condition does to MiniMax-H3's internal block states; MAI Concept Inject Delta takes that measurement and puts it back. It loads a delta pack - a .safetensors of per-(block, step) frame_mean maps, optional patch_mean maps, optional full block states, plus a sidecar JSON - and adds it, scaled by alpha, to the target-video rows of the block output. On a clone of the model, like every other patching node in this family, so your original is untouched.

The pack is admirably honest about what this node does and doesn't claim: "It answers one question and holds no theory: does a delta measured at the tap do anything when it is put back?" That's it. This is a scientific instrument, not a filter you drop on your renders.

Run it against its own controls

The whole point is the control enum. If you add a delta and something happens, you don't yet know the something is the delta:

  • zero - runs every line of the patch with zeroes. If that render differs from the unpatched one, the plumbing itself is the effect.
  • time_shuffle - keeps the delta's energy but destroys its timing. If it renders the same as none, timing isn't doing the work.
  • space_shuffle - same, but scrambles where the delta sits inside a frame (refused in mode='frame', which has no space axis).
  • sign_flip - the last arm.

control_seed seeds the shuffle permutations on the CPU, so any arm is re-runnable from its label.

The settings that matter

  • pack_path - absolute path to the pack; its sidecar <pack>.json (or <pack>.safetensors.json) must sit right beside it
  • alpha - scale on the delta, default 1.0; negative subtracts
  • mode - frame (one vector per latent frame), separable (frame + patch − grand mean, the rank-2 map, needs patch_mean in the pack), or full (the whole stored block state, ~160 MB per position, read from disk one at a time on first use)
  • step_mode - captured_only fires only on the steps the pack was captured at; nearest_all fires every step using the nearest captured entry
  • blocks - which DiT blocks to inject at; empty means every block the pack carries. Must not collide with a tap's blocks on the same model.

One hard constraint: the pack's (latent_t, frame_rows) must match the run's, or the node refuses before the first block. A different prompt or a different audio length is fine - the delta lives on video rows.

Should you touch it?

Only if you're doing Concept Lab research. The pack itself flags the whole subsystem as alpha and its conversion pipeline (capture → factor → conditioning) as not yet built. If that describes you, it's a genuinely careful piece of instrumentation with real experimental hygiene - the controls, the mismatch refusal, the read-one-at-a-time full mode are all things a sloppier tool wouldn't bother with. It ships in ComfyUI-MAINodes (GPL-3.0, matlowai):

cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes

Restart, find it under MAI/concept (alpha), and remember H3's weights are licence-restricted in the US, EU, UK and Korea - if you're capturing and injecting, you're doing it somewhere the model is legal to run.

CategoryMAI/concept (alpha)

Inputs (10)

NameTypeDefaultDescription
modelMODELa patched CLONE comes out; the input is untouched
pack_pathSTRINGabsolute path to the pack .safetensors; its sidecar <pack>.json (or <pack>.safetensors.json) must sit beside it
blocksSTRINGcomma-separated DiT blocks to inject at; empty = every block the pack carries. Must not collide with a tap's blocks on the same model
alphaFLOAT1.00-8–8scale on the delta; negative subtracts
step_modeCOMBOcaptured_onlycaptured_only fires only on the steps the pack was captured at; nearest_all fires every step using the nearest captured entry
modeCOMBOframeframe = one vector per latent frame; separable = frame + patch - grand mean, the rank-2 map (needs patch_mean in the pack); full = the whole stored block state, row for row (needs full states in the pack, ~160 MB each, read one at a time)
controlCOMBOnonethe arm: none / zero (plumbing control) / time_shuffle (same energy, wrong timing) / space_shuffle (same energy, wrong place; refused in mode 'frame', which has no space axis) / sign_flip
control_seedINT00–4294967295seeds the shuffle permutations, on the CPU, so an arm is re-runnable from its label
cond_onlyoptBOOLEANtrueinject only on the conditional forward; CFG makes two per step and they are two different conditions
enabledoptBOOLEANtrueFalse installs the patches and adds NOTHING: the pass-through control

Outputs (1)

NameTypeDescription
modelMODEL