A ComfyUI consistent character workflow injects identity from a reference (IP-Adapter or PuLID on SDXL, or native reference input on FLUX.2 klein), then repairs small faces with a face detailer pass that reuses the same identity source. Each template below lists its nodes, the settings to start from and where it breaks.
A ComfyUI consistent character workflow has two halves: an identity source that conditions every generation (IP-Adapter, PuLID, a LoRA, or FLUX.2 klein's native reference input) and a face detailer pass that re-renders small faces with that same identity. Below are three copy-and-adapt node templates for those jobs plus a no-custom-node FLUX.2 route, each with the settings to start from and the place it fails.
Nodes, settings and licenses checked October 2026 against the ComfyUI_IPAdapter_plus, PuLID_ComfyUI, PuLID and Impact Pack repositories, Impact Pack's detailer reference, the IP-Adapter-FaceID model card, InsightFace, and ComfyUI's FLUX.2 klein guide and Flux2ImageNode docs.
This is the ComfyUI build sheet. If you are still deciding between ComfyUI, Midjourney, Nano Banana or a hosted model, read our consistent character AI guide first; it compares every method. Come back here when you have picked ComfyUI and need the graph.
What you will have at the end
One approved hero image, a saved identity graph you reuse for every post, a detailer pass that holds the face in wide shots, and a set of approved angle views that doubles as a character sheet and a LoRA dataset.
- ComfyUI updated to a current release; IPAdapter plus says it always needs the latest ComfyUI
- ComfyUI-Manager installed for custom nodes
- A base model chosen: SDXL for templates A and B, FLUX.2 klein for the native route
- A sharp, front-facing hero image of a fictional character, face fully visible
- A fixed identity block for the prompt: age range, hair, eyes, one or two signature details
- License checked for commercial work: InsightFace-based face models are research only
Which template fits your build
| Template | Base model | Needs | License note | Where it fails |
|---|---|---|---|---|
| A. IP-Adapter | SD1.5, SDXL | IPAdapter plus nodes, CLIP vision encoder | Apache 2.0 (plain models); FaceID: research only | Maintenance-only repo; FaceID needs InsightFace plus a paired LoRA |
| B. PuLID | SDXL (cubiq); FLUX.1 dev (community nodes) | PuLID model, EVA CLIP, InsightFace antelopev2 | InsightFace models research only; FLUX.1 dev license | Sensitive to reference quality; lower fidelity on some male faces (FLUX) |
| C. Face detailer chain | Any | Impact Pack plus Impact Subpack detector | Follows your base model | Skips large faces unless forced; generic face if run without identity |
| Native FLUX.2 klein edit | FLUX.2 klein 4B or 9B | None beyond core ComfyUI | 4B Apache 2.0; 9B non-commercial | Up to 4 references; quality depends on the reference set |
- 01Hero image
Sharp, front-facing, approved once
- 02Identity source
IP-Adapter, PuLID, LoRA or native reference
- 03Base generation
Identity block plus scene prompt
- 04Face detailer
Same identity source, moderate denoise
- 05Review
Compare against the hero at full size
Template A: IP-Adapter face reference (SDXL)
IP-Adapter conditions the generation on an image; the IPAdapter plus README calls it a one-image LoRA. For a face, the Plus Face model on a cropped face works without InsightFace. The chain:
Load Checkpoint (SDXL) -> IPAdapter Unified Loader (preset: PLUS FACE (portraits)) -> IPAdapter Advanced [image: hero face crop | weight: 0.8 | weight_type: adjust for prompt adherence] -> KSampler [positive: identity block + scene | fixed seed while testing] -> VAE Decode -> (Template C detailer) -> Save Image- Models. The unified loader only finds files named exactly as the README lists them: the ViT-H CLIP vision encoder in
models/clip_visionandip-adapter-plus-face_sdxl_vit-h.safetensorsinmodels/ipadapter. - Starting settings. The README suggests lowering weight to at least 0.8 and raising steps, and changing the weight type in IPAdapter Advanced for more prompt adherence.
- Where it fails. The repository has been maintenance-only since April 14, 2025. FaceID variants need InsightFace installed plus a specific paired LoRA, and the FaceID model card says those models are for research, not commercial use, and do not achieve perfect ID consistency.
Template B: PuLID identity injection
PuLID injects an identity embedding taken from the hero face. PuLID_ComfyUI is the native SDXL implementation; PuLID-FLUX runs through community node packs listed by the PuLID authors.
Load Checkpoint (SDXL) -> Load PuLID Model (ip-adapter_pulid_sdxl_fp16 in models/pulid) + Load InsightFace (PuLID): antelopev2 + Load Eva Clip (PuLID): EVA02-CLIP-L-14-336 -> Apply PuLID [image: hero | method: fidelity | weight: 1.0 default] -> KSampler [try sgm_uniform scheduler] -> VAE Decode -> (Template C) -> Save Image- Settings that matter. The
methodparameter: fidelity sits closer to the reference, style gives the checkpoint more freedom. On the Advanced node, lowerfidelityvalues give higher resemblance. - On FLUX. The authors' PuLID-FLUX notes suggest starting ID insertion at timestep 4 for realistic images (lower it if similarity is weak) and 0 to 1 for stylised ones.
- Where it fails. The README says reference quality is very important (use a clean, sharp picture) and that quality degraded on checkpoints other than the one it was built around. The FLUX version notes lower ID fidelity for some male inputs and falls under the FLUX.1 dev license. The cubiq repo is maintenance-only since April 14, 2025, and the InsightFace models it needs are research-only.
Template C: the face detailer chain
Identity methods hold close-ups well; in full-body shots the face covers too few pixels and drifts. A detailer detects the face, crops it, re-renders it larger and pastes it back. Impact Pack's FaceDetailer is the standard node; its detector provider for YOLO models lives in the separate Impact Subpack since version 8.0.
Base image (from Template A, B, a LoRA or the native route) -> UltralyticsDetectorProvider (face bbox model, Impact Subpack) -> FaceDetailer [same model + LoRA/IP-Adapter/PuLID | identity block prompt | guide_size: 512 default | denoise: moderate | noise_mask: on] -> Save Image- guide_size. Per the detailer reference, faces smaller than guide_size are enlarged to it; faces already larger are skipped as not needing detail, unless
force_inpaintis on. Raise guide_size for more face detail. - noise_mask. Generally recommended on, per the same reference.
- Where it fails. Run it without your identity source and it draws a generic face at higher resolution, which reads as drift. Impact Pack has also changed detailer node structure between versions, so an old saved workflow can error after an update.
ComfyUI consistent character without LoRA: the native FLUX.2 route
In 2026 the simplest no-LoRA graph needs no custom nodes. ComfyUI's FLUX.2 klein guide ships image-edit workflows in the built-in Workflow Templates, with multi-reference composition and iterative edits listed as supported. It reports the 4B base model at about 9.2GB of VRAM, and Black Forest Labs licenses klein 4B under Apache 2.0.
- Open Workflow Templates and load the FLUX.2 [klein] 4B Image Edit Base workflow.
- Put the hero image in the first LoadImage node.
- Prompt by position: "the woman in image 1, [identity block], now sits at a cafe window, overcast light".
- Approve outputs and add the best angle views as extra references for later scenes.
- Finish wide shots with Template C.
If you would rather not run the model locally, the built-in Flux2ImageNode sends the job to Black Forest Labs' FLUX.2 [pro] or [max] API with up to eight reference images, resized so the total does not exceed 2048 x 2048 pixels. Our Flux consistent character guide covers prompt word order and the edit chain for poses in detail.
ComfyUI character sheet workflow
A character sheet is the set of approved angles that every later image is checked against. Build it from the hero, one angle at a time, in whichever template you chose:
- 1Lock the hero
Approve one front-facing image; never regenerate it later.
- 2One angle per run
Three-quarter left and right, profile, back, full body; same identity prompt.
- 3Fix the seed per angle
So reruns change only the setting you are testing.
- 4Detailer on full-body views
Template C with the same identity source.
- 5Review against the hero
Reject any view where eyes, nose, jaw or hairline moved.
- 6Save as a set
These views become references and LoRA training images.
Prompting for all angles in one grid image is quicker, but faces in small panels drift for the same crop-scale reason the detailer exists. Generating each view separately at full size costs more runs and gives a sheet you can trust. For exact poses per angle, add an OpenPose ControlNet; our ControlNet guide covers the setup.
Which template to start with
- Commercial persona, no custom nodes wanted: the native FLUX.2 klein 4B route plus Template C. Apache 2.0 model, built-in template, nothing to keep patched.
- Existing SDXL setup and checkpoints you like: Template A with the plain Plus Face model, then Template C. Avoid the FaceID variants if the work is commercial.
- Research or personal projects that need the strongest identity from one photo: Template B, within the InsightFace and FLUX.1 dev terms.
- Already have a character LoRA: skip A and B, load the LoRA in the base pass and in Template C.
Save the graph as your template
Once a graph produces faces you approve, freeze it. Save the workflow file with a name that records the base model and identity method, keep the hero image and reference views in a fixed input folder, and change only the scene prompt and seed from post to post. Group the identity nodes so nobody edits them by accident. When you change anything inside the identity group (weight, model, detailer settings), save it as a new version and re-run your character sheet angles through it before posting with it. That habit turns a one-off graph into a template a whole team can run, and it makes drift traceable to a specific change.
Troubleshooting the graph
- Red nodes after an update. Custom node packs lag ComfyUI releases. Update through ComfyUI-Manager, and for production keep a pinned copy of the ComfyUI version your graph was built on. Our ComfyUI workflow library guide covers safe sources and setup for shared workflows.
- Pasted-on or oversaturated face. Weight too high; step it down in 0.1 increments.
- The face drifts in a way none of this explains. Work through the seven causes in our AI face consistency guide, one variable at a time.
When a template stops being enough
Reference templates are the fastest start and the right tool for a new persona. Once you post daily, a LoRA trained on your approved sheet and best outputs holds the face across more angles and lighting than a single reference can, and Template C still runs on top of it. Our character LoRA dataset guide shows how to turn the sheet into training data. The AI Influencers program covers the full ComfyUI persona stack, from hero image to trained LoRA to video.
ComfyUI consistent character: FAQ
What is the best ComfyUI consistent character workflow?
It depends on the base model and whether the work is commercial. For SDXL, an IP-Adapter or PuLID graph followed by a face detailer pass is the classic stack. For FLUX.2, ComfyUI's built-in klein image-edit template takes reference images with no custom nodes. For strict likeness at volume, train a LoRA and keep the detailer pass on top.
How do I keep a character consistent in ComfyUI without a LoRA?
Use a reference-image method. IP-Adapter Plus Face conditions on a face crop of your hero image, PuLID injects an identity embedding, and FLUX.2 klein's image-edit workflow reads reference images natively. Keep one identity block in the prompt, fix the seed while testing, and add a face detailer pass for wide shots where the face is small.
Are IP-Adapter and PuLID still maintained for ComfyUI?
Both cubiq repositories, ComfyUI_IPAdapter_plus and PuLID_ComfyUI, were set to maintenance-only mode on April 14, 2025; the author may merge crucial fixes but plans no consistent work. They still run, but a ComfyUI update can break them. Pin a working ComfyUI version for production graphs, or move new work to native FLUX.2 nodes.
Can I use PuLID or IP-Adapter FaceID for a commercial AI influencer?
Check the face models first. Both rely on InsightFace models, and InsightFace says its pretrained models are for non-commercial research only; the IP-Adapter-FaceID model card says the same of its models. The plain IP-Adapter models on h94's Hugging Face page are Apache 2.0, and FLUX.2 klein 4B is Apache 2.0, which makes them cleaner commercial bases.
How do I make a character sheet in ComfyUI?
Generate one approved hero image, then produce each angle (front, three-quarter, profile, back, full body) as a separate edit from that hero with the same identity prompt, and review each against it. Generating every angle in one image is faster but tends to drift across panels. Save the approved views; they become your reference set and the start of a LoRA dataset.
Why does the face detailer change my character's face?
Because it re-renders the face. If the detailer runs without your LoRA, reference or identity prompt, it draws a plausible generic face at higher resolution. Run it with the same identity source as the main pass and a moderate denoise. Note that Impact Pack's detailer skips faces already larger than guide_size unless force_inpaint is on.
One graph, one face. Every post.
AI Influencers, included in All Access, covers ComfyUI identity graphs, detailer passes, LoRA training and video, with the other three programs, live coaching and the private community in one subscription.
Build your identity block free
Write the fixed identity block your graph will reuse, then share your character sheet in the free Telegram for feedback.