arkennemasis fal · Flux 2 LoRA Gallery Face to Full Portrait · $0.021/MP
Extend a headshot into a body, and hope the shoes match
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- images
- image_paths
- seed
- prompt
- info
You have a cropped headshot and you need it to be a full portrait. This node is fal's flux-2-lora-gallery/face-to-full-portrait endpoint: feed it the face, get back a whole person, $0.021 per processed megapixel. It's a genuinely useful endpoint and also the one in the gallery that most obviously relies on the model's imagination, so set your expectations about the outfit before you run forty of them.
The mechanism
Flux 2 plus a LoRA trained to continue a cropped head into a full-length figure, exposed in ComfyUI by this pack's wrapper. Your picture is uploaded to fal's CDN, the job goes to fal's queue, and results are saved in output/fal/fal-ai_flux-2-lora-gallery_face-to-full-portrait/. The image you upload leaves your machine - normal for every node in this pack, worth remembering when the face belongs to a client or a child.
Inputs
image_1 is required and the tooltip is explicit: it wants a cropped face. Sockets run to image_6 - batches and multiple subjects both work, sent in socket order.
prompt defaults to the literal string Face to full portrait, and for once that isn't a placeholder; empty leaves the prompt out and the endpoint does fine on its own. Use it when you need to specify something: Face to full portrait, standing, business suit, neutral grey studio backdrop. What you're describing is the part that isn't in the picture - the body, the wardrobe, the background - because the face is already known.
lora_scale (0–2, default 1) is the strength of the effect, and it's the dial that decides how much the model invents versus how closely it hugs what you gave it.
Then the Flux 2 dials: guidance_scale (default 2.5), num_inference_steps (default 40, range 4–50), acceleration (none / regular), image_size defaulting to square_hd - which matters enormously here, since you're usually going taller than square, so choose portrait_4_3 or custom and set the height deliberately. num_images (1–4) gives you variations in one paid call. seed at -1 randomises; output_format and the safety checker are standard, with flagged output returned black.
max_cost_usd ($20), reuse_identical_run, extra_json and max_concurrent are the shared options: pre-flight cap, free reuse of an identical run, raw JSON passthrough, and a limit on simultaneous paid fal calls.
Outputs
images is the full portrait, ready for a save node or a compositing chain - this is the node you'd pair with a background or overlay step. image_paths gives you the files on disk, seed and prompt make the run reproducible, and info is the JSON with request id, estimate, saved files and fal's full response.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI, then:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
in the .env beside run_nvidia_gpu.bat. No pip step for the fal nodes.
Where people get burned
Identity is the whole game and Klein-lineage models are known for drifting it, so expect the body to be plausible and the outfit to be a lottery - a headshot with no clothing cue gives the model nothing to match, and it will invent a blazer. Give it wardrobe and setting in the prompt if they matter. Second: proportion. Continuing a tight crop often lands at the wrong focal length, so the head comes back slightly too large for the body; generate a few and compare rather than accepting the first.
Third, cost: it bills processed megapixels including your input, so a 2MP face plus a 1MP output is roughly $0.063 - and with num_images: 4 you're near a quarter a run. Batch deliberately. Fourth, the ethics don't disappear because the node is convenient: making full-body images of a real person from a photo of their face is exactly the sort of thing that should have a reason, and in some places a consent.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| image_1 | IMAGE | The URL of the cropped face image. Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| prompt | STRING | Face to full portrait | The prompt describing the full portrait to generate from the face. Empty leaves it out. |
| image_size | COMBO | square_hd | The size of the generated image. If not provided, the size of the input image will be used. 'custom' uses the width and height below. |
| image_size_width | INT | 102416–14142 | Width in pixels when image_size is 'custom'. |
| image_size_height | INT | 102416–14142 | Height in pixels when image_size is 'custom'. |
| guidance_scale | FLOAT | 2.500–20 | The CFG (Classifier Free Guidance) scale. Controls how closely the model follows the prompt. |
| num_inference_steps | INT | 404–50 | The number of inference steps to perform. |
| acceleration | COMBO | regular | Acceleration level for image generation. 'regular' balances speed and quality. |
| seed | INT | -1-1–2147483647 | Random seed for reproducibility. Same seed with same prompt will produce same result. -1 leaves it to the model. |
| enable_safety_checker | BOOLEAN | true | Whether to enable the safety checker for the generated image. Disabling it requires account authorization; unauthorized requests are always checked. |
| output_format | COMBO | png | The format of the output image |
| num_images | INT | 11–4 | Number of images to generate |
| lora_scale | FLOAT | 1.000–2 | The strength of the face to full portrait effect. |
| image_2opt | IMAGE | The URL of the cropped face image. Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| image_3opt | IMAGE | The URL of the cropped face image. Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| image_4opt | IMAGE | The URL of the cropped face image. Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| image_5opt | IMAGE | The URL of the cropped face image. Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| image_6opt | IMAGE | The URL of the cropped face image. Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap. |
| reuse_identical_runopt | BOOLEAN | true | If these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings. |
| extra_jsonopt | STRING | Advanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally. | |
| max_concurrentopt | INT | 11–32 | How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| image_paths | STRING | — |
| seed | INT | — |
| prompt | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |