"""Default ComfyUI workflow templates as Python dicts."""
from .config import settings
def get_default_negative_prompt() -> str:
"""Return a sensible default negative prompt."""
return "blurry, low quality, distorted, deformed"
def build_txt2img_workflow(
prompt: str,
negative_prompt: str = "",
model: str | None = None,
width: int | None = None,
height: int | None = None,
steps: int | None = None,
cfg_scale: float | None = None,
seed: int = -1,
) -> dict:
"""Build a standard txt2img workflow for ComfyUI.
Returns a dict ready to submit via POST /prompt.
"""
model = settings.default_model if model is None else model
width = settings.default_width if width is None else width
height = settings.default_height if height is None else height
steps = settings.default_steps if steps is None else steps
cfg_scale = settings.default_cfg_scale if cfg_scale is None else cfg_scale
negative_prompt = negative_prompt or get_default_negative_prompt()
return {
"3": {
"class_type": "KSampler",
"inputs": {
"seed": seed,
"steps": steps,
"cfg": cfg_scale,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1.0,
"model": ["4", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["5", 0],
},
},
"4": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": model,
},
},
"5": {
"class_type": "EmptyLatentImage",
"inputs": {
"width": width,
"height": height,
"batch_size": 1,
},
},
"6": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": prompt,
"clip": ["4", 1],
},
},
"7": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": negative_prompt,
"clip": ["4", 1],
},
},
"8": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["3", 0],
"vae": ["4", 2],
},
},
"9": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI-MCP",
"images": ["8", 0],
},
},
}
def build_img2img_workflow(
prompt: str,
negative_prompt: str = "",
model: str | None = None,
image_path: str = "",
denoise: float = 0.75,
steps: int | None = None,
cfg_scale: float | None = None,
seed: int = -1,
) -> dict:
"""Build an img2img workflow for ComfyUI.
Similar to txt2img but uses LoadImage instead of EmptyLatentImage
and adds a denoise parameter to KSampler.
"""
model = settings.default_model if model is None else model
steps = settings.default_steps if steps is None else steps
cfg_scale = settings.default_cfg_scale if cfg_scale is None else cfg_scale
negative_prompt = negative_prompt or get_default_negative_prompt()
return {
"3": {
"class_type": "KSampler",
"inputs": {
"seed": seed,
"steps": steps,
"cfg": cfg_scale,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": denoise,
"model": ["4", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["10", 0],
},
},
"4": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": model,
},
},
"5": {
"class_type": "LoadImage",
"inputs": {
"image": image_path,
},
},
"6": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": prompt,
"clip": ["4", 1],
},
},
"7": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": negative_prompt,
"clip": ["4", 1],
},
},
"8": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["3", 0],
"vae": ["4", 2],
},
},
"9": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI-MCP",
"images": ["8", 0],
},
},
"10": {
"class_type": "VAEEncode",
"inputs": {
"pixels": ["5", 0],
"vae": ["4", 2],
},
},
}