# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"60": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI",
"images": [
"84:8",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"73": {
"class_type": "LoadImage",
"inputs": {
"image": "image_qwen_image_union_control_lora_input_image.png"
},
"_meta": {
"title": "Load Image"
}
},
"74": {
"class_type": "Canny",
"inputs": {
"high_threshold": 0.8,
"image": [
"77",
0
],
"low_threshold": 0.4
},
"_meta": {
"title": "Detect Edges (Canny)"
}
},
"75": {
"class_type": "PreviewImage",
"inputs": {
"images": [
"74",
0
]
},
"_meta": {
"title": "Preview Image"
}
},
"77": {
"class_type": "ImageScaleToTotalPixels",
"inputs": {
"image": [
"73",
0
],
"megapixels": 1,
"resolution_steps": 1,
"upscale_method": "lanczos"
},
"_meta": {
"title": "Scale Image to Total Pixels"
}
},
"84:3": {
"class_type": "KSampler",
"inputs": {
"cfg": 1,
"denoise": 1,
"latent_image": [
"84:72",
0
],
"model": [
"84:66",
0
],
"negative": [
"84:71",
0
],
"positive": [
"84:70",
0
],
"sampler_name": "euler",
"scheduler": "simple",
"seed": 70741926012422,
"steps": 4
},
"_meta": {
"title": "KSampler"
}
},
"84:37": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "qwen_image_fp8_e4m3fn.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Diffusion Model"
}
},
"84:38": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors",
"device": "default",
"type": "qwen_image"
},
"_meta": {
"title": "Load CLIP"
}
},
"84:39": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "qwen_image_vae.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"84:6": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"84:38",
0
],
"text": "Extreme close-up shot, realistic digital illustration, close eyes, peaceful,oil painting with thick application, girl with curly hair, large black flower, black nail polish, ring details, soft light and shadow, dark green backdrop, delicate hair texture, smooth skin rendering, fine artistic details, dreamy and elegant atmosphere, dark style, grotesque. White hair, huge black flower behind her (with yellow stamens, green stems and leaves), black turtleneck clothing, green leaves and black flowers around, artistic illustration style, sharp color contrast, mysterious atmosphere, delicate brushstrokes, thick oil painting, thickly applied oil painting, the whole picture is filled with layered flowers, huge, petals spreading, beautiful composition, unexpected angle, layered background. Macro, eyes looking down, thick application, brushstrokes, splatters, mottled, old, extremely romantic, light and shadow, strong contrast, maximalist style, full-frame composition."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"84:66": {
"class_type": "ModelSamplingAuraFlow",
"inputs": {
"model": [
"84:79",
0
],
"sampling": "flow",
"shift": 3.1
},
"_meta": {
"title": "ModelSamplingAuraFlow"
}
},
"84:69": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "qwen_image_union_diffsynth_lora.safetensors",
"model": [
"84:37",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"84:7": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"84:38",
0
],
"text": " "
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"84:70": {
"class_type": "ReferenceLatent",
"inputs": {
"conditioning": [
"84:6",
0
],
"latent": [
"84:72",
0
]
},
"_meta": {
"title": "Set Reference Latent"
}
},
"84:71": {
"class_type": "ReferenceLatent",
"inputs": {
"conditioning": [
"84:7",
0
],
"latent": [
"84:72",
0
]
},
"_meta": {
"title": "Set Reference Latent"
}
},
"84:72": {
"class_type": "VAEEncode",
"inputs": {
"pixels": [
"74",
0
],
"vae": [
"84:39",
0
]
},
"_meta": {
"title": "VAE Encode"
}
},
"84:79": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "Qwen-Image-Lightning-4steps-V1.0.safetensors",
"model": [
"84:69",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"84:8": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"84:3",
0
],
"vae": [
"84:39",
0
]
},
"_meta": {
"title": "VAE Decode"
}
}
})
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)