☁️BizyAir ReActor 🌌 Fast Face Swap
The whole face-swap stack in one node
- input_image
- source_image
- face_boost
- SWAPPED_IMAGE
- BIZYAIR_PLACEHOLDER
- ORIGINAL_IMAGE
ReActor is the other branch of face identity work - not the "generate a face that resembles this person" approach PuLID and InstantID take, but a straight pixel-level swap: detect the face in a target image, detect a face in a source image, replace one with the other. It's post-processing, not generation. The community's own shorthand for the split: adapters like PuLID get you "80% there," and a ReActor-style swap on top gets you the rest of the way to an exact match - the two approaches are complementary rather than competing.
What's actually running underneath
swap_model offers inswapper_128.onnx, and that name is worth reading literally: the open swap model this whole category of tool depends on outputs at 128×128 resolution, full stop, and that ceiling hasn't moved in years - the model's own maintainers describe it as no longer maintained and point commercial users at their paid product instead. That's not a BizyAir limitation, it's the actual state of the open ecosystem this node (and Roop, and FaceFusion, and every other InsightFace-based swapper) is built on. This is exactly why face_restore_model exists in this node: without a restoration pass, a 128×128 swap composited back into a full-resolution image looks visibly soft. Budget for using it.
The inputs that matter
input_image/source_image- target (the image getting a new face) and source (where the face comes from).source_imageis optional in this schema; if you're reusing a face from earlier in a workflow, check whether it's actually wired in before assuming a swap silently failed.swap_model,facedetection- the swap model and which detector backbone finds faces to swap (RetinaFace variants or YOLOv5 options).face_restore_model-none,codeformer,GFPGAN,GPEN, orRestoreFormer_PP. Pick one; leaving this onnonemeans you keep the raw 128×128-sourced blur.face_restore_visibility(0.1–1) blends the restored face back against the swap, andcodeformer_weight(0–1) is Codeformer's own fidelity-vs-quality dial, relevant only if you picked it.detect_gender_input/detect_gender_source,input_faces_index/source_faces_index- filters for when a photo has more than one face: restrict by gender, or pick a specific face by its detected position.enabled- a toggle to switch the whole node off without unplugging it, handy while you're testing a workflow.
Outputs: SWAPPED_IMAGE (the result), ORIGINAL_IMAGE (an unmodified passthrough, useful for side-by-side comparison), and BIZYAIR_PLACEHOLDER, whose exact purpose isn't documented in the node's own schema - treat it as an internal artifact rather than something to wire up deliberately.
Installing it
ComfyUI Manager: search BizyAir, install, restart - or:
cd ComfyUI/custom_nodes
git clone https://github.com/siliconflow/BizyAir.git
Set your BizyAir API key before running anything.
Where people get burned
Multi-face images are the recurring trap: without setting input_faces_index/source_faces_index deliberately, you're at the mercy of whatever order the detector found faces in, which can silently swap the wrong person in a group photo. And on the licensing side, worth knowing even running through BizyAir's cloud: InsightFace's ArcFace weights underneath this whole swap pipeline are non-commercial-only, and that restriction travels with every tool built on them - switching between ReActor, PuLID, or InstantID doesn't get you a cleaner license, since they all share the same dependency underneath.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| enabled | BOOLEAN | true | — |
| input_image | IMAGE | — | |
| swap_model | COMBO | 1 options: inswapper_128.onnx | |
| facedetection | COMBO | 4 options: retinaface_resnet50, retinaface_mobile0.25, YOLOv5l, YOLOv5n | |
| face_restore_model | COMBO | 5 options: none, codeformer-v0.1.0.pth, GFPGANv1.4.onnx, GPEN-BFR-2048.onnx, RestoreFormer_PP.onnx | |
| face_restore_visibility | FLOAT | 1.000.1–1 | — |
| codeformer_weight | FLOAT | 0.500–1 | — |
| detect_gender_input | COMBO | no | 3 options: no, female, male |
| detect_gender_source | COMBO | no | 3 options: no, female, male |
| input_faces_index | STRING | 0 | — |
| source_faces_index | STRING | 0 | — |
| console_log_level | COMBO | 1 | 3 options: 0, 1, 2 |
| source_imageopt | IMAGE | — | |
| face_boostopt | FACE_BOOST | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| SWAPPED_IMAGE | IMAGE | — |
| BIZYAIR_PLACEHOLDER | BIZYAIR_PLACEHOLDER | — |
| ORIGINAL_IMAGE | IMAGE | — |