DiffSynth: JoyAI Image Inference
JoyAI Image Inference — an edit node you prompt, not a text-to-image sampler
- pipe
- edit_image
- image
JoyAI-Image-Edit is JD's open editing model, and this is the node that uses it. The socket that matters is edit_image: wire an image and you're doing instruction editing, which is the entire point of the checkpoint. Leave it empty and you're asking a purpose-built editor to behave like a general text-to-image model, which mostly works and mostly disappoints.
Required sockets: pipe (from the JoyAI Image Loader), prompt, seed, num_inference_steps (default 30), height, width (1024). One output: image → Save Image.
The optional sockets
edit_image- the reference image. This is the whole workflow.cfg_scale- default 5. High enough that your negative prompt is live and doing something, which is unusual for a 2026 model and puts this closer to the classic SD workflow than to a distilled four-stepper.negative_prompt- use it at CFG 5.denoising_strength- default 1.0. On an edit node this is the difference between "re-imagine this image" and "adjust it": pull it down to 0.4-0.7 if you want to keep the original composition and only apply the instruction.max_sequence_length- default 4096, generous enough that long structured edit instructions won't get truncated. Don't bother trimming prompts here the way you would on a 512-token T5 model.shift- default 4, a flow-matching schedule shift. Leave it alone until you have a baseline.tiled,tile_size("30,52"),tile_stride("15,26") - tiling is off by default, and here the tile numbers are typed as comma-separated text rather than two integer fields, because the underlying parameter is a pair rather than a single number. Read through Wan's 8× VAE,30,52is roughly a 240×416-pixel tile, which is the sort of size you'd tile at for a large canvas.height/width- for an edit run these act as the output canvas, so set them near your input's aspect ratio or you're asking the pipeline to reframe the shot.
Honest notes
There isn't much community tuning for this model. The JoyAI name in the wild is mostly attached to a different JD project, so searches for settings will send you to Echo workflows and voice cloning instead. Practical upshot: start at the node's defaults, treat the shipped template as the reference implementation, and evaluate it against a plain instruction - "replace the sky with a sunset, keep the lighting on the subject" - rather than a five-clause prompt.
It's also worth knowing what you're buying. This is a Wan-VAE-backed editor with a .pth transformer; it's a solid mid-tier option, not a model with a LoRA ecosystem behind it. If your job is text-heavy editing or deep character recall, Ideogram 4 or FLUX.2's edit path are the better-equipped tools.
Install
# Manager: search "DiffSynth-ComfyUI" → Install → restart
pip install git+https://github.com/modelscope/DiffSynth-Studio.git
cd ComfyUI/custom_nodes && git clone https://github.com/modelscope/DiffSynth-ComfyUI.git
Template tab → the DiffSynth JoyAI Image Edit workflow has the four ModelConfigs, the Loader, this node and a Load Image feeding it. Change the instruction and run.
Troubleshooting
Instruction ignored: lower denoising_strength and make the instruction a single concrete change rather than a paragraph of vibes. Output reframed badly: match width/height to your input's aspect ratio. Everything is slow and orange: cfg_scale is doing a genuine two-pass sample at 5, which is correct, not a bug - drop steps before dropping CFG. Text in the image comes back garbled: that's the model, not your prompt; use a text-oriented model for that job.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | DIFFSYNTH_PIPE | — | |
| prompt | STRING | — | |
| seed | INT | 00–4294967295 | — |
| num_inference_steps | INT | 301–200 | — |
| height | INT | 102464–4096 | — |
| width | INT | 102464–4096 | — |
| negative_promptopt | STRING | — | |
| cfg_scaleopt | FLOAT | 5.00–10000 | — |
| edit_imageopt | IMAGE | — | |
| denoising_strengthopt | FLOAT | 1.00–10000 | — |
| max_sequence_lengthopt | INT | 40960–4294967295 | — |
| tiledopt | BOOLEAN | false | — |
| tile_sizeopt | STRING | 30,52 | — |
| tile_strideopt | STRING | 15,26 | — |
| shiftopt | FLOAT | 4.00–10000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |