Nodes/comfyui-reactor-node/ReActor 🌌 Set Face Swap Weight
ComfyUI Node

ReActor 🌌 Set Face Swap Weight

Dial a face swap down from 100% to something believable

By GourieffΒ·Created 2 years agoΒ·Updated 3 months agoΒ· 1,309
ReActor 🌌 Set Face Swap Weight
  • input_image
  • source_image
  • face_model
  • INPUT_IMAGE
  • FACE_MODEL
β—„faceswap_weight50%β–Ί

ReActor's face swap is normally a light switch: the source face goes on at full strength, or it doesn't go on at all. ReActorSetWeight turns that into a dimmer - you can run the swap at 50%, 25%, whatever, instead of committing to the whole thing.

Why bother? Because a hard 100% swap only looks right when the source and target faces are close in bone structure, skin tone, and lighting to begin with. Push a very different face onto a target at full strength and you get that "pasted-on" look people complain about with face swap tools generally. Dialing the weight down blends the identity in more gradually, so the result sits better with the rest of the image instead of looking cut-and-pasted. It's also just a useful knob for a subtler effect - a hint of resemblance rather than a full replacement. Worth remembering that ReActor itself is a pixel-level post-process, not a generative identity tool like InstantID or PuLID - the community's own shorthand for the combo is "ip adapter gets you 80% there, reactor gets you the rest of the way there." This node is what lets you control how hard that last push lands.

How it works

It sits inline between your face source and the main ReActorFaceSwap node. Wire in your target image, wire in either a source_image or a face_model (from a Load Face Model node), pick a percentage, and it forwards a weight-scaled version onward. You then feed its outputs into the main swap node instead of connecting your source directly.

The inputs and outputs that matter

  • input_image (required, IMAGE) - the target image, passed through the node.
  • faceswap_weight (required, enum, default 50%) - the actual dial. It's not a free-form float; you're choosing from nine fixed steps: 0%, 12.5%, 25%, 37.5%, 50%, 62.5%, 75%, 87.5%, 100%.
  • source_image (optional, IMAGE) or face_model (optional, FACE_MODEL) - whichever face reference you're weighting. You need at least one of these for the node to have anything to do.

Outputs: INPUT_IMAGE (the passthrough) and FACE_MODEL (the weight-scaled result) - wire both into the main ReActor swap node's input_image and face_model slots in place of a direct connection.

How to install it

ComfyUI Manager: search "ReActor", install, restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/Gourieff/ComfyUI-ReActor

then, inside that folder, run install.bat on Windows or python install.py on Linux/macOS - this is a separate step from the clone, and skipping it is the most common reason people can't find any ReActor nodes in the menu afterward. First run auto-downloads the face-analysis model (buffalo_l) and the swap model (inswapper_128) into ComfyUI/models/insightface; SetWeight doesn't need anything beyond that base install.

Common issues & troubleshooting

You need finer control than 12.5% steps give you. That granularity is baked into the node - there's no continuous slider here, so if you want 33% you're rounding to 37.5%.

Nothing changes when you turn the weight down. Check that you actually connected source_image or face_model into this node and wired its outputs onward - if both inputs are empty, there's nothing for it to scale, and if you're still feeding the original source straight into the main node elsewhere in the graph, this node isn't in the path at all.

"got an unexpected keyword argument" after updating the pack. ReActor's node signatures change between versions, and a workflow JSON can end up calling an old one. The README's own fix is blunt and it works: delete the ReActor node from your workflow and add a fresh copy rather than trying to patch it.

Your swapped output comes back solid black. That's not this node - it's ReActor's built-in NSFW detector firing on the main swap node downstream, a separate system entirely. It ships because GitHub's content policy pushed the maintainer to add it after an earlier version of the repo got pulled down; the community's usual workarounds are editing the detector's threshold in reactor_sfw.py or switching to the author's own mirror on Codeberg, which doesn't carry it.

Category🌌 ReActor

Inputs (4)

NameTypeDefaultDescription
input_imageIMAGEβ€”
faceswap_weightCOMBO50%9 options: 0%, 12.5%, 25%, 37.5%, 50%, 62.5%, +3
source_imageoptIMAGEβ€”
face_modeloptFACE_MODELβ€”

Outputs (2)

NameTypeDescription
INPUT_IMAGEIMAGEβ€”
FACE_MODELFACE_MODELβ€”