Apply instantId adapter
The optional half of InstantID
- model
- instantId_adapter
- face_conditioning
- model
Here's the honest framing straight from the pack's own README: this node is optional. You can get good InstantID results without it. That's an unusual thing for an author to say about their own node, and it's worth taking seriously before you wire it in by default.
What it actually does
InstantID's architecture has two identity-injection halves working together: an image adapter that feeds the face embedding into the model's cross-attention (this node), and IdentityNet, a ControlNet-shaped module that constrains facial geometry via landmarks (ControlNetInstantIdApply, elsewhere in this pack). This node patches your SDXL model itself so its denoising steps lean toward the reference identity - a direct model-level nudge, distinct from the ControlNet's spatial constraint. Because it edits the model rather than the conditioning, it stacks with whatever else you're doing to the model (LoRAs, other patches) as long as order and strength stay sane.
The inputs and outputs that matter
model- your SDXL checkpoint, going in before your sampler.instantId_adapter- fromLoadInstantIdAdapter's first output.face_conditioning- fromFaceEmbedCombine. This is the resampled identity signal, not the raw face embed.strength(default 0.8, range 0–10) - the one knob you'll actually touch. Higher pushes the model harder toward the reference face; push it too far and you'll fight the prompt and get artifacts, the same tradeoff as any adapter strength dial.
Output: model, patched and ready for your sampler (or further patches, like a LoRA loader after it).
Why you might skip it
The README's own framing - "this is optional, you can achieve good results without using this node" - matches how InstantID's architecture is actually weighted in practice: IdentityNet (the ControlNet half) is doing most of the heavy lifting on likeness because it constrains actual facial geometry, not just a semantic nudge. The adapter is additive reinforcement, not the core mechanism. If your results are already strong off the ControlNet alone, adding this node just gives you one more strength value to fight with for diminishing returns. Where it does earn its slot: when the ControlNet alone isn't holding likeness as tightly as you want, or your pose/style is aggressive enough that the model needs an extra push toward the reference face.
Install
ComfyUI Manager: search comfyui-instantId-faceswap. Manual: git clone https://github.com/nosiu/comfyui-instantId-faceswap into custom_nodes/, then pip install -r requirements.txt. This node's own dependency is the InstantID adapter file (ip-adapter.bin from InstantX/InstantID on Hugging Face) in models/ipadapter - see the LoadInstantIdAdapter article for the exact path.
Common issues & troubleshooting
Face looks overcooked or the prompt stops mattering. Classic adapter-too-strong symptom. Bring strength down before touching anything else; the community-tested range for InstantID overall runs 1.0–1.3 when the adapter is a meaningful contributor, but that's total identity pressure across both nodes - if ControlNetInstantIdApply is already doing the heavy lifting, you may want this well under 1.0 or skipped entirely.
No visible difference with or without this node. That's not necessarily broken - it can genuinely mean IdentityNet is carrying the likeness on its own for your particular pose/reference combo, which is exactly the scenario the README is describing when it calls this optional.
Wrong socket into face_conditioning. This wants the output of FaceEmbedCombine, not the raw FACE_EMBED from FaceEmbed - those are different types and ComfyUI won't let you connect them, but it's an easy node to reach for by name alone.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| instantId_adapter | INSTANTID_ADAPTER | — | |
| face_conditioning | FACE_CONDITIONING | — | |
| strength | FLOAT | 0.80–10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |