chx_IPA_basic
IP-Adapter, wired the way you'll actually use it
- model
- image
- attn_mask
- image_negative
- model
- image
- mask
IP-Adapter is the oldest trick in the "make my output look like this reference picture" book - hand it an image, it conditions your model on what that image looks like, no LoRA training required. chx_IPA_basic is Apt_Preset's default entry point into that trick: one node, a preset dropdown, and the handful of knobs people actually touch, instead of the sprawl of separate loader + apply nodes the reference implementation needs.
What it's doing, and where it fits
Under the hood this is the same idea as cubiq's ComfyUI_IPAdapter_plus, the de facto reference implementation for IP-Adapter in ComfyUI: an image encoder turns your reference into embeddings, and the model gets patched so those embeddings steer generation through their own attention path, leaving your text prompt free to keep working alongside it. That's the whole trick - a 22M-parameter adapter riding on a frozen base model, which is why it's cheap and why it generalizes across checkpoint fine-tunes.
It's worth knowing IP-Adapter's real boundary before you reach for this node: it's strongest on SD 1.5, usable on SDXL, and it does not exist for Flux or newer architectures - nobody, including the original Tencent AI Lab team, ever shipped Flux weights for it. If you're on a Flux or Kontext-family workflow, this node (and its siblings in the chx_IPA_* family) aren't the tool; Apt_Preset's separate "redux_stack" / "union_stack" controls in its Kontext-oriented samplers are built for that instead.
The inputs and outputs that matter
modelandimage- your base model and the reference picture to condition on.preset- six choices:STANDARD,LIGHT(SD1.5 only),VIT-G,PLUS,PLUS FACE,FULL FACE(SD1.5 only). This is the setting that actually decides behavior.PLUSis the usual default for general style transfer - it uses patch-level tokens instead of one global vector, so output tracks the reference more closely thanSTANDARDdoes.PLUS FACE/FULL FACEcrop and encode just the face region, which is the sellable, non-face-recognition way to get face conditioning (seechx_IPA_faceIDbelow if you want the stronger, license-restricted version).weight(default 1, range -1 to 5) - how hard the reference pushes. The community's working range is 0.6–0.8 for style transfer and 0.3–0.5 for face similarity; push past ~0.8 and the reference starts overriding your prompt entirely.weight_type,combine_embeds,embeds_scaling- advanced knobs (linear/ease-in/composition/style-transfer weighting curves, how multiple embeddings combine, and V-only vs K+V attention scaling). Leave these at default untilweightandpresetalone aren't giving you what you want.start_at/end_at(0–1, step fraction of the sampling process) - restrict the adapter to a range of steps rather than all of them. Running it only early preserves more fine detail in the output; running it across every step measurably softens the image.- Optional
attn_maskto restrict the effect to part of the canvas, andimage_negativeto steer away from a reference instead of toward one.
Outputs are model (patched, wire it to your sampler), image (passthrough), and mask.
Installing it
Through ComfyUI Manager: search ComfyUI-Apt_Preset, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/cardenluo/ComfyUI-Apt_Preset.git
then run install.bat on Windows for dependencies, restart ComfyUI. You'll also need the actual IP-Adapter model files and a CLIP vision encoder in your models/ipadapter and models/clip_vision folders - this node applies IP-Adapter, it doesn't ship the weights. The Apache 2.0 CLIP-based variants (base, Plus, Plus Face, Full Face) are on Hugging Face under h94/IP-Adapter.
Common issues
Output looks nothing like the reference, or completely overrides your prompt. That's the weight knob - too low and the adapter barely registers, too high and it steamrolls the text prompt. Start around 0.6–0.8 for style and dial down for anything face-related.
Faces come out soft or generic. Known limitation, not a misconfiguration: IP-Adapter conditions on the face region reasonably well but loses outfit, hair, and body details elsewhere in the frame, and running it across all sampling steps costs detail overall. Tighten start_at/end_at to the earlier steps, and if you specifically need identity rather than resemblance, that's what chx_IPA_faceID is for - different tradeoff, different license.
It does nothing on your Flux or Kontext workflow. Expected - see above. This whole node family targets SD 1.5/SDXL-class models.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| image | IMAGE | — | |
| preset | COMBO | 6 options: STANDARD (medium strength), LIGHT - SD1.5 only (low strength), VIT-G (medium strength), PLUS (high strength), PLUS FACE (portraits), FULL FACE - SD1.5 only (portraits stronger) | |
| weight | FLOAT | 1.00-1–5 | — |
| weight_type | COMBO | 15 options: linear, ease in, ease out, ease in-out, reverse in-out, weak input, +9 | |
| combine_embeds | COMBO | 5 options: concat, add, subtract, average, norm average | |
| start_at | FLOAT | 0.0000–1 | — |
| end_at | FLOAT | 1.0000–1 | — |
| embeds_scaling | COMBO | 4 options: V only, K+V, K+V w/ C penalty, K+mean(V) w/ C penalty | |
| attn_maskopt | MASK | — | |
| image_negativeopt | IMAGE | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| image | IMAGE | — |
| mask | MASK | — |