arkennemasis fal · Flux 2 Klein 4B Edit · $0.01/MP
A cent an edit, and eight steps instead of four
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- images
- image_paths
- timings
- has_nsfw_concepts
- seed
- prompt
- info
Klein 4B distilled, doing edits, at $0.01 per megapixel of input and output - so a 1024×1024 edit from a 512×512 reference lands around two cents. That's the workhorse end of the family: Apache 2.0 weights, four-step sampling, editing and text-to-image in one checkpoint, and small enough that the four-step speed is the whole point.
If you want the local story, this is the model people ran on an 8GB card in about a second an image. On fal you're skipping the download and the VRAM and paying per call, which for occasional edits is the better deal and for constant edits is not.
What distilled means on this node
Two fields are missing, and they're missing by design. There's no guidance_scale and no negative_prompt, because guidance is trained into the distilled weights - there's no unconditional pass, so a negative prompt would have nothing to act on. It's the same reason the community advice for distilled Klein is "CFG 1"; on this endpoint that decision has already been made for you.
What you get instead is num_inference_steps, defaulting to 4, and this is the single most valuable thing you can change. The launch-week finding, from the model's own users: run the distills at 8 steps and you get rid of the body horror, the extra fingers and most of the garbled text. Fal bills per megapixel, not per step, so doubling the steps costs you seconds of wall time and exactly zero extra dollars. Do it before you decide Klein can't do hands.
The inputs
prompt - the edit instruction, and the field where people lose hours. Talk to it like a retoucher: remove blur and noise, fix exposure and color profile, shadow recovery. Describe the subject and the model slides into generator mode and hands you a different subject - identity drift is this family's documented weakness, not something you can prompt your way out of, and if a face has to survive the edit the usual answer is a consistency LoRA (there are LoRA variants of these nodes in the same pack).
image_1 through image_6 - sockets. image_1 is required; fal uses the first four, each accepts a batch, and they're ordered by socket position. Multi-reference editing is what Klein is actually good at, so use more than one.
image_size - square_hd by default; custom uses image_size_width / image_size_height. Remember this is the output shape.
num_images - the cost multiplier. output_format - png, jpeg, webp. seed - -1, or lock a good one.
enable_safety_checker - on by default, and it returns black squares rather than errors for flagged results. Disabling it needs account authorisation on fal; unauthorised requests get checked regardless.
Outputs
images is the edited IMAGE batch, image_paths is where the files landed as a STRING, timings is fal's timing JSON, has_nsfw_concepts is the checker's report, seed is an INT worth locking when you get a good edit, prompt echoes what the model received, and info is JSON with the request id, cost estimate, saved files and fal's full answer.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI and you'll find it under arkennemasis → fal → Image → Flux; ComfyUI-Manager → Install via Git URL with the same repo works too. The pack's only pinned dependency is httpx, for its ChatGPT/Codex nodes - the fal provider is standard-library only, so nothing else gets installed.
Key, in the .env next to run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Where people get burned
An unwanted warm cast. Flux 2 edits come back slightly warmer than the source, consistently and regardless of precision. Colour-match against the original when the frame rejoins a sequence.
Assuming the four steps are fine because the preview looks OK. Fingers pass at 4 steps and fail at 8, not the other way round. Run 8.
Expecting the negative prompt box. It isn't here. If you need one, the base edit variant in this pack has the field, because base still runs a real guidance pass.
Reruns that return the identical file. reuse_identical_run is on by default - same settings, same inputs, files still in output/fal, so it serves them instead of billing you twice. Turn it off for a new take. And keep max_cost_usd low while testing: the estimate is checked before upload, so a run that trips the cap costs nothing.
Inputs (19)
| 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). | |
| 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. |