arkennemasis fal · Nano Banana Lite Edit · ~$0.05/image
Six image sockets and a sentence of instruction
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- images
- image_paths
- description
- info
The node for "change one thing about this picture"
Every local editing stack you've used needs a mask: paint the shirt, write a prompt about a shirt, hope. This node doesn't. You give it an image and a sentence - "swap the wall colour to deep green, keep the furniture and lighting identical" - and the closed model decides what to touch.
That's why it's worth wiring into a local graph. It's not replacing your inpainting setup; it's the escape hatch for edits where building the mask would take longer than the edit is worth, and for the classes of edit (text on objects, relighting, colour changes, keeping a face recognisable) where these Gemini-backed endpoints are simply better than anything you have local.
The inputs that matter
Six image sockets, one prompt, and that's the shape of it:
- image_1 through image_6 - all optional, each may carry a batch. They're sent in socket order, so the first picture on socket 1 is "number 1" to the model. This is how you do multi-image edits: person on
image_1, jacket onimage_2, "put the jacket on the person". - prompt - the instruction. Talk to it like a person briefing an editor, and say what to keep as well as what to change. "Only change X" is the phrase that saves you a re-roll.
- aspect_ratio - default
auto, and it supports the extreme ratios (4:1,1:8, etc.). On an edit this matters more than it looks:autocan let the model reframe, and a reframed edit is usually not what you wanted. If you need the output to match your input's shape exactly, the pack ships a neighbouring utility node for exactly that job (arkennemasis Match Aspect), which measures the image being edited and pins the generator's output to that shape. - num_images - 1 to 4, billed per image.
- output_format -
png,jpeg,webp. - seed -
-1by default; set one if you want the same edit from the same inputs twice. - system_prompt - a system instruction, empty by default.
- safety_tolerance -
1to6, default4. Google's moderation with a bit of slack. - limit_generations - on by default; forces one image per prompting round and ignores in-prompt "make me several" instructions.
- thinking_level -
(not set),minimal,high. Optional reasoning pass before drawing.
Shared guards: max_cost_usd (default $20, checked before upload), reuse_identical_run (no double-billing identical inputs, survives restarts), extra_json (raw JSON merge for missing fields), max_concurrent (default 1 paid fal call at a time graph-wide).
How it works, and what it costs
The node uploads your pictures to fal's CDN (free - only the submit bills), calls google/nano-banana-lite/edit, and writes results into output/fal/google_nano-banana-lite_edit/. Pricing is token-based and the node's ~$0.05/image badge is an approximation for a simple one-image edit; image tokens on the output side are the expensive ones ($37.50 per million), so multi-image inputs and long instructions move the number. Trust the pre-run estimate over the badge when the run matters.
By the way - the fal endpoint's own output is fixed 1K. Editing a 4K photo doesn't give you a 4K edit back.
Outputs
images (the edited IMAGE batch), image_paths, description (fal's text for the result), info (request id, cost estimate, saved files, fal's raw answer).
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install -r comfyui-arkennemasis/requirements.txt
Restart ComfyUI. (ComfyUI-Manager's Install via Git URL with the repo URL works too.) The only declared dependency is httpx; the fal provider itself uses Python's standard library, so nothing exotic gets pulled in.
Key line in the .env next to your launcher:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Where people get burned
Reference order is not negotiable, and batches flatten. Six sockets, each accepting a batch, means the model's "Image 3" could be the second picture on socket 2 - they're numbered in socket order, first picture first. Keep one image per socket until you've confirmed which is which.
The model redraws more than you asked. These endpoints are generative editors, not masked inpainting. Identical faces drift, backgrounds quietly change, and resolution is whatever the endpoint decided. Say "preserve exactly" in the prompt and expect to reroll a couple of times.
auto aspect ratio can re-frame your picture. If the composition must survive, pin the shape.
Moderation applies at Google's end. safety_tolerance loosens; it does not unlock. Nothing local can patch a filter that lives in the model.
Small new packs deserve a read. This one is a fresh, single-author Node pack of API wrappers - the category that once shipped a credential stealer. The key handling here is done sensibly (env file, no key widgets), but reading a network-touching pack before you run it is habit worth keeping.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt for image editing. | |
| system_prompt | STRING | Optional system instruction that steers the model's persona and output style across the request. Leave blank to omit; when provided, it is sent as the system instruction to Gemini (or as a system message on OpenAI-compatible providers). Empty leaves it out. | |
| aspect_ratio | COMBO | auto | The aspect ratio of the generated image. Supports extreme ratios: 4:1, 1:4, 8:1, 1:8. |
| num_images | INT | 11–4 | The number of images to generate. |
| seed | INT | -1-1–2147483647 | The seed for the random number generator. -1 leaves it to the model. |
| output_format | COMBO | png | The format of the generated image. |
| safety_tolerance | COMBO | 4 | The safety tolerance level for content moderation. 1 is the most strict (blocks most content), 6 is the least strict. |
| limit_generations | BOOLEAN | true | Experimental parameter to limit the number of generations from each round of prompting to 1. Set to `True` to to disregard any instructions in the prompt regarding the number of images to generate and ignore any intermediate images generated by the model. This may affect generation quality. |
| thinking_level | COMBO | (not set) | When set, enables model thinking with the given level ('minimal' or 'high') and includes thoughts in the generation. Omit to disable. '(not set)' leaves it to the model. |
| image_1opt | IMAGE | The URLs of the images to use for image-to-image generation or image editing. 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 to use for image-to-image generation or image editing. 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 to use for image-to-image generation or image editing. 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 to use for image-to-image generation or image editing. 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 to use for image-to-image generation or image editing. 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 to use for image-to-image generation or image editing. 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 (4)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| image_paths | STRING | — |
| description | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |