Stability Structure Control
Keep the Bones, Change Everything Else
- image
- IMAGE
Same family as the sketch control node, different job. StabilityControlStructure keeps the layout of your input image and regenerates everything else from your prompt. You hand it a photo or render, describe a new subject or scene, and out comes an image that holds the original's composition - camera angle, spatial arrangement, the "bones" of the frame - while the content changes.
Locally, this is what depth and MLSD ControlNets do: a spatial condition pins down where things are, and the prompt decides what they are. The appeal of this node is that you don't extract anything yourself. No depth map, no pose skeleton, no preprocessor to babysit - you feed an image and Stability figures out the structure it's supposed to preserve. If you've ever wanted "same composition, but it's a cyberpunk street instead of a countryside lane," this is the shortest path to it in the pack.
How it works
The node POSTs the image and prompt to Stability's /v2beta/stable-image/control/structure endpoint. The control_strength dial (0–1, default 0.7) is the whole game: how hard the output is pinned to the input's structure. At 0.7 you get the composition held with room to reimagine content. Push toward 1.0 and the output stays nearly glued to the source's layout - at the top end you're basically doing a low-strength img2img where the structure dominates and the prompt has little room to change the picture. Drop it and the structure loosens into a vibe.
One honest caveat: "structure" is a fuzzy concept, and Stability doesn't document exactly which cues the model extracts. In practice it tracks the spatial arrangement well but doesn't reliably preserve things like pose or object boundaries that a dedicated OpenPose or depth ControlNet would. For "same arrangement, new content" it's great; for "exactly this pose, new character," a local control stack is still the precise tool.
Inputs and outputs
- image - required. The reference whose structure you keep.
- prompt - required. What the output should be.
- negative_prompt - optional.
- control_strength - 0–1, default 0.7. The main dial.
- seed - set for reproducibility.
- style_preset - 18 named looks;
noneby default. - output_format - png / jpeg / webp.
- api_key - per-node override.
Output: a single IMAGE.
Installing it
Part of the aicu-comfyui-stability-ai-api pack:
cd ComfyUI/custom_nodes
git clone https://github.com/aicuai/aicu-comfyui-stability-ai-api.git
cd aicu-comfyui-stability-ai-api
pip install -r requirements.txt
Or install via ComfyUI Manager (search "aicu-comfyui-stability-ai-api") and restart. You need a paid Stability AI key: node api_key field, STABILITY_API_KEY env var, or the pack's auto-generated config.ini.
Gotchas
Input validation mirrors the sketch node: 64px minimum sides, 4,096–~9.4MP total pixels, aspect ratio between 1:2.5 and 2.5:1. If your source is a huge panorama, crop it first. And the usual paid-API reality - every run costs credits and runs through Stability's moderation, so the node is a great convenience but not a free or an uncensored one. When the job is genuinely "keep the bones," it's the fastest way to get there without a local control stack.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| prompt | STRING | — | |
| api_keyopt | STRING | — | |
| negative_promptopt | STRING | — | |
| control_strengthopt | FLOAT | 0.700–1 | — |
| seedopt | INT | 00–4294967295 | — |
| style_presetopt | COMBO | none | 18 options: none, 3d-model, analog-film, anime, cinematic, comic-book, +12 |
| output_formatopt | COMBO | png | 3 options: png, jpeg, webp |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |