arkennemasis fal · Flux 2 LoRA Edit · $0.021/MP
4 reference images, your LoRA, and the best open editor in the room
- image_1
- image_2
- image_3
- image_4
- images
- image_paths
- seed
- prompt
- timings
- has_nsfw_concepts
- info
If the KB is right that “Flux 2 dev, even at fp8 turbo, is the best local edit model by far” - and the people doing serious editing work do keep saying that - then this is the node that gets you that model without the 53GB of weights. It's the editing endpoint of FLUX.2 [dev] with a LoRA slot and up to four reference images, at $0.021 per megapixel of input and output.
The mechanism, briefly
The node is a wrapper around fal-ai/flux-2/lora/edit: it uploads your pictures to fal's CDN, submits a queued job with your prompt and settings, polls until it's done, and saves the results into output/fal/fal-ai_flux-2_lora_edit/. Anything you connect to the image sockets leaves your machine - that's the deal, not a defect.
What matters about the model underneath: [dev] does text-to-image, single-reference and multi-reference editing in one checkpoint, it composes from several reference images better than anything else open, and it's the tier that supports character sheets. It's also slow and heavy - 28 inference steps at 2.5 guidance by default, because it isn't a distilled 4-stepper.
Inputs
prompt is an instruction on the file. From the editing guides that circulate: name the action and name what must not change - "zoom out until the sitting woman's white sneakers are visible. Maintain the faces. Maintain the posture." Vague vibes produce a remixed picture rather than an edit.
image_1 is required; sockets run to image_6, but fal accepts four images maximum and counts every frame of a connected batch, numbered in socket order. This is the multi-reference case: person plus garment plus prop, all conditioning the same generation.
guidance_scale (0–20, default 2.5) is your adherence dial. num_inference_steps runs 4–50 with a default of 28 - don't knock it down to 4 expecting Klein behaviour, the model isn't step-distilled. acceleration (none / regular / high) trades some quality for turnaround; regular is the default.
loras takes a JSON list of up to three - URL, HuggingFace repo ID or local path - and empty leaves it out. enable_prompt_expansion (off) lets an LLM rewrite your prompt, which is convenient and occasionally annoying. image_size defaults to square_hd; use custom if the aspect ratio of your source matters, since nothing here preserves it automatically. num_images (1–4), output_format (png default), seed (-1 means the model decides), and the safety checker, which returns flagged results as black images.
Shared options: max_cost_usd ($20) refuses the run pre-upload if the estimate exceeds it, reuse_identical_run gives you a paid-identical re-run for free, extra_json merges raw JSON for unsupported fields, max_concurrent caps concurrent paid fal calls.
Outputs
images is the edited image batch; the rest is bookkeeping you'll actually use - image_paths, seed, prompt, timings, has_nsfw_concepts, and info with the request id, cost estimate, files and fal's full response.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI, then add the key to the .env that sits beside run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
No pip step for the fal nodes - that provider is standard library only; the httpx dependency in the pack is for its ChatGPT/Codex nodes.
Where people get burned
Cost first, because it's doubled here: $0.021 per megapixel of input and output, so a 1024×1024 result from a 512×512 source is $0.042, and num_images: 4 is four output megapixels. Second, the LoRA surcharge - fal adds 50% per gigabyte for stacks over 2GB, and the node's badge doesn't know your LoRA sizes, so the estimate can understate a heavy stack by 1.5× to 2.5×.
Third, the thing the model is bad at: [dev] is strong on composition and character sheets, but if you only need one small change to a photo, you're paying for a 32B model to do a job a smaller editor does for a fifth of the price. Reach for this when the edit genuinely needs multi-reference understanding.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt to generate an image from. | |
| guidance_scale | FLOAT | 2.500–20 | Guidance Scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you. |
| seed | INT | -1-1–2147483647 | The seed to use for the generation. If not provided, a random seed will be used. -1 leaves it to the model. |
| num_inference_steps | INT | 284–50 | The number of inference steps to perform. |
| image_size | COMBO | square_hd | The size of the image to generate. The width and height must be between 512 and 2048 pixels. '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'. |
| num_images | INT | 11–4 | The number of images to generate. |
| acceleration | COMBO | regular | The acceleration level to use for the image generation. |
| enable_prompt_expansion | BOOLEAN | false | If set to true, the prompt will be expanded for better results. |
| enable_safety_checker | BOOLEAN | true | If set to true, the safety checker will be enabled. Disabling it requires account authorization; unauthorized requests are always checked, and images flagged as unsafe are returned as black images. |
| output_format | COMBO | png | The format of the generated image. |
| image_1 | IMAGE | The URLs of the images for editing. A maximum of 4 images are allowed. Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| loras | STRING | List of LoRA weights to apply (maximum 3). Each LoRA can be a URL, HuggingFace repo ID, or local path. JSON. Empty leaves it out. | |
| image_2opt | IMAGE | The URLs of the images for editing. A maximum of 4 images are allowed. 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 URLs of the images for editing. A maximum of 4 images are allowed. 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 URLs of the images for editing. A maximum of 4 images are allowed. 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 (7)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| image_paths | STRING | — |
| seed | INT | — |
| prompt | STRING | — |
| timings | STRING | — |
| has_nsfw_concepts | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |