# 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({
"3": {
"class_type": "KSampler",
"inputs": {
"cfg": 6,
"denoise": 1,
"latent_image": [
"40",
0
],
"model": [
"48",
0
],
"negative": [
"7",
0
],
"positive": [
"6",
0
],
"sampler_name": "uni_pc",
"scheduler": "simple",
"seed": 558449140107503,
"steps": 20
},
"_meta": {
"title": "KSampler"
}
},
"6": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"38",
0
],
"text": "\"Medium shot. A little girl holds a bubble wand and blows out colorful bubbles that float and pop in the air. The background of this video is transparent. Realistic style.\"\t"
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"7": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"38",
0
],
"text": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt) Useless s"
}
},
"8": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"3",
0
],
"vae": [
"39",
0
]
},
"_meta": {
"title": "RGB VAE Decode"
}
},
"37": {
"class_type": "UNETLoader",
"inputs": {
"unet_name": "wan2.1_t2v_14B_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"_meta": {
"title": "Load Wan 2.1 t2v 14B"
}
},
"38": {
"class_type": "CLIPLoader",
"inputs": {
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"device": "default",
"type": "wan"
},
"_meta": {
"title": "Load Text Encoder"
}
},
"39": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_alpha_2.1_vae_rgb_channel.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"40": {
"class_type": "EmptyHunyuanLatentVideo",
"inputs": {
"batch_size": 1,
"height": 480,
"length": 33,
"width": 832
},
"_meta": {
"title": "Empty Hunyuan Video 1.0 Latent"
}
},
"48": {
"class_type": "ModelSamplingSD3",
"inputs": {
"model": [
"65",
0
],
"shift": 5
},
"_meta": {
"title": "ModelSamplingSD3"
}
},
"51": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "wan_alpha_2.1_vae_alpha_channel.safetensors"
},
"_meta": {
"title": "Load VAE"
}
},
"52": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"3",
0
],
"vae": [
"51",
0
]
},
"_meta": {
"title": "Alpha VAE Decode"
}
},
"65": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "wan_alpha_2.1_rgba_lora.safetensors",
"model": [
"37",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"80": {
"class_type": "SaveAnimatedWEBP",
"inputs": {
"filename_prefix": "ComfyUI",
"fps": 16,
"images": [
"86",
0
],
"lossless": True,
"method": "default",
"quality": 80
},
"_meta": {
"title": "Save Animated WEBP"
}
},
"82": {
"class_type": "ImageToMask",
"inputs": {
"channel": "red",
"image": [
"52",
0
]
},
"_meta": {
"title": "Convert Image to Mask"
}
},
"84": {
"class_type": "InvertMask",
"inputs": {
"mask": [
"82",
0
]
},
"_meta": {
"title": "Invert Mask"
}
},
"86": {
"class_type": "JoinImageWithAlpha",
"inputs": {
"alpha": [
"84",
0
],
"image": [
"8",
0
]
},
"_meta": {
"title": "Join Image with Alpha"
}
}
})
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)