# Rebuilding the workflow in the interface

This plan describes the original v1 graph. Create the nodes by searching for their technical identifier in ComfyUI. The translated labels may vary. The numbers in parentheses are the identifiers from the delivered JSON, useful for reading its links; the interface may assign other numbers during a manual rebuild.

## Shared nodes

| Identifier | Core type | Setting | Outputs used |
| --- | --- | --- | --- |
| 1 | CheckpointLoaderSimple | sd_xl_base_1.0.safetensors | MODEL, CLIP, VAE |
| 2 | EmptyLatentImage | width 1024, height 1024, batch_size 1 | LATENT |
| 3 | CLIPTextEncode | `negative_prompt` from the manifest | CONDITIONING |

Connect the CLIP output of the loader (1, slot 1) to the clip input of the negative text (3, slot 0).

## Three branches to create

| Variant | Positive text | KSampler | VAEDecode | SaveImage |
| --- | --- | --- | --- | --- |
| A, frontal | 4 | 5 | 6 | 7 |
| B, side | 8 | 9 | 10 | 11 |
| C, backlit | 12 | 13 | 14 | 15 |

Copy the full `prompt` of each variant into its positive CLIPTextEncode. All three texts share the `common_positive_prompt` prefix followed by the `light` phrase. The shared negative does not change.

For **each** branch, make these eight connections:

1. CLIP of the loader → clip of the positive text.
2. MODEL of the loader → model of the KSampler.
3. CONDITIONING of the positive text → positive of the KSampler.
4. CONDITIONING of the shared negative text → negative of the KSampler.
5. LATENT of the shared empty latent → latent_image of the KSampler.
6. LATENT of the KSampler → samples of VAEDecode.
7. VAE of the loader → vae of VAEDecode.
8. IMAGE of VAEDecode → images of SaveImage.

Total: 1 shared connection + 3 × 8 = **25 connections**. A 0.37.0 SaveImage node also has an IMAGE output; leave it unconnected. No external nodes and no input image source are needed.

## Settings for the three KSamplers

| Widget | Value |
| --- | --- |
| seed | 24092026 |
| control_after_generate | fixed |
| steps | 24 |
| cfg | 6.5 |
| sampler_name | euler |
| scheduler | normal |
| denoise | 1.0 |

In the UI JSON 0.4, `widgets_values` follows this order: `[24092026, "fixed", 24, 6.5, "euler", "normal", 1.0]`. The `fixed` control is an interface widget added to the seed; it is not an additional argument of the Python `sample` function.

The connected inputs of KSampler follow the order `model`, `positive`, `negative`, `latent_image`. The loader's outputs follow `MODEL`, `CLIP`, `VAE`. This distinction between widgets and sockets prevents shifting values in a hand-written JSON.

## Output names and verification

Enter each SaveImage's `output_prefix` from the manifest. The prefixes are different so the outputs don't become an anonymous series. Final numbering is handled by ComfyUI.

Save your rebuild in a new JSON. The identifiers and positions may differ from those in the folder; the delivered validator, deliberately strict, only accepts the identifiers from the v1 recipe. Then visually compare the chain and the settings, and validate the generation in your environment. The UI schema alone proves neither the presence of the model nor the success of the computation.

Sources: [node definitions 0.37.0](https://github.com/Comfy-Org/ComfyUI/blob/73c9bad4d21e7addbe1d13bc92eee0f1431b017d/nodes.py), [frontend widget value control 1.52.7](https://github.com/Comfy-Org/ComfyUI_frontend/blob/1a7a6b82514874545dc5e8203d0bd2188c2d9b18/src/scripts/widgets.ts), [UI schema 0.4](https://docs.comfy.org/specs/workflow_json_0.4).
