arkennemasis fal · Flux 2 Klein 9B LoRA · $0.015/MP
Text-to-image with your own weights, $0.015 a megapixel
- images
- image_paths
- timings
- has_nsfw_concepts
- seed
- prompt
- info
Klein 9B distilled is the fastest good open image model you can't always run, and this node is its text-to-image endpoint with a LoRA slot - the plain generation half of the Klein pair. It's the node you reach for when you want the realism-stack results people post without owning a card that holds a 9B flow model plus a Qwen3-8B encoder.
What's actually running
Not a ComfyUI sampler. The node uploads nothing, submits to fal-ai/flux-2/klein/9b/lora on fal's queue, waits, and downloads the images to output/fal/fal-ai_flux-2_klein_9b_lora/. What comes back is distilled Klein 9B: 4-step, guidance-distilled, an LLM text encoder reading your prompt as a chat turn rather than CLIP tags. Two practical consequences, straight from the KB.
Your prompt should be sentences with explicit ownership and spatial relations, not tag soup. "masterpiece, best quality, 8k" does nothing here - there's no CLIP to weight and ((word:1.4)) is dead syntax on this encoder. And if anatomy goes wrong, that's the model's known weakness and it's baked in early, so batching four and picking is cheaper than re-rolling one.
The inputs
prompt - plain sentences. num_inference_steps is 4 to 8, default 4; the well-worn Klein trick is 8 steps, and at four images a run it costs you very little wall time.
image_size defaults to landscape_4_3; the presets are fal's standard square/portrait/landscape set plus custom, where image_size_width and image_size_height take over. Megapixels are the billing unit, so the size box is the price box.
num_images (1–4) generates a batch in one paid call - often the best value here, since you're likely picking one of four anyway. loras is a JSON list of up to three entries, each a URL, HuggingFace repo ID or local path; empty omits the field. seed at -1 lets the model choose; same seed and prompt reproduces.
output_format is png or jpeg or webp - plain generation here defaults to png, unlike the Pro and Max nodes. enable_safety_checker defaults on, and flagged images come back black rather than as an error.
The four shared options are worth knowing once: max_cost_usd (default $20, 0 = off) refuses a run before anything is sent if the estimate exceeds it; reuse_identical_run returns an already-paid identical result, even after a ComfyUI restart; extra_json merges raw JSON into the request for fields the node doesn't expose; max_concurrent (default 1) is a global cap on simultaneous paid fal calls, so a canvas of twenty of these doesn't fire twenty billed requests in the same second.
Outputs
images is the batch; wire it to a preview or SaveImage. image_paths is where they landed on disk, seed and prompt make a run reproducible and traceable, timings and has_nsfw_concepts come from fal, and info is the JSON record - request id, cost estimate, files, full response. Read info when you care what a session cost.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart, then put the key in the .env in the folder that holds run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
There's no key widget on the node on purpose - a key typed into a node gets written into every workflow JSON and every image's metadata you share later. And the fal provider adds no Python dependencies, so there is nothing to pip install for these nodes.
Where people get burned
Pricing: $0.015 per megapixel, so 1024×1024 is $0.015 and four images is $0.06 - cheap per image, easy to accumulate when a batch of twenty fiddles runs overnight. The LoRA list is the fiddly bit: wrong base (a 4B or Flux.1 LoRA), and you get silent no-op results. And if your subject's face has to stay the same person across a series, text-to-image plus a LoRA is the wrong tool - that's an edit job, and the Klein edit node with a consistency LoRA is where you want to be.
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. |