modelbeast/server/operators/comfyui_sd/manifest.json
m3ultra 4c05a9daa8 docs: wan_video + ardy_motion measured RAM/speed (two-machine verification)
wan_video 5B q8 verified clean on M3 Ultra (148.7s) and M2 Max (503.7s),
identical 9.2GB max RSS on both; 81GB 'footprint' on m2max identified as
MLX opportunistic cache, not demand. Frame-identical output at same seed
across machines. HARDWARE.md gains wan_video and ardy_motion rows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 16:44:08 +10:00

129 lines
4.1 KiB
JSON

{
"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"
}
}
}
}