Every block in api/blocks names what it gives a block after it ("gives": its sampler and its
output node; {} for one that changes the step it is put on) and its own model loader
("own_model"). api/block_chain.py builds a list of steps on a new tab: the picture first, each
next block anchored to what the step before gave, by near_node_id and a new page-only
save_node_id (canvas_roles.js findRoles pins the output node), so a canvas with several
samplers and outputs is no guess. add_nodes' answer names the block it built.
Redraw with another model and face/hand detailing now take the step before's picture
("$save.images") instead of the sampler's decode, which after an enlargement is the older
picture. The two-model routes are built as two-step chains; routes.json no longer names the
loaders.
Checked through the real page on the test ComfyUI: the Tile route on two Anima models (base on
Harem 1.5, Tile redraw on Kirazuri v4, from the base's picture and prompts), then face and hand
detailing after it took the Tile step's colour-matched picture.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upscale held by Tile takes in the tile upscale, the Anima Tile detail
upscale and the second-model upscale: its redraw has its own copy of the
canvas's model line (copy_of "$sampler.model": loader and LoRAs, titled
"Upscale model"), so a second model is one set_model and the LoRAs stay;
on Anima it is the user's tested route (latent 1.22x, Tile LLLite,
denoise 0.85). The iterative upscale goes. add_nodes no longer lists every
block name, and the repaint hints name the use, not a block.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The panel's text for each of the 18 blocks (about, zh and en) is one short sentence; where it came from and how it was tried stay under Details, the AI's instructions (after, notes) unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 18 blocks are grouped into 7 uses (a block's "job": repaint,
new_background, upscale, refine, follow, detail, process); a block that is
not its use's default has a "want" word (best, 2x, pose, ...).
add_nodes(use=…, want=…) has reference_blocks.pick choose the first by rank
this ComfyUI can run (packs and models present, not turned off), the block
taking a second picture when one is given; block= by name still works.
begin_task's directory is a line a use with its wants, the rest by what it
needs ("LanPaint: repaint best"), so it no longer grows with the blocks and
the word budget tiers are gone. Tried live: use=new_background with two
pictures built place_in_scene.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
place_in_scene takes two pictures (add_nodes' new scene argument, $scene in
a block marked "scene"): the character is cut out (inspyrenet-rembg), the
place scaled and cropped to its size (GetImageSize, ImageScale), the
character pasted on (ImageCompositeMasked) and everything else redrawn at
denoise 0.5 with the edge grown 6 px, so shadow and ground meet it while
the place keeps its look. Tried on an RTX 4050 6 GB with SDXL (Illustrious)
832x1216: about 40 s.
The blocks' short words are shorter so begin_task stays under 4000
characters.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
change_scene cuts the character out of a handed picture (inspyrenet-rembg),
inverts it and redraws only the rest at denoise 1.0 from the prompt's new
scene; GrowMask lets 6 px of the edge be redrawn for the seam. Tried on an
RTX 4050 6 GB with SDXL (Illustrious) 832x1216: about 30 s, the character
kept, the forest replaced by a night street.
A picture handed to a block may be written "name.png [output]" as Load
Image shows it. Two block descriptions are shorter so begin_task stays
under 4000 characters.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- api/block_models.json: the 15 models the ways recommend, each with its
Hugging Face / Civitai / GitHub links, size, SHA256 (all checked against the
sites), licence and folder. A block's "models" names its recommended ones; the
Ways panel ticks those here (by name, or by size for a renamed copy) and
downloads a missing one in a click with model_download.downloadFrom, its hash
checked.
- A block's "tested": the card (RTX 4050 laptop, 6 GB), sizes and a whole run's
time, shown in the panel and told to the AI with the block (answer.tested).
- color_lineart gets an Anima variant with Anima's lineart LLLite.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- upscale_tile: the 1.25x upscale with a tile ControlNet holding the redraw
(the source's 0.6 to 80%), so it can redraw at 0.5; NoobAI's tile model for
NoobAI/Illustrious, the union one for SDXL, Anima's tile-repair LLLite on
Anima (slow on a 6 GB card, the AI is told to say so).
- color_lineart: a line drawing, inverted to white on black, steers a lineart
ControlNet; its lines are left as a preview.
- A union ControlNet gets SetUnionControlNetType for what it follows.
ControlNets not scanned yet take their base from their folder or name.
- MissingModel: a block's model not in ComfyUI's lists makes add_nodes read
them anew once (a model just downloaded into a subfolder), then try again.
- The upscales prefer the least enlarging model that reaches their size.
Live on the isolated 8199 ComfyUI: NoobAI tile upscale 77 s, Anima tile 710 s,
lineart colouring 34 s (the union model found after the lists were read anew).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>