{"id": "d4e7f2a9-8b1c-4d6e-9f3a-gmanski-charensemble", "revision": 0, "last_node_id": 26, "last_link_id": 21, "nodes": [{"id": 1, "type": "MarkdownNote", "pos": [-1900, -460], "size": [600, 820], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [], "properties": {"Node name for S&R": "MarkdownNote"}, "widgets_values": ["## Character Ensemble H3 (Gmanski)\n\n**Multiple people in one photo, locally, for free.** No API, no login, no per-image cost — unlike Flux 2 Multiple Characters (Gmanski), which calls a paid, sign-in-required Flux.2 [pro] API node. This uses the exact same identity-lock mechanism as Kids Music Video H3 / Character Portrait H3 (a reference photo, not a trained LoRA) — MiniMax H3's reference-to-video node natively accepts up to 9 reference images in a single generation.\n\n### Run it\n1. **Reference photo 1 and 2 are already wired to the H3 node.** Click each one and upload your photo — that's the whole setup for a 2-person scene.\n2. **For 3 or more people**: Reference photo 3-9 are colored red and intentionally NOT connected. Drag a wire from that node's `IMAGE` output dot to the matching `ref_image_N` input on the H3 node (the exact input name is in the node's own title) — in order starting from Picture 3. Skipping a slot can shift the model's own picture numbering.\n3. Edit the **prompt**, tagging each person by number: `<Picture 1>`, `<Picture 2>`, etc., in the exact order you connected them.\n4. Pick a resolution, queue. Find the result under `output/Gmanski/character_ensemble_h3_00001.png`.\n\n### If your result doesn't look like any of your reference photos\nThis almost always means a photo was uploaded but never actually connected to the H3 node — uploading into a `LoadImage` node's picker does nothing by itself if there's no wire running from its `IMAGE` output to a `ref_image_N` input. Click each reference photo node and check for a line running out of its right edge before assuming anything else is wrong.\n\n### Want more than 9 people?\nA community patch (found researching this) raises MiniMax H3's reference cap to 15 by editing one line of ComfyUI core — `comfy_extras/nodes_minimax_h3.py`, changing `io.Autogrow.TemplatePrefix(prefix=\"ref_image_\", min=0, max=9)` to `max=15`. It's a real UI cap, not a model limit — verified by reading the actual execution code (no count check anywhere below that line) — but it edits a file this repo doesn't control, so it's not applied here. `update_comfyui.bat`/a fresh pod image will silently revert it if you do apply it by hand.\n\n### Same accuracy notes as Character Portrait H3\nUntested at scale for how well 9 simultaneous identities hold up — worth judging yourself, same as that template. `ref_image_size` is set to `max` (not the node's default `match`), which keeps each reference near full resolution instead of downscaling it to the generation size first.\n\n### Cost — read this before queueing\nSame pack as Character Portrait H3 / Kids Music Video H3: `minimax-h3-ref2v` (~44 GB, shared if already installed), 48 GB+ VRAM recommended.\n\n### Safety\nThis produces a local file only. Review it yourself before sharing it anywhere.\n\n### Models\n`gmanski-packs install minimax-h3-ref2v`.\n"], "title": "Read me: Character Ensemble H3 (Gmanski)", "color": "#432", "bgcolor": "#653"}, {"id": 2, "type": "LoadImage", "pos": [-1250, -460], "size": [320, 314], "flags": {}, "order": 1, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [9]}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 1 — connected, upload your photo here"}, {"id": 3, "type": "LoadImage", "pos": [-910, -460], "size": [320, 314], "flags": {}, "order": 2, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [10]}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 2 — connected, upload your photo here"}, {"id": 4, "type": "LoadImage", "pos": [-570, -460], "size": [320, 314], "flags": {}, "order": 3, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 3 — NOT connected. Drag IMAGE output to H3 node's ref_image_2 input to use it", "color": "#533", "bgcolor": "#a33"}, {"id": 5, "type": "LoadImage", "pos": [-1250, -120], "size": [320, 314], "flags": {}, "order": 4, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 4 — NOT connected. Drag IMAGE output to H3 node's ref_image_3 input to use it", "color": "#533", "bgcolor": "#a33"}, {"id": 6, "type": "LoadImage", "pos": [-910, -120], "size": [320, 314], "flags": {}, "order": 5, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 5 — NOT connected. Drag IMAGE output to H3 node's ref_image_4 input to use it", "color": "#533", "bgcolor": "#a33"}, {"id": 7, "type": "LoadImage", "pos": [-570, -120], "size": [320, 314], "flags": {}, "order": 6, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 6 — NOT connected. Drag IMAGE output to H3 node's ref_image_5 input to use it", "color": "#533", "bgcolor": "#a33"}, {"id": 8, "type": "LoadImage", "pos": [-1250, 220], "size": [320, 314], "flags": {}, "order": 7, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 7 — NOT connected. Drag IMAGE output to H3 node's ref_image_6 input to use it", "color": "#533", "bgcolor": "#a33"}, {"id": 9, "type": "LoadImage", "pos": [-910, 220], "size": [320, 314], "flags": {}, "order": 8, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 8 — NOT connected. Drag IMAGE output to H3 node's ref_image_7 input to use it", "color": "#533", "bgcolor": "#a33"}, {"id": 10, "type": "LoadImage", "pos": [-570, 220], "size": [320, 314], "flags": {}, "order": 9, "mode": 0, "inputs": [], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "MASK", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "LoadImage"}, "widgets_values": ["example.png", "image"], "title": "Reference photo 9 — NOT connected. Drag IMAGE output to H3 node's ref_image_8 input to use it", "color": "#533", "bgcolor": "#a33"}, {"id": 11, "type": "ResolutionSelector", "pos": [-1250, 620], "size": [300, 170], "flags": {}, "order": 10, "mode": 0, "inputs": [], "outputs": [{"name": "width", "type": "INT", "links": [7]}, {"name": "height", "type": "INT", "links": [8]}], "properties": {"Node name for S&R": "ResolutionSelector"}, "widgets_values": ["3:2 (Photo)", 1.0, 32], "title": "Resolution Selector"}, {"id": 12, "type": "UNETLoader", "pos": [500, 900], "size": [440, 90], "flags": {}, "order": 11, "mode": 0, "inputs": [{"name": "unet_name", "type": "COMBO", "link": null, "widget": {"name": "unet_name"}}, {"name": "weight_dtype", "type": "COMBO", "link": null, "widget": {"name": "weight_dtype"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [1]}], "properties": {"Node name for S&R": "UNETLoader", "models": [{"name": "minimax_h3_ref2va_pruned_int8_convrot.safetensors", "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors", "directory": "diffusion_models"}]}, "widgets_values": ["minimax_h3_ref2va_pruned_int8_convrot.safetensors", "default"], "title": "MiniMax H3 ref2v checkpoint"}, {"id": 13, "type": "LoraLoaderModelOnly", "pos": [500, 1020], "size": [440, 90], "flags": {}, "order": 12, "mode": 4, "inputs": [{"name": "model", "type": "MODEL", "link": 1}, {"name": "lora_name", "type": "COMBO", "link": null, "widget": {"name": "lora_name"}}, {"name": "strength_model", "type": "FLOAT", "link": null, "widget": {"name": "strength_model"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [2]}], "properties": {"Node name for S&R": "LoraLoaderModelOnly", "models": [{"name": "minimax_h3_ref2v_turbo_8step_v1.0_768p_comfyui_bf16.safetensors", "url": "https://huggingface.co/lightx2v/Minimax-h3-Turbo/resolve/main/minimax_h3_ref2v_turbo_8step_v1.0_768p_comfyui_bf16.safetensors", "directory": "loras"}]}, "widgets_values": ["minimax_h3_ref2v_turbo_8step_v1.0_768p_comfyui_bf16.safetensors", 1.0], "title": "Turbo LoRA — bypassed by default, see readme"}, {"id": 14, "type": "MiniMaxH3SigmaShift", "pos": [500, 1140], "size": [300, 110], "flags": {}, "order": 13, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 2}, {"name": "shift_video", "type": "FLOAT", "link": null, "widget": {"name": "shift_video"}}, {"name": "shift_audio", "type": "FLOAT", "link": null, "widget": {"name": "shift_audio"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [3, 11]}], "properties": {"Node name for S&R": "MiniMaxH3SigmaShift"}, "widgets_values": [6, 3], "title": "Sigma shift"}, {"id": 15, "type": "CLIPLoader", "pos": [500, 1280], "size": [440, 110], "flags": {}, "order": 14, "mode": 0, "inputs": [{"name": "clip_name", "type": "COMBO", "link": null, "widget": {"name": "clip_name"}}, {"name": "type", "type": "COMBO", "link": null, "widget": {"name": "type"}}, {"name": "device", "type": "COMBO", "link": null, "widget": {"name": "device"}}], "outputs": [{"name": "CLIP", "type": "CLIP", "links": [4]}], "properties": {"Node name for S&R": "CLIPLoader", "models": [{"name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors", "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors", "directory": "text_encoders"}]}, "widgets_values": ["qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors", "minimax", "default"], "title": "MiniMax H3 text encoder"}, {"id": 16, "type": "VAELoader", "pos": [500, 1420], "size": [440, 60], "flags": {}, "order": 15, "mode": 0, "inputs": [{"name": "vae_name", "type": "COMBO", "link": null, "widget": {"name": "vae_name"}}], "outputs": [{"name": "VAE", "type": "VAE", "links": [5, 19]}], "properties": {"Node name for S&R": "VAELoader", "models": [{"name": "minimax_h3_video_vae_fp16.safetensors", "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors", "directory": "vae"}]}, "widgets_values": ["minimax_h3_video_vae_fp16.safetensors"], "title": "MiniMax H3 video VAE"}, {"id": 17, "type": "VAELoader", "pos": [500, 1510], "size": [440, 60], "flags": {}, "order": 16, "mode": 0, "inputs": [{"name": "vae_name", "type": "COMBO", "link": null, "widget": {"name": "vae_name"}}], "outputs": [{"name": "VAE", "type": "VAE", "links": [6]}], "properties": {"Node name for S&R": "VAELoader", "models": [{"name": "minimax_h3_audio_vae_fp32.safetensors", "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors", "directory": "vae"}]}, "widgets_values": ["minimax_h3_audio_vae_fp32.safetensors"], "title": "MiniMax H3 audio VAE (required input, decoded audio unused — see module docstring)"}, {"id": 18, "type": "KSamplerSelect", "pos": [500, 1600], "size": [300, 60], "flags": {}, "order": 17, "mode": 0, "inputs": [{"name": "sampler_name", "type": "COMBO", "link": null, "widget": {"name": "sampler_name"}}], "outputs": [{"name": "SAMPLER", "type": "SAMPLER", "links": [15]}], "properties": {"Node name for S&R": "KSamplerSelect"}, "widgets_values": ["res_multistep"], "title": "Sampler (shared)"}, {"id": 19, "type": "BasicScheduler", "pos": [500, 1680], "size": [300, 130], "flags": {}, "order": 18, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 3}, {"name": "scheduler", "type": "COMBO", "link": null, "widget": {"name": "scheduler"}}, {"name": "steps", "type": "INT", "link": null, "widget": {"name": "steps"}}, {"name": "denoise", "type": "FLOAT", "link": null, "widget": {"name": "denoise"}}], "outputs": [{"name": "SIGMAS", "type": "SIGMAS", "links": [16]}], "properties": {"Node name for S&R": "BasicScheduler"}, "widgets_values": ["simple", 20, 1.0], "title": "Scheduler (shared, 20 steps — 8 if turbo LoRA enabled)"}, {"id": 20, "type": "MiniMaxH3ReferenceToVideo", "pos": [0, -460], "size": [460, 480], "flags": {}, "order": 19, "mode": 0, "inputs": [{"name": "clip", "type": "CLIP", "link": 4}, {"name": "vae", "type": "VAE", "link": 5}, {"name": "audio_vae", "type": "VAE", "link": 6}, {"name": "ref_images.ref_image_0", "type": "IMAGE", "link": 9}, {"name": "ref_images.ref_image_1", "type": "IMAGE", "link": 10}, {"name": "ref_images.ref_image_2", "type": "IMAGE", "link": null}, {"name": "ref_images.ref_image_3", "type": "IMAGE", "link": null}, {"name": "ref_images.ref_image_4", "type": "IMAGE", "link": null}, {"name": "ref_images.ref_image_5", "type": "IMAGE", "link": null}, {"name": "ref_images.ref_image_6", "type": "IMAGE", "link": null}, {"name": "ref_images.ref_image_7", "type": "IMAGE", "link": null}, {"name": "ref_images.ref_image_8", "type": "IMAGE", "link": null}, {"name": "prompt", "type": "STRING", "link": null, "widget": {"name": "prompt"}}, {"name": "width", "type": "INT", "link": 7, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": 8, "widget": {"name": "height"}}, {"name": "length", "type": "INT", "link": null, "widget": {"name": "length"}}, {"name": "ref_image_size", "type": "COMBO", "link": null, "widget": {"name": "ref_image_size"}}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [12]}, {"name": "LATENT", "type": "LATENT", "links": [17]}], "properties": {"Node name for S&R": "MiniMaxH3ReferenceToVideo"}, "widgets_values": ["photorealistic photo of two people standing together in a sunlit park, casual clothing, natural daylight, medium shot. <Picture 1> is on the left, smiling at the camera. <Picture 2> is on the right, arms crossed. Plain, unbranded clothing: no logos, emblems, brand names, text or watermarks.", 1248, 832, 5, "match"], "title": "H3 reference-to-video node (9 reference slots)"}, {"id": 21, "type": "BasicGuider", "pos": [540, -460], "size": [290, 46], "flags": {}, "order": 20, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 11}, {"name": "conditioning", "type": "CONDITIONING", "link": 12}], "outputs": [{"name": "GUIDER", "type": "GUIDER", "links": [14]}], "properties": {"Node name for S&R": "BasicGuider"}, "widgets_values": [], "title": "Guider"}, {"id": 22, "type": "RandomNoise", "pos": [540, -340], "size": [290, 82], "flags": {}, "order": 21, "mode": 0, "inputs": [{"name": "noise_seed", "type": "INT", "link": null, "widget": {"name": "noise_seed"}}], "outputs": [{"name": "NOISE", "type": "NOISE", "links": [13]}], "properties": {"Node name for S&R": "RandomNoise"}, "widgets_values": [12345, "randomize"], "title": "Seed"}, {"id": 23, "type": "SamplerCustomAdvanced", "pos": [900, -460], "size": [300, 200], "flags": {}, "order": 22, "mode": 0, "inputs": [{"name": "noise", "type": "NOISE", "link": 13}, {"name": "guider", "type": "GUIDER", "link": 14}, {"name": "sampler", "type": "SAMPLER", "link": 15}, {"name": "sigmas", "type": "SIGMAS", "link": 16}, {"name": "latent_image", "type": "LATENT", "link": 17}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [18]}], "properties": {"Node name for S&R": "SamplerCustomAdvanced"}, "widgets_values": [], "title": "Sample"}, {"id": 24, "type": "VAEDecode", "pos": [1260, -460], "size": [300, 46], "flags": {}, "order": 23, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 18}, {"name": "vae", "type": "VAE", "link": 19}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [20]}], "properties": {"Node name for S&R": "VAEDecode"}, "widgets_values": [], "title": "Decode picture (22-frame clip)"}, {"id": 25, "type": "ImageFromBatch", "pos": [1620, -460], "size": [300, 90], "flags": {}, "order": 24, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 20}, {"name": "batch_index", "type": "INT", "link": null, "widget": {"name": "batch_index"}}, {"name": "length", "type": "INT", "link": null, "widget": {"name": "length"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [21]}], "properties": {"Node name for S&R": "ImageFromBatch"}, "widgets_values": [2, 1], "title": "Keep frame 2 (middle, not the first)"}, {"id": 26, "type": "SaveImage", "pos": [1960, -460], "size": [280, 60], "flags": {}, "order": 25, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 21}, {"name": "filename_prefix", "type": "STRING", "link": null, "widget": {"name": "filename_prefix"}}], "outputs": [], "properties": {"Node name for S&R": "SaveImage"}, "widgets_values": ["Gmanski/character_ensemble_h3"], "title": "Save"}], "links": [[1, 12, 0, 13, 0, "MODEL"], [2, 13, 0, 14, 0, "MODEL"], [3, 14, 0, 19, 0, "MODEL"], [4, 15, 0, 20, 0, "CLIP"], [5, 16, 0, 20, 1, "VAE"], [6, 17, 0, 20, 2, "VAE"], [7, 11, 0, 20, 13, "INT"], [8, 11, 1, 20, 14, "INT"], [9, 2, 0, 20, 3, "IMAGE"], [10, 3, 0, 20, 4, "IMAGE"], [11, 14, 0, 21, 0, "MODEL"], [12, 20, 0, 21, 1, "CONDITIONING"], [13, 22, 0, 23, 0, "NOISE"], [14, 21, 0, 23, 1, "GUIDER"], [15, 18, 0, 23, 2, "SAMPLER"], [16, 19, 0, 23, 3, "SIGMAS"], [17, 20, 1, 23, 4, "LATENT"], [18, 23, 0, 24, 0, "LATENT"], [19, 16, 0, 24, 1, "VAE"], [20, 24, 0, 25, 0, "IMAGE"], [21, 25, 0, 26, 0, "IMAGE"]], "groups": [], "config": {}, "extra": {"ds": {"scale": 0.62, "offset": [1480, 420]}, "gmanski_template": "character-ensemble-h3", "generator": "scripts/build_character_ensemble_h3_workflow.py", "source": "https://gmanski.com/workflows/character-ensemble-h3"}, "version": 0.4}