arkennemasis fal · Flux 2 Klein 4B Base LoRA · $0.016/MP
Text-to-image with your own weights attached
- images
- image_paths
- timings
- has_nsfw_concepts
- seed
- prompt
- info
Text-to-image on the un-distilled Klein 4B, with up to three LoRA weights applied on top. It's the companion to the base edit LoRA node: same idea, generation instead of editing. $0.016 per megapixel, which is nearly double the plain 4B base node, so the LoRA has to be earning its keep.
The honest framing: base Klein is the checkpoint people train against, and this node is how you sample from one of those fine-tunes without owning the hardware to run it. The 4B bases train in about 12GB of VRAM in bf16 and 8GB in int8, which is the most accessible fine-tuning target Black Forest Labs has ever shipped - and it's Apache 2.0, so what you make with it is yours.
The LoRA box
loras is a JSON text box, not a dropdown of your local files. That's not laziness on the pack's part: fal has to download the weights itself, so what goes in the box is fal's own LoRA list format - up to three entries - pointing at weights that are reachable by URL rather than sitting in your ComfyUI/models/loras folder. Check the model page for the exact JSON shape. Leave it empty and you get plain base 4B.
Two rules that will save you a wasted run. Size matters: 4B and 9B LoRAs are not interchangeable, and mixing them produces garbage, not a subtle degradation. Base versus distilled matters: most published Klein LoRAs are trained on a base checkpoint, which is exactly why this node exists rather than a LoRA on the distilled node.
The inputs
prompt - sentences with clear ownership and spatial relations. The encoder is a Qwen3 LLM reading a chat turn, and prompt weighting is disabled for it, so tag soup and (emphasis:1.4) both underperform plain language.
negative_prompt - a field that exists on this node and not on its distilled sibling, because base runs a real guidance pass. Use it for what you don't want; it works here.
guidance_scale - 5, which is where the community runs base Klein (4-5). num_inference_steps - 28 on the node against the 50 that base really wants, and since fal bills per megapixel rather than per step, raising it costs time and not money.
acceleration (none / regular / high, default regular), image_size (presets or custom with the width/height boxes), num_images, output_format (png default), enable_safety_checker - flagged renders return black squares rather than errors, and turning it off needs fal account authorisation.
Outputs
images is the IMAGE batch, image_paths the saved files as a STRING, timings fal's timing JSON, has_nsfw_concepts the checker's verdict, seed an INT you can lock, prompt the string the model received, and info a JSON blob 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; the node sits under arkennemasis → fal → Image → Flux. ComfyUI-Manager → Install via Git URL with the same repo is the no-terminal path. The pack's only declared dependency is httpx, for the ChatGPT/Codex half of it - fal needs nothing beyond the standard library.
Key, in the .env by run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Where people get burned
Expecting base to look like a finished model. It's a training checkpoint. At low step counts it's soft and the anatomy is worse than the distilled 4B; that isn't a bug, it's what you're paying $0.016/MP for and why most people use it to validate a fine-tune rather than to ship output.
Wrong-size LoRAs - the single biggest waste of money on nodes like this. Read the LoRA card's base model line before you paste the URL.
LoRAs that need a trigger word. Many do, and the node won't tell you; if a LoRA seems to do nothing, your prompt is missing its keyword.
Cached reruns. reuse_identical_run defaults on, so an identical second run comes back from disk instead of being billed again - a nice guard against double-charging, confusing when you wanted variety. max_cost_usd (default $20) is checked before anything is uploaded; set it to a dollar or two while you're experimenting and an over-budget run costs nothing at all.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt to generate an image from. | |
| negative_prompt | STRING | Negative prompt for classifier-free guidance. Describes what to avoid in the image. Empty leaves it out. | |
| guidance_scale | FLOAT | 5.000–20 | Guidance scale for classifier-free guidance. |
| 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 | 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. |
| acceleration | COMBO | regular | The acceleration level to use for image generation. |
| 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. |