Conditioning Grid (cond)
Regional prompting as a grid, without the spaghetti
- base
- CONDITIONING
You know the core-area-conditioning dance: a ConditioningSetArea per region, each with its own width/height/x/y, all fed into a ConditioningCombine chain that grows a new wire every time you add a region. It works, and it's miserable to edit. Conditioning Grid (cond) collapses that into one node: you define a grid of cells, drop a conditioning into each, and it stacks them into a single conditioning where each prompt only steers its own cell.
This is the multi-character / multi-scene workhorse: "person A on the left, person B on the right, both in a cafe" stops being four overlapping area nodes and becomes a 2×1 grid.
How it works
Under the hood it does exactly what you'd do by hand - it just automates it. For each cell, it calls the core ConditioningSetArea with the cell's width×height at position (col*width, row*height), then folds every result into ConditioningCombine along with the base conditioning. You get one CONDITIONING output that's ready for your KSampler.
Inputs that matter:
- columns / rows - grid dimensions (1–8 each, default 3×3).
- width / height - the pixel size of each cell (16–2048, default 256).
- strength - conditioning strength applied to every cell. The default of 3 is on the aggressive side; if cells bleed into each other, dial it down.
- base - a
CONDITIONINGthat covers everything outside and between the cells. The author's tip: an empty-stringCLIPTextEncodefor a clean base, or put shared elements in here (and lowerstrength) if you want common ground across cells. - The cell inputs - named
r1_c1,r1_c2, ...r{rows}_c{columns}. These don't exist until you right-click → "update inputs", the pack's ❔ convention. Each takes aCONDITIONING(wire from aCLIPTextEncodeorCLIPEncodeMultiple).
The trap: forgot to update inputs
Same gotcha as every multi-input node in this pack: set columns/rows, then right-click and hit "update inputs" to generate the matching cell sockets. Change the grid size and re-run it. If you see a r1_c1 input missing, that's why. You can leave a cell unconnected in some ComfyUI builds, but the intended flow is to feed every cell.
strength is per-cell but shared across all of them, so you can't give the left cell 1.0 and the right cell 0.7 with this node - that's a limitation to know before you commit. If you need per-cell strengths, hand-build with the core nodes.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/bmad4ever/comfyui_bmad_nodes
cd comfyui_bmad_nodes
pip install -r requirements.txt
or install "comfyui_bmad_nodes" via ComfyUI Manager and restart. It's pure core-API plumbing - no models, no extra downloads. If you're building grid-based regional prompts more than once, this saves you a genuinely silly amount of wiring.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| columns | INT | 31–8 | — |
| rows | INT | 31–8 | — |
| width | INT | 25616–2048 | — |
| height | INT | 25616–2048 | — |
| strength | FLOAT | 3.00 | — |
| base | CONDITIONING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |