{"id": "f5c8a3b1-9d2e-4a7f-8c6b-gmanski-charensvid", "revision": 0, "last_node_id": 29, "last_link_id": 26, "nodes": [{"id": 1, "type": "MarkdownNote", "pos": [-1900, -460], "size": [600, 900], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [], "properties": {"Node name for S&R": "MarkdownNote"}, "widgets_values": ["## Character Ensemble H3 Video (Gmanski)\n\n**Several people, one video.** Up to nine reference photos composed into a single moving shot, with H3's own generated audio. Identity comes from the photos - no LoRA training, no trigger words.\n\nThis is the moving version of **Character Ensemble H3**, which does the same thing but saves one still frame.\n\n### Run it\n1. Upload a photo into **Reference photo 1** and **2** (already connected). One clear, well-lit face per photo works best.\n2. Need more people? See below - slots 3-9 ship **disconnected on purpose**.\n3. Describe the scene in the H3 node's prompt. Say what each person is doing; H3 takes identity from the photos, not the words.\n4. Set **Duration (seconds)**, then queue. Output lands in `output/video/Gmanski/character_ensemble_h3_video/`.\n\n### Using more than two people\nSlots 3-9 are red and unconnected. Drag each one's **IMAGE** output onto the H3 node's matching `ref_image_N` input. They are left unwired because a connected-but-empty slot feeds a blank placeholder image into the conditioning and degrades everyone's likeness - an unconnected slot is simply ignored.\n\n### Duration\nFrame count is computed for you: H3 only accepts lengths of **17n+5** frames at 24fps, so the Duration control runs through a small expression that rounds to the nearest legal value. Don't replace it with a plain number unless you know the rule.\n\n### Cost - read this before queueing\n- **Download**: ~44 GB (`minimax-h3` + `minimax-h3-ref2v` packs).\n- **VRAM**: 48 GB+ recommended. Video costs far more than the still version - a 5s clip is 120-odd frames through the full model, not one.\n- Start at 3-5 seconds. Longer clips scale badly and drift.\n\n### Safety\nThis produces a local file only. Review it before sharing it anywhere, and only use photos of people who agreed to this.\n\n### Models\n`gmanski-packs install minimax-h3-ref2v`.\n"], "title": "Read me: Character Ensemble H3 Video (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": [11]}, {"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": [12]}, {"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": [8]}, {"name": "height", "type": "INT", "links": [9]}], "properties": {"Node name for S&R": "ResolutionSelector"}, "widgets_values": ["3:2 (Photo)", 2.5, 32], "title": "Resolution Selector"}, {"id": 12, "type": "PrimitiveFloat", "pos": [-1250, 830], "size": [300, 60], "flags": {}, "order": 11, "mode": 0, "inputs": [{"name": "value", "type": "FLOAT", "link": null, "widget": {"name": "value"}}], "outputs": [{"name": "FLOAT", "type": "FLOAT", "links": [1]}], "properties": {"Node name for S&R": "PrimitiveFloat"}, "widgets_values": [5.0], "title": "Duration (seconds)"}, {"id": 13, "type": "ComfyMathExpression", "pos": [-1250, 930], "size": [300, 90], "flags": {}, "order": 12, "mode": 0, "inputs": [{"name": "values.a", "type": "FLOAT,INT,BOOLEAN", "link": 1}], "outputs": [{"name": "FLOAT", "type": "FLOAT", "links": []}, {"name": "INT", "type": "INT", "links": [10]}, {"name": "BOOL", "type": "BOOLEAN", "links": []}], "properties": {"Node name for S&R": "ComfyMathExpression"}, "widgets_values": ["max(5, round(a * 24)) + (5 - (max(5, round(a * 24)) % 17)) % 17"], "title": "Frame count (17n+5 - H3 requires it)"}, {"id": 14, "type": "UNETLoader", "pos": [500, 900], "size": [440, 90], "flags": {}, "order": 13, "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": [2]}], "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": 15, "type": "LoraLoaderModelOnly", "pos": [500, 1020], "size": [440, 90], "flags": {}, "order": 14, "mode": 4, "inputs": [{"name": "model", "type": "MODEL", "link": 2}, {"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": [3]}], "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": 16, "type": "MiniMaxH3SigmaShift", "pos": [500, 1140], "size": [300, 110], "flags": {}, "order": 15, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 3}, {"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": [4, 13]}], "properties": {"Node name for S&R": "MiniMaxH3SigmaShift"}, "widgets_values": [12, 3], "title": "Sigma shift"}, {"id": 17, "type": "CLIPLoader", "pos": [500, 1280], "size": [440, 110], "flags": {}, "order": 16, "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": [5]}], "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": 18, "type": "VAELoader", "pos": [500, 1420], "size": [440, 60], "flags": {}, "order": 17, "mode": 0, "inputs": [{"name": "vae_name", "type": "COMBO", "link": null, "widget": {"name": "vae_name"}}], "outputs": [{"name": "VAE", "type": "VAE", "links": [6, 21]}], "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": 19, "type": "VAELoader", "pos": [500, 1510], "size": [440, 60], "flags": {}, "order": 18, "mode": 0, "inputs": [{"name": "vae_name", "type": "COMBO", "link": null, "widget": {"name": "vae_name"}}], "outputs": [{"name": "VAE", "type": "VAE", "links": [7, 23]}], "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": 20, "type": "KSamplerSelect", "pos": [500, 1600], "size": [300, 60], "flags": {}, "order": 19, "mode": 0, "inputs": [{"name": "sampler_name", "type": "COMBO", "link": null, "widget": {"name": "sampler_name"}}], "outputs": [{"name": "SAMPLER", "type": "SAMPLER", "links": [17]}], "properties": {"Node name for S&R": "KSamplerSelect"}, "widgets_values": ["res_multistep"], "title": "Sampler (shared)"}, {"id": 21, "type": "BasicScheduler", "pos": [500, 1680], "size": [300, 130], "flags": {}, "order": 20, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 4}, {"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": [18]}], "properties": {"Node name for S&R": "BasicScheduler"}, "widgets_values": ["simple", 20, 1.0], "title": "Scheduler (shared, 20 steps — 8 if turbo LoRA enabled)"}, {"id": 22, "type": "MiniMaxH3ReferenceToVideo", "pos": [0, -460], "size": [460, 480], "flags": {}, "order": 21, "mode": 0, "inputs": [{"name": "clip", "type": "CLIP", "link": 5}, {"name": "vae", "type": "VAE", "link": 6}, {"name": "audio_vae", "type": "VAE", "link": 7}, {"name": "ref_images.ref_image_0", "type": "IMAGE", "link": 11}, {"name": "ref_images.ref_image_1", "type": "IMAGE", "link": 12}, {"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": 8, "widget": {"name": "width"}}, {"name": "height", "type": "INT", "link": 9, "widget": {"name": "height"}}, {"name": "length", "type": "INT", "link": 10, "widget": {"name": "length"}}, {"name": "ref_image_size", "type": "COMBO", "link": null, "widget": {"name": "ref_image_size"}}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [14]}, {"name": "LATENT", "type": "LATENT", "links": [19]}], "properties": {"Node name for S&R": "MiniMaxH3ReferenceToVideo"}, "widgets_values": ["photorealistic video of two people standing together in a sunlit kitchen, talking and smiling at each other, natural handheld camera movement, shallow depth of field", 1024, 1536, 120, "max"], "title": "H3 reference-to-video node (9 reference slots)"}, {"id": 23, "type": "BasicGuider", "pos": [540, -460], "size": [290, 46], "flags": {}, "order": 22, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 13}, {"name": "conditioning", "type": "CONDITIONING", "link": 14}], "outputs": [{"name": "GUIDER", "type": "GUIDER", "links": [16]}], "properties": {"Node name for S&R": "BasicGuider"}, "widgets_values": [], "title": "Guider"}, {"id": 24, "type": "RandomNoise", "pos": [540, -340], "size": [290, 82], "flags": {}, "order": 23, "mode": 0, "inputs": [{"name": "noise_seed", "type": "INT", "link": null, "widget": {"name": "noise_seed"}}], "outputs": [{"name": "NOISE", "type": "NOISE", "links": [15]}], "properties": {"Node name for S&R": "RandomNoise"}, "widgets_values": [12345, "randomize"], "title": "Seed"}, {"id": 25, "type": "SamplerCustomAdvanced", "pos": [900, -460], "size": [300, 200], "flags": {}, "order": 24, "mode": 0, "inputs": [{"name": "noise", "type": "NOISE", "link": 15}, {"name": "guider", "type": "GUIDER", "link": 16}, {"name": "sampler", "type": "SAMPLER", "link": 17}, {"name": "sigmas", "type": "SIGMAS", "link": 18}, {"name": "latent_image", "type": "LATENT", "link": 19}], "outputs": [{"name": "output", "type": "LATENT", "links": [20, 22]}, {"name": "denoised_output", "type": "LATENT", "links": []}], "properties": {"Node name for S&R": "SamplerCustomAdvanced"}, "widgets_values": [], "title": "Sample"}, {"id": 26, "type": "VAEDecode", "pos": [1260, -460], "size": [300, 46], "flags": {}, "order": 25, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 20}, {"name": "vae", "type": "VAE", "link": 21}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [24]}], "properties": {"Node name for S&R": "VAEDecode"}, "widgets_values": [], "title": "Decode frames"}, {"id": 27, "type": "VAEDecodeAudio", "pos": [1260, -360], "size": [300, 46], "flags": {}, "order": 26, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 22}, {"name": "vae", "type": "VAE", "link": 23}], "outputs": [{"name": "AUDIO", "type": "AUDIO", "links": [25]}], "properties": {"Node name for S&R": "VAEDecodeAudio"}, "widgets_values": [], "title": "Decode sound (H3's own native audio)"}, {"id": 28, "type": "CreateVideo", "pos": [1620, -460], "size": [280, 126], "flags": {}, "order": 27, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 24}, {"name": "audio", "type": "AUDIO", "link": 25}, {"name": "fps", "type": "FLOAT", "link": null, "widget": {"name": "fps"}}, {"name": "bit_depth", "type": "COMBO", "link": null, "widget": {"name": "bit_depth"}}], "outputs": [{"name": "VIDEO", "type": "VIDEO", "links": [26]}], "properties": {"Node name for S&R": "CreateVideo"}, "widgets_values": [24, 8, "sRGB"], "title": "Join into a video"}, {"id": 29, "type": "SaveVideo", "pos": [1620, -290], "size": [280, 200], "flags": {}, "order": 28, "mode": 0, "inputs": [{"name": "video", "type": "VIDEO", "link": 26}, {"name": "filename_prefix", "type": "STRING", "link": null, "widget": {"name": "filename_prefix"}}, {"name": "format", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "format"}}, {"name": "codec", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "codec"}}], "outputs": [], "properties": {"Node name for S&R": "SaveVideo"}, "widgets_values": ["video/Gmanski/character_ensemble_h3_video", "auto", "auto", "auto"], "title": "Save"}], "links": [[1, 12, 0, 13, 0, "FLOAT"], [2, 14, 0, 15, 0, "MODEL"], [3, 15, 0, 16, 0, "MODEL"], [4, 16, 0, 21, 0, "MODEL"], [5, 17, 0, 22, 0, "CLIP"], [6, 18, 0, 22, 1, "VAE"], [7, 19, 0, 22, 2, "VAE"], [8, 11, 0, 22, 13, "INT"], [9, 11, 1, 22, 14, "INT"], [10, 13, 1, 22, 15, "INT"], [11, 2, 0, 22, 3, "IMAGE"], [12, 3, 0, 22, 4, "IMAGE"], [13, 16, 0, 23, 0, "MODEL"], [14, 22, 0, 23, 1, "CONDITIONING"], [15, 24, 0, 25, 0, "NOISE"], [16, 23, 0, 25, 1, "GUIDER"], [17, 20, 0, 25, 2, "SAMPLER"], [18, 21, 0, 25, 3, "SIGMAS"], [19, 22, 1, 25, 4, "LATENT"], [20, 25, 0, 26, 0, "LATENT"], [21, 18, 0, 26, 1, "VAE"], [22, 25, 0, 27, 0, "LATENT"], [23, 19, 0, 27, 1, "VAE"], [24, 26, 0, 28, 0, "IMAGE"], [25, 27, 0, 28, 1, "AUDIO"], [26, 28, 0, 29, 0, "VIDEO"]], "groups": [], "config": {}, "extra": {"ds": {"scale": 0.62, "offset": [1480, 420]}, "gmanski_template": "character-ensemble-h3-video", "generator": "scripts/build_character_ensemble_h3_video_workflow.py", "source": "https://gmanski.com/workflows/character-ensemble-h3-video"}, "version": 0.4}