{
  "workflow_info": {
    "name": "Chroma Text-to-Image",
    "description": "Full-precision Chroma text-to-image on RunPod serverless (Chroma1-HD, UnCanny v1.3 BF16, Photonic Fusion BF16, UnGloryHail BF16 selectable). Reference sampler graph: euler + beta(0.45/0.45) scheduler, CFG guider, flow shift 1.0.",
    "version": "1.0.0",
    "author": "Oshun Platform",
    "category": "chroma",
    "tags": ["chroma", "runpod-serverless", "volume-backed", "text-to-image"],
    "estimated_time_seconds": 35,
    "gpu_requirement": "A5000"
  },
  "estimated_cost_usd": 0.011,
  "cost_note": "Estimate from the 2026-09-11 cost model (RTX 4090 $1.10/h flex); replaced by measured C.11 numbers. The upscale tail is not in this estimate: seedvr2_3b adds one SeedVR2 3B step at ~4 MP and needs the seedvr2-3b family (7.29 GB: the 6.78 GB transformer and the 0.50 GB VAE) on the image endpoint's model cache; its cost is unmeasured until A.01.08's live still.",
  "content_policy": "adult_ok",
  "policy_note": "Chroma1-HD is Apache-2.0 with no acceptable-use clause (licence facts verified 2026-09-13), and the UnCanny, UnGloryHail and Photonic Fusion checkpoints and the six Chroma LoRAs are Civitai releases whose permission flags limit distribution (option_policy), not content; the optional SeedVR2 3B upscale tail is Apache-2.0 and only restores the still.",
  "option_policy": {
    "checkpoint": {
      "chroma1-hd": {
        "distribution": "service",
        "content": "neutral"
      },
      "uncanny-v13-bf16": {
        "distribution": "service",
        "content": "neutral"
      },
      "photonic-fusion-debloated-bf16": {
        "distribution": "internal_only",
        "content": "neutral"
      },
      "ungloryhail-bf16": {
        "distribution": "service",
        "content": "explicit"
      }
    },
    "lora": {
      "lenovo-ultrareal": {
        "distribution": "service",
        "content": "neutral"
      },
      "chroma-realistic-slider": {
        "distribution": "service",
        "content": "neutral"
      },
      "chroma-defluxer": {
        "distribution": "service",
        "content": "neutral"
      },
      "style-muk": {
        "distribution": "service",
        "content": "neutral"
      },
      "nicegirls-ultrareal": {
        "distribution": "service",
        "content": "racy"
      },
      "nsfw-realism-v1": {
        "distribution": "service",
        "content": "explicit"
      }
    }
  },
  "inputs": {
    "prompt": {
      "type": "string",
      "required": true,
      "default": "a close-up photograph of a tiger's eye, intricately detailed fur, natural lighting, sharp focus, highest quality",
      "description": "Positive prompt in natural prose (Chroma responds to descriptive photography language)",
      "max_length": 4000
    },
    "negative_prompt": {
      "type": "string",
      "default": "This greyscale unfinished sketch has bad proportions, is featureless and disfigured. It is a blurry ugly mess with excessive gaussian blur, riddled with watermarks and signatures, smudged with leaking colors and nonsensical orientation of objects. Messy and abstract, filled with artifacts that disrupt the coherency of the composition, extreme chromatic aberrations and inconsistent lighting. Dull, monochrome colors and countless artistic errors.",
      "description": "Negative prompt (Chroma is CFG-guided, so this is honoured)",
      "max_length": 4000
    },
    "checkpoint": {
      "type": "enum",
      "options": [
        "chroma1-hd",
        "uncanny-v13-bf16",
        "photonic-fusion-debloated-bf16",
        "ungloryhail-bf16"
      ],
      "default": "chroma1-hd",
      "description": "Full-precision Chroma checkpoint on the network volume. ungloryhail-bf16 = UnGloryHail BF16 (A.03.01, Civitai model-version 2898818, the BF16 file 2776781 rather than the version's fp8 primary; content explicit; not rendered on a GPU yet, A.03.01 live still owed)."
    },
    "steps": {
      "type": "integer",
      "default": 26,
      "min": 8,
      "max": 60,
      "description": "Sampling steps (26 is the Chroma1-HD reference)"
    },
    "cfg": {
      "type": "float",
      "default": 3.8,
      "min": 1.0,
      "max": 10.0,
      "description": "Classifier-free guidance (3.8 is the Chroma1-HD reference)"
    },
    "seed": {
      "type": "integer",
      "default": -1,
      "description": "Random seed (-1 = random)"
    },
    "aspect": {
      "type": "enum",
      "options": [
        "square_1024",
        "portrait_896x1152",
        "landscape_1152x896",
        "portrait_832x1216",
        "landscape_1216x832"
      ],
      "default": "square_1024",
      "description": "Output aspect preset"
    },
    "batch_size": {
      "type": "integer",
      "default": 1,
      "min": 1,
      "max": 1,
      "description": "Images per run. Pinned to 1: the executor's resolution-scaled batch cap (C.12.19) allows a second latent only below ~0.5 MP, and every aspect preset here is ~1 MP. batch_size 2 at 896x1152 killed a live worker."
    },
    "sampler": {
      "type": "enum",
      "options": [
        "euler",
        "euler_ancestral",
        "dpmpp_2m",
        "dpmpp_2m_sde",
        "uni_pc",
        "res_multistep"
      ],
      "default": "euler",
      "description": "Sampler. euler is the Chroma1-HD reference; the rest are samplers already in use elsewhere in this catalog."
    },
    "upscale": {
      "type": "enum",
      "options": ["none", "seedvr2_3b"],
      "default": "none",
      "description": "Optional still-upscale tail, 2x. seedvr2_3b (A.01.08) resizes the still 2x with lanczos and restores it in one step with SeedVR2 3B (fp16) on ComfyUI's core SeedVR2 nodes, as the SeedVR2 3B image template does at 4x; its first use loads the seedvr2-3b family (7.29 GB) into the model cache. Only 2x is offered: the worker returns the PNG inline in the job output, and a 4x (~16 MP) still would not fit RunPod's job-output ceiling until outputs travel by the volume (V.12.05). none leaves the graph exactly as before. The Real-ESRGAN x2 tail (C.12.02) was retired once SeedVR2 3B had rendered (A.01.08); the enum refuses a job that still names x2."
    },
    "lora": {
      "type": "enum",
      "options": [
        "none",
        "lenovo-ultrareal",
        "chroma-realistic-slider",
        "chroma-defluxer",
        "style-muk",
        "nicegirls-ultrareal",
        "nsfw-realism-v1"
      ],
      "default": "none",
      "description": "Optional LoRA on the Chroma model (C.12.01; four picked by the user on 2026-09-13, all from CivitAI with every commercial flag). lenovo-ultrareal = photorealism enhancer (its trigger word `l3n0v0` is appended to the prompt automatically); chroma-realistic-slider = realism up/down by strength; chroma-defluxer = removes the residual Flux look; style-muk = illustration style. A.03.01 adds two more, also with every commercial flag: nicegirls-ultrareal = NiceGirls UltraReal Chroma (model-version 2487473, content racy); nsfw-realism-v1 = NSFW Realism v1.0 (model-version 2357084, content explicit). Neither version lists trained words, so neither appends a trigger, and neither has rendered on a GPU yet (A.03.01 live stills owed). none leaves the graph exactly as before."
    },
    "lora_strength": {
      "type": "float",
      "default": 1.0,
      "min": -2.0,
      "max": 2.0,
      "description": "LoRA strength on the model (LoraLoaderModelOnly.strength_model). The slider LoRA is meant to be driven negative as well as positive; the others sit at 1.0."
    }
  },
  "checkpoint_map": {
    "chroma1-hd": "Chroma1-HD.safetensors",
    "uncanny-v13-bf16": "uncannyPhotorealism_v13_bf16.safetensors",
    "photonic-fusion-debloated-bf16": "photonicFusionChroma_debloated_bf16.safetensors",
    "ungloryhail-bf16": "ungloryhail_bf16.safetensors"
  },
  "aspect_map": {
    "square_1024": {
      "width": 1024,
      "height": 1024
    },
    "portrait_896x1152": {
      "width": 896,
      "height": 1152
    },
    "landscape_1152x896": {
      "width": 1152,
      "height": 896
    },
    "portrait_832x1216": {
      "width": 832,
      "height": 1216
    },
    "landscape_1216x832": {
      "width": 1216,
      "height": 832
    }
  },
  "prompt_construction": {
    "template": "{base_prompt}",
    "variables": {
      "base_prompt": "{{prompt}}"
    }
  },
  "nodes": {
    "1": {
      "class_type": "UNETLoader",
      "inputs": {
        "unet_name": "{{checkpoint_map[checkpoint]}}",
        "weight_dtype": "default"
      },
      "outputs": ["MODEL"]
    },
    "2": {
      "class_type": "CLIPLoader",
      "inputs": {
        "clip_name": "t5xxl_fp16.safetensors",
        "type": "chroma",
        "device": "default"
      },
      "outputs": ["CLIP"],
      "_comment": "T5-XXL FP16 in Chroma mode; shared by every checkpoint."
    },
    "3": {
      "class_type": "VAELoader",
      "inputs": {
        "vae_name": "ae.safetensors"
      },
      "outputs": ["VAE"]
    },
    "4": {
      "class_type": "ModelSamplingAuraFlow",
      "inputs": {
        "model": ["19", 0],
        "shift": 1.0
      },
      "outputs": ["MODEL"],
      "_comment": "Flow shift 1.0 is the Chroma creator's intended value."
    },
    "5": {
      "class_type": "T5TokenizerOptions",
      "inputs": {
        "clip": ["2", 0],
        "min_padding": 1,
        "min_length": 0
      },
      "outputs": ["CLIP"]
    },
    "6": {
      "class_type": "CLIPTextEncode",
      "inputs": {
        "text": "{{constructed_prompt}}{{lora_trigger_map[lora]}}",
        "clip": ["5", 0]
      },
      "outputs": ["CONDITIONING"]
    },
    "7": {
      "class_type": "CLIPTextEncode",
      "inputs": {
        "text": "{{negative_prompt}}",
        "clip": ["5", 0]
      },
      "outputs": ["CONDITIONING"]
    },
    "8": {
      "class_type": "CFGGuider",
      "inputs": {
        "model": ["4", 0],
        "positive": ["6", 0],
        "negative": ["7", 0],
        "cfg": "{{cfg}}"
      },
      "outputs": ["GUIDER"]
    },
    "9": {
      "class_type": "KSamplerSelect",
      "inputs": {
        "sampler_name": "{{sampler}}"
      },
      "outputs": ["SAMPLER"]
    },
    "10": {
      "class_type": "BetaSamplingScheduler",
      "inputs": {
        "model": ["4", 0],
        "steps": "{{steps}}",
        "alpha": 0.45,
        "beta": 0.45
      },
      "outputs": ["SIGMAS"],
      "_comment": "Chroma's reference schedule: beta(0.45/0.45). `scheduler` is deliberately NOT a catalog input — swapping scheduler families means swapping node class (BetaSamplingScheduler alpha/beta vs BasicScheduler scheduler/denoise), and the catalog's `_condition` mechanism bypasses a node through its own input rather than choosing between two classes, so an either/or cannot be expressed without wiring a type-wrong link into `sigmas`. Changing the schedule means editing this node."
    },
    "11": {
      "class_type": "RandomNoise",
      "inputs": {
        "noise_seed": "{{seed}}"
      },
      "outputs": ["NOISE"]
    },
    "12": {
      "class_type": "EmptySD3LatentImage",
      "inputs": {
        "width": "{{aspect_map[aspect].width}}",
        "height": "{{aspect_map[aspect].height}}",
        "batch_size": "{{batch_size}}"
      },
      "outputs": ["LATENT"]
    },
    "13": {
      "class_type": "SamplerCustomAdvanced",
      "inputs": {
        "noise": ["11", 0],
        "guider": ["8", 0],
        "sampler": ["9", 0],
        "sigmas": ["10", 0],
        "latent_image": ["12", 0]
      },
      "outputs": ["LATENT", "LATENT"]
    },
    "14": {
      "class_type": "VAEDecode",
      "inputs": {
        "samples": ["13", 0],
        "vae": ["3", 0]
      },
      "outputs": ["IMAGE"]
    },
    "15": {
      "class_type": "SaveImage",
      "inputs": {
        "images": "{{upscale_output_map[upscale]}}",
        "filename_prefix": "isis/chroma-txt2img"
      },
      "outputs": []
    },
    "19": {
      "class_type": "LoraLoaderModelOnly",
      "inputs": {
        "model": ["1", 0],
        "lora_name": "{{lora_map[lora]}}",
        "strength_model": "{{lora_strength}}"
      },
      "outputs": ["MODEL"],
      "_condition": "{{lora != 'none'}}",
      "_condition_passthrough": "model",
      "_comment": "C.12.01. Present only when a LoRA is chosen; with none the renderer drops it and repoints ModelSamplingAuraFlow at the UNETLoader, so the default graph is byte-identical to the pre-C.12.01 one."
    },
    "20": {
      "class_type": "UNETLoader",
      "inputs": {
        "unet_name": "seedvr2_3b_fp16.safetensors",
        "weight_dtype": "default"
      },
      "outputs": ["MODEL"],
      "_condition": "{{upscale == 'seedvr2_3b'}}",
      "_comment": "A.01.08 seedvr2_3b tail, from the ComfyUI template utility_seedvr2_3b_int8_upscale_image with the manifest's seedvr2_3b_fp16 in place of seedvr2_3b_int8_convrot (weight_dtype default keeps fp16). Every tail node carries the same _condition, so with none the graph is exactly the pre-A.01.08 one."
    },
    "21": {
      "class_type": "VAELoader",
      "inputs": {
        "vae_name": "seedvr2_ema_vae_fp16.safetensors"
      },
      "outputs": ["VAE"],
      "_condition": "{{upscale == 'seedvr2_3b'}}"
    },
    "22": {
      "class_type": "ResizeImageMaskNode",
      "inputs": {
        "input": ["14", 0],
        "resize_type": "scale by multiplier",
        "resize_type.multiplier": 2.0,
        "scale_method": "lanczos"
      },
      "outputs": ["IMAGE"],
      "_condition": "{{upscale == 'seedvr2_3b'}}",
      "_comment": "2x, not the image template's 4x, for the job-output ceiling. The template's JoinImageWithAlpha is not used: the decoded still has no alpha to join."
    },
    "23": {
      "class_type": "SeedVR2Preprocess",
      "inputs": {
        "resized_images": ["22", 0]
      },
      "outputs": ["IMAGE"],
      "_condition": "{{upscale == 'seedvr2_3b'}}"
    },
    "24": {
      "class_type": "VAEEncodeTiled",
      "inputs": {
        "pixels": ["23", 0],
        "vae": ["21", 0],
        "tile_size": 512,
        "overlap": 128,
        "temporal_size": 4096,
        "temporal_overlap": 8
      },
      "outputs": ["LATENT"],
      "_condition": "{{upscale == 'seedvr2_3b'}}"
    },
    "25": {
      "class_type": "SeedVR2Conditioning",
      "inputs": {
        "model": ["20", 0],
        "vae_conditioning": ["24", 0]
      },
      "outputs": ["CONDITIONING", "CONDITIONING"],
      "_condition": "{{upscale == 'seedvr2_3b'}}"
    },
    "26": {
      "class_type": "KSampler",
      "inputs": {
        "model": ["20", 0],
        "positive": ["25", 0],
        "negative": ["25", 1],
        "latent_image": ["24", 0],
        "seed": "{{seed}}",
        "steps": 1,
        "cfg": 1.0,
        "sampler_name": "euler",
        "scheduler": "simple",
        "denoise": 1.0
      },
      "outputs": ["LATENT"],
      "_condition": "{{upscale == 'seedvr2_3b'}}",
      "_comment": "The template's one step at CFG 1, euler, simple, denoise 1; the still's own seed."
    },
    "27": {
      "class_type": "VAEDecodeTiled",
      "inputs": {
        "samples": ["26", 0],
        "vae": ["21", 0],
        "tile_size": 512,
        "overlap": 128,
        "temporal_size": 4096,
        "temporal_overlap": 8
      },
      "outputs": ["IMAGE"],
      "_condition": "{{upscale == 'seedvr2_3b'}}"
    },
    "28": {
      "class_type": "SeedVR2PostProcessing",
      "inputs": {
        "images": ["27", 0],
        "original_resized_images": ["22", 0],
        "color_correction_method": "none"
      },
      "outputs": ["IMAGE"],
      "_condition": "{{upscale == 'seedvr2_3b'}}"
    }
  },
  "output_spec": {
    "type": "image",
    "format": "png"
  },
  "models_required": [
    "Chroma1-HD.safetensors",
    "uncannyPhotorealism_v13_bf16.safetensors",
    "photonicFusionChroma_debloated_bf16.safetensors",
    "ungloryhail_bf16.safetensors",
    "t5xxl_fp16.safetensors",
    "ae.safetensors",
    "chroma-lenovo-ultrareal.safetensors",
    "chroma-realistic-slider.safetensors",
    "chroma-defluxer.safetensors",
    "chroma-style-muk.safetensors",
    "chroma-nicegirls-ultrareal.safetensors",
    "chroma-nsfw-realism-v1.safetensors",
    "seedvr2_3b_fp16.safetensors",
    "seedvr2_ema_vae_fp16.safetensors"
  ],
  "requires_families": ["chroma-core", "seedvr2-3b"],
  "custom_nodes_required": [],
  "lora_map": {
    "none": "",
    "lenovo-ultrareal": "chroma-lenovo-ultrareal.safetensors",
    "chroma-realistic-slider": "chroma-realistic-slider.safetensors",
    "chroma-defluxer": "chroma-defluxer.safetensors",
    "style-muk": "chroma-style-muk.safetensors",
    "nicegirls-ultrareal": "chroma-nicegirls-ultrareal.safetensors",
    "nsfw-realism-v1": "chroma-nsfw-realism-v1.safetensors"
  },
  "lora_trigger_map": {
    "none": "",
    "lenovo-ultrareal": ", l3n0v0",
    "chroma-realistic-slider": "",
    "chroma-defluxer": "",
    "style-muk": "",
    "nicegirls-ultrareal": "",
    "nsfw-realism-v1": ""
  },
  "upscale_output_map": {
    "none": ["14", 0],
    "seedvr2_3b": ["28", 0]
  }
}
