Tiled Captioned Custom Sampler
The tiled upsample, wired into your own sampler stack
- noise
- guider
- sampler
- sigmas
- vae
- image
- clip
- captioner
- upscale_model
- affine_schedule
- affine_options
- image
- latent
- captions
Tiled Captioned Custom Sampler is the same tiled upscaler as its sibling Tiled Captioned KSampler, with the KSampler taken out of it. No model, no positive/negative, no steps, no denoise widget - you hand it a noise source, a guider, a sampler and a sigma schedule, and it refines your image over overlapping tiles in one pass.
So the real question is when you want this one rather than the simpler node: when you're already running a custom sampler chain. A BasicGuider on a distilled model at CFG 1, a DualCFGGuider, a sigma schedule you've tuned elsewhere, shaped starting noise, or a sampler wrapped for something the stock list doesn't do. If you just want "bigger and nicer", the KSampler sibling gets you there with a third of the wiring.
What it does with the picture
The image is upscaled in pixel space first - through upscale_model if you wire one, then resized to upscale_by on whole VAE pixels - then encoded, in VAE tiles once it's past 1536×1536, and planned into a grid of overlapping latent tiles. Each tile's conditioning carries its own area and a feathered blend mask, the model is patched to run one tile at a time, and the grid samples together across your sigmas, blending every step. That's the whole trick: nothing is stitched afterwards, so there's no seam to hunt. Batch in, batch out, each frame sampled on its own.
tiling at auto plans 512px tiles for an SD1-family model and 1024 for everything else, quarter-tile overlap. manual opens the tile size and overlap widgets - the knob you'll actually use on an 8–12GB card, since smaller tiles with more overlap trade speed for memory.
What you have to wire
Four sockets do the work the other node hides inside widgets:
sigmas- from BasicScheduler. Its denoise is now your "how much gets redrawn" control: 0.2–0.35 adds detail without moving the composition, past 0.5 you're repainting.guider- CFGGuider is the obvious pick; BasicGuider and DualCFGGuider work too. The node checks for the attributes a guider has to have and tells you plainly if it got something else.sampler- from KSamplerSelect or any SAMPLER source, including an affine-wrapped one.dpm_fast,dpm_adaptive,uni_pcanduni_pc_bh2don't carry the affine; you get a console notice rather than a failed run.noise- where the starting noise comes from. Quietly the nicest thing about the custom variant: swap in shaped noise and the tile pass inherits it.
Add vae, image and upscale_by (default 2.0) for the picture itself, and affine if you want scale and offset pushed in from inside the loop - on opens affine_space and affine_acts_on, with affine_schedule and affine_options as optional dict sockets.
The caption block
clip, captioner, prompt, style, system_prompt - identical to the KSampler node. Load a vision model with Load CLIP (qwen3vl_8b_fp8_scaled.safetensors), wire the model's own text encoder into clip, and every tile is prompted with a caption of what that tile holds instead of your whole-scene prompt. prompt gives the captioner context; it isn't sampled. style is appended to each caption.
Two caveats. It's a model pass per tile, so it's slow, and per-tile captioning sits exactly where vision models are weakest - attribution across multiple subjects. captions returns one numbered line per tile plus an overview, so read it before trusting it. One wiring rule that catches people: with a captioner connected, the guider has to carry a positive prompt for the captions to replace. A guider without one gets a hard error telling you to use CFGGuider or BasicGuider, or to disconnect the captioner.
Outputs are image, latent and captions - the last one empty with no captioner.
Installing the pack
Manager, search WAS Node Suite v3. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
ComfyUI 0.14.0+, Python 3.10+. Nothing else gets installed: requirements.txt is empty and the pack never runs pip. Your config.yaml lands under <ComfyUI user dir>/was-node-suite/ on first start. The captioner model you download yourself into ComfyUI/models/text_encoders - features.network is false out of the box, and for a pack whose headline feature is a vision model reading your tiles, that's the right default.
If it misbehaves
Nothing changed in the output. Check sigmas first - fewer than two steps and the node passes the encoded image straight through. A 0.05 denoise over six steps isn't a bug, it's just very little.
A subtle grid at 4x. Raise the overlap. Tile divergence - a tile growing its own window, colour drifting between neighbours - is the classic failure of tiled upscaling, and if there's a ControlNet in the conditioning, keep it: this node crops the control hint per tile, which is the standard fix.
Out of memory. Tile size, not your GPU.
An old workflow shows missing nodes. That's the v2 → v3 migration; four retired ids come back through the missing-node dialog's replace button.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| noise | NOISE | Where the noise laid over the whole picture comes from. Its seed also seeds the captions, written again only when the seed, picture, captioner, prompt or tiling changes. | |
| guider | GUIDER | What steers the denoising, as CFGGuider. With a captioner each tile's caption replaces the text of its positive prompt. | |
| sampler | SAMPLER | The sampler to wrap, from KSamplerSelect or any other SAMPLER source. Every stock sampler carries the affine except dpm_fast, dpm_adaptive, uni_pc and uni_pc_bh2, which is reported in the console rather than failing the run. | |
| sigmas | SIGMAS | The noise levels to step through, as BasicScheduler gives them. Its denoise sets how much of the picture is redrawn. | |
| vae | VAE | The VAE of the model, which encodes the picture, decodes a LATENT source and decodes the answer. | |
| image | IMAGE,LATENT | The picture to refine, as IMAGE, or a LATENT made with the VAE wired to vae; each one of a batch is sampled on its own. A LATENT at upscale_by `1.0` with no upscale model is sampled as it is, keeping its noise_mask. | |
| upscale_by | FLOAT | 2.000.25–8 | Size of the answer against the picture. `1.0` = refine at the same size; `2.0` = twice as wide and tall. The upscale model runs first where one is wired. |
| tiling | COMBO | `auto` = tiles the size the model was trained at, 512 for SD1 and 1024 for the rest, sharing a quarter of a tile; `manual` = set the tile size and overlap. | |
| affine | COMBO | `off` = sample as it is; `on` = scale and offset the whole picture from inside the sampler's loop, which pushes texture and contrast in as the tiles refine. | |
| clipopt | CLIP | The text encoder from the loader the model came from. It encodes each tile's caption; with no captioner it is not used. | |
| captioneropt | CLIP | A vision language model from Load CLIP that writes each tile's prompt, as `qwen3vl_8b_fp8_scaled.safetensors`. Unwired, every tile takes the positive prompt. | |
| promptopt | STRING | The prompt the picture was made from, or what it shows, as `a top-down view of a space station`. The captioner reads it to name what each tile holds; it is not sampled. | |
| styleopt | STRING | Words added to the end of every tile's caption, as `oil painting, sharp focus`. | |
| upscale_modelopt | UPSCALE_MODEL | An upscale model run on the picture before it is sampled, as `4x-UltraSharp`. | |
| affine_scheduleopt | DICT | The per-step strength curve from an Affine Schedule node. Left unwired the affine ramps up over the middle of the run, from a fifth of the way in to four fifths. | |
| affine_optionsopt | DICT | Pattern parameters and mask shaping from an Affine Options node. Leave it unwired and every value takes its default. A pattern set there wins over the pattern widget. | |
| system_promptopt | STRING | You write the prompt an image model uses to repaint a crop of a larger picture. - You are shown the whole picture with its tiles ruled and numbered and the crop's tile outlined in yellow, and the crop itself at full detail. Describe only what lies inside the crop. - Name each subject and object inside the crop, largest first, including any only partly in frame. For each, say which part of it shows, where that part sits within the frame and how much of the frame it fills. For a person or animal only partly in the crop, name exactly which part of the body shows and whose it is, as the whole picture shows it. Then describe their surfaces, textures, colours and lighting, and any legible text in double quotes. - Use the whole picture and the overview only to recognise and name what the crop shows. Most of what they show lies outside the crop. Never name anything that is not inside it. - Keep the medium and style of the whole picture. - Where the crop holds only empty background, sky, water or a plain surface, name that surface and its colour in a few words. - Describe what is there directly. Write one plain paragraph of at most 60 words, with no preamble and no list. Never write the words tile, crop, overview, outlined, numbered, attached or image, and never say where the crop sits in the whole picture. | The rules each tile's caption is written under. A line such as `Name every plant species you can identify.` adds a rule. |
| stagesopt | INT | 11–8 | Passes that reach upscale_by, each enlarging by the same factor and re-captioning before it refines: `1` = one pass; `2` at upscale_by `4.0` = two 2x passes. At upscale_by `1.0` each stage refines the last one again at the same size. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | The refined pictures. |
| latent | LATENT | The refined latents, for a further pass. |
| captions | STRING | The overview and every tile's caption, one numbered line each. Empty with no captioner. |