Nodes/arkennemasis - ChatGPT / Codex / fal AI nodes/arkennemasis fal · Flux General Differential Diffusion · per compute second
ComfyUI Node

arkennemasis fal · Flux General Differential Diffusion · per compute second

A change map instead of a mask, so edits fade instead of stopping

By Hishamahmer·Created 3 months ago·Updated 9 days ago· 11
arkennemasis fal · Flux General Differential Diffusion · per compute second
  • image
  • change_map_image
  • fill_image_fill_image_1
  • fill_image_fill_image_2
  • fill_image_fill_image_3
  • fill_image_fill_image_4
  • fill_image_fill_image_5
  • fill_image_fill_image_6
  • reference_image
  • images
  • image_paths
  • timings
  • has_nsfw_concepts
  • prompt
  • seed
  • info
◄prompt►
◄image_sizesquare_hd►
◄image_size_width1024►
◄image_size_height1024►
◄num_inference_steps28►
◄seed-1►
◄loras►
◄control_loras►
◄controlnets►
◄controlnet_unions►
◄ip_adapters►
◄easycontrols►
◄guidance_scale3.50►
◄real_cfg_scale3.50►
◄use_real_cfgfalse►
◄use_cfg_zerofalse►
◄num_images1►
◄enable_safety_checkertrue►
◄reference_strength0.65►
◄reference_start0.00►
◄reference_end1.00►
◄base_shift0.50►
◄max_shift1.15►
◄output_formatpng►
◄use_beta_schedulefalse►
◄schedulereuler►
◄negative_prompt►
◄nag_scale3.00►
◄nag_tau2.50►
◄nag_alpha0.25►
◄nag_end0.25►
◄strength0.85►
◄max_cost_usd20.0►
◄reuse_identical_runtrue►
◄extra_json►
◄max_concurrent1►

Differential diffusion is the answer to a problem every mask-based editor has: masks are binary and edits aren't. You get a hard boundary, or you get blur, and neither is what you wanted when the change should graduate from "definitely" in the middle to "nothing at all" at the edges.

Differential diffusion replaces the mask with a change map - a greyscale image where black means leave this alone, white means regenerate it, and every grey in between means "somewhere in the middle". Instead of a region switch flipping per pixel, you get a continuous field. It's been a steady if modest topic in the community for two years, active through mid-2026, and it's one of the genuinely distinctive things you can do on a hosted endpoint.

This is fal's Flux General endpoint with the differential-diffusion pipeline selected, so it also carries every extension the general node has: LoRA, ControlNet, IP-Adapter, EasyControl.

The two inputs that define it

image - required. The photo you're editing.

change_map_image - required. This is the greyscale map. Paint it yourself in any image editor: white where the change is strongest, black where nothing may move, grey where you want a partial transition. A gradient around a face, a soft ring around an object being replaced, a blurred blob where a new element goes.

strength defaults to 0.85 and reads like every other denoise dial here: 1.0 completely remakes the image, 0.0 preserves it. Think of it as the ceiling of the change map - the map says where, strength says how far in total.

Building a usable change map is the actual work, and there's a reason this technique stayed niche: the map is another artefact to author and version. But when you need a soft blend rather than a composited edge, nothing else does it.

The rest of the node

Everything from the general endpoint is present, so this is the place to be precise about what you leave empty:

  • prompt and negative_prompt - the negative only genuinely bites through NAG, exposed here as nag_scale (3), nag_tau (2.5), nag_alpha (0.25) and nag_end (0.25). Don't exceed nag_scale 3.
  • loras, control_loras, controlnets, controlnet_unions, ip_adapters, easycontrols - JSON fields, all optional, all expecting URLs fal can fetch. Local files in your models/loras folder are not reachable. Empty is the right value until you need one.
  • image_size (square_hd default, custom for exact dimensions), num_inference_steps 28, seed -1, guidance_scale 3.5, use_real_cfg (false - and it increases both time and price when enabled), use_cfg_zero (false), scheduler euler, base_shift 0.5, max_shift 1.15, use_beta_schedule false, output_format png.
  • Six optional fill_image_* sockets and reference_image with reference_strength / reference_start / reference_end for reference-only conditioning.

Outputs

images and image_paths (under output/fal/fal-ai_flux-general_differential-diffusion/), plus timings, has_nsfw_concepts, prompt, seed, and info.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis

Restart ComfyUI, or use ComfyUI-Manager → Install via Git URL. The pack declares httpx for its Codex nodes; the fal provider itself needs nothing past the standard library, and no model files are downloaded.

FAL_KEY=your-key-from-fal.ai/dashboard/keys

in the .env next to run_nvidia_gpu.bat (portable build) or your ComfyUI folder. There's no key widget, deliberately.

The one thing to understand about the price

This endpoint is billed per compute second with no per-run figure, so its title reads "per compute second" rather than a dollar rate. That has a concrete consequence: max_cost_usd has nothing to compare against. The default $20 cap can't stop this node, because the node genuinely doesn't know what a run will cost until fal bills it. The same is true on a few other compute-billed endpoints in this pack.

Practical read: don't fire this off in a 40-branch fan-out and walk away. One call at a time is what max_concurrent (default 1) gives you, and that's the right setting here.

reuse_identical_run (default on) is your sharpest cost control: the fingerprint covers the settings and the bytes of both the image and the change map, so re-queuing the same job after a crash returns the saved file instead of paying again.

Mask or change map?

Worth saying plainly, because it's the decision the node forces. A mask plus compositing locally is still the only way to guarantee that unmasked pixels come back bit-identical - and that's the one thing an instruction edit or a full-frame re-render can't offer. Differential diffusion is not that. It's a per-pixel strength field on a hosted generation, so the untouched-looking areas are generated too, just barely moved.

If your requirement is "nothing outside the mask may change, provably", do it locally with a mask and a composite. If your requirement is "this change should fade out across the jawline instead of tearing", this is the node.

Categoryarkennemasis/fal/Image/Flux

Inputs (45)

NameTypeDefaultDescription
promptSTRINGThe prompt to generate an image from.
image_sizeCOMBOsquare_hdThe size of the generated image. 'custom' uses the width and height below.
image_size_widthINT102416–14142Width in pixels when image_size is 'custom'.
image_size_heightINT102416–14142Height in pixels when image_size is 'custom'.
num_inference_stepsINT281–50The number of inference steps to perform.
seedINT-1-1–2147483647The same seed and the same prompt given to the same version of the model will output the same image every time. -1 leaves it to the model.
lorasSTRINGThe LoRAs to use for the image generation. You can use any number of LoRAs and they will be merged together to generate the final image. JSON. Empty leaves it out.
control_lorasSTRINGThe LoRAs to use for the image generation which use a control image. You can use any number of LoRAs and they will be merged together to generate the final image. JSON. Empty leaves it out.
controlnetsSTRINGThe controlnets to use for the image generation. Only one controlnet is supported at the moment. JSON. Empty leaves it out.
controlnet_unionsSTRINGThe controlnet unions to use for the image generation. Only one controlnet is supported at the moment. JSON. Empty leaves it out.
ip_adaptersSTRINGIP-Adapter to use for image generation. JSON. Empty leaves it out.
easycontrolsSTRINGEasyControl Inputs to use for image generation. JSON. Empty leaves it out.
guidance_scaleFLOAT3.500–20The CFG (Classifier Free 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.
real_cfg_scaleFLOAT3.500–5The CFG (Classifier Free 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.
use_real_cfgBOOLEANfalseUses classical CFG as in SD1.5, SDXL, etc. Increases generation times and price when set to be true. If using XLabs IP-Adapter v1, this will be turned on!.
use_cfg_zeroBOOLEANfalseUses CFG-zero init sampling as in https://arxiv.org/abs/2503.18886.
num_imagesINT11–10The number of images to generate. This is always set to 1 for streaming output.
enable_safety_checkerBOOLEANtrueIf 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.
reference_strengthFLOAT0.65-3–3Strength of reference_only generation. Only used if a reference image is provided.
reference_startFLOAT0.000–1The percentage of the total timesteps when the reference guidance is to bestarted.
reference_endFLOAT1.000–1The percentage of the total timesteps when the reference guidance is to be ended.
base_shiftFLOAT0.500.01–5Base shift for the scheduled timesteps
max_shiftFLOAT1.150.01–5Max shift for the scheduled timesteps
output_formatCOMBOpngThe format of the generated image.
use_beta_scheduleBOOLEANfalseSpecifies whether beta sigmas ought to be used.
schedulerCOMBOeulerScheduler for the denoising process.
negative_promptSTRINGNegative prompt to steer the image generation away from unwanted features. By default, we will be using NAG for processing the negative prompt. Empty leaves it out.
nag_scaleFLOAT3.001.01–10The scale for NAG. Higher values will result in a image that is more distant to the negative prompt.
nag_tauFLOAT2.50The tau for NAG. Controls the normalization of the hidden state. Higher values will result in a less aggressive normalization, but may also lead to unexpected changes with respect to the original image. Not recommended to change this value.
nag_alphaFLOAT0.250.01–1The alpha value for NAG. This value is used as a final weighting factor for steering the normalized guidance (positive and negative prompts) in the direction of the positive prompt. Higher values will result in less steering on the normalized guidance where lower values will result in considering the positive prompt guidance more.
nag_endFLOAT0.250.01–1The proportion of steps to apply NAG. After the specified proportion of steps has been iterated, the remaining steps will use original attention processors in FLUX.
imageIMAGEURL of image to use as initial image.
change_map_imageIMAGEURL of change map.
strengthFLOAT0.850.01–1The strength to use for differential diffusion. 1.0 is completely remakes the image while 0.0 preserves the original.
fill_image_fill_image_1optIMAGEURLs of images to be filled for redux prompting Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1).
fill_image_fill_image_2optIMAGEURLs of images to be filled for redux prompting Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1).
fill_image_fill_image_3optIMAGEURLs of images to be filled for redux prompting Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1).
fill_image_fill_image_4optIMAGEURLs of images to be filled for redux prompting Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1).
fill_image_fill_image_5optIMAGEURLs of images to be filled for redux prompting Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1).
fill_image_fill_image_6optIMAGEURLs of images to be filled for redux prompting Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1).
reference_imageoptIMAGEURL of Image for Reference-Only
max_cost_usdoptFLOAT20.00–100000Safety 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_runoptBOOLEANtrueIf 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_jsonoptSTRINGAdvanced: 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_concurrentoptINT11–32How 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)

NameTypeDescription
imagesIMAGE—
image_pathsSTRING—
timingsSTRING—
has_nsfw_conceptsSTRING—
promptSTRING—
seedINT—
infoSTRINGJSON: request id, cost estimate, saved files and fal's full answer.