arkennemasis fal · Flux 2 Turbo Edit · $0.008/MP
Instruction editing at a fraction of a cent, if you mind the aspect ratio
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- images
- image_paths
- seed
- prompt
- timings
- has_nsfw_concepts
- info
Give it a photo and a sentence, get the photo back with the sentence applied. FLUX.2 [dev] does single-reference and multi-reference editing in the same checkpoint - that unification is the thing that made the Flux 2 line matter, because you stop maintaining a separate generator and editor. This node wraps the turbo variant of it at $0.008 per megapixel of input and output.
That pricing detail matters more than it looks. Input images are resized to 1MP, and you pay for the input too: a 512×512 source plus a 1024×1024 output is 1MP in + 1MP out = $0.016. Still nothing, but the price badge is honest about it, so trust the badge.
The honest comparison
If you run Klein locally, you already have an instruction editor that's faster and free. Kontext LoRAs, Qwen-Image-Edit, Klein 9B - the local editing space is crowded and good. What this node gives you that none of those do is FLUX.2 dev-grade comprehension without a 53GB fp16 pair and a 48GB card, and multi-image edits where each reference is a separate socket you can wire independently.
So: reach for it when your machine can't hold Flux 2 dev, or when you want to edit somebody's photo without setting up a local stack at all. Stay local when the picture can't leave your machine, or when you're doing a hundred iterations and the per-call metering starts to annoy you.
Editing with more than one image
image_1 is required; image_2 through image_6 are optional sockets, and fal only uses the first four. Each socket can carry a batch, and pictures are numbered in socket order - the first frame on socket 1 is picture one, and so on.
In practice this is how you do "put this jacket on this person" or "match this room's lighting": reference the subject on one socket and the thing to transfer on the next, then say what you want in the prompt. The model preserves identity across the references, which is the part that used to require a LoRA.
There's no mask here. If you need to protect specific pixels, this isn't the node - see the general inpainting or Kontext LoRA inpaint nodes in the same pack.
The aspect-ratio trap
image_size defaults to square_hd. Your source photo is probably not square. Leave this alone and you've asked for a square remake of a 16:9 picture, and the model will reframe your shot to get there. Set image_size to match your input, or pick custom and type the source dimensions into image_size_width / image_size_height. There's no "match the input" option on this endpoint.
That's a big enough deal that the pack ships a separate arkennemasis Match Aspect node whose whole job is measuring the image being edited and pinning the generator's output to that shape. On this node, checking the aspect ratio is step one of every workflow.
The rest of the settings are the usual: prompt, guidance_scale at 2.5 (Flux guidance, not CFG - don't set it to 7), seed at -1, num_images up to 4, enable_prompt_expansion off, enable_safety_checker on, output_format at png.
Outputs
images and image_paths for the graph and the files on disk (in output/fal/fal-ai_flux-2_turbo_edit/), plus seed, prompt (post-expansion), timings, has_nsfw_concepts, and info carrying the request id, cost estimate, saved files, and fal's raw answer.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI, or use ComfyUI-Manager → Install via Git URL. Only httpx is declared in requirements.txt and that's for the pack's Codex nodes - the fal nodes run on Python's standard library and download no weights.
# FAL_KEY goes in .env, not in a node widget
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Portable build: the folder with run_nvidia_gpu.bat.
Things that catch people out
Cached results. reuse_identical_run is on by default, so re-queuing unchanged inputs + the same picture bytes returns the file you already paid for. Turn it off for a fresh take - with a random seed, that's the difference between a new edit and the same one.
Connecting a batch to a single-image socket. The node stops with a clear message rather than guessing; pick your frame first with a ComfyUI image-select node.
Expecting a mask. There's no mask input, so a "fix just the eyes" prompt will re-render more of the picture than you asked for. That's a property of instruction editing, not of this node - the models that edit from a sentence can't promise the rest of the frame is untouched. The mask-based nodes in this pack exist for exactly that reason.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt to edit the image. | |
| guidance_scale | FLOAT | 2.500–20 | Guidance Scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you. |
| 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. |
| image_size | COMBO | square_hd | The size of the image to generate. The width and height must be between 512 and 2048 pixels. '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_prompt_expansion | BOOLEAN | false | If set to true, the prompt will be expanded for better results. |
| 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, if more are provided, only the first 4 will be used. 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, if more are provided, only the first 4 will be used. 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, if more are provided, only the first 4 will be used. 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, if more are provided, only the first 4 will be used. 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, if more are provided, only the first 4 will be used. 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, if more are provided, only the first 4 will be used. 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 | — |
| seed | INT | — |
| prompt | STRING | — |
| timings | STRING | — |
| has_nsfw_concepts | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |