{ "id": "comfyui_sd", "name": "Stable Diffusion + LoRA (local, ComfyUI)", "category": "generate", "description": "Prompt -> image via local SD/SDXL checkpoints + LoRAs (ComfyUI on Metal). Stacks multiple LoRAs and supports ControlNet (recolour a garment into N colourways with an identical silhouette). Cannot load FLUX/Z-Image LoRAs \u2014 those go to flux_local.", "accepts": [ "image" ], "produces": [ "image" ], "resources": "gpu", "entry": "run.py", "params_schema": { "type": "object", "properties": { "prompt": { "type": "string", "default": "", "description": "Positive prompt (put LoRA trigger words early)" }, "negative": { "type": "string", "default": "(worst quality, low quality:1.4), blurry, jpeg artifacts, watermark, text, deformed, bad anatomy, extra fingers", "description": "Negative prompt (ignored at cfg 1.0 on Turbo/Lightning)" }, "checkpoint": { "type": "string", "default": "Hyper_Realism_1.2_fp16.safetensors", "description": "SD1.5 = Hyper_Realism_1.2_fp16 (the only one LoRAs work with); SDXL = bigLust_v16 / sd_xl_base_1.0" }, "lora": { "type": [ "string", "array" ], "default": "", "description": "LoRA filename, or a LIST to stack them (style + texture together). Each entry may carry its own weight as 'name=0.6'. A LoRA on the wrong base architecture is a SILENT no-op \u2014 filenames lie, check metadata." }, "lora_weight": { "type": [ "number", "array" ], "default": 0.8, "minimum": 0, "maximum": 2, "description": "Weight, or a list matching `lora` order. Per-entry 'name=0.6' wins." }, "clip_skip": { "type": "integer", "enum": [ 1, 2 ], "default": 2, "description": "2 for all the local SD1.5 LoRAs (their training config)" }, "width": { "type": "integer", "default": 512, "description": "SD1.5: 512 (768 max). SDXL: 1024. Turbo: 512" }, "height": { "type": "integer", "default": 512, "description": "SD1.5: 512/768. SDXL: 1024" }, "steps": { "type": "integer", "default": 25, "description": "SD1.5/SDXL: 25-30. Turbo: 1-4. Lightning: 8" }, "cfg": { "type": "number", "default": 7.0, "description": "SD1.5/SDXL: 5-8. Turbo: 1.0. Lightning: 1-2 (wrong cfg = fried image)" }, "sampler": { "type": "string", "default": "dpmpp_2m", "description": "dpmpp_2m (+karras) is the workhorse; euler for Turbo/Lightning" }, "scheduler": { "type": "string", "default": "karras", "description": "karras normally; sgm_uniform for Lightning" }, "seed": { "type": "integer", "default": -1, "description": "-1 = random. Fix it when tuning LoRA weight." }, "batch": { "type": "integer", "default": 1, "minimum": 1, "maximum": 16, "description": "Images per job \u2014 brute-force seeds and pick" }, "controlnet": { "type": "string", "default": "", "description": "ControlNet model filename. Needs a control image passed as the job's input asset. Recolor holds the silhouette fixed while changing colour \u2014 N colourways of one garment sharing a byte-identical cut-out alpha." }, "controlnet_strength": { "type": "number", "default": 1.0, "minimum": 0, "maximum": 2, "description": "ControlNet conditioning strength" }, "controlnet_start": { "type": "number", "default": 0.0, "minimum": 0, "maximum": 1, "description": "Fraction of sampling at which conditioning starts" }, "controlnet_end": { "type": "number", "default": 1.0, "minimum": 0, "maximum": 1, "description": "Fraction of sampling at which conditioning ends" } } } }