LTX-2.3 Face Identity Reinforcer ⚡
The node that makes Best-Face-ID actually hold a face in LTX-2.3
- model
- vae
- reference_image
- target_latent
- reference_image_2
- model
If you make LTX-2.3 talking-head or face-to-video content, you know the failure mode: the person in frame one is a stranger by frame thirty. The community's best-known fix is the Best-Face-ID LoRA from Alissonerdx (Best_FaceID_v1.0_LoRA.safetensors), and this node is the wrapper that makes it behave. It takes everything the identity recipe needs - reference latent injection, the RoPE source-phase tag the LoRA was trained on, face detection, spatial mask gating - and collapses it into one node you can drop into a graph.
The subtle part is why a wrapper is even necessary. Best-Face-ID tags its reference tokens with a specific RoPE position (source_id=2) via phase rotation, and that convention collides with i2v's frame-0 conditioning unless the tokens are placed carefully. This node keeps the trained source_id=2 tag while positioning reference tokens so they don't stomp the first-frame hold - which is what makes the whole approach work in image-to-video, not just text-to-video. GPU-verified A/Bs from the pack author: conditioning alone pulls identity toward the photo, reinforcer + Best-Face-ID locks it closest, and strength 0 is a bitwise no-op.
How to wire it
Load Best_FaceID_v1.0_LoRA.safetensors on the MODEL path before this node (a stock LoraLoaderModelOnly at ~1.0 strength is fine), then run this node's model output into the rest of the workflow. Required: model, vae, reference_image, and target_latent (same latent that feeds your sampler).
The dials that actually change results:
auto_face_crop(default on) - detects the face and crops the reference around it atcrop_zoom_factor, matching the target aspect ratio. This is the biggest single lever for wide or full-body references: the VAE encodes real face detail instead of a pinhead. Disable it when your reference is already a tight headshot.identity_strength- 1.0 is the Best-Face-ID default; raise it for stronger likeness, lower it when the reference starts drowning the prompt.spatial_gating-mask_soft(recommended) limits identity influence to the face region with a cosine falloff;mask_hardis a hard binary;offis raw Best-Face-ID. If you've seen identity bleed onto clothing or background, soft gating is your fix.source_id/phase_scale- leave at 2.0 / 1.0; those are the values the LoRA was trained against.source_id=0disables rotation for plain overlap behavior.reference_image_2- a second reference for multi-subject scenes.
One model out, ready for this pack's LTX-2.3 prep nodes. It handles joint AV latents - the video half is unbound automatically.
Installing it
This node lives in the ComfyUI-GGUF-Loader pack (ChrisColeTech's fork of city96's ComfyUI-GGUF). ComfyUI Manager: search "ComfyUI-GGUF-Loader", install, restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
pip install --upgrade gguf
Restart, then drop Best_FaceID_v1.0_LoRA.safetensors into models/loras. Face detection is built in (YuNet → MediaPipe → Haar fallback), no separate detector download.
Common issues
The recurring trap is using the node without the LoRA - the phase tag does little without the weights it was trained for, so you're just doing plain reference conditioning. And if you're on the LTX-2.5 listing instead: it's the same implementation, but the Best-Face-ID LoRA is 2.3-trained, so that pairing is unverified cross-version territory. On 2.3, this is the settled way to keep a face.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| reference_image | IMAGE | — | |
| target_latent | LATENT | — | |
| identity_strengthopt | FLOAT | 1.000–2 | Scales reference latent magnitude. 1.0 = Best-Face-ID default. |
| face_paddingopt | FLOAT | 0.150–0.5 | Face bbox expansion - captures hair/neck context. |
| auto_face_cropopt | BOOLEAN | true | When a face is detected, auto-crop the reference image around the face at zoom_factor extent and match target aspect ratio. Dramatically improves identity transfer for wide/full-body references by giving the VAE much more face detail to encode. Turn off if reference is already tightly cropped. |
| crop_zoom_factoropt | FLOAT | 2.01.2–4 | How much context around the face to include. 2.0 = crop is 2x the face bbox (shoulders + hair). 1.5 = very tight (face + hair only). 3.0 = wide (upper body). Ignored if auto_face_crop off. |
| spatial_gatingopt | COMBO | mask_soft | Constrain identity influence to face region. mask_soft = cosine falloff (recommended). mask_hard = binary. off = uniform (raw Best-Face-ID). |
| placement_modeopt | COMBO | i2v_safe | i2v_safe / t2v_overlap = pure overlap layout (Best-Face-ID's default). Reference reuses target's coord grid, disambiguated by clean/noisy state and sequence position. prefix = additive offset (legacy). |
| source_idopt | FLOAT | 20–8 | RoPE source tag applied via phase rotation. Best-Face-ID LoRA expects 2.0. source_id=0 disables rotation (overlap-only behavior). |
| phase_scaleopt | FLOAT | 1.00–2 | Phase rotation magnitude multiplier. Best-Face-ID LoRA expects 1.0. Lower values reduce reference/target separation strength. |
| reference_image_2opt | IMAGE | Optional secondary reference (multi-subject). | |
| debugopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |