Nodes/ComfyUI Assistant Node/PVL Flux PuLID (fal.ai)
ComfyUI Node

PVL Flux PuLID (fal.ai)

Put a face on a Flux image without installing InsightFace

By pvlprk·Created about a year ago·Updated 8 months ago· 1
PVL Flux PuLID (fal.ai)
  • reference_image
  • image
  • request_id
prompt
negative_promptbad quality, worst quality, text, signature, watermark, extra limbs
width1024
height1024
num_inference_steps20
guidance_scale4.00
true_cfg1.00
id_weight1.00
seed0
enable_safety_checkerfalse
max_sequence_length256
start_step0

PuLID is the identity adapter that gave Flux a face without wrecking prompt adherence - it beat InstantID on that front mostly because it actually shipped a Flux port. The usual way to run it locally means juggling the PuLID ComfyUI nodes, the insightface models, and a pile of weights that eat VRAM. This node skips all of that: it's a thin wrapper over fal.ai's fal-ai/flux-pulid endpoint, so you drop in a reference face, type a prompt, and get back an image of that person doing what you asked. Cloud inference, pay per image, no local model files.

It's part of pvlprk/comfyui-pvl-api-nodes, the "ComfyUI Assistant Node" grab bag. If you already have any other PVL fal node installed, this one's already on disk - no extra setup beyond a FAL_KEY.

How it works

The node converts your reference_image tensor to a base64 PNG and posts it (plus your prompt and settings) to https://fal.run/fal-ai/flux-pulid. The endpoint runs Flux with PuLID's identity embedding injected, then hands back the result, which the node converts back to a ComfyUI IMAGE. Note that it uses the base64 data-URI route, not the fal.storage upload route - so no temporary file upload dance, just a bigger JSON payload.

Inputs that matter

  • prompt is the only required input - what the person is doing, wearing, or where they are.
  • reference_image is the face. One good, well-lit, front-facing shot beats five average ones.
  • id_weight (default 1.0) is your likeness dial. Crank toward 2-3 if it doesn't look like them; drop it if the face starts to overpower everything else.
  • true_cfg (default 1.0) and guidance_scale (default 4.0) are the Flux-specific CFG knobs. Leave them alone until you know what you're chasing.
  • max_sequence_length (128/256/512, default 256) trades speed against prompt-following on long prompts.
  • width/height default to 1024, step 8. seed 0 means random (only sent to the API if > 0).

Outputs: image (the generated IMAGE) and request_id - a string you can use to look the run up in your fal.ai dashboard.

Install

Via ComfyUI Manager (search "ComfyUI Assistant Node" / "pvlprk"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/pvlprk/comfyui-pvl-api-nodes

Restart, then set FAL_KEY in the environment that launches ComfyUI (it checks FAL_KEY, FAL_API_KEY, FAL_CLIENT_KEY). Full pack dependency install is heavy - diffusers, scikit-image, google-genai, etc. - but this node itself only needs requests.

Where people get burned

  • It's paid. Each image burns fal credits, so the "generate 8 and pick the best" habit gets expensive fast.
  • Face quality depends on the reference, not the node. A blurry, angled, or occluded reference gives you a worse likeness than PuLID locally would - same model, same limitation, just less control to compensate.
  • The safety checker is off by default. The KB notes PuLID carries the InsightFace commercial licensing trap locally; via the API you sidestep the install, but know that the endpoint's own safety toggles are on you. Flip enable_safety_checker on if you're shipping output anywhere.
CategoryPVL/FAL

Inputs (13)

NameTypeDefaultDescription
promptSTRING
reference_imageoptIMAGE
negative_promptoptSTRINGbad quality, worst quality, text, signature, watermark, extra limbs
widthoptINT102464–4096
heightoptINT102464–4096
num_inference_stepsoptINT201–100
guidance_scaleoptFLOAT4.000–20
true_cfgoptFLOAT1.000–10
id_weightoptFLOAT1.000–10
seedoptINT00–2147483647
enable_safety_checkeroptBOOLEANfalse
max_sequence_lengthoptCOMBO2563 options: 128, 256, 512
start_stepoptINT00–100

Outputs (2)

NameTypeDescription
imageIMAGE
request_idSTRING