arkennemasis fal · Flux 2 Klein 4B LoRA · $0.01/MP
Styles, characters and consistency, at a cent a megapixel
- images
- image_paths
- timings
- has_nsfw_concepts
- seed
- prompt
- info
Klein's quiet superpower in the first half of 2026 wasn't speed, it was that it does styles. Flux.1 never could - the community comparison went straight to the point: "Klein does styles very well, that's something Flux.1 couldn't do, and it created images that astonished me." So a node that generates with up to three LoRAs attached is a more interesting proposition here than it would be on most checkpoints.
This is the distilled 4B with a loras box: four-step sampling, Apache 2.0 weights, $0.01 per megapixel. Twice the plain 4B node, which you're paying for the LoRAs rather than for better generation.
The LoRA box, honestly
It's a JSON text box, and it can't see your local files - fal downloads the weights, so what goes in the box is a URL-reachable weight file, in fal's own list format, up to three entries. Check the model page for the exact JSON shape. Leave it empty and you're just paying double for the plain model, so don't.
Two constraints that are hard, not soft. Klein 4B and 9B LoRAs do not interoperate - mixing them gives you mush, which is the most expensive kind of mistake on a paid endpoint. And many published Klein LoRAs target a base checkpoint and are then applied at inference to the distilled model, which works; if you're unsure which side a LoRA belongs on, the pack has both.
Stacking, though, is genuinely fine: Klein tolerates multiple LoRAs at full strength where Z-Image Turbo starts burning past two. Three is the ceiling here.
The inputs
prompt - sentences, not tags. The encoder is a Qwen3 LLM behind a chat template, and prompt weighting is disabled for it entirely, so (style:1.3) does nothing. What works is plain language with explicit ownership: "A realistic photo of a woman sitting on a beach. She is looking at the camera." And if your LoRA has a trigger word, use it - a silent LoRA is usually an uninvoked one.
num_inference_steps - 4 by default. Go to 8. The documented effect on distilled Klein is fewer mangled hands and cleaner text, and because fal bills per megapixel rather than per step, the extra steps are free.
seed - -1, or locked when you've found the take you like. Klein gives real variety between seeds, unlike some of the turbo-style models.
image_size - presets (landscape_4_3 default) or custom with image_size_width / image_size_height. num_images - the cost multiplier. output_format - png, jpeg, webp. enable_safety_checker - flagged images return black, and disabling needs account authorisation.
There's no guidance_scale and no negative_prompt here: distilled, so guidance is baked in and a negative prompt has no unconditional pass to attach to.
Outputs
images is the IMAGE batch - into SaveImage, an upscaler, a board for comparing variants. image_paths gives the saved locations as a STRING, timings is fal's timing JSON, has_nsfw_concepts reports the checker, seed is an INT, prompt echoes what the model saw, 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, and the node is under arkennemasis → fal → Image → Flux. ComfyUI-Manager → Install via Git URL with the same repo does it without a terminal. The pack's requirements.txt contains one line, httpx, and that's for the ChatGPT/Codex nodes - the fal side is standard library only.
Key, in the .env alongside run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Where people get burned
Paying double for no LoRA. If the box is empty, use the cheaper non-LoRA node in this pack.
A LoRA URL that fails mid-run - private links, throttled hosts. Test one weight before you stack three.
Local-file confusion. This node has no idea what's in ComfyUI/models/loras. It only ever sees URLs.
Cached reruns. reuse_identical_run defaults on, so identical inputs return the stored files from output/fal instead of billing again - good for your wallet, surprising when you expected variation. max_cost_usd (default $20) is checked before upload, so an over-budget run costs nothing at all.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt to generate an image from. | |
| 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 | landscape_4_3 | The size of the image to generate. '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. |
| loras | STRING | List of LoRA weights to apply (maximum 3). JSON. Empty leaves it out. | |
| 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. |