arkennemasis fal · Flux 2 Klein 4B Edit LoRA · $0.01/MP
The cheapest way to bring your own style to an edit
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- images
- image_paths
- timings
- has_nsfw_concepts
- seed
- prompt
- info
Here's a pricing quirk worth knowing before you pick a node: this is the distilled 4B edit endpoint with LoRA support, and it costs $0.01 per megapixel - the same as the plain distilled edit node. Over on the base side, adding a LoRA nearly doubles the rate. So if you want a style or consistency LoRA on a cheap edit, this is the node where the LoRA is effectively free.
Four steps by default, Apache 2.0 weights, up to three LoRAs stacked on top of an instruction edit.
The LoRA box
loras is a JSON text box, and it's the awkward part of any LoRA node that runs on fal: the weights have to be reachable by URL for fal to download, so your ComfyUI/models/loras folder might as well not exist. The box takes fal's own list format - a maximum of three entries, check the model page for the exact shape - and stays optional here (the plain edit node shows the same endpoint without it).
The rule that saves money: matching the size and the training base. 4B LoRAs and 9B LoRAs are not interchangeable and mixing them produces a broken image rather than a subtle quality dip. Most published Klein LoRAs are trained on a base checkpoint and then applied at inference to a distilled model like this one, which is fine - the size is the hard constraint. And read the LoRA card for a trigger word; a LoRA that appears to do nothing usually just isn't being invoked by your prompt.
Stacking itself is a Klein strength. The community's own comparison had Klein 9B handling three LoRAs at full strength without burning - the highest-scoring Klein thread of the first half of 2026 was a three-LoRA realism stack. Three is also the ceiling here.
The inputs
prompt - a command list, not a scene. remove blur and noise, fix exposure and color profile, unsharp mask, micro-contrast over sharp. Say what must not change, or the model invents a new subject.
image_1 - required, plus image_2 through image_6: fal uses the first four, batches ride along each socket, and the socket order is the reference order.
image_size - square_hd default, custom plus image_size_width / image_size_height.
num_inference_steps - 4. Take it to 8; the extra steps cost wall time, not money, and they're the documented fix for the model's anatomy wobble.
seed, num_images, output_format, enable_safety_checker (flagged results come back black; turning it off needs fal account authorisation).
No guidance_scale and no negative_prompt on this node - distilled, so guidance is in the weights and there's no unconditional pass for a negative prompt to steer. If you need those fields, the base edit LoRA variant has them for a bit more money.
Cost
$0.01 per megapixel of input and output, input resized to 1MP. A 1024×1024 edit from any number of references is about $0.02, and num_images is what makes it grow.
Outputs
images (the edited IMAGE batch), image_paths (STRING - the saved files), timings (fal's timing JSON), has_nsfw_concepts, seed (INT), prompt (STRING) and info (JSON: request id, cost estimate, saved files, fal's full answer).
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI, then look under arkennemasis → fal → Image → Flux. ComfyUI-Manager → Install via Git URL with the same repo is the equivalent. The pack pins exactly one dependency - httpx, for its ChatGPT/Codex nodes - and the fal nodes run on Python's standard library, so nothing lands in your environment.
Key in the .env by run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Where people get burned
A cold LoRA run with a bad URL. fal downloads the weights, so a private or throttled link is a failed run you waited for. Attach one LoRA first, confirm it works, then build the stack.
Expecting the LoRA to fix identity drift. It might, if it's a consistency LoRA - that's what they're for. A style LoRA will make the drift prettier, not absent.
Reruns returning the same file. That's reuse_identical_run (on by default) refusing to charge you twice for identical inputs. Turn it off for a different take. And a run that stops before uploading is max_cost_usd - set it low while experimenting; the check happens before the paid call, so a tripped cap costs nothing.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt to edit the image. | |
| 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 | 44–8 | The number of inference steps to perform. |
| image_size | COMBO | square_hd | The size of the generated image. If not provided, uses the input image size. '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. |
| 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). 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). | |
| image_5opt | 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_6opt | 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 | — |
| timings | STRING | — |
| has_nsfw_concepts | STRING | — |
| seed | INT | — |
| prompt | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |