Skip to main content

Workflows

cmfy.cloud executes ComfyUI workflows. This page explains the workflow format and how to prepare your workflows for the API.

What Is a Workflow?​

A ComfyUI workflow is a graph of nodes that process data. Each node performs one operation:

In this example:

  1. Load Checkpoint - Loads the AI model from disk
  2. CLIP Encode - Converts your text prompt to embeddings
  3. Empty Latent - Creates a blank latent image
  4. KSampler - The main generation step
  5. VAE Decode - Converts latent to pixel image
  6. Save Image - Outputs the final image

Workflow Format​

The API accepts workflows in ComfyUI's native format - a JSON object where each key is a node ID:

{
"3": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "https://huggingface.co/stabilityai/sdxl/model.safetensors"
}
},
"6": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "a beautiful sunset over mountains",
"clip": ["3", 1]
}
},
"5": {
"class_type": "EmptyLatentImage",
"inputs": {
"width": 1024,
"height": 1024,
"batch_size": 1
}
}
}

Node Structure​

Every node has:

FieldRequiredDescription
class_typeYesThe ComfyUI node type (e.g., KSampler, VAEDecode)
inputsYesParameters for this node
_metaNoOptional metadata (ignored by the system)

Connecting Nodes​

Nodes connect by referencing other nodes' outputs. The format is [node_id, output_index]:

{
"6": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "a cat",
"clip": ["3", 1] // Output #1 from node "3"
}
}
}

The ["3", 1] means "take output slot 1 from node 3". Output slots are zero-indexed, so slot 1 is the second output from that node (slot 0 is the first).

Converting from ComfyUI​

If you have a workflow in the ComfyUI desktop app:

Step 1: Enable Dev Mode​

In ComfyUI, go to Settings > Enable Dev mode options.

Step 2: Save API Format​

Click Save (API Format) instead of regular Save. This exports the workflow in the format the API expects.

Step 3: Replace Model Paths​

Change local file paths to URLs:

// Before (local file)
"ckpt_name": "v1-5-pruned-emaonly.ckpt"

// After (URL)
"ckpt_name": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt"

Model URLs​

cmfy.cloud downloads models on-demand from URLs you provide. Supported sources:

SourceURL Pattern
Hugging Facehttps://huggingface.co/...
Civitaihttps://civitai.com/api/download/...
Amazon S3https://*.s3.amazonaws.com/...
Google Cloudhttps://storage.googleapis.com/...
Azure Blobhttps://*.blob.core.windows.net/...
Cloudflare R2https://*.r2.cloudflarestorage.com/...
Use Consistent URLs

Always use the same URL for the same model. The routing system uses URL matching to find nodes with cached models. Different URLs for the same model will be treated as different models.

Common Node Types​

Here are frequently used nodes and their typical inputs:

Checkpoint Loaders​

Load the main AI model:

{
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "https://..."
}
}

Text Encoders​

Convert text to model-understandable embeddings:

{
"class_type": "CLIPTextEncode",
"inputs": {
"text": "your prompt here",
"clip": ["checkpoint_node", 1]
}
}

Samplers​

The core generation step:

{
"class_type": "KSampler",
"inputs": {
"seed": 42,
"steps": 20,
"cfg": 7.5,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1.0,
"model": ["checkpoint_node", 0],
"positive": ["positive_prompt_node", 0],
"negative": ["negative_prompt_node", 0],
"latent_image": ["latent_node", 0]
}
}

LoRA Loaders​

Add style or character LoRAs:

{
"class_type": "LoraLoader",
"inputs": {
"lora_name": "https://...",
"strength_model": 0.8,
"strength_clip": 0.8,
"model": ["checkpoint_node", 0],
"clip": ["checkpoint_node", 1]
}
}

Workflow Limits​

To ensure fair resource usage:

LimitValue
Maximum nodes500
Maximum payload size10 MB
Required fieldsclass_type, inputs

Best Practices​

1. Use Minimal Workflows​

Include only the nodes you need. Smaller workflows are faster to validate and execute.

2. Reuse Model URLs​

When possible, use popular models that other users also use. These are more likely to be cached on GPU nodes.

3. Test Locally First​

Run your workflow in ComfyUI locally before submitting to the API. This catches errors faster.

4. Use Deterministic Seeds​

Set explicit seed values for reproducible results. Random seeds make debugging harder.

Example: Complete Workflow​

Here's a minimal text-to-image workflow:

{
"1": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors"
}
},
"2": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "a serene mountain landscape at sunset, digital art",
"clip": ["1", 1]
}
},
"3": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "blurry, low quality",
"clip": ["1", 1]
}
},
"4": {
"class_type": "EmptyLatentImage",
"inputs": {
"width": 1024,
"height": 1024,
"batch_size": 1
}
},
"5": {
"class_type": "KSampler",
"inputs": {
"seed": 12345,
"steps": 25,
"cfg": 7.0,
"sampler_name": "euler_ancestral",
"scheduler": "normal",
"denoise": 1.0,
"model": ["1", 0],
"positive": ["2", 0],
"negative": ["3", 0],
"latent_image": ["4", 0]
}
},
"6": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["5", 0],
"vae": ["1", 2]
}
},
"7": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "output",
"images": ["6", 0]
}
}
}

What's Next?​

Was this page helpful?