dzmdd commited on
Commit
41ef577
·
verified ·
1 Parent(s): 10569f8

Upload folder using huggingface_hub

Browse files
Files changed (23) hide show
  1. .gitattributes +2 -0
  2. Comfyui_Minimax_h3_latent_Upscaler/.gitattributes +2 -0
  3. Comfyui_Minimax_h3_latent_Upscaler/README.md +351 -0
  4. Comfyui_Minimax_h3_latent_Upscaler/README_zh.md +321 -0
  5. Comfyui_Minimax_h3_latent_Upscaler/__init__.py +3 -0
  6. Comfyui_Minimax_h3_latent_Upscaler/__pycache__/__init__.cpython-312.pyc +0 -0
  7. Comfyui_Minimax_h3_latent_Upscaler/examples/Minimax_h3_latent_Upscaler_001.mp4 +3 -0
  8. Comfyui_Minimax_h3_latent_Upscaler/examples/Minimax_h3_latent_Upscaler_002.jpg +3 -0
  9. Comfyui_Minimax_h3_latent_Upscaler/nodes/MMH3_Split_Upscale.py +725 -0
  10. Comfyui_Minimax_h3_latent_Upscaler/nodes/__init__.py +37 -0
  11. Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/MMH3_Split_Upscale.cpython-312.pyc +0 -0
  12. Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/__init__.cpython-312.pyc +0 -0
  13. Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/minimax_h3_latent_upscaler_2d.cpython-312.pyc +0 -0
  14. Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/minimax_h3_latent_upscaler_3d.cpython-312.pyc +0 -0
  15. Comfyui_Minimax_h3_latent_Upscaler/nodes/minimax_h3_latent_upscaler_2d.py +479 -0
  16. Comfyui_Minimax_h3_latent_Upscaler/nodes/minimax_h3_latent_upscaler_3d.py +655 -0
  17. Comfyui_Minimax_h3_latent_Upscaler/workflow_templates/minimax_h3_i2v_Latent Upscaler example workflow2.json +3003 -0
  18. Comfyui_Minimax_h3_latent_Upscaler/workflow_templates/minimax_h3_r2v_Latent Upscaler example workflow3.json +2671 -0
  19. h3_bundle/__init__.py +475 -0
  20. h3_bundle/__pycache__/__init__.cpython-312.pyc +0 -0
  21. note.txt +1 -0
  22. workflow/Bundle_h3.json +1978 -0
  23. workflow/Minimax_Timeline.json +3192 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ Comfyui_Minimax_h3_latent_Upscaler/examples/Minimax_h3_latent_Upscaler_001.mp4 filter=lfs diff=lfs merge=lfs -text
37
+ Comfyui_Minimax_h3_latent_Upscaler/examples/Minimax_h3_latent_Upscaler_002.jpg filter=lfs diff=lfs merge=lfs -text
Comfyui_Minimax_h3_latent_Upscaler/.gitattributes ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
Comfyui_Minimax_h3_latent_Upscaler/README.md ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <p align="center">
2
+ <a href="./README.md"><strong>English</strong></a> ·
3
+ <a href="./README_zh.md">中文</a>
4
+ </p>
5
+
6
+ <div align="center">
7
+
8
+ # ComfyUI Minimax H3 Latent Upscaler
9
+
10
+ **Neural Latent Upscaler for Minimax H3 Video Generation**
11
+ Learned · High-fidelity · 2D & 3D Variants
12
+
13
+ </div>
14
+
15
+ ## 📰 News
16
+
17
+ - [2026-08-28] 🚀 **New node combo — MMH3 Split Upscale**: three new nodes (`MMH3 Temporal Split Params`, `MMH3 Spatial Split Params`, `MMH3 Split Upscale`) perform a tiled, hires-fix style latent re-sampling upscale for H3 video. Decomposed and optimized from the **Comfyui-MMH3-UltimateUpscale** project — splitting the AV latent into temporal chunks and spatial tiles, resampling each piece, and stitching with seam denoise, two-level color matching and temporal anchors. Key upgrades vs. original: more stable seams (`seam_denoise` + probe-gated seam polish), zero color drift (two-level matching + first-block/every-chunk pin-source), triple temporal anchors (frame-0/motion/identity), easier use (spatial params simplified to overlap/fade percentages snapping to the latent grid), and a lighter footprint (built-in upscale model removed in favor of an external pre-upscaled latent).
18
+ - [2026-08-26] 🚀 **3D node memory & UX optimizations**: zero-copy model loading plus ComfyUI's native `soft_empty_cache` and explicit `.contiguous()` calls reduce RAM/VRAM spikes during load and inference; the post-inference CPU offload is now an optional `force_unload` toggle (default on); `enable_chunking` is renamed to `enable_temporal_chunking` and its effective chunk stride raised from 24 to 32; model files can now live in subfolders (PR #30); `target dimensions` and `megapixels` upper limits raised to 8192 px and 16 MP.
19
+ - [2026-08-23] 🚀 **3D node improvements**: added an `enable_chunking` toggle (turn off for short clips to use full-context inference); fixed temporal-chunk edge artifacts with replicate padding and weighted overlap blending, eliminating end-frame flicker; added ROCm (AMD GPU) backend support via the new `rocm` device option.
20
+ - [2026-08-21] 🚀 **3D node optimization**: The model is automatically offloaded to CPU after execution to free VRAM for subsequent second-pass sampling; width and height are independently aligned to the align grid (default 32), fixing the bottom light band issue; normalization/denormalization is changed from in-place operations to standard operations; temporal chunking is retained to support long videos.
21
+ - [2026-08-19] 🚀 **3D node overhaul**: all three resize modes (`scale by multiplier`, `target dimensions`, `megapixels`) merged into a single node; fixed aspect-ratio mismatch in certain modes and edge artifacts at specific sizes; added a new example workflow and expanded the usage notes.
22
+ - [2026-08-18] 🔥 **Precision selector**: both 2D and 3D nodes now support `fp32` / `fp16` / `bf16` inference.
23
+ - [2026-08-17] 🎉 **Initial release**: Minimax H3 Latent Upscaler 2D + 3D nodes with bilingual README and inline examples.
24
+
25
+ A custom ComfyUI node that upscales **Minimax H3** VAE latents (24 channels) with a trained
26
+ neural network instead of naive interpolation. Its main purpose is to **accelerate
27
+ high-resolution video generation** and improve quality:
28
+
29
+ - **Skip the slow decode → pixel-upscale → encode round-trip.** Minimax H3 ships a heavy
30
+ ~5B-parameter VAE, so decoding and re-encoding latents is expensive. Upscaling directly in
31
+ latent space avoids that costly round-trip entirely.
32
+ - **Enable a faster generation pipeline:** generate at low resolution (far fewer latent tokens),
33
+ upscale the latent with this node, then refine at the target resolution.
34
+
35
+ It also **avoids the ghosting / double-image artifacts** that naive latent interpolation
36
+ (bilinear/bicubic) introduces, and plays a role similar to the latent upscaler in **LTX2.3**.
37
+
38
+ ⚠️ This saves **time, not VRAM** — the refinement pass still runs at the target resolution, so
39
+ peak memory is comparable to generating high-res directly. The win is purely speed.
40
+
41
+ Two node variants are provided, both registered under the `video/MinimaxH3` category:
42
+
43
+ - **Minimax H3 Latent Upscaler (2D)** — a 2D ResBlock backbone with Temporal 3D-Conv layers
44
+ inserted for temporal consistency. Spatial (H×W) upscaling; the time dimension is preserved.
45
+ Lightweight and fast. Uses a simple `scale` factor (1.0×–4.0×).
46
+ - **Minimax H3 Latent Upscaler (3D)** — a fully 3D-convolution backbone (3D ResBlocks +
47
+ TemporalConv + trilinear interpolation). Processes the spatiotemporal volume jointly for
48
+ stronger temporal coherence; heavier on compute/memory. Supports **three resize modes** in one
49
+ node:
50
+ - `scale by multiplier` — classic `scale` factor (1.0×–4.0×).
51
+ - `target dimensions` — directly set target pixel `width`/`height`.
52
+ - `megapixels` — set a target total pixel count in megapixels (e.g. `1.2`); keeps aspect ratio.
53
+ Both `target dimensions` and `megapixels` modes align the output to a configurable pixel grid and
54
+ derive the effective scale automatically.
55
+
56
+ > The 3D node computes the equivalent `scale` internally for the size-based modes and feeds it to
57
+ > the same trained model, so any target between 1.0×–4.0× works.
58
+
59
+ > Both nodes support **upscaling only** (`effective scale >= 1.0`). `scale = 1.0` returns the input
60
+ > unchanged; an effective scale below `1.0` raises an error.
61
+
62
+ ### MMH3 Split Upscale (combo)
63
+
64
+ > **Origin:** this combo is a **decomposed and re-optimized version of the
65
+ > Comfyui-MMH3-UltimateUpscale project**. The original monolithic node was broken into three composable nodes (temporal split /
66
+ > spatial split / main upscaler), and the enhancements below were layered on top of the original tiling
67
+ > logic to improve seam stability, color consistency, temporal coherence, usability, and footprint.
68
+
69
+ A separate three-node combo that does a **tiled, hires-fix style re-sampling upscale** directly
70
+ inside the diffusion sampler — instead of a pre-trained upscaler network. It takes the H3 **AV
71
+ latent** (nested video 24ch + audio 32ch), splits it into **temporal chunks** and **spatial tiles**,
72
+ runs the sampler on each piece, then stitches them back seamlessly with seam-denoise, two-level color
73
+ matching and temporal anchors so seams and ghosting don't appear. The two `* Split Params` nodes
74
+ configure the splitting and feed the main `MMH3 Split Upscale` node (both optional — leave them
75
+ unconnected for a single full-frame pass). It requires a `model` + `conditioning` + `sampler`/`sigmas`,
76
+ i.e. it re-runs sampling at the higher resolution.
77
+
78
+ **Key enhancements vs. the original project:**
79
+
80
+ - **🧩 More stable seams (Seam / Ghosting):** a seam-neighborhood denoise cap (`seam_denoise`) plus a probe-gated second-pass seam polish (`seam_polish`) remove seams and ghosting; even under high denoise + fast motion, moving objects are no longer sliced ("broken limbs").
81
+ - **🎨 Zero color drift (Color Zero-Drift):** spatial + temporal two-level color matching, with a global color reference pinned to the **first block** and to **every chunk** (`grade_pin`) — eliminates inter-tile flicker and the localized cyan/green tint (e.g. top-left corner).
82
+ - **⏱️ Stronger temporal continuity:** a **triple temporal anchor** — `frame-0 anchor` + `motion anchor` + `identity anchor` — automatically backs up identity consistency under high denoise, so subjects don't drift.
83
+ - **🖱️ Easier to use:** spatial parameters cut from 9 fields down to **percentages** (overlap ratio / fade ratio) that auto-snap to the latent grid; `negative` sits right next to `conditioning` for a more intuitive layout.
84
+ - **🪶 Lighter footprint:** the built-in upscale model was removed in favor of an **external pre-upscaled latent** input — more controllable VRAM, and a node that stays focused on its job.
85
+
86
+ **Modules added / optimized (relative to the original project):**
87
+
88
+ | Module | What it adds / optimizes |
89
+ | :--- | :--- |
90
+ | **Prevention (预防)** | Freeze-prefill overlap band + **triple temporal anchors** (frame-0 anchor + motion anchor + identity anchor) + cross-fade stitching — stops seams and forks from forming in the first place. |
91
+ | **Correction (校正)** | **Two-level (spatial + temporal) color matching** + first-block source reference + per-chunk global pin-source (`grade_pin`) — keeps color & brightness consistent across tiles and chunks, killing inter-tile flicker and localized cyan/green tint. |
92
+ | **Anti-forking (抗分叉)** | `seam_denoise` cap — under high denoise + fast motion, the seam neighborhood is re-sampled at *medium* denoise so moving objects aren't sliced ("broken limbs"); combined with the probe-gated second-pass seam polish, seams and ghosting are both eliminated (suggested 0.5–0.8; 1.0 = off). |
93
+ | **Fixes (修复)** | **Per-tile independent Guider** + cropped keyframes, and a **fixed probe-gated seam polish** (`seam_polish`) — each tile gets correctly-scoped conditioning/keyframes, and the polish gating no longer over/under-applies. |
94
+ | **Simplification (简化)** | `overlap` / `fade` are now **percentage parameters** (overlap ratio / fade ratio, resolution-independent) instead of absolute pixels, and auto-snap to the latent grid; `negative` sits next to `conditioning` for a more intuitive layout. |
95
+
96
+ ---
97
+
98
+ ## 📸 Examples
99
+
100
+ **Video upscale comparison**
101
+
102
+ <video src="examples/Minimax_h3_latent_Upscaler_001.mp4" controls width="640"></video>
103
+
104
+ **Image upscale comparison**
105
+
106
+ ![](examples/Minimax_h3_latent_Upscaler_002.jpg)
107
+
108
+ ---
109
+
110
+ ## 📁 Project Structure
111
+
112
+ ```text
113
+ Comfyui_Minimax_h3_latent_Upscaler/
114
+ ├── examples/
115
+ │ ├── Minimax_h3_latent_Upscaler_001.mp4
116
+ │ └── Minimax_h3_latent_Upscaler_002.jpg
117
+ ├── workflow_templates/
118
+ │ └── minimax_h3_r2v_Latent Upscaler example workflow.json # example workflow for ComfyUI templates
119
+ ├── nodes/
120
+ │ ├── __init__.py # merges 2D/3D/Split node mappings
121
+ │ ├── minimax_h3_latent_upscaler_2d.py # 2D backbone + Temporal 3D Conv (scale mode)
122
+ │ ├── minimax_h3_latent_upscaler_3d.py # pure 3D convolution with 3 resize modes
123
+ │ └── MMH3_Split_Upscale.py # MMH3 Split Upscale combo (decomposed from Comfyui-MMH3-UltimateUpscale)
124
+ ├── README.md
125
+ ├── README_zh.md
126
+ └── __init__.py
127
+ ```
128
+
129
+ > The model weights are **not** included in this repo. Place them in your ComfyUI models folder
130
+ > (see Model Placement below).
131
+
132
+ ---
133
+
134
+ ## 🚀 Key Features
135
+
136
+ - ✅ **Learned latent upscaling** — neural network trained for Minimax H3 latents, far sharper
137
+ than bilinear/bicubic interpolation.
138
+ - ✅ **Two backbones** — pick the fast **2D** variant or the temporally-coherent **3D** variant.
139
+ - ✅ **Three ways to set output size on the 3D node** — `scale by multiplier`, `target dimensions`,
140
+ or `megapixels`, all with pixel-grid alignment and aspect-ratio lock.
141
+ - ✅ **Tiled hires-fix upscaler (MMH3 Split Upscale combo)** — re-sample the H3 AV latent at higher
142
+ resolution by splitting into temporal chunks + spatial tiles, with seam-denoise, two-level color
143
+ matching and temporal anchors to avoid seams and ghosting.
144
+ - ✅ **24-channel Minimax H3 latent** — uses the exact per-channel mean/std normalization from
145
+ training.
146
+ - ✅ **Auto architecture detection** — reads `in_channels`, block counts, temporal config and
147
+ kernel size straight from the checkpoint; no manual config needed.
148
+ - ✅ **Robust weight loader** — supports `.safetensors` and `.pth`; auto-converts FP8→FP16;
149
+ tolerates the `upscaler.` prefix in merged checkpoints.
150
+ - ✅ **Flexible precision/device** — `cuda`/`cpu` and fp32/fp16/bf16 options.
151
+ - ✅ **Plug-and-play** — standard ComfyUI node, no changes to your existing workflow.
152
+
153
+ Inference forces attention **off** (`attn=False`) for speed and stability. Loaded models are
154
+ cached by `(name, device, precision)` so repeated runs stay cheap.
155
+
156
+ ---
157
+
158
+ ## 📦 Installation
159
+
160
+ 1. Clone this repository into ComfyUI's `custom_nodes` folder:
161
+
162
+ ```bash
163
+ cd ComfyUI/custom_nodes
164
+ git clone https://github.com/LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler.git
165
+ ```
166
+
167
+ 2. Required dependencies (`torch`, `einops`, `safetensors`) are already present in a standard
168
+ ComfyUI environment — no extra install needed.
169
+
170
+ 3. Restart ComfyUI.
171
+
172
+ ---
173
+
174
+ ## 🤖 Model Placement
175
+
176
+ The nodes scan and load weights from:
177
+
178
+ ```text
179
+ ComfyUI/models/latent_upscale_models/
180
+ ```
181
+
182
+ Put your Minimax H3 latent upscaler checkpoint (`.safetensors` or `.pth`) there. It will appear
183
+ automatically in the node's `model_name` dropdown.
184
+
185
+ Pre-trained checkpoints are available at:
186
+ [huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler)
187
+
188
+ The loader auto-detects the architecture, so a single checkpoint works for both the 2D and 3D
189
+ nodes as long as the stored structure matches.
190
+
191
+ ---
192
+
193
+ ## 🧩 Usage
194
+
195
+ Add the node you need from the `video/MinimaxH3` menu, connect a `LATENT`, pick the model, set the
196
+ resize mode / scale, and decode.
197
+
198
+ **Typical workflow:**
199
+ - **Quick preview:** `[Minimax H3 Latent] → [H3 Latent Upscaler] → [VAE Decode]`
200
+ - **High quality / time-saving (recommended):** `[Low-res Latent] → [H3 Latent Upscaler] → [Refine / Re-sample] → [VAE Decode]`
201
+
202
+ Compared to the naive approach `[Latent] → [VAE Decode] → [Pixel Upscaler] → [VAE Encode] → …`,
203
+ upscaling directly in latent space skips the expensive VAE decode/encode round-trip. Minimax H3's
204
+ ~5B-parameter VAE makes decode and re-encode notably slow, so this is where most of the time is
205
+ saved. It also avoids the **ghosting / double-image artifacts** that direct latent interpolation
206
+ (bilinear/bicubic) causes.
207
+
208
+ ⚠️ **Saves time, not VRAM:** the refinement still runs at the target resolution, so peak memory is
209
+ roughly the same as generating high-res directly. The benefit is purely faster turnaround.
210
+
211
+ ### Node Reference — 2D
212
+
213
+ | Parameter | Type | Default | Range / Options | Description |
214
+ | :--- | :--- | :--- | :--- | :--- |
215
+ | `latent` | LATENT | — | — | Input Minimax H3 latent (B,C,T,H,W) or (B,C,H,W) |
216
+ | `model_name` | dropdown | auto | scanned files | Checkpoint in `latent_upscale_models/` |
217
+ | `scale` | FLOAT | 2.0 | 1.0 – 4.0 (step 0.1) | Spatial upscale factor |
218
+ | `device` | dropdown | cuda | cuda / cpu | Inference device |
219
+ | `precision` | dropdown | fp32 | fp32 / fp16 / bf16 | Inference precision |
220
+
221
+ **Output:** `LATENT` — the upscaled latent, ready for VAE decode.
222
+
223
+ ### Node Reference — 3D
224
+
225
+ | Parameter | Type | Default | Range / Options | Description |
226
+ | :--- | :--- | :--- | :--- | :--- |
227
+ | `latent` | LATENT | — | — | Input Minimax H3 latent (B,C,T,H,W) or (B,C,H,W) |
228
+ | `model_name` | dropdown | auto | scanned files | Checkpoint in `latent_upscale_models/` |
229
+ | `mode` | dropdown | `scale by multiplier` | `scale by multiplier` / `target dimensions` / `megapixels` | How the output size is chosen |
230
+ | `scale` | FLOAT | 2.0 | 1.0 – 4.0 (step 0.05) | Used when `mode` is `scale by multiplier` |
231
+ | `width` | INT | 1280 | 64 – 8192 (step 8) | Target pixel width (used by `target dimensions`) |
232
+ | `height` | INT | 704 | 64 – 8192 (step 8) | Target pixel height (used by `target dimensions`) |
233
+ | `megapixels` | FLOAT | 1.0 | 0.1 – 16.0 (step 0.1) | Target total megapixels (used by `megapixels`); keeps aspect ratio |
234
+ | `align` | INT | 32 | 1 – 512 | Pixel-grid alignment: output W/H are independently rounded to multiples of this value (e.g. 16/32/64) |
235
+ | `enable_temporal_chunking` | BOOLEAN | True | True / False | Split long videos into temporal chunks to cap VRAM; disable for short clips for full-context inference |
236
+ | `force_unload` | BOOLEAN | True | True / False | Unload model to CPU after inference to free VRAM for subsequent nodes; disable if you reuse this node repeatedly to avoid reload overhead |
237
+ | `device` | dropdown | cuda | cuda / rocm / cpu | Inference backend (ROCm needs a HIP-enabled PyTorch build) |
238
+ | `precision` | dropdown | fp32 | fp32 / fp16 / bf16 | Inference precision |
239
+
240
+ **Output:** `LATENT` — the upscaled latent.
241
+
242
+ > **Which node to pick?** Use **2D** for speed and when frames are already temporally stable; use
243
+ > **3D** when you need stronger motion/temporal coherence or prefer specifying output size by
244
+ > `target dimensions` / `megapixels`.
245
+
246
+ ### Node Reference — MMH3 Split Upscale (combo)
247
+
248
+ A tiled, **hires-fix style** re-sampling upscaler for H3 video, **decomposed and optimized from the
249
+ Comfyui-MMH3-UltimateUpscale project**. Unlike the 2D/3D nodes (which use a
250
+ pre-trained upscaler network), this combo re-runs the diffusion sampler on a higher-resolution
251
+ version of the latent, split into pieces so it fits in VRAM. It operates on the H3 **AV latent**
252
+ (nested video 24ch + audio 32ch) and requires `model` + `conditioning` + `sampler`/`sigmas`.
253
+
254
+ **`MMH3 Temporal Split Params`** — how to cut the clip along time (H3's native 5+17·m frame/token grid):
255
+
256
+ | Parameter | Type | Default | Range / Options | Description |
257
+ | :--- | :--- | :--- | :--- | :--- |
258
+ | `chunk_frames` | INT | 73 | 5 – 100000 | Chunk length in frames (snapped to H3 token grid) |
259
+ | `temporal_overlap_frames` | INT | 22 | 0 – 100000 | Overlap between consecutive chunks |
260
+ | `anchor_strength` | FLOAT | 0.999 | 0.0 – 1.0 | Temporal anchor strength |
261
+ | `motion_anchor_frames` | dropdown | 22 | 0 / 5 / 22 / 39 | Motion anchor length in frames |
262
+ | `identity_anchor_frames` | INT | 24 | 0 – 240 | Spacing of identity anchors |
263
+
264
+ Output: `temporal_split_param` (custom type, feeds the main node).
265
+
266
+ **`MMH3 Spatial Split Params`** — how to cut each frame into tiles:
267
+
268
+ | Parameter | Type | Default | Range / Options | Description |
269
+ | :--- | :--- | :--- | :--- | :--- |
270
+ | `tile_width` | INT | 512 | 64 – 16384 (step 32) | Tile width in pixels |
271
+ | `tile_height` | INT | 512 | 64 – 16384 (step 32) | Tile height in pixels |
272
+ | `overlap_ratio` | FLOAT | 0.25 | 0.0 – 0.90 | Overlap as a fraction of the tile |
273
+ | `fade_ratio` | FLOAT | 0.50 | 0.0 – 1.0 | Fade band width within the overlap |
274
+ | `min_tile_size` | INT | 256 | 0 – 16384 (step 32) | Minimum tile edge; avoids tiny edge tiles |
275
+ | `seam_denoise` | FLOAT | 1.0 | 0.1 – 1.0 | Seam-neighborhood denoise cap; <1 prevents fast objects being cut at seams (suggest 0.5–0.8) |
276
+
277
+ Outputs: `spatial_split_param` (custom type) + `grid_preview` (string, shows the computed tile/overlap grid).
278
+
279
+ **`MMH3 Split Upscale`** — the main orchestrator:
280
+
281
+ | Parameter | Type | Default | Range / Options | Description |
282
+ | :--- | :--- | :--- | :--- | :--- |
283
+ | `model` | MODEL | — | — | Diffusion model used for re-sampling |
284
+ | `conditioning` | CONDITIONING | — | — | Positive conditioning |
285
+ | `negative` | CONDITIONING | — | optional | Negative conditioning |
286
+ | `latent` | LATENT | — | — | Input H3 AV latent (nested video 24ch + audio 32ch); batch 1 only |
287
+ | `noise` | NOISE | — | — | Noise source for the sampler |
288
+ | `sampler` | SAMPLER | — | — | Sampler |
289
+ | `sigmas` | SIGMAS | — | — | Sigma schedule |
290
+ | `cfg` | FLOAT | 1.0 | 0.0 – 100.0 | Classifier-free guidance scale |
291
+ | `temporal_split_param` | custom | — | optional | From `MMH3 Temporal Split Params` |
292
+ | `spatial_split_param` | custom | — | optional | From `MMH3 Spatial Split Params` |
293
+ | `seam_polish` | dropdown | off | off / auto / all | Extra de-seam pass on detected seams |
294
+ | `color_match` | BOOLEAN | True | True / False | Two-level color matching across tiles/chunks |
295
+
296
+ **Output:** `LATENT` — the upscaled H3 AV latent, ready for VAE decode.
297
+
298
+ > **Notes:** Both `* Split Params` nodes are optional — leave them unconnected for a single
299
+ > full-frame pass (no temporal/spatial splitting). The combo re-runs the sampler at the higher
300
+ > resolution, so it trades extra compute for VRAM headroom on long / high-res clips.
301
+
302
+ ---
303
+
304
+ ## 🧪 Model / Architecture
305
+
306
+ - **Latent format:** 24-channel Minimax H3 VAE latent, normalized per-channel with the training
307
+ mean/std before inference and de-normalized after.
308
+ - **Default detected architecture** (overridden automatically if the checkpoint differs):
309
+ `in_channels=24`, `in_blocks=12`, `out_blocks=12`, `base_channels=512`, `dropout=0.1`,
310
+ `temporal_every=2`, `temporal_kernel=5`, `attn=False`.
311
+ - **Interpolation:** the 2D node uses bilinear feature interpolation; the 3D node uses trilinear.
312
+ - **Temporal handling:** both variants preserve the time dimension (only H×W are scaled).
313
+
314
+ ---
315
+
316
+ ## 📊 Training Data
317
+
318
+ The upscaler was trained on **~80,000 paired samples** (a low-resolution latent paired with its
319
+ high-resolution target), balanced across modalities and scale factors to maximize generalization.
320
+
321
+ **By data modality:**
322
+
323
+ | Modality | Pairs | Share |
324
+ | :--- | :--- | :--- |
325
+ | Video clips | ~70,000 | ~87.5% |
326
+ | 2K images | ~8,000 | ~10% |
327
+
328
+ **By upscale factor (scale distribution, approximate):**
329
+
330
+ | Scale | Share | Note |
331
+ | :--- | :--- | :--- |
332
+ | 2× | 40% | Dominant factor — the most common real-world case |
333
+ | 1.5× | 10% | — |
334
+ | 2.5× | 10% | — |
335
+ | 3× | 10% | — |
336
+ | 4× | 10% | — |
337
+ | 1.0×–4.0× (arbitrary decimals) | 10% | Improves generalization to in-between / non-fixed scales |
338
+
339
+ The heavy emphasis on **2× (40%)** matches the most common practical use case, while the **10% spread
340
+ of arbitrary decimal scales between 1 and 4** prevents overfitting to the fixed 1.5×/2×/2.5×/3×/4×
341
+ buckets — letting the model handle any continuous `scale` in the 1.0×–4.0× range at inference time.
342
+
343
+ ---
344
+
345
+ ## 🙏 Acknowledgments
346
+
347
+ This node follows the neural-latent-upscaling approach pioneered by
348
+ [ComfyUi_NNLatentUpscale](https://github.com/Ttl/ComfyUi_NNLatentUpscale) by **Ttl**
349
+ (https://github.com/Ttl). The model architecture also draws on and references the
350
+ **LTX 2.3 Spatial Upscaler** (`ltx-2.3-spatial-upscaler-x2-1.1.safetensors`).
351
+ Thanks to both projects for the open-source foundation this work builds upon.
Comfyui_Minimax_h3_latent_Upscaler/README_zh.md ADDED
@@ -0,0 +1,321 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <p align="center">
2
+ <a href="./README.md">English</a> ·
3
+ <a href="./README_zh.md"><strong>中文</strong></a>
4
+ </p>
5
+
6
+ <div align="center">
7
+
8
+ # ComfyUI Minimax H3 Latent Upscaler
9
+
10
+ **Minimax H3 视频生成专用 Latent 神经网络放大节点**
11
+ 学习型 · 高保真 · 2D 与 3D 双版本
12
+
13
+ </div>
14
+
15
+ ## 📰 更新动态
16
+
17
+ - [2026-08-28] 🚀 **新增组合节点 — MMH3 Split Upscale**:新增三个节点(`MMH3 Temporal Split Params`、`MMH3 Spatial Split Params`、`MMH3 Split Upscale`),对 H3 视频做**分块式「高清重采样」放大**。该组合是在 **Comfyui-MMH3-UltimateUpscale** 项目基础上拆解优化而来——把 AV latent 沿时间切块、沿空间分块,逐块重采样后再无缝拼接;相比原版主要增强:更稳的拼接(`seam_denoise` + probe 门控二道缝修补)、颜色零漂移(空间+时间两级颜色匹配 + 首块/每 chunk 钉源)、三重时间锚(frame-0 / motion / identity)、更易用(空间参数简化为重叠率/渐变率百分比并自动吸附网格)、更轻量(移除内置放大模型,改接外部预放大 latent)。
18
+ - [2026-08-26] 🚀 **3D 节点显存与使用优化**:采用零拷贝模型加载,并接入 ComfyUI 原生 `soft_empty_cache` 与显式 `.contiguous()`,降低加载与推理期间的显存/内存峰值;推理后卸载到 CPU 改为可选开关 `force_unload`(默认开启);`enable_chunking` 更名为 `enable_temporal_chunking`,分块有效帧数由 24 提升至 32;模型文件现可放入子目录(PR #30);`target dimensions` 与 `megapixels` 上限分别放宽到 8192 像素与 16 MP。
19
+ - [2026-08-23] 🚀 **3D 节点改进**:新增 `enable_chunking` 开关(短片段可关闭,使用全上下文推理);修复时间分块边缘伪影——采用 Replicate Padding 与重叠区域加权融合,消除末尾帧闪烁;新增 ROCm(AMD 显卡)后端支持,设备选项新增 `rocm`。
20
+ - [2026-08-21] 🚀 **3D 节点优化**:节点执行后自动将模型卸载到 CPU,为后续二次采样释放显存;宽高分别独立对齐到 `align` 网格(默认 32),修复底部光带问题;归一化/反归一化由原地操作改为标准运算,保留时间分块以支持长视频。
21
+ - [2026-08-19] 🚀 **3D 节点重构**:三种缩放模式(`scale by multiplier`、`target dimensions`、`megapixels`)合并进单一节点;修复特定模式下造成的比例不统一,修复各类特定尺寸造成的边缘伪影;新增示例工作流供参考。
22
+ - [2026-08-18] 🔥 **精度选择**:2D / 3D 节点均支持 `fp32` / `fp16` / `bf16` 推理。
23
+ - [2026-08-17] 🎉 **初始发布**:Minimax H3 Latent Upscaler 2D + 3D 双节点、双语 README、内联示例。
24
+
25
+ 一个 ComfyUI 自定义节点,用训练好的神经网络(而非简单插值)对 **Minimax H3** 的 VAE latent
26
+ (24 通道)进行放大。它的**主要目的是加速高分辨率视频的生成**,并提升画质:
27
+
28
+ - **跳过「解码 → 像素放大 → 再编码」的慢速往返。** Minimax H3 自带约 5B 参数的笨重 VAE,
29
+ 对 latent 做解码和再编码都很耗时;直接在 latent 空间放大,就彻底省掉了这一往返开销。
30
+ - **支持更快的生成流程:** 先低分辨率生成(latent token 少得多),用本节点放大 latent,再在
31
+ 目标分辨率下二次采样 / 重绘精修。
32
+
33
+ 同时,它**避免了直接对 latent 插值(双线性/双三次)带来的鬼影、重影问题**,作用类似于
34
+ **LTX2.3** 中的 latent 放大模型。
35
+
36
+ ⚠️ 它节省的是**时间,不是显存** —— 精修阶段仍在目标分辨率下运行,峰值显存与直接高清生成接近,
37
+ 收益纯粹是更快出片。
38
+
39
+ 提供两个节点变体,均注册在 `video/MinimaxH3` 分类下:
40
+
41
+ - **Minimax H3 Latent Upscaler (2D)**:2D 残差主干 + 穿插的时序 3D 卷积,仅做空间(H×W)放大,
42
+ 时间维度保持不变,轻量且快速。使用简单的 `scale` 倍数(1.0×–4.0×)。
43
+ - **Minimax H3 Latent Upscaler (3D)**:纯 3D 卷积主干(3D 残差块 + 时序卷积 + 三线性插值),
44
+ 联合处理时空体,时间一致性更强,但算力/显存开销更高。一个节点内置**三种缩放模式**:
45
+ - `scale by multiplier`:经典 `scale` 倍数(1.0×–4.0×)。
46
+ - `target dimensions`:直接填目标像素 `width` / `height`。
47
+ - `megapixels`:填目标总像素(百万像素,例如 `1.2`),保持原宽高比。
48
+ `target dimensions` 与 `megapixels` 两种模式会按可配置的像素网格对齐输出,并自动反推等效倍率。
49
+
50
+ > 3D 节点在尺寸模式下会在内部计算出等效 `scale` 并喂给同一个训练好的模型,因此 1.0×–4.0× 之间
51
+ > 任意目标都能用。
52
+
53
+ > 两个节点均**只支持放大**(等效 `scale >= 1.0`)。`scale = 1.0` 返回输入原样;等效倍率小于 1.0 会报错。
54
+
55
+ ### MMH3 Split Upscale(组合节点)
56
+
57
+ > **来源:** 该组合是在 **Comfyui-MMH3-UltimateUpscale** 项目���础上**拆解优化**而来。原本的单节点被拆成三个可组合节点(时间切分 / 空间切分 / 主放大),
58
+ > 并在原有分块逻辑之上,针对拼接稳定性、色彩一致性、时间连续性、易用性与轻量化做了系统性增强。
59
+
60
+ 一套独立的**三节点组合**,在扩散采样器内部做**分块式「高清重采样」放大**(而非用预训练放大网络)。
61
+ 它接收 H3 的 **AV latent**(嵌套:视频 24 通道 + 音频 32 通道),沿**时间切块**、沿**空间分块**,
62
+ 对每一块单独跑采样器,再用缝降噪、两级颜色匹配与时间锚点把结果**无缝拼接**回去,避免出现接缝和鬼影。
63
+ 两个 `* Split Params` 节点负责配置切分方式,并喂给主节点 `MMH3 Split Upscale`(两者均可选——
64
+ 不连接即为整段/整帧单次处理)。它需要 `model` + `conditioning` + `sampler`/`sigmas`,即会在更高
65
+ 分辨率上重新跑一遍采样。
66
+
67
+ **相比原版主要增强(拆解优化点):**
68
+
69
+ - **🔧 更稳的拼接(Seam / Ghosting)**:缝邻域降噪上限(`seam_denoise`)+ probe 门控的**二道缝修补**(`seam_polish`),消除接缝与鬼影;在高降噪 + 快速运动下,运动物体也不再被切断("断肢")。
70
+ - **🎨 颜色零漂移(Color Zero-Drift)**:**空间 + 时间两级颜色匹配**,并对**首块**与**每个 chunk** 做全局色基准钉源(`grade_pin`),彻底解决块间闪烁、左上角发青等问题。
71
+ - **⏱️ 更强的时间连续性(Temporal Continuity)**:`frame-0 锚` + `motion 锚` + `identity 锚` **三重时间锚**,高降噪时自动兜底身份一致性,人物不漂移。
72
+ - **🧩 更易用(Usability)**:空间参数由原本的 9 项精简为**百分比**(重叠率 / 渐变率),并自动吸附 latent 网格;`negative` 紧跟 `conditioning` 布局,连线更直观。
73
+ - **🪶 更轻量(Lightweight)**:移除内置放大模型,改接**外部预放大 latent**,显存更可控、节点更专注。
74
+
75
+ **新增 / 优化的模块(相对于原项目):**
76
+
77
+ | 模块 | 新增 / 优化的内容 |
78
+ | :--- | :--- |
79
+ | **预防(Prevention)** | 冻结预填重叠带 + **三重时间锚**(frame-0 锚 + motion 锚 + identity 锚)+ cross-fade 拼接——让接缝与分叉在生成之初就不出现。 |
80
+ | **校正(Correction)** | **空间/时间两级颜色匹配** + 首块源参考 + 每块(chunk)全局钉源(`grade_pin`)——保证各瓦片、各时间块之间的色彩与亮度一致,杜绝块间闪烁与局部发青。 |
81
+ | **抗分叉(Anti-forking)** | `seam_denoise` 上限——在高降噪 + 快速运动下,缝邻域以*中等*降噪续写邻居内容,防止运动物体被切断("断肢");配合 probe 门控的二道缝修补,接缝与鬼影一并消除(建议 0.5–0.8;1.0 = 关闭)。 |
82
+ | **修复(Fixes)** | **每瓦片独立 Guider** + 裁剪 keyframes,以及**修复版 probe 门控去缝**(`seam_polish`)——每个瓦片获得正确作用域的条件/关键帧,去缝门控不再过度或不足。 |
83
+ | **简化(Simplification)** | `overlap` / `fade` 改为**百分比参数**(重叠率 / 渐变率,与分辨率无关),替代原来的绝对像素值,并自动吸附 latent 网格;`negative` 紧跟 `conditioning`,布局更直观。 |
84
+
85
+ ---
86
+
87
+ ## 📸 示例
88
+
89
+ **视频放大对比**
90
+
91
+ <video src="examples/Minimax_h3_latent_Upscaler_001.mp4" controls width="640"></video>
92
+
93
+ **图像放大对比**
94
+
95
+ ![](examples/Minimax_h3_latent_Upscaler_002.jpg)
96
+
97
+ ---
98
+
99
+ ## 📁 项目结构
100
+
101
+ ```text
102
+ Comfyui_Minimax_h3_latent_Upscaler/
103
+ ├── examples/
104
+ │ ├── Minimax_h3_latent_Upscaler_001.mp4
105
+ │ └── Minimax_h3_latent_Upscaler_002.jpg
106
+ ├── workflow_templates/
107
+ │ └── minimax_h3_r2v_Latent Upscaler example workflow.json # ComfyUI 模板示例工作流
108
+ ├── nodes/
109
+ │ ├── __init__.py # 合并 2D/3D/组合节点映射
110
+ │ ├── minimax_h3_latent_upscaler_2d.py # 2D 主干 + Temporal 3D Conv(倍数模式)
111
+ │ ├── minimax_h3_latent_upscaler_3d.py # 纯 3D 卷积,支持 3 种缩放模式
112
+ │ └── MMH3_Split_Upscale.py # MMH3 Split Upscale 组合(基于 Comfyui-MMH3-UltimateUpscale 拆解优化)
113
+ ├── README.md
114
+ ├── README_zh.md
115
+ └── __init__.py
116
+ ```
117
+
118
+ > 模型权重**不**随仓库提供,请按下方「模型放置」说明放入 ComfyUI 模型目录。
119
+
120
+ ---
121
+
122
+ ## 🚀 核心特性
123
+
124
+ - ✅ **学习型 latent 放大** — 针对 Minimax H3 latent 训练的神经网络,比双线性/双三次插值清晰得多。
125
+ - ✅ **两种主干** — 追求速度选轻量的 **2D** 版,追求时间一致性选 **3D** 版。
126
+ - ✅ **3D 节点三种输出尺寸方式** — 支持 `scale by multiplier` / `target dimensions` /
127
+ `megapixels`,均带像素网格对齐与宽高比锁定。
128
+ - ✅ **分块式高清重采样(MMH3 Split Upscale 组合)** — 把 H3 的 AV latent 沿时间切块 + 空间分块,
129
+ 在更高分辨率上重采样,配合缝降噪、两级颜色匹配与时间锚点,避免接缝与鬼影。
130
+ - ✅ **24 通道 Minimax H3 latent** — 使用训练时一致的逐通道均值/标准差做归一化。
131
+ - ✅ **自动识别模型结构** — 直接从权重读取通道数、块数、时序配置与卷积核大小,无需手动配置。
132
+ - ✅ **鲁棒的权重加载器** — 支持 `.safetensors` 与 `.pth`;自动 FP8→FP16;兼容合并权重中的
133
+ `upscaler.` 前缀。
134
+ - ✅ **可选精度与设备** — `cuda`/`cpu` 与 fp32/fp16/bf16 选项。
135
+ - ✅ **即插即用** — 标准 ComfyUI 节点,不改变现有工作流。
136
+
137
+ 推理时强制关闭注意力(`attn=False`)以提升速度与稳定性;已加载模型按 `(名称, 设备, 精度)`
138
+ 缓存,重复调用开销很低。
139
+
140
+ ---
141
+
142
+ ## 📦 安装
143
+
144
+ 1. 将仓库克隆到 ComfyUI 的 `custom_nodes` 文件夹:
145
+
146
+ ```bash
147
+ cd ComfyUI/custom_nodes
148
+ git clone https://github.com/LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler.git
149
+ ```
150
+
151
+ 2. 所需依赖(`torch`、`einops`、`safetensors`)在标准 ComfyUI 环境中已自带,无需额外安装。
152
+
153
+ 3. 重启 ComfyUI。
154
+
155
+ ---
156
+
157
+ ## 🤖 模型放置
158
+
159
+ 节点从这里扫描并加载权重:
160
+
161
+ ```text
162
+ ComfyUI/models/latent_upscale_models/
163
+ ```
164
+
165
+ 把你的 Minimax H3 latent 放大模型权重(`.safetensors` 或 `.pth`)放进该目录,节点下拉框会自动列出。
166
+
167
+ 预训练权重可在此下载:
168
+ [huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler)
169
+
170
+ 加载器会自动识别结构,只要权重存储的结构匹配,2D 与 3D 节点可共用同一份权重。
171
+
172
+ ---
173
+
174
+ ## 🧩 使用方法
175
+
176
+ 从 `video/MinimaxH3` 菜单中添加所需节点,连入一个 `LATENT`,选择模型、设置缩放模式/参数,再解码即可。
177
+
178
+ **典型流程:**
179
+ - **快速预览:** `[Minimax H3 Latent] → [H3 Latent Upscaler] → [VAE 解码]`
180
+ - **高品质 / 省时(推荐):** `[低清 Latent] → [H3 Latent Upscaler] → [二次采样重绘/精修] → [VAE 解码]`
181
+
182
+ 相比「[Latent] → [VAE 解码] → [像素放大] → [VAE 编码] → …」这种朴素做法,直接在 latent 空间
183
+ 放大跳过了昂贵的 VAE 解码/编码往返。Minimax H3 的约 5B 参数 VAE 让解码与再编码都明显偏慢,时间
184
+ 主要就省在这里。同时也避免了直接对 latent 插值(双线性/双三次)造成的**鬼影 / 重影**问题。
185
+
186
+ ⚠️ **省时间,不省显存:** 精修仍在目标分辨率下运行,峰值显存与直接高清生成接近,收益纯粹是更快出片。
187
+
188
+ ### 节点参数 — 2D
189
+
190
+ | 参数 | 类型 | 默认值 | 范围 / 选项 | 说明 |
191
+ | :--- | :--- | :--- | :--- | :--- |
192
+ | `latent` | LATENT | — | — | 输入的 Minimax H3 latent((B,C,T,H,W) 或 (B,C,H,W)) |
193
+ | `model_name` | 下拉框 | 自动 | 扫描到的文件 | `latent_upscale_models/` 中的模型 |
194
+ | `scale` | FLOAT | 2.0 | 1.0 – 4.0(步进 0.1) | 空间放大倍数 |
195
+ | `device` | 下拉框 | cuda | cuda / cpu | 推理设备 |
196
+ | `precision` | 下拉框 | fp32 | fp32 / fp16 / bf16 | 推理精度 |
197
+
198
+ **输出:** `LATENT` — 放大后的 latent,可直接送 VAE 解码。
199
+
200
+ ### 节点参数 — 3D
201
+
202
+ | 参数 | 类型 | 默认值 | 范围 / 选项 | 说明 |
203
+ | :--- | :--- | :--- | :--- | :--- |
204
+ | `latent` | LATENT | — | — | 输入的 Minimax H3 latent((B,C,T,H,W) 或 (B,C,H,W)) |
205
+ | `model_name` | 下拉框 | 自动 | 扫描到的文件 | `latent_upscale_models/` 中的模型 |
206
+ | `mode` | 下拉框 | `scale by multiplier` | `scale by multiplier` / `target dimensions` / `megapixels` | 输出尺寸选择方式 |
207
+ | `scale` | FLOAT | 2.0 | 1.0 – 4.0(步进 0.05) | `mode` 为 `scale by multiplier` 时使用 |
208
+ | `width` | INT | 1280 | 64 – 8192(步进 8) | 目标像素宽(`target dimensions` 使用) |
209
+ | `height` | INT | 704 | 64 – 8192(步进 8) | 目标像素高(`target dimensions` 使用) |
210
+ | `megapixels` | FLOAT | 1.0 | 0.1 – 16.0(步进 0.1) | 目标总百万像素(`megapixels` 使用),保持宽高比 |
211
+ | `align` | INT | 32 | 1 – 512 | 像素网格对齐:输出 W/H 会分别独立取整到该值的倍数(如 16/32/64) |
212
+ | `enable_temporal_chunking` | BOOLEAN | True | True / False | 长视频时间分块以压低显存峰值;短片段可关闭,使用全上下文推理 |
213
+ | `force_unload` | BOOLEAN | True | True / False | 推理后将模型卸载到 CPU,为后续节点释放显存;若重复使用本节点可关闭,避免重复加载开销 |
214
+ | `device` | 下拉框 | cuda | cuda / rocm / cpu | 推理后端(ROCm 需要支持 HIP 的 PyTorch 构建) |
215
+ | `precision` | 下拉框 | fp32 | fp32 / fp16 / bf16 | 推理精度 |
216
+
217
+ **输出:** `LATENT` — 放大后的 latent。
218
+
219
+ > **选哪个节点?** 帧间已较稳定、求快时选 **2D**;需要更强运动/时间一致性,或想直接按目标
220
+ > 像素/百万像素出图,选 **3D**。
221
+
222
+ ### 节点参数 — MMH3 Split Upscale(组合)
223
+
224
+ 一套**分块式「高清重采样」**的 H3 视频放大方案,**在 Comfyui-MMH3-UltimateUpscale 项目基础上拆解优化而来**。和 2D/3D 节点(用预训练放大网络)不同,这套组合会在
225
+ latent 的更高分辨率版本上重跑扩散采样器,并切块以适配显存。它操作的是 H3 的 **AV latent**
226
+ (嵌套:视频 24 通道 + 音频 32 通道),需要 `model` + `conditioning` + `sampler`/`sigmas`。
227
+
228
+ **`MMH3 Temporal Split Params`** — 沿时间怎么切(对齐 H3 原生的 5+17·m 帧/token 网格):
229
+
230
+ | 参数 | 类型 | 默认值 | 范围 / 选项 | 说明 |
231
+ | :--- | :--- | :--- | :--- | :--- |
232
+ | `chunk_frames` | INT | 73 | 5 – 100000 | 每块帧数(自动对齐 H3 token 网格) |
233
+ | `temporal_overlap_frames` | INT | 22 | 0 – 100000 | 相邻块之间的重叠帧数 |
234
+ | `anchor_strength` | FLOAT | 0.999 | 0.0 – 1.0 | 时间锚强度 |
235
+ | `motion_anchor_frames` | 下拉框 | 22 | 0 / 5 / 22 / 39 | 运动锚长度(帧) |
236
+ | `identity_anchor_frames` | INT | 24 | 0 – 240 | 身份锚间距 |
237
+
238
+ 输出:`temporal_split_param`(自定义类型,喂给主节点)。
239
+
240
+ **`MMH3 Spatial Split Params`** — 每帧怎么切瓦片:
241
+
242
+ | 参数 | 类型 | 默认值 | 范围 / 选项 | 说明 |
243
+ | :--- | :--- | :--- | :--- | :--- |
244
+ | `tile_width` | INT | 512 | 64 – 16384(步进 32) | 瓦片宽(像素) |
245
+ | `tile_height` | INT | 512 | 64 – 16384(步进 32) | 瓦片高(像素) |
246
+ | `overlap_ratio` | FLOAT | 0.25 | 0.0 – 0.90 | 重叠占比(占瓦片) |
247
+ | `fade_ratio` | FLOAT | 0.50 | 0.0 – 1.0 | 重叠区内的渐变带宽度 |
248
+ | `min_tile_size` | INT | 256 | 0 – 16384(步进 32) | 最小瓦片边长;避免边缘出现极小瓦片 |
249
+ | `seam_denoise` | FLOAT | 1.0 | 0.1 – 1.0 | 缝邻域降噪上限;<1 时高降噪下防止快速物体被切断(建议 0.5–0.8) |
250
+
251
+ 输出:`spatial_split_param`(自定义类型)+ `grid_preview`(字符串,显示计算出的瓦片/重叠网格)。
252
+
253
+ **`MMH3 Split Upscale`** — 主调度节点:
254
+
255
+ | 参数 | 类型 | 默认值 | 范围 / 选项 | 说明 |
256
+ | :--- | :--- | :--- | :--- | :--- |
257
+ | `model` | MODEL | — | — | 用于重采样的扩散模型 |
258
+ | `conditioning` | CONDITIONING | — | — | 正向条件 |
259
+ | `negative` | CONDITIONING | — | 可选 | 负向条件 |
260
+ | `latent` | LATENT | — | — | 输入的 H3 AV latent(嵌套:视频 24 通道 + 音频 32 通道);仅支持 batch 1 |
261
+ | `noise` | NOISE | — | — | 采样器用的噪声源 |
262
+ | `sampler` | SAMPLER | — | — | 采样器 |
263
+ | `sigmas` | SIGMAS | — | — | 调度序列(sigma schedule) |
264
+ | `cfg` | FLOAT | 1.0 | 0.0 – 100.0 | 无分类器引导强度 |
265
+ | `temporal_split_param` | 自定义 | — | 可选 | 来自 `MMH3 Temporal Split Params` |
266
+ | `spatial_split_param` | 自定义 | — | 可选 | 来自 `MMH3 Spatial Split Params` |
267
+ | `seam_polish` | 下拉框 | off | off / auto / all | 对检测到的接缝额外做去缝处理 |
268
+ | `color_match` | BOOLEAN | True | True / False | 跨瓦片/块的两级颜色匹配 |
269
+
270
+ **输出:** `LATENT` — 放大后的 H3 AV latent,可直接送 VAE 解码。
271
+
272
+ > **注意:** 两个 `* Split Params` 节点都可不接(即为整段/整帧单次处理,不做时间/空间切分)。
273
+ > 该组合会在更高分辨率上重跑采样器,因此以额外算力换取长视频 / 高分辨率下的显存余量。
274
+
275
+ ---
276
+
277
+ ## 🧪 模型与架构
278
+
279
+ - **Latent 格式:** 24 通道 Minimax H3 VAE latent,推理前按训练均值/标准差逐通道归一化,推理后反归一化。
280
+ - **默认检测结构**(若权重不同会被自动覆盖):`in_channels=24`、`in_blocks=12`、
281
+ `out_blocks=12`、`base_channels=512`、`dropout=0.1`、`temporal_every=2`、
282
+ `temporal_kernel=5`、`attn=False`。
283
+ - **插值方式:** 2D 节点用双线性特征插值;3D 节点用三线性插值。
284
+ - **时间处理:** 两个节点均保持时间长度不变,仅放大空间分辨率(H×W)。
285
+
286
+ ---
287
+
288
+ ## 📊 训练数据
289
+
290
+ 该放大模型在**近 8 万对样本**上训练(低分辨率 latent 与高分辨率目标配对),并在数据类型与缩放倍数上做了均衡,以提升泛化能力。
291
+
292
+ **按数据类型:**
293
+
294
+ | 数据类型 | 对数 | 占比 |
295
+ | :--- | :--- | :--- |
296
+ | 视频素材 | 约 70,000 对 | 约 87.5% |
297
+ | 2K 图像 | 约 8,000 对 | 约 10% |
298
+
299
+ **按缩放倍数(占比,约):**
300
+
301
+ | 倍数 | 占比 | 说明 |
302
+ | :--- | :--- | :--- |
303
+ | 2× | 40% | 主力倍数 —— 最常见的实际使用场景 |
304
+ | 1.5× | 10% | — |
305
+ | 2.5× | 10% | — |
306
+ | 3× | 10% | — |
307
+ | 4× | 10% | — |
308
+ | 1.0×–4.0×(任意小数位) | 10% | 增强对中间任意倍数的泛化能力 |
309
+
310
+ 重点放在 **2×(40%)**,对应最常见的实际使用场景;而 **1–4 之间的任意小数位占 10%** 这一设计,
311
+ 是为了避免模型只对固定的 1.5×/2×/2.5×/3×/4× 几个档位过拟合,从而能在推理时处理 1.0×–4.0× 区间内
312
+ 任意连续 `scale` 值。
313
+
314
+ ---
315
+
316
+ ## 🙏 致谢
317
+
318
+ 本节点沿用了 **Ttl** 提出的「神经网络 latent 放大」思路
319
+ ([ComfyUi_NNLatentUpscale](https://github.com/Ttl/ComfyUi_NNLatentUpscale),
320
+ https://github.com/Ttl)。本项目模型架构同时参考借鉴了 **LTX 2.3 Spatial Upscaler**
321
+ (`ltx-2.3-spatial-upscaler-x2-1.1.safetensors`)。感谢这些开源工作为本项目奠定基础。
Comfyui_Minimax_h3_latent_Upscaler/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
2
+
3
+ __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
Comfyui_Minimax_h3_latent_Upscaler/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (321 Bytes). View file
 
Comfyui_Minimax_h3_latent_Upscaler/examples/Minimax_h3_latent_Upscaler_001.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:12ed02f38b167768ff865a880bec42d15d18e60522952ae601f28fc71508e71f
3
+ size 8011665
Comfyui_Minimax_h3_latent_Upscaler/examples/Minimax_h3_latent_Upscaler_002.jpg ADDED

Git LFS Details

  • SHA256: 33c4cf7e57d8836cdbdf09533283b99e6f40624e54334720cbae98959e001b43
  • Pointer size: 131 Bytes
  • Size of remote file: 853 kB
Comfyui_Minimax_h3_latent_Upscaler/nodes/MMH3_Split_Upscale.py ADDED
@@ -0,0 +1,725 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """MMH3 Split Upscale - 完整最终版 (含 seam_denoise 缝邻域降噪上限)
2
+ 预防: 冻结预填重叠带 + 三重时间锚 + cross-fade
3
+ 校正: 空间/时间两级颜色匹配 + 首块源参考 + 每 chunk 全局钉源
4
+ 抗分叉: seam_denoise 缝邻域降噪上限 (高降噪+快运动防切割残影)
5
+ 修复: 每瓦片独立 Guider + 裁剪 keyframes; 修复版 probe 门控 polish
6
+ 简化: overlap/fade 百分比参数。
7
+ """
8
+
9
+ import math
10
+ import torch
11
+ import comfy.model_management
12
+ import comfy.sample
13
+ import comfy.samplers
14
+ import comfy.utils
15
+ import comfy.nested_tensor
16
+ import latent_preview
17
+ from comfy_api.latest import io
18
+
19
+ try:
20
+ from comfy.ldm.minimax.model import FRAME_PER_TOKEN, FRAME_RESCALE
21
+ except Exception:
22
+ FRAME_PER_TOKEN = (1, 4, 4, 4, 4)
23
+ FRAME_RESCALE = 5.0 / 3.0
24
+
25
+ H3_TEMPORAL_PARAM = io.Custom("H3_TEMPORAL_PARAM_V10")
26
+ H3_SPATIAL_PARAM = io.Custom("H3_SPATIAL_PARAM_V10")
27
+
28
+ VAE_DOWNSAMPLE = 16
29
+ ALIGN = 2
30
+ MAX_IDENTITY_ANCHORS = 6
31
+ POLISH_HALO = 16
32
+ DC_MATCH_CLAMP = 0.05
33
+ SEAM_CORR_GATE, SEAM_DC_GATE = 0.85, 0.6
34
+ COLOR_CLAMP = 0.05
35
+
36
+ # ---------------------------------------------------------------------------
37
+ # 帧/token 映射
38
+ # ---------------------------------------------------------------------------
39
+ def frames_for_tokens(n): return sum(FRAME_PER_TOKEN[i % 5] for i in range(n))
40
+
41
+ def tokens_for_frames(f):
42
+ n, acc = 0, 0
43
+ while acc < f:
44
+ acc += FRAME_PER_TOKEN[n % 5]; n += 1
45
+ return n
46
+
47
+ def audio_range(f0, f1): return round(f0 * FRAME_RESCALE), round(f1 * FRAME_RESCALE)
48
+
49
+ def clip_tokens(n): return (n - 5) // 17 * 5 + 2 if n >= 5 else 1
50
+
51
+ def snap_clip_frames(v): return 5 + 17 * max(1, round((v - 5) / 17)) if v >= 5 else max(1, int(v))
52
+
53
+ def snap_overlap_frames(v): return 0 if v <= 0 else 5 + 17 * max(0, round((v - 5) / 17))
54
+
55
+ def token_start_at_or_before(f):
56
+ k = 0
57
+ while frames_for_tokens(k + 1) <= f:
58
+ k += 1
59
+ return k
60
+
61
+ def steps_for_frames(n):
62
+ k, covered = 0, 0
63
+ while covered < n:
64
+ covered += FRAME_PER_TOKEN[k % 5]; k += 1
65
+ return k if covered == n else None
66
+
67
+ def compute_h3_segments_adaptive(tv, chunk_frames, overlap_frames):
68
+ tc = clip_tokens(chunk_frames)
69
+ to = clip_tokens(overlap_frames) if overlap_frames > 0 else 0
70
+ if to >= tc:
71
+ to = max(0, tc - 1)
72
+ if tc >= tv:
73
+ return [(0, 0, tv, frames_for_tokens(tv))], frames_for_tokens(tv)
74
+ hop = max(1, tc - to)
75
+ bounds, prev_k0, i = [], -1, 0
76
+ while True:
77
+ k0 = i * hop
78
+ if k0 + tc >= tv:
79
+ k1 = tv
80
+ k0 = max(k0, tv - tc)
81
+ if prev_k0 >= 0 and k0 <= prev_k0:
82
+ k0 = prev_k0 + 1
83
+ if k0 >= tv:
84
+ break
85
+ bounds.append((k0, frames_for_tokens(k0), k1, frames_for_tokens(k1)))
86
+ break
87
+ bounds.append((k0, frames_for_tokens(k0), k0 + tc, frames_for_tokens(k0 + tc)))
88
+ prev_k0 = k0
89
+ i += 1
90
+ return bounds, frames_for_tokens(tv)
91
+
92
+ def is_h3_av_latent(samples):
93
+ return (samples is not None and samples.is_nested and len(samples.tensors) == 2
94
+ and samples.tensors[0].ndim == 5 and samples.tensors[0].shape[1] == 24
95
+ and samples.tensors[1].ndim == 4 and samples.tensors[1].shape[1] == 32)
96
+
97
+ def px_to_lat(px):
98
+ return max(ALIGN, (round(px / VAE_DOWNSAMPLE) // ALIGN) * ALIGN)
99
+
100
+ def snap_align(v):
101
+ return max(0, int(round(v / ALIGN)) * ALIGN)
102
+
103
+ # ---------------------------------------------------------------------------
104
+ # keyframe 链路
105
+ # ---------------------------------------------------------------------------
106
+ def trim_keyframe(kf, f0, f1):
107
+ idx = kf["resolved_frame_index"]
108
+ latent, audio_latent = kf.get("latent"), kf.get("audio_latent")
109
+ if latent is None and audio_latent is None:
110
+ return None if (idx < f0 or idx >= f1) else {"resolved_frame_index": idx - f0}
111
+ out = {}
112
+ if latent is not None:
113
+ t_start = t_end = None
114
+ pos = idx
115
+ for k in range(latent.shape[2]):
116
+ span = FRAME_PER_TOKEN[k % 5]
117
+ if f0 <= pos and pos + span <= f1:
118
+ if t_start is None: t_start = k
119
+ t_end = k + 1
120
+ pos += span
121
+ if t_start is None: return None
122
+ out["latent"] = latent[:, :, t_start:t_end].contiguous()
123
+ out["resolved_frame_index"] = idx + frames_for_tokens(t_start) - f0
124
+ if audio_latent is not None:
125
+ rt = audio_latent.shape[-1]
126
+ a_start = max(0, math.ceil((f0 - idx) * FRAME_RESCALE))
127
+ a_end = min(rt, math.floor((f1 - idx) / FRAME_RESCALE))
128
+ if a_end > a_start:
129
+ out["audio_latent"] = audio_latent[..., a_start:a_end].contiguous()
130
+ if "resolved_frame_index" not in out:
131
+ out["resolved_frame_index"] = max(0, idx - f0)
132
+ return out if ("latent" in out or "audio_latent" in out) else None
133
+
134
+ def reanchor_conditioning(cond, f0, f1, spatial):
135
+ out = []
136
+ for tensor, d in cond:
137
+ nd = dict(d)
138
+ kfs = nd.get("minimax_keyframes")
139
+ if kfs:
140
+ trimmed = [kf for kf in (trim_keyframe(kf, f0, f1) for kf in kfs) if kf is not None]
141
+ if trimmed:
142
+ if spatial is not None:
143
+ for kf in trimmed:
144
+ lt = kf.get("latent")
145
+ if lt is not None and (lt.shape[3] != spatial[0] or lt.shape[4] != spatial[1]):
146
+ B, C, T, H, W = lt.shape
147
+ kf["latent"] = torch.nn.functional.interpolate(
148
+ lt.view(B * T, C, H, W), size=spatial, mode="bilinear",
149
+ align_corners=False).view(B, C, T, spatial[0], spatial[1])
150
+ nd["minimax_keyframes"] = trimmed
151
+ else:
152
+ nd.pop("minimax_keyframes", None)
153
+ out.append([tensor, nd])
154
+ return out
155
+
156
+ def prepend_keyframes(cond, kfs):
157
+ if not kfs:
158
+ return cond
159
+ out = []
160
+ for tensor, d in cond:
161
+ nd = dict(d)
162
+ nd["minimax_keyframes"] = kfs + (nd.get("minimax_keyframes") or [])
163
+ out.append([tensor, nd])
164
+ return out
165
+
166
+ def motion_keyframes(prev_video, prev_tokens, f0, n_frames):
167
+ n = next((g for g in (56, 39, 22, 5) if g <= n_frames), 0)
168
+ steps = steps_for_frames(n) if n else None
169
+ if not steps or steps > prev_tokens or (prev_tokens - steps) % 5 != 0:
170
+ return []
171
+ start = prev_tokens - steps
172
+ return [{"resolved_frame_index": frames_for_tokens(start + k) - f0,
173
+ "latent": prev_video[:, :, start + k:start + k + 1].contiguous()}
174
+ for k in range(steps)]
175
+
176
+ def identity_keyframes(source, f0, f1, spacing):
177
+ kfs, p = [], f0 + spacing
178
+ while p < f1:
179
+ k = token_start_at_or_before(p)
180
+ kfs.append({"resolved_frame_index": frames_for_tokens(k) - f0,
181
+ "latent": source[:, :, k:k + 1].contiguous()})
182
+ p += spacing
183
+ if len(kfs) > MAX_IDENTITY_ANCHORS:
184
+ kfs = [kfs[i * len(kfs) // MAX_IDENTITY_ANCHORS] for i in range(MAX_IDENTITY_ANCHORS)]
185
+ return kfs
186
+
187
+ def anchor_conditioning(cond, prev_video, f0, strength):
188
+ t = tokens_for_frames(f0)
189
+ if t >= prev_video.shape[2]:
190
+ raise ValueError("previous result does not reach the current segment start")
191
+ anchor_kf = {"resolved_frame_index": 0, "latent": prev_video[:, :, t:t + 1].contiguous()}
192
+ aug = max(0.0, min(1.0, float(strength)))
193
+ out = []
194
+ for tensor, d in cond:
195
+ nd = dict(d)
196
+ kfs = nd.get("minimax_keyframes")
197
+ if kfs:
198
+ kept = [kf for kf in kfs if kf.get("resolved_frame_index") != 0 or "latent" not in kf]
199
+ nd["minimax_keyframes"] = [anchor_kf] + kept
200
+ else:
201
+ nd["minimax_keyframes"] = [anchor_kf]
202
+ nd["minimax_visual_cond_noise_aug"] = aug
203
+ out.append([tensor, nd])
204
+ return out
205
+
206
+ def crop_keyframes_to_tile(cond, src_h, src_w, r0, c0, tr, tc):
207
+ out = []
208
+ for tensor, d in cond:
209
+ nd = dict(d)
210
+ kfs = nd.get("minimax_keyframes")
211
+ if kfs:
212
+ cropped = []
213
+ for kf in kfs:
214
+ nkf = dict(kf)
215
+ lt = kf.get("latent")
216
+ if lt is not None:
217
+ if lt.shape[3] == src_h and lt.shape[4] == src_w:
218
+ nkf["latent"] = lt[:, :, :, r0:r0 + tr, c0:c0 + tc].contiguous()
219
+ else:
220
+ lt_r = torch.nn.functional.interpolate(
221
+ lt.to(torch.float32), size=(src_h, src_w),
222
+ mode="bilinear", align_corners=False)
223
+ nkf["latent"] = lt_r[:, :, :, r0:r0 + tr, c0:c0 + tc].contiguous()
224
+ cropped.append(nkf)
225
+ nd["minimax_keyframes"] = cropped
226
+ out.append([tensor, nd])
227
+ return out
228
+
229
+ # ---------------------------------------------------------------------------
230
+ # 空间网格
231
+ # ---------------------------------------------------------------------------
232
+ def _grid_1d(size, tile, ol, min_tile):
233
+ if size <= tile:
234
+ return [0], [size], [0]
235
+ sh = tile - ol
236
+ n = math.ceil((size - ol) / sh)
237
+ if (n - 1) * sh + tile < size:
238
+ n += 1
239
+ rows = [i * sh for i in range(n)]
240
+ trows = [min(tile, size - r) for r in rows]
241
+ if min_tile > 0 and n >= 2:
242
+ edge = size - rows[-1]
243
+ if edge < min_tile:
244
+ new_last = size - min_tile
245
+ if rows[-2] < new_last < rows[-2] + trows[-2]:
246
+ rows[-1] = new_last
247
+ trows[-1] = size - new_last
248
+ ovl = [0] * n
249
+ for i in range(1, n):
250
+ ovl[i] = max(0, rows[i - 1] + trows[i - 1] - rows[i])
251
+ return rows, trows, ovl
252
+
253
+ def compute_spatial_grid(h, w, th, tw, ol_h, ol_w, min_th=0, min_tw=0):
254
+ rows, trows, row_ovl = _grid_1d(h, th, ol_h, min_th)
255
+ cols, tcols, col_ovl = _grid_1d(w, tw, ol_w, min_tw)
256
+ return rows, cols, trows, tcols, row_ovl, col_ovl
257
+
258
+ def spatial_fade_mask(tile_h, tile_w, ovh, ovw, done_top, done_left,
259
+ fade_h=0, fade_w=0, seam_cap=1.0):
260
+ """1=自由重��样, 0=冻结。
261
+ 重叠带 = 冻结段(缝侧) + 渐变段(0->seam_cap);
262
+ seam_cap<1 时重叠带后再加一段等宽渐变 (cap->1), 让缝邻域以中等降噪
263
+ "续写"冻结条内容, 高降噪下防止运动物体被切断。seam_cap=1.0 = 经典行为。"""
264
+ mask = torch.ones(tile_h, tile_w, dtype=torch.float32)
265
+
266
+ def profile(n, ov, fade):
267
+ p = torch.ones(n, dtype=torch.float32)
268
+ f = min(fade, ov)
269
+ frozen = ov - f
270
+ p[:frozen] = 0.0
271
+ if f > 0:
272
+ p[frozen:ov] = torch.linspace(0.0, seam_cap, f)
273
+ ramp = min(ov, n - ov)
274
+ if ramp > 0 and seam_cap < 1.0:
275
+ start = seam_cap if f > 0 else 0.0
276
+ p[ov:ov + ramp] = torch.linspace(start, 1.0, ramp)
277
+ return p
278
+
279
+ if done_left and ovw > 0:
280
+ mask = torch.minimum(mask, profile(tile_w, ovw, fade_w)[None, :])
281
+ if done_top and ovh > 0:
282
+ mask = torch.minimum(mask, profile(tile_h, ovh, fade_h)[:, None])
283
+ return mask
284
+
285
+ # ---------------------------------------------------------------------------
286
+ # 校正 + 门控
287
+ # ---------------------------------------------------------------------------
288
+ def dc_correct(new, refs, clamp=COLOR_CLAMP, min_samples=256):
289
+ pairs = [p for p in refs if p is not None and p[0] is not None
290
+ and p[0].numel() >= min_samples]
291
+ if not pairs:
292
+ return new, None
293
+ pa = torch.cat([a.float().permute(0, 2, 3, 4, 1).reshape(-1, a.shape[1]) for a, _ in pairs])
294
+ pb = torch.cat([b.float().permute(0, 2, 3, 4, 1).reshape(-1, b.shape[1]) for _, b in pairs])
295
+ dc = (pa - pb).median(dim=0).values.clamp(-clamp, clamp)
296
+ return new - dc.view(1, -1, 1, 1, 1).to(new.device, new.dtype), dc
297
+
298
+ def grade_pin(chunk, ref, clamp=COLOR_CLAMP):
299
+ a = chunk.float().permute(0, 2, 3, 4, 1).reshape(-1, chunk.shape[1])
300
+ b = ref.float().permute(0, 2, 3, 4, 1).reshape(-1, ref.shape[1])
301
+ dc = (a - b).median(dim=0).values.clamp(-clamp, clamp)
302
+ return chunk - dc.view(1, -1, 1, 1, 1).to(chunk.device, chunk.dtype), dc
303
+
304
+ def seam_metrics(sub, region):
305
+ if sub.numel() < 4096:
306
+ return None, None
307
+ sp = sub.float().permute(0, 2, 3, 4, 1).reshape(-1, sub.shape[1])
308
+ rp = region.float().permute(0, 2, 3, 4, 1).reshape(-1, region.shape[1])
309
+ dc = (sp - rp).median(dim=0).values.clamp(-DC_MATCH_CLAMP, DC_MATCH_CLAMP)
310
+ a = sp - sp.mean(dim=0)
311
+ b = rp - rp.mean(dim=0)
312
+ corr = ((a * b).mean(dim=0) / (a.std(dim=0) * b.std(dim=0) + 1e-6)).median()
313
+ return dc, float(corr)
314
+
315
+ def _should_polish(mode, sub, region):
316
+ if mode == "all":
317
+ return True
318
+ dc, corr = seam_metrics(sub, region)
319
+ if dc is None:
320
+ return False
321
+ return ((corr is not None and corr < SEAM_CORR_GATE)
322
+ or dc.abs().max().item() > SEAM_DC_GATE * DC_MATCH_CLAMP)
323
+
324
+ # ---------------------------------------------------------------------------
325
+ # 时间缝合
326
+ # ---------------------------------------------------------------------------
327
+ def _crossfade(a, b, dim):
328
+ n = a.shape[dim]
329
+ w = torch.linspace(0.0, 1.0, n, device=a.device, dtype=a.dtype)
330
+ shape = [1] * a.ndim
331
+ shape[dim] = n
332
+ return a + (b - a) * w.view(shape)
333
+
334
+ def temporal_append(acc_v, acc_a, chunk_v, chunk_a, index, k0, f0, color_match=True):
335
+ if acc_v is None:
336
+ return chunk_v, chunk_a
337
+ gi, agi = k0, round(f0 * FRAME_RESCALE)
338
+ total_v = max(acc_v.shape[2], gi + chunk_v.shape[2])
339
+ total_a = max(acc_a.shape[-1], agi + chunk_a.shape[-1])
340
+ rv = torch.zeros((1, acc_v.shape[1], total_v, acc_v.shape[3], acc_v.shape[4]),
341
+ device=acc_v.device, dtype=acc_v.dtype)
342
+ ra = torch.zeros((1, 32, 2, total_a), device=acc_a.device, dtype=acc_a.dtype)
343
+ rv[:, :, :acc_v.shape[2]] = acc_v
344
+ ra[:, :, :, :acc_a.shape[-1]] = acc_a
345
+ v, a = chunk_v, chunk_a
346
+ if index > 0:
347
+ ov = min(acc_v.shape[2] - gi, v.shape[2])
348
+ if ov > 0:
349
+ if color_match:
350
+ v, dc = dc_correct(v, [(v[:, :, :ov], rv[:, :, gi:gi + ov])])
351
+ if dc is not None:
352
+ print(f"[H3] 🎨 chunk {index} 时间颜色匹配 |dc|max={dc.abs().max():.4f}")
353
+ rv[:, :, gi:gi + ov] = _crossfade(rv[:, :, gi:gi + ov], v[:, :, :ov], dim=2)
354
+ v = v[:, :, ov:]
355
+ gi += ov
356
+ ova = min(acc_a.shape[-1] - agi, a.shape[-1])
357
+ if ova > 0:
358
+ ra[:, :, :, agi:agi + ova] = _crossfade(ra[:, :, :, agi:agi + ova], a[:, :, :, :ova], dim=3)
359
+ a = a[:, :, :, ova:]
360
+ agi += ova
361
+ if v.shape[2] > 0:
362
+ rv[:, :, gi:gi + v.shape[2]] = v
363
+ if a.shape[-1] > 0:
364
+ ra[:, :, :, agi:agi + a.shape[-1]] = a
365
+ return rv, ra
366
+
367
+ # ---------------------------------------------------------------------------
368
+ # 采样
369
+ # ---------------------------------------------------------------------------
370
+ def build_guider(model, cond, negative, cfg):
371
+ guider = comfy.samplers.CFGGuider(model)
372
+ if negative is not None:
373
+ guider.set_conds(cond, negative)
374
+ guider.set_cfg(cfg)
375
+ else:
376
+ guider.inner_set_conds({"positive": cond})
377
+ return guider
378
+
379
+ def sample_piece(piece, guider, noise_tensor, seed, sampler, sigmas, callback=None):
380
+ latent = dict(piece)
381
+ latent_image = latent["samples"]
382
+ latent_image = comfy.sample.fix_empty_latent_channels(
383
+ model=guider.model_patcher.model, latent_image=latent_image)
384
+ latent["samples"] = latent_image
385
+ if callback is None:
386
+ x0_output = {}
387
+ callback = latent_preview.prepare_callback(guider.model_patcher, sigmas.shape[-1] - 1, x0_output)
388
+ samples = guider.sample(noise_tensor, latent_image, sampler, sigmas,
389
+ denoise_mask=latent.get("noise_mask"), callback=callback,
390
+ disable_pbar=not comfy.utils.PROGRESS_BAR_ENABLED, seed=seed)
391
+ return samples.to(comfy.model_management.intermediate_device())
392
+
393
+ def make_tile_progress(model_patcher, steps, n_tiles):
394
+ previewer = latent_preview.get_previewer(model_patcher.load_device, model_patcher.model.latent_format)
395
+ total = steps * n_tiles
396
+ pbar = comfy.utils.ProgressBar(total)
397
+ def for_tile(idx):
398
+ def callback(step, x0, x, total_steps):
399
+ preview = None
400
+ if previewer is not None and x0 is not None:
401
+ px0 = x0.tensors[0] if getattr(x0, "is_nested", False) else x0
402
+ try:
403
+ preview = previewer.decode_latent_to_preview_image("JPEG", px0)
404
+ except Exception:
405
+ preview = None
406
+ pbar.update_absolute(idx * steps + step + 1, total, preview)
407
+ return callback
408
+ return for_tile
409
+
410
+ # ---------------------------------------------------------------------------
411
+ # 参数节点
412
+ # ---------------------------------------------------------------------------
413
+ class H3TemporalSplitParams(io.ComfyNode):
414
+ @classmethod
415
+ def define_schema(cls):
416
+ return io.Schema(
417
+ node_id="MMH3TemporalSplitParamsV10", display_name="MMH3 Temporal Split Params",
418
+ category="latent/upscale/minimax",
419
+ description="H3 原生网格时间分块 (5+17m 帧) + 三重锚。",
420
+ inputs=[
421
+ io.Int.Input("chunk_frames", default=73, min=5, max=100000, step=1),
422
+ io.Int.Input("temporal_overlap_frames", default=22, min=0, max=100000, step=1),
423
+ io.Float.Input("anchor_strength", default=0.999, min=0.0, max=1.0, step=0.001),
424
+ io.Combo.Input("motion_anchor_frames", options=["0", "5", "22", "39"], default="22"),
425
+ io.Int.Input("identity_anchor_frames", default=24, min=0, max=240, step=1),
426
+ ],
427
+ outputs=[H3_TEMPORAL_PARAM.Output("temporal_split_param")],
428
+ )
429
+
430
+ @classmethod
431
+ def execute(cls, chunk_frames, temporal_overlap_frames, anchor_strength,
432
+ motion_anchor_frames, identity_anchor_frames) -> io.NodeOutput:
433
+ chunk = snap_clip_frames(int(chunk_frames))
434
+ overlap = snap_overlap_frames(int(temporal_overlap_frames))
435
+ if overlap >= chunk:
436
+ overlap = snap_overlap_frames(chunk - 17)
437
+ return io.NodeOutput({"p": (chunk, overlap, float(anchor_strength),
438
+ int(motion_anchor_frames), int(identity_anchor_frames))})
439
+
440
+
441
+ class H3SpatialSplitParams(io.ComfyNode):
442
+ @classmethod
443
+ def define_schema(cls):
444
+ return io.Schema(
445
+ node_id="MMH3SpatialSplitParamsV10", display_name="MMH3 Spatial Split Params",
446
+ category="latent/upscale/minimax",
447
+ description="简化空间分块: 百分比重叠/渐变 + 缝邻域降噪上限。",
448
+ inputs=[
449
+ io.Int.Input("tile_width", default=512, min=64, max=16384, step=32),
450
+ io.Int.Input("tile_height", default=512, min=64, max=16384, step=32),
451
+ io.Float.Input("overlap_ratio", default=0.25, min=0.0, max=0.90, step=0.05),
452
+ io.Float.Input("fade_ratio", default=0.50, min=0.0, max=1.0, step=0.05),
453
+ io.Int.Input("min_tile_size", default=256, min=0, max=16384, step=32),
454
+ io.Float.Input("seam_denoise", default=1.0, min=0.1, max=1.0, step=0.05,
455
+ tooltip="缝邻域降噪上限: <1 时高降噪下缝附近以中等降噪续写邻居内容, "
456
+ "防止快运动物体在缝处被切断; 建议 0.5~0.8; 1.0=关。"),
457
+ ],
458
+ outputs=[
459
+ H3_SPATIAL_PARAM.Output("spatial_split_param"),
460
+ io.String.Output("grid_preview"),
461
+ ],
462
+ )
463
+
464
+ @classmethod
465
+ def execute(cls, tile_width, tile_height, overlap_ratio, fade_ratio,
466
+ min_tile_size, seam_denoise) -> io.NodeOutput:
467
+ tw, th = px_to_lat(tile_width), px_to_lat(tile_height)
468
+ ol_w = min(tw - ALIGN, snap_align(tw * overlap_ratio))
469
+ ol_h = min(th - ALIGN, snap_align(th * overlap_ratio))
470
+ fw = min(ol_w, int(round(ol_w * fade_ratio)))
471
+ fh = min(ol_h, int(round(ol_h * fade_ratio)))
472
+ mt = min(px_to_lat(min_tile_size), th, tw) if min_tile_size > 0 else 0
473
+ param = {"tw": tw, "th": th, "ol_w": ol_w, "ol_h": ol_h,
474
+ "fw": fw, "fh": fh, "mt": mt, "cap": float(seam_denoise)}
475
+ preview = (f"Tile: {tile_width}x{tile_height}px -> {tw}x{th}lat | "
476
+ f"Overlap: {overlap_ratio:.0%} -> {ol_w}x{ol_h}lat | "
477
+ f"Fade: {fade_ratio:.0%} -> {fw}x{fh}lat | SeamDenoise: {seam_denoise:.2f}")
478
+ print(f"[H3] 📊 {preview}")
479
+ return io.NodeOutput(param, preview)
480
+
481
+
482
+ # ---------------------------------------------------------------------------
483
+ # 主节点
484
+ # ---------------------------------------------------------------------------
485
+ class MMH3SplitUpscale(io.ComfyNode):
486
+ @classmethod
487
+ def define_schema(cls):
488
+ return io.Schema(
489
+ node_id="MMH3SplitUpscale", display_name="MMH3 Split Upscale",
490
+ category="latent/upscale/minimax",
491
+ description="预防(冻结预填+三重锚) + 校正(颜色匹配+钉源) + 抗分叉(seam_denoise) + probe 门控 polish。",
492
+ inputs=[
493
+ io.Model.Input("model"),
494
+ io.Conditioning.Input("conditioning"),
495
+ io.Conditioning.Input("negative", optional=True),
496
+ io.Latent.Input("latent"),
497
+ io.Noise.Input("noise"),
498
+ io.Sampler.Input("sampler"),
499
+ io.Sigmas.Input("sigmas"),
500
+ io.Float.Input("cfg", default=1.0, min=0.0, max=100.0, step=0.1, round=0.01),
501
+ H3_TEMPORAL_PARAM.Input("temporal_split_param", optional=True),
502
+ H3_SPATIAL_PARAM.Input("spatial_split_param", optional=True),
503
+ io.Combo.Input("seam_polish", options=["off", "auto", "all"], default="off"),
504
+ io.Boolean.Input("color_match", default=True),
505
+ ],
506
+ outputs=[io.Latent.Output("latent")],
507
+ )
508
+
509
+ @classmethod
510
+ def execute(cls, latent, conditioning, model, noise, sampler, sigmas,
511
+ negative=None, cfg=1.0, temporal_split_param=None,
512
+ spatial_split_param=None, seam_polish="off",
513
+ color_match=True) -> io.NodeOutput:
514
+ samples = latent["samples"]
515
+ if not is_h3_av_latent(samples):
516
+ raise ValueError("期望 MiniMax H3 AV latent (嵌套 video+audio)")
517
+ video, audio = samples.tensors[0], samples.tensors[1]
518
+ if video.shape[0] != 1:
519
+ raise ValueError("仅支持 Batch 1")
520
+ B, C, T, H, W = video.shape
521
+
522
+ if temporal_split_param is not None:
523
+ cl, ov, anchor_strength, motion_n, identity_n = temporal_split_param["p"]
524
+ bounds, _ = compute_h3_segments_adaptive(T, cl, ov)
525
+ else:
526
+ bounds = [(0, 0, T, frames_for_tokens(T))]
527
+ anchor_strength, motion_n, identity_n = 0.999, 0, 0
528
+
529
+ if spatial_split_param is not None:
530
+ sp = spatial_split_param
531
+ rows, cols, trows, tcols, row_ovl, col_ovl = compute_spatial_grid(
532
+ H, W, sp["th"], sp["tw"], sp["ol_h"], sp["ol_w"], sp["mt"], sp["mt"])
533
+ seam_cap = sp.get("cap", 1.0)
534
+ else:
535
+ rows, cols, trows, tcols, row_ovl, col_ovl = [0], [0], [H], [W], [0], [0]
536
+ seam_cap = 1.0
537
+ nrows, ncols = len(rows), len(cols)
538
+
539
+ steps = max(int(sigmas.shape[-1]) - 1, 1)
540
+ n_tiles = len(bounds) * nrows * ncols
541
+ for_tile = make_tile_progress(model.model_patcher if hasattr(model, "model_patcher") else model,
542
+ steps, n_tiles)
543
+
544
+ source = video
545
+ noise_v = noise.generate_noise({"samples": torch.zeros_like(video, dtype=torch.float32)})
546
+ noise_a = noise.generate_noise({"samples": torch.zeros_like(audio, dtype=torch.float32)})
547
+
548
+ acc_v = acc_a = None
549
+ polish_queue = {}
550
+ tile_idx = 0
551
+
552
+ for i, (k0, f0, k1, f1) in enumerate(bounds):
553
+ chunk_v = video[:, :, k0:k1].contiguous()
554
+ a0, a1 = audio_range(f0, f1)
555
+ a1 = min(a1, audio.shape[-1])
556
+ chunk_a = audio[:, :, :, a0:a1].contiguous()
557
+
558
+ cond_i = reanchor_conditioning(conditioning, f0, f1, (H, W))
559
+ if i > 0 and acc_v is not None:
560
+ if motion_n > 0:
561
+ cond_i = prepend_keyframes(cond_i, motion_keyframes(acc_v, k0, f0, motion_n))
562
+ if identity_n > 0:
563
+ cond_i = prepend_keyframes(cond_i, identity_keyframes(source, f0, f1, identity_n))
564
+ if anchor_strength > 0.0:
565
+ cond_i = anchor_conditioning(cond_i, acc_v, f0, anchor_strength)
566
+ elif identity_n > 0:
567
+ cond_i = prepend_keyframes(cond_i, identity_keyframes(source, f0, f1, identity_n))
568
+
569
+ chunk_out = chunk_v.clone()
570
+ noise_vc = noise_v[:, :, k0:k1]
571
+ noise_ac = noise_a[:, :, :, a0:a1]
572
+
573
+ # ================= 空间内循环 =================
574
+ for ri in range(nrows):
575
+ for cj in range(ncols):
576
+ comfy.model_management.throw_exception_if_processing_interrupted()
577
+ r0, c0 = rows[ri], cols[cj]
578
+ tr, tc = trows[ri], tcols[cj]
579
+ ovh, ovw = row_ovl[ri], col_ovl[cj]
580
+
581
+ tile = chunk_out[:, :, :, r0:r0 + tr, c0:c0 + tc].clone()
582
+
583
+ if spatial_split_param is not None:
584
+ fh, fw = spatial_split_param["fh"], spatial_split_param["fw"]
585
+ else:
586
+ fh = fw = 0
587
+ m = spatial_fade_mask(tr, tc, ovh, ovw,
588
+ done_top=(ri > 0), done_left=(cj > 0),
589
+ fade_h=fh, fade_w=fw, seam_cap=seam_cap)
590
+ mv = m[None, None, None].to(chunk_out.device)
591
+ ma = torch.zeros((1, 32, 2, chunk_a.shape[-1]),
592
+ device=chunk_a.device, dtype=torch.float32)
593
+ piece = {"samples": comfy.nested_tensor.NestedTensor((tile, chunk_a)),
594
+ "noise_mask": comfy.nested_tensor.NestedTensor((mv, ma))}
595
+ tile_noise = comfy.nested_tensor.NestedTensor((
596
+ noise_vc[:, :, :, r0:r0 + tr, c0:c0 + tc].contiguous(),
597
+ noise_ac.contiguous()))
598
+
599
+ cond_tile = crop_keyframes_to_tile(cond_i, H, W, r0, c0, tr, tc)
600
+ guider = build_guider(model, cond_tile, negative, cfg)
601
+ out = sample_piece(piece, guider, tile_noise, noise.seed, sampler, sigmas,
602
+ for_tile(tile_idx))
603
+ tile_v = (out.tensors[0] if out.is_nested else out).to(chunk_out.device)
604
+
605
+ region = chunk_out[:, :, :, r0:r0 + tr, c0:c0 + tc].clone()
606
+
607
+ if color_match:
608
+ tile_v, _ = dc_correct(tile_v, [
609
+ (tile_v[:, :, :, :, :ovw], region[:, :, :, :, :ovw])
610
+ if (cj > 0 and ovw > 0) else None,
611
+ (tile_v[:, :, :, :ovh, :], region[:, :, :, :ovh, :])
612
+ if (ri > 0 and ovh > 0) else None,
613
+ (tile_v, chunk_v[:, :, :, r0:r0 + tr, c0:c0 + tc])
614
+ if (ri == 0 and cj == 0) else None,
615
+ ])
616
+
617
+ if seam_polish != "off":
618
+ if cj > 0 and ovw > 0 and \
619
+ _should_polish(seam_polish, tile_v[:, :, :, :, :ovw], region[:, :, :, :, :ovw]):
620
+ polish_queue[(i, ri, cj, "W")] = (c0, ovw, (k0, k1))
621
+ if ri > 0 and ovh > 0 and \
622
+ _should_polish(seam_polish, tile_v[:, :, :, :ovh, :], region[:, :, :, :ovh, :]):
623
+ polish_queue[(i, ri, cj, "H")] = (r0, ovh, (k0, k1))
624
+
625
+ if cj > 0 and ovw > 0:
626
+ wts = torch.linspace(0.0, 1.0, ovw, device=region.device,
627
+ dtype=region.dtype).view(1, 1, 1, 1, ovw)
628
+ region[:, :, :, :, :ovw] = (region[:, :, :, :, :ovw] * (1.0 - wts)
629
+ + tile_v[:, :, :, :, :ovw] * wts)
630
+ if ri > 0 and ovh > 0:
631
+ wts = torch.linspace(0.0, 1.0, ovh, device=region.device,
632
+ dtype=region.dtype).view(1, 1, 1, ovh, 1)
633
+ region[:, :, :, :ovh, :] = (region[:, :, :, :ovh, :] * (1.0 - wts)
634
+ + tile_v[:, :, :, :ovh, :] * wts)
635
+ band = torch.zeros((1, 1, 1, tr, tc), dtype=torch.bool, device=region.device)
636
+ if cj > 0 and ovw > 0:
637
+ band[:, :, :, :, :ovw] = True
638
+ if ri > 0 and ovh > 0:
639
+ band[:, :, :, :ovh, :] = True
640
+ region = torch.where(band, region, tile_v)
641
+ chunk_out[:, :, :, r0:r0 + tr, c0:c0 + tc] = region
642
+
643
+ tile_idx += 1
644
+ comfy.model_management.soft_empty_cache()
645
+
646
+ if color_match:
647
+ chunk_out, dcg = grade_pin(chunk_out, chunk_v)
648
+ if dcg is not None and dcg.abs().max().item() > 1e-4:
649
+ print(f"[H3] 🎯 chunk {i} 全局钉源 |dc|max={dcg.abs().max():.4f}")
650
+
651
+ # ================= 修复版 polish 二道缝 =================
652
+ chunk_polish = [(k, v) for k, v in polish_queue.items() if k[0] == i]
653
+ if chunk_polish:
654
+ print(f"[H3] 🔧 chunk {i}: polish {len(chunk_polish)} 条缝")
655
+ pbar2 = comfy.utils.ProgressBar(steps * len(chunk_polish))
656
+ for pi, (key, (s0, band_w, (tk0, tk1))) in enumerate(chunk_polish):
657
+ comfy.model_management.throw_exception_if_processing_interrupted()
658
+ axis = key[3]
659
+ t_len = tk1 - tk0
660
+ if axis == "W":
661
+ w0 = max(0, s0 - POLISH_HALO)
662
+ w1 = min(W, s0 + band_w + POLISH_HALO)
663
+ win = chunk_out[:, :, :, :, w0:w1].clone()
664
+ b0, b1 = s0 - w0, s0 - w0 + band_w
665
+ mv = torch.zeros((1, 1, t_len, H, w1 - w0), dtype=torch.float32, device=win.device)
666
+ mv[:, :, :, :, b0:b1] = 1.0
667
+ r0c, c0c, trc, tcc, ax = 0, w0, H, w1 - w0, 4
668
+ nsl = (slice(None), slice(None), slice(tk0, tk1), slice(None), slice(w0, w1))
669
+ else:
670
+ h0 = max(0, s0 - POLISH_HALO)
671
+ h1 = min(H, s0 + band_w + POLISH_HALO)
672
+ win = chunk_out[:, :, :, h0:h1, :].clone()
673
+ b0, b1 = s0 - h0, s0 - h0 + band_w
674
+ mv = torch.zeros((1, 1, t_len, h1 - h0, W), dtype=torch.float32, device=win.device)
675
+ mv[:, :, :, b0:b1, :] = 1.0
676
+ r0c, c0c, trc, tcc, ax = h0, 0, h1 - h0, W, 3
677
+ nsl = (slice(None), slice(None), slice(tk0, tk1), slice(h0, h1), slice(None))
678
+ ma = torch.zeros((1, 32, 2, chunk_a.shape[-1]),
679
+ device=chunk_a.device, dtype=torch.float32)
680
+ piece = {"samples": comfy.nested_tensor.NestedTensor((win, chunk_a)),
681
+ "noise_mask": comfy.nested_tensor.NestedTensor((mv, ma))}
682
+ tn = comfy.nested_tensor.NestedTensor((noise_v[nsl].contiguous(), noise_ac.contiguous()))
683
+
684
+ cond_p = crop_keyframes_to_tile(cond_i, H, W, r0c, c0c, trc, tcc)
685
+ g = build_guider(model, cond_p, negative, cfg)
686
+
687
+ def _cb(step, x0, x, ts, _pi=pi):
688
+ pbar2.update_absolute(_pi * steps + step + 1, steps * len(chunk_polish))
689
+
690
+ out = sample_piece(piece, g, tn, noise.seed, sampler, sigmas, callback=_cb)
691
+ pv = (out.tensors[0] if out.is_nested else out).to(chunk_out.device)
692
+
693
+ nlen = (w1 - w0) if ax == 4 else (h1 - h0)
694
+ alpha = torch.ones(nlen, dtype=torch.float32)
695
+ if b0 > 0:
696
+ alpha[:b0] = torch.linspace(0.0, 1.0, b0)
697
+ if nlen - b1 > 0:
698
+ alpha[b1:] = torch.linspace(1.0, 0.0, nlen - b1)
699
+ view = [1, 1, 1, 1, 1]
700
+ view[ax] = nlen
701
+ avv = alpha.view(view).to(chunk_out.device)
702
+ if ax == 4:
703
+ chunk_out[:, :, :, :, w0:w1] = avv * pv + (1.0 - avv) * win
704
+ else:
705
+ chunk_out[:, :, :, h0:h1, :] = avv * pv + (1.0 - avv) * win
706
+ comfy.model_management.soft_empty_cache()
707
+
708
+ acc_v, acc_a = temporal_append(acc_v, acc_a, chunk_out, chunk_a, i, k0, f0, color_match)
709
+
710
+ if hasattr(model, "clone_base_uuid"):
711
+ comfy.model_management.unload_model_and_clones(model, unload_additional_models=False)
712
+ comfy.model_management.soft_empty_cache()
713
+ return io.NodeOutput({"samples": comfy.nested_tensor.NestedTensor((acc_v, acc_a))})
714
+
715
+
716
+ NODE_CLASS_MAPPINGS = {
717
+ "MMH3TemporalSplitParamsV10": H3TemporalSplitParams,
718
+ "MMH3SpatialSplitParamsV10": H3SpatialSplitParams,
719
+ "MMH3SplitUpscale": MMH3SplitUpscale,
720
+ }
721
+ NODE_DISPLAY_NAME_MAPPINGS = {
722
+ "MMH3TemporalSplitParamsV10": "MMH3 Temporal Split Params",
723
+ "MMH3SpatialSplitParamsV10": "MMH3 Spatial Split Params",
724
+ "MMH3SplitUpscale": "MMH3 Split Upscale",
725
+ }
Comfyui_Minimax_h3_latent_Upscaler/nodes/__init__.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+
3
+ # 2D node: legacy API
4
+ from .minimax_h3_latent_upscaler_2d import (
5
+ NODE_CLASS_MAPPINGS as NODE_CLASS_MAPPINGS_2D,
6
+ NODE_DISPLAY_NAME_MAPPINGS as NODE_DISPLAY_NAME_MAPPINGS_2D,
7
+ )
8
+
9
+ NODE_CLASS_MAPPINGS = {}
10
+ NODE_CLASS_MAPPINGS.update(NODE_CLASS_MAPPINGS_2D)
11
+
12
+ NODE_DISPLAY_NAME_MAPPINGS = {}
13
+ NODE_DISPLAY_NAME_MAPPINGS.update(NODE_DISPLAY_NAME_MAPPINGS_2D)
14
+
15
+ # 3D node: legacy API (same registration mechanism as 2D)
16
+ try:
17
+ from .minimax_h3_latent_upscaler_3d import (
18
+ NODE_CLASS_MAPPINGS as NODE_CLASS_MAPPINGS_3D,
19
+ NODE_DISPLAY_NAME_MAPPINGS as NODE_DISPLAY_NAME_MAPPINGS_3D,
20
+ )
21
+ NODE_CLASS_MAPPINGS.update(NODE_CLASS_MAPPINGS_3D)
22
+ NODE_DISPLAY_NAME_MAPPINGS.update(NODE_DISPLAY_NAME_MAPPINGS_3D)
23
+ except Exception as e:
24
+ logging.error(f"[MinimaxH3] Failed to import 3D node: {e}")
25
+
26
+ # MMH3 Split Upscale combo: legacy API (Temporal/Spatial params + main upscale node)
27
+ try:
28
+ from .MMH3_Split_Upscale import (
29
+ NODE_CLASS_MAPPINGS as NODE_CLASS_MAPPINGS_SPLIT,
30
+ NODE_DISPLAY_NAME_MAPPINGS as NODE_DISPLAY_NAME_MAPPINGS_SPLIT,
31
+ )
32
+ NODE_CLASS_MAPPINGS.update(NODE_CLASS_MAPPINGS_SPLIT)
33
+ NODE_DISPLAY_NAME_MAPPINGS.update(NODE_DISPLAY_NAME_MAPPINGS_SPLIT)
34
+ except Exception as e:
35
+ logging.error(f"[MinimaxH3] Failed to import MMH3 Split Upscale node: {e}")
36
+
37
+ __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/MMH3_Split_Upscale.cpython-312.pyc ADDED
Binary file (47.6 kB). View file
 
Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (1.4 kB). View file
 
Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/minimax_h3_latent_upscaler_2d.cpython-312.pyc ADDED
Binary file (25.7 kB). View file
 
Comfyui_Minimax_h3_latent_Upscaler/nodes/__pycache__/minimax_h3_latent_upscaler_3d.cpython-312.pyc ADDED
Binary file (38.1 kB). View file
 
Comfyui_Minimax_h3_latent_Upscaler/nodes/minimax_h3_latent_upscaler_2d.py ADDED
@@ -0,0 +1,479 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Minimax H3 Latent Upscaler - ComfyUI 推理节点 (2D主干 + Temporal 3D卷积)
3
+ - 使用 VideoLatentResizer (与训练代码完全一致)
4
+ - 自动检测模型结构并加载权重 (支持合并文件中的 upscaler. 前缀)
5
+ - 强制关闭注意力 (attn=False) 以优化推理速度
6
+ - 模型从 ComfyUI/models/latent_upscale_models/ 加载
7
+ """
8
+ import torch
9
+ import torch.nn as nn
10
+ import torch.nn.functional as F
11
+ import os
12
+ import glob
13
+ import folder_paths
14
+ import re
15
+ from einops import rearrange
16
+
17
+ # ==========================================
18
+ # 注册模型文件夹
19
+ # ==========================================
20
+ _LATENT_UPSCALE_FOLDER = "latent_upscale_models"
21
+ if _LATENT_UPSCALE_FOLDER not in folder_paths.folder_names_and_paths:
22
+ folder_paths.add_model_folder_path(
23
+ _LATENT_UPSCALE_FOLDER,
24
+ os.path.join(folder_paths.models_dir, _LATENT_UPSCALE_FOLDER)
25
+ )
26
+
27
+ # ==========================================
28
+ # Minimax H3 归一化参数 (24通道)
29
+ # ==========================================
30
+ LATENTS_MEAN = [
31
+ 0.858090341091156, -0.9606591463088989, 1.0661640167236328, -0.5090325474739075,
32
+ -0.2727581858634949, -1.3675414323806763, -0.2553254961967468, -0.26907554268836975,
33
+ -0.5376840829849243, -0.0464097298681736, 0.6657370328903198, 0.19690127670764923,
34
+ -0.5460608005523682, -0.4035342037677765, -0.23683024942874908, 0.25928452610969543,
35
+ -0.30133944749832153, 0.211341992020607, -1.1206848621368408, 0.3581933379173279,
36
+ -0.04225143790245056, 0.2604829967021942, 0.22864092886447906, 0.7056031823158264
37
+ ]
38
+ LATENTS_STD = [
39
+ 1.2223774194717407, 1.2767263650894165, 1.6831774711608887, 1.7549455165863037,
40
+ 1.5636216402053833, 2.194143533706665, 0.9653137922286987, 1.0569885969161987,
41
+ 0.841948926448822, 0.7729952931404114, 1.8955937623977661, 0.946841835975647,
42
+ 0.7996809482574463, 0.44988900423049927, 0.7197399735450745, 0.6936293244361877,
43
+ 2.961095094680786, 2.7694199085235596, 3.0496184825897217, 2.1088054180145264,
44
+ 3.276226282119751, 3.1627357006073, 2.2816812992095947, 2.6127843856811523
45
+ ]
46
+
47
+ def _make_norm_tensors(device, dtype):
48
+ mean = torch.tensor(LATENTS_MEAN, dtype=dtype, device=device).view(1, -1, 1, 1, 1)
49
+ std = torch.tensor(LATENTS_STD, dtype=dtype, device=device).view(1, -1, 1, 1, 1)
50
+ return mean, std
51
+
52
+ # ==========================================
53
+ # 与训练代码完全一致的网络组件 (2D + Temporal)
54
+ # ==========================================
55
+ def normalization(channels):
56
+ return nn.GroupNorm(32, channels)
57
+
58
+ def zero_module(module):
59
+ for p in module.parameters():
60
+ p.detach().zero_()
61
+ return module
62
+
63
+ class AttnBlock(nn.Module):
64
+ def __init__(self, in_channels):
65
+ super().__init__()
66
+ self.norm = normalization(in_channels)
67
+ self.q = nn.Conv2d(in_channels, in_channels, 1)
68
+ self.k = nn.Conv2d(in_channels, in_channels, 1)
69
+ self.v = nn.Conv2d(in_channels, in_channels, 1)
70
+ self.proj_out = nn.Conv2d(in_channels, in_channels, 1)
71
+
72
+ def forward(self, x):
73
+ h = self.norm(x)
74
+ q = rearrange(self.q(h), "b c h w -> b 1 (h w) c")
75
+ k = rearrange(self.k(h), "b c h w -> b 1 (h w) c")
76
+ v = rearrange(self.v(h), "b c h w -> b 1 (h w) c")
77
+ h = F.scaled_dot_product_attention(q, k, v)
78
+ h = rearrange(h, "b 1 (h w) c -> b c h w", h=x.shape[-2], w=x.shape[-1])
79
+ return x + self.proj_out(h)
80
+
81
+ class ResBlockEmb(nn.Module):
82
+ def __init__(self, channels, emb_channels, dropout=0, out_channels=None):
83
+ super().__init__()
84
+ self.out_channels = out_channels or channels
85
+ self.in_layers = nn.Sequential(
86
+ normalization(channels), nn.SiLU(),
87
+ nn.Conv2d(channels, self.out_channels, 3, padding=1),
88
+ )
89
+ self.emb_layers = nn.Sequential(
90
+ nn.SiLU(), nn.Linear(emb_channels, 2 * self.out_channels),
91
+ )
92
+ self.out_norm = normalization(self.out_channels)
93
+ self.out_layers = nn.Sequential(
94
+ nn.SiLU(), nn.Dropout(p=dropout),
95
+ zero_module(nn.Conv2d(self.out_channels, self.out_channels, 3, padding=1)),
96
+ )
97
+ self.skip = (
98
+ nn.Conv2d(channels, self.out_channels, 1)
99
+ if self.out_channels != channels else nn.Identity()
100
+ )
101
+
102
+ def forward(self, x, emb):
103
+ h = self.in_layers(x)
104
+ emb_out = self.emb_layers(emb).type(h.dtype)
105
+ while len(emb_out.shape) < len(h.shape):
106
+ emb_out = emb_out[..., None]
107
+ scale, shift = torch.chunk(emb_out, 2, dim=1)
108
+ h = self.out_norm(h) * (1 + scale) + shift
109
+ h = self.out_layers(h)
110
+ return self.skip(x) + h
111
+
112
+ class TemporalConv(nn.Module):
113
+ def __init__(self, channels, kernel_size=5):
114
+ super().__init__()
115
+ padding = kernel_size // 2
116
+ self.norm = normalization(channels)
117
+ self.dwconv = nn.Conv3d(channels, channels,
118
+ kernel_size=(kernel_size, 1, 1),
119
+ padding=(padding, 0, 0),
120
+ groups=channels)
121
+ self.pwconv = nn.Conv3d(channels, channels, kernel_size=1)
122
+ nn.init.zeros_(self.pwconv.weight)
123
+ nn.init.zeros_(self.pwconv.bias)
124
+
125
+ def forward(self, x):
126
+ identity = x
127
+ B, C, T, H, W = x.shape
128
+ # 先 reshape 为 (B*T, C, H, W) 应用 2D norm
129
+ h = rearrange(x, "b c t h w -> (b t) c h w")
130
+ h = self.norm(h)
131
+ h = rearrange(h, "(b t) c h w -> b c t h w", b=B, t=T)
132
+ h = F.silu(h)
133
+ h = self.dwconv(h)
134
+ h = self.pwconv(h)
135
+ return identity + h
136
+
137
+ class LatentResizer(nn.Module):
138
+ """2D 主干 (与训练代码完全一致)"""
139
+ def __init__(self, in_channels=24, in_blocks=12, out_blocks=12,
140
+ channels=640, dropout=0.1, attn=False):
141
+ super().__init__()
142
+ self.conv_in = nn.Conv2d(in_channels, channels, 3, padding=1)
143
+ embed_dim = 64
144
+ self.embed = nn.Sequential(
145
+ nn.Linear(1, embed_dim), nn.SiLU(), nn.Linear(embed_dim, embed_dim))
146
+ self.in_blocks = nn.ModuleList()
147
+ for b in range(in_blocks):
148
+ if (b == 1 or b == in_blocks - 1) and attn:
149
+ self.in_blocks.append(AttnBlock(channels))
150
+ self.in_blocks.append(ResBlockEmb(channels, embed_dim, dropout))
151
+ self.out_blocks = nn.ModuleList()
152
+ for b in range(out_blocks):
153
+ if (b == 1 or b == out_blocks - 1) and attn:
154
+ self.out_blocks.append(AttnBlock(channels))
155
+ self.out_blocks.append(ResBlockEmb(channels, embed_dim, dropout))
156
+ self.norm_out = normalization(channels)
157
+ self.conv_out = nn.Conv2d(channels, in_channels, 3, padding=1)
158
+
159
+ def forward(self, x, scale=None, target_hw=None):
160
+ if target_hw is not None:
161
+ size = target_hw
162
+ elif scale is not None:
163
+ size = tuple(int(round(s * scale)) for s in x.shape[-2:])
164
+ else:
165
+ return x
166
+ if size == x.shape[-2:]:
167
+ return x
168
+
169
+ scale_emb = torch.tensor(
170
+ [scale - 1 if scale is not None else 0.0],
171
+ dtype=x.dtype, device=x.device).unsqueeze(0)
172
+ emb = self.embed(scale_emb)
173
+
174
+ x = self.conv_in(x)
175
+ for b in self.in_blocks:
176
+ if isinstance(b, ResBlockEmb):
177
+ x = b(x, emb)
178
+ else:
179
+ x = b(x)
180
+ x = F.interpolate(x, size=size, mode="bilinear")
181
+ for b in self.out_blocks:
182
+ if isinstance(b, ResBlockEmb):
183
+ x = b(x, emb)
184
+ else:
185
+ x = b(x)
186
+ x = self.norm_out(x)
187
+ x = F.silu(x)
188
+ x = self.conv_out(x)
189
+ return x
190
+
191
+ class VideoLatentResizer(nn.Module):
192
+ """5D 包装器 (含 Temporal 块) 与训练代码完全一致"""
193
+ def __init__(self, in_channels=24, in_blocks=12, out_blocks=12,
194
+ channels=640, dropout=0.1, attn=False,
195
+ temporal_every=2, temporal_kernel=5):
196
+ super().__init__()
197
+ self.resizer = LatentResizer(
198
+ in_channels=in_channels,
199
+ in_blocks=in_blocks,
200
+ out_blocks=out_blocks,
201
+ channels=channels,
202
+ dropout=dropout,
203
+ attn=attn,
204
+ )
205
+ self.temporal_blocks = nn.ModuleList()
206
+ if temporal_every > 0:
207
+ self.temporal_blocks.append(TemporalConv(channels, temporal_kernel))
208
+ self.temporal_blocks.append(TemporalConv(channels, temporal_kernel))
209
+ self.temporal_every = temporal_every
210
+ self.temporal_kernel = temporal_kernel
211
+
212
+ def forward(self, x, scale=None, target_hw=None):
213
+ B, C, T, H, W = x.shape
214
+ if target_hw is not None:
215
+ size = target_hw
216
+ elif scale is not None:
217
+ size = (int(round(H * scale)), int(round(W * scale)))
218
+ else:
219
+ size = (H, W)
220
+
221
+ if len(self.temporal_blocks) == 0:
222
+ x_flat = rearrange(x, "b c t h w -> (b t) c h w")
223
+ out = self.resizer(x_flat, scale=scale, target_hw=size)
224
+ return rearrange(out, "(b t) c h w -> b c t h w", b=B, t=T)
225
+
226
+ x_flat = rearrange(x, "b c t h w -> (b t) c h w")
227
+ emb = torch.tensor(
228
+ [scale - 1 if scale is not None else 0.0],
229
+ dtype=x.dtype, device=x.device).unsqueeze(0)
230
+ emb = self.resizer.embed(emb)
231
+
232
+ out = self.resizer.conv_in(x_flat)
233
+ for i, block in enumerate(self.resizer.in_blocks):
234
+ if isinstance(block, ResBlockEmb):
235
+ emb_t = emb.expand(B * T, -1)
236
+ out = block(out, emb_t)
237
+ else:
238
+ out = block(out)
239
+ if i % self.temporal_every == 0:
240
+ out_3d = rearrange(out, "(b t) c h w -> b c t h w", b=B, t=T)
241
+ out_3d = self.temporal_blocks[0](out_3d)
242
+ out = rearrange(out_3d, "b c t h w -> (b t) c h w")
243
+
244
+ out = F.interpolate(out, size=size, mode="bilinear")
245
+
246
+ for i, block in enumerate(self.resizer.out_blocks):
247
+ if isinstance(block, ResBlockEmb):
248
+ emb_t = emb.expand(B * T, -1)
249
+ out = block(out, emb_t)
250
+ else:
251
+ out = block(out)
252
+ if i % self.temporal_every == 0:
253
+ out_3d = rearrange(out, "(b t) c h w -> b c t h w", b=B, t=T)
254
+ out_3d = self.temporal_blocks[1](out_3d)
255
+ out = rearrange(out_3d, "b c t h w -> (b t) c h w")
256
+
257
+ out = self.resizer.norm_out(out)
258
+ out = F.silu(out)
259
+ out = self.resizer.conv_out(out)
260
+ out = rearrange(out, "(b t) c h w -> b c t h w", b=B, t=T)
261
+ return out
262
+
263
+ # ==========================================
264
+ # 模型加载 (适配训练权重)
265
+ # ==========================================
266
+ MODEL_CACHE = {}
267
+
268
+ def get_models_dir():
269
+ return folder_paths.get_folder_paths(_LATENT_UPSCALE_FOLDER)[0]
270
+
271
+ def scan_models():
272
+ files = []
273
+ model_dir = get_models_dir()
274
+ for ext in ("*.pth", "*.safetensors"):
275
+ files.extend(glob.glob(os.path.join(model_dir, ext)))
276
+ names = sorted(os.path.basename(f) for f in files)
277
+ return names if names else [f"(请将模型放入: {model_dir})"]
278
+
279
+ def _load_raw_sd(path):
280
+ if path.endswith('.safetensors'):
281
+ from safetensors.torch import load_file
282
+ sd = load_file(path, device='cpu')
283
+ else:
284
+ sd = torch.load(path, map_location='cpu', weights_only=False)
285
+ if isinstance(sd, dict) and 'model' in sd:
286
+ sd = sd['model']
287
+ # 转换 FP8 为 FP16 方便处理
288
+ sd = {k: v.to(torch.float16) if v.dtype == torch.float8_e4m3fn else v
289
+ for k, v in sd.items()}
290
+ return sd
291
+
292
+ def _extract_upscaler_sd(sd):
293
+ # 兼容合并权重中的 upscaler. 前缀
294
+ if any(k.startswith("upscaler.") for k in sd):
295
+ return {k[len("upscaler."):]: v for k, v in sd.items() if k.startswith("upscaler.")}
296
+ return sd
297
+
298
+ def _detect_arch(sd):
299
+ """
300
+ 从 state_dict 推断模型结构参数 (与训练代码一致)
301
+ 返回: dict 包含 in_blocks, out_blocks, channels, in_channels,
302
+ dropout, attn, temporal_every, temporal_kernel
303
+ """
304
+ cfg = {
305
+ "in_channels": 24,
306
+ "in_blocks": 12,
307
+ "out_blocks": 12,
308
+ "channels": 640,
309
+ "dropout": 0.1,
310
+ "attn": False,
311
+ "temporal_every": 2,
312
+ "temporal_kernel": 5,
313
+ }
314
+
315
+ # 从 conv_in 推断通道数
316
+ if 'resizer.conv_in.weight' in sd:
317
+ w = sd['resizer.conv_in.weight']
318
+ cfg["in_channels"] = w.shape[1]
319
+ cfg["channels"] = w.shape[0]
320
+
321
+ # 统计 in_blocks 中的 ResBlock 数量 (通过 in_layers 键)
322
+ in_ids = set()
323
+ out_ids = set()
324
+ for k in sd.keys():
325
+ m = re.match(r'resizer\.in_blocks\.(\d+)\.in_layers\.', k)
326
+ if m:
327
+ in_ids.add(int(m.group(1)))
328
+ m = re.match(r'resizer\.out_blocks\.(\d+)\.in_layers\.', k)
329
+ if m:
330
+ out_ids.add(int(m.group(1)))
331
+
332
+ if in_ids:
333
+ cfg["in_blocks"] = len(in_ids)
334
+ if out_ids:
335
+ cfg["out_blocks"] = len(out_ids)
336
+
337
+ # 检测是否包含 temporal 块
338
+ has_temporal = any('temporal_blocks' in k for k in sd)
339
+ if has_temporal:
340
+ # 尝试从 temporal_blocks.0.dwconv.weight 提取 kernel size
341
+ for k in sd.keys():
342
+ if 'temporal_blocks.0.dwconv.weight' in k:
343
+ kernel_t = sd[k].shape[2]
344
+ cfg["temporal_kernel"] = kernel_t
345
+ break
346
+ cfg["temporal_every"] = 2 # 训练固定值
347
+ else:
348
+ cfg["temporal_every"] = 0
349
+
350
+ # 检测是否包含 attn (但推理时强制关闭)
351
+ if any('attn' in k for k in sd):
352
+ cfg["attn"] = True # 仅用于记录,实际加载时强制 False
353
+
354
+ # 推理时强制 attn=False 以提高性能
355
+ cfg["attn"] = False
356
+ return cfg
357
+
358
+ def load_model(name, device, precision):
359
+ cache_key = f"{name}::{device}::{precision}"
360
+ if cache_key in MODEL_CACHE:
361
+ return MODEL_CACHE[cache_key]
362
+
363
+ path = os.path.join(get_models_dir(), name)
364
+ if not os.path.exists(path):
365
+ raise FileNotFoundError(f"模型文件不存在: {path}")
366
+
367
+ raw_sd = _load_raw_sd(path)
368
+ up_sd = _extract_upscaler_sd(raw_sd)
369
+
370
+ cfg = _detect_arch(up_sd)
371
+
372
+ # 构建模型 (与训练完全一致)
373
+ model = VideoLatentResizer(
374
+ in_channels=cfg["in_channels"],
375
+ in_blocks=cfg["in_blocks"],
376
+ out_blocks=cfg["out_blocks"],
377
+ channels=cfg["channels"],
378
+ dropout=cfg["dropout"],
379
+ attn=cfg["attn"], # 强制 False
380
+ temporal_every=cfg["temporal_every"],
381
+ temporal_kernel=cfg["temporal_kernel"],
382
+ )
383
+
384
+ # 加载权重,忽略不匹配的键 (如 attn 层若训练有但推理强制关闭)
385
+ missing, unexpected = model.load_state_dict(up_sd, strict=False)
386
+ if missing:
387
+ print(f"[MinimaxH3] 缺少键: {missing[:5]}... (可能由于 attn 强制关闭)")
388
+ if unexpected:
389
+ print(f"[MinimaxH3] 多余键: {unexpected[:5]}... (可能来自合并文件的其他部分)")
390
+
391
+ dtype = {"fp32": torch.float32, "fp16": torch.float16, "bf16": torch.bfloat16}.get(precision, torch.float32)
392
+ model = model.to(device).eval()
393
+ if dtype != torch.float32:
394
+ model = model.to(dtype)
395
+
396
+ MODEL_CACHE[cache_key] = model
397
+
398
+ print(f"[MinimaxH3] 加载放大模型: {name}")
399
+ print(f" Params: {sum(p.numel() for p in model.parameters()):,} | "
400
+ f"Attn: 强制关闭 | Temporal: {'✓' if cfg['temporal_every']>0 else '✗'} "
401
+ f"(every={cfg['temporal_every']}, kernel={cfg['temporal_kernel']})")
402
+ return model
403
+
404
+ # ==========================================
405
+ # ComfyUI 节点 (2D 版本)
406
+ # ==========================================
407
+ class MinimaxH3LatentUpscalerNode2D:
408
+ """Minimax H3 Latent 放大节点 (2D主干 + Temporal,与训练模型兼容,scale 1.0~4.0)"""
409
+ @classmethod
410
+ def INPUT_TYPES(cls):
411
+ return {
412
+ "required": {
413
+ "latent": ("LATENT",),
414
+ "model_name": (scan_models(),),
415
+ "scale": ("FLOAT", {"default": 2.0, "min": 1.0, "max": 4.0, "step": 0.1}),
416
+ "device": (["cuda", "cpu"], {"default": "cuda"}),
417
+ "precision": (["fp32", "fp16", "bf16"], {"default": "fp32"}),
418
+ }
419
+ }
420
+
421
+ RETURN_TYPES = ("LATENT",)
422
+ FUNCTION = "run"
423
+ CATEGORY = "video/MinimaxH3"
424
+
425
+ def run(self, latent, model_name, scale, device, precision):
426
+ if model_name.startswith('('):
427
+ raise ValueError("请将模型文件放入 latent_upscale_models 目录")
428
+
429
+ if abs(scale - 1.0) < 1e-6:
430
+ return (latent,)
431
+
432
+ if scale < 1.0:
433
+ raise ValueError("仅支持放大 (scale >= 1.0)")
434
+
435
+ dev = torch.device(device if torch.cuda.is_available() else "cpu")
436
+ model = load_model(model_name, dev, precision)
437
+
438
+ s = latent["samples"].clone()
439
+ orig_dtype = s.dtype
440
+ # 确保是 5D (B, C, T, H, W)
441
+ if len(s.shape) == 4:
442
+ s = s.unsqueeze(2) # (B, C, 1, H, W)
443
+
444
+ compute_dtype = {"fp32": torch.float32, "fp16": torch.float16, "bf16": torch.bfloat16}[precision]
445
+ s = s.to(dev, compute_dtype)
446
+
447
+ # 归一化
448
+ norm_mean, norm_std = _make_norm_tensors(dev, compute_dtype)
449
+ s = (s - norm_mean) / norm_std
450
+
451
+ with torch.no_grad():
452
+ # 目标空间尺寸 (H, W),时间维度不变
453
+ T, H, W = s.shape[2], s.shape[3], s.shape[4]
454
+ target_hw = (int(round(H * scale)), int(round(W * scale)))
455
+ out = model(s, scale=scale, target_hw=target_hw)
456
+
457
+ # 反归一化
458
+ out = out * norm_std + norm_mean
459
+
460
+ # 还原维度
461
+ if len(latent["samples"].shape) == 4:
462
+ out = out.squeeze(2)
463
+
464
+ out = out.cpu().to(orig_dtype)
465
+
466
+ if dev.type == "cuda":
467
+ torch.cuda.empty_cache()
468
+
469
+ return ({"samples": out},)
470
+
471
+ # ==========================================
472
+ # 节点注册
473
+ # ==========================================
474
+ NODE_CLASS_MAPPINGS = {
475
+ "MinimaxH3LatentUpscalerNode2D": MinimaxH3LatentUpscalerNode2D,
476
+ }
477
+ NODE_DISPLAY_NAME_MAPPINGS = {
478
+ "MinimaxH3LatentUpscalerNode2D": "Minimax H3 Latent Upscaler (2D)",
479
+ }
Comfyui_Minimax_h3_latent_Upscaler/nodes/minimax_h3_latent_upscaler_3d.py ADDED
@@ -0,0 +1,655 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Minimax H3 Latent Upscaler - ComfyUI inference node (pure 3D conv version)
3
+ - [终极融合] 引入时间分块(Temporal Chunking)与 Replicate Padding,解决长视频 OOM 与末尾闪烁
4
+ - [底层黑科技] 显式 .contiguous() 消除隐式显存拷贝尖峰
5
+ - [底层黑科技] Zero-Copy 零拷贝加载模型,防止系统内存(RAM)峰值爆满
6
+ - [底层黑科技] 接入 ComfyUI 原生 soft_empty_cache,彻底清理显存碎片
7
+ - [终极整合] 推理结束后将模型踢回CPU,释放显存给后续节点(可选开关)
8
+ - [终极整合] 强制长宽双向对齐到32的倍数,彻底解决底部光带(Light Banding)问题
9
+ - [终极整合] 放弃 In-place 原地操作,保障 FP16/FP32 下的数值精度与画质
10
+ - [新增] 完美支持 ROCm (AMD GPU) 加速
11
+ - [新增] 支持子文件夹模型管理 (PR #30)
12
+ - [新增] 强制卸载模型开关 (force_unload)
13
+ - 3 resize modes: scale by multiplier / target dimensions / megapixels
14
+ - Auto-detects model architecture (channels, blocks, temporal layout)
15
+ """
16
+ import torch
17
+ import torch.nn as nn
18
+ import torch.nn.functional as F
19
+ import os
20
+ import glob
21
+ import gc
22
+ import folder_paths
23
+ import re
24
+ from einops import rearrange
25
+ from enum import Enum
26
+ from typing import TypedDict
27
+
28
+ try:
29
+ import comfy.model_management as mm
30
+ HAS_COMFY_MM = True
31
+ except ImportError:
32
+ HAS_COMFY_MM = False
33
+
34
+ try:
35
+ from comfy_api.latest import ComfyExtension, io
36
+ from typing_extensions import override
37
+ USE_NEW_API = True
38
+ except ImportError:
39
+ USE_NEW_API = False
40
+ class io:
41
+ class ComfyNode: pass
42
+ class Schema: pass
43
+ class NodeOutput: pass
44
+ class AnyType:
45
+ @staticmethod
46
+ def Input(*args, **kwargs): return args[0] if args else "ANY"
47
+ @staticmethod
48
+ def Output(*args, **kwargs): return args[0] if args else "ANY"
49
+ class Combo:
50
+ @staticmethod
51
+ def Input(*args, **kwargs): return args[0] if args else "COMBO"
52
+ class Float:
53
+ @staticmethod
54
+ def Input(*args, **kwargs): return "FLOAT"
55
+ class Int:
56
+ @staticmethod
57
+ def Input(*args, **kwargs): return "INT"
58
+ class Boolean:
59
+ @staticmethod
60
+ def Input(*args, **kwargs): return "BOOLEAN"
61
+ class DynamicCombo:
62
+ @staticmethod
63
+ def Input(*args, **kwargs): return args[0] if args else "DYNAMIC"
64
+ class Option: pass
65
+ class ComfyExtension: pass
66
+ def override(func): return func
67
+
68
+ # ==========================================
69
+ # Register model folder
70
+ # ==========================================
71
+ _LATENT_UPSCALE_FOLDER = "latent_upscale_models"
72
+ if _LATENT_UPSCALE_FOLDER not in folder_paths.folder_names_and_paths:
73
+ folder_paths.add_model_folder_path(
74
+ _LATENT_UPSCALE_FOLDER,
75
+ os.path.join(folder_paths.models_dir, _LATENT_UPSCALE_FOLDER)
76
+ )
77
+
78
+ VAE_DOWNSAMPLE = 16
79
+
80
+ # ==========================================
81
+ # Minimax H3 latent normalization stats (24 channels)
82
+ # ==========================================
83
+ LATENTS_MEAN = [
84
+ 0.858090341091156, -0.9606591463088989, 1.0661640167236328, -0.5090325474739075,
85
+ -0.2727581858634949, -1.3675414323806763, -0.2553254961967468, -0.26907554268836975,
86
+ -0.5376840829849243, -0.0464097298681736, 0.6657370328903198, 0.19690127670764923,
87
+ -0.5460608005523682, -0.4035342037677765, -0.23683024942874908, 0.25928452610969543,
88
+ -0.30133944749832153, 0.211341992020607, -1.1206848621368408, 0.3581933379173279,
89
+ -0.04225143790245056, 0.2604829967021942, 0.22864092886447906, 0.7056031823158264
90
+ ]
91
+ LATENTS_STD = [
92
+ 1.2223774194717407, 1.2767263650894165, 1.6831774711608887, 1.7549455165863037,
93
+ 1.5636216402053833, 2.194143533706665, 0.9653137922286987, 1.0569885969161987,
94
+ 0.841948926448822, 0.7729952931404114, 1.8955937623977661, 0.946841835975647,
95
+ 0.7996809482574463, 0.44988900423049927, 0.7197399735450745, 0.6936293244361877,
96
+ 2.961095094680786, 2.7694199085235596, 3.0496184825897217, 2.1088054180145264,
97
+ 3.276226282119751, 3.1627357006073, 2.2816812992095947, 2.6127843856811523
98
+ ]
99
+
100
+ def _make_norm_tensors(device, dtype):
101
+ mean = torch.tensor(LATENTS_MEAN, dtype=dtype, device=device).view(1, -1, 1, 1, 1)
102
+ std = torch.tensor(LATENTS_STD, dtype=dtype, device=device).view(1, -1, 1, 1, 1)
103
+ return mean, std
104
+
105
+ # ==========================================
106
+ # ROCm / Device Helper Functions
107
+ # ==========================================
108
+ def _is_rocm_build():
109
+ return getattr(torch.version, "hip", None) is not None
110
+
111
+ def _resolve_device(backend):
112
+ if backend == "cpu":
113
+ return torch.device("cpu")
114
+ if backend == "rocm":
115
+ if not _is_rocm_build():
116
+ raise RuntimeError("ROCm was selected, but this PyTorch build has no HIP/ROCm support.")
117
+ if not torch.cuda.is_available():
118
+ raise RuntimeError("ROCm was selected, but PyTorch cannot access an AMD GPU.")
119
+ return torch.device("cuda")
120
+ if backend == "cuda":
121
+ return torch.device("cuda" if torch.cuda.is_available() else "cpu")
122
+ raise ValueError(f"Unsupported device backend: {backend}")
123
+
124
+ def _backend_label(device):
125
+ if device.type == "cuda" and _is_rocm_build():
126
+ return f"ROCm/HIP {torch.version.hip}"
127
+ if device.type == "cuda":
128
+ return f"CUDA {getattr(torch.version, 'cuda', None) or 'unknown'}"
129
+ return "CPU"
130
+
131
+ # ==========================================
132
+ # 3D network components
133
+ # ==========================================
134
+ def normalization(channels):
135
+ return nn.GroupNorm(32, channels)
136
+
137
+ def zero_module(module):
138
+ for p in module.parameters():
139
+ p.detach().zero_()
140
+ return module
141
+
142
+ class AttnBlock3D(nn.Module):
143
+ def __init__(self, in_channels):
144
+ super().__init__()
145
+ self.norm = normalization(in_channels)
146
+ self.q = nn.Conv3d(in_channels, in_channels, 1)
147
+ self.k = nn.Conv3d(in_channels, in_channels, 1)
148
+ self.v = nn.Conv3d(in_channels, in_channels, 1)
149
+ self.proj_out = nn.Conv3d(in_channels, in_channels, 1)
150
+
151
+ def forward(self, x):
152
+ h = self.norm(x)
153
+ q = rearrange(self.q(h), "b c t h w -> b 1 (t h w) c")
154
+ k = rearrange(self.k(h), "b c t h w -> b 1 (t h w) c")
155
+ v = rearrange(self.v(h), "b c t h w -> b 1 (t h w) c")
156
+ h = F.scaled_dot_product_attention(q, k, v)
157
+ h = rearrange(h, "b 1 (t h w) c -> b c t h w", t=x.shape[2], h=x.shape[3], w=x.shape[4])
158
+ return x + self.proj_out(h)
159
+
160
+ class ResBlockEmb3D(nn.Module):
161
+ def __init__(self, channels, emb_channels, dropout=0, out_channels=None):
162
+ super().__init__()
163
+ self.out_channels = out_channels or channels
164
+ self.in_layers = nn.Sequential(
165
+ normalization(channels), nn.SiLU(),
166
+ nn.Conv3d(channels, self.out_channels, 3, padding=1),
167
+ )
168
+ self.emb_layers = nn.Sequential(
169
+ nn.SiLU(), nn.Linear(emb_channels, 2 * self.out_channels),
170
+ )
171
+ self.out_norm = normalization(self.out_channels)
172
+ self.out_layers = nn.Sequential(
173
+ nn.SiLU(), nn.Dropout(p=dropout),
174
+ zero_module(nn.Conv3d(self.out_channels, self.out_channels, 3, padding=1)),
175
+ )
176
+ self.skip = (
177
+ nn.Conv3d(channels, self.out_channels, 1)
178
+ if self.out_channels != channels else nn.Identity()
179
+ )
180
+
181
+ def forward(self, x, emb):
182
+ h = self.in_layers(x)
183
+ emb_out = self.emb_layers(emb).type(h.dtype)
184
+ while len(emb_out.shape) < len(h.shape):
185
+ emb_out = emb_out[..., None]
186
+ scale, shift = torch.chunk(emb_out, 2, dim=1)
187
+ h = self.out_norm(h) * (1 + scale) + shift
188
+ h = self.out_layers(h)
189
+ return self.skip(x) + h
190
+
191
+ class TemporalConv(nn.Module):
192
+ def __init__(self, channels, kernel_size=5):
193
+ super().__init__()
194
+ padding = kernel_size // 2
195
+ self.norm = normalization(channels)
196
+ self.dwconv = nn.Conv3d(channels, channels,
197
+ kernel_size=(kernel_size, 1, 1),
198
+ padding=(padding, 0, 0),
199
+ groups=channels)
200
+ self.pwconv = nn.Conv3d(channels, channels, kernel_size=1)
201
+ nn.init.zeros_(self.pwconv.weight)
202
+ nn.init.zeros_(self.pwconv.bias)
203
+
204
+ def forward(self, x):
205
+ identity = x
206
+ h = self.norm(x)
207
+ h = F.silu(h)
208
+ h = self.dwconv(h)
209
+ h = self.pwconv(h)
210
+ return identity + h
211
+
212
+ # ==========================================
213
+ # Pure-3D backbone with Temporal Chunking
214
+ # ==========================================
215
+ class LatentResizer3D(nn.Module):
216
+ def __init__(self, in_channels=24, in_blocks=12, out_blocks=12,
217
+ channels=512, dropout=0.1, attn=False,
218
+ temporal_every=2, temporal_kernel=5):
219
+ super().__init__()
220
+ self.conv_in = nn.Conv3d(in_channels, channels, 3, padding=1)
221
+ embed_dim = 64
222
+ self.embed = nn.Sequential(
223
+ nn.Linear(1, embed_dim), nn.SiLU(), nn.Linear(embed_dim, embed_dim))
224
+
225
+ self.in_blocks = nn.ModuleList()
226
+ for b in range(in_blocks):
227
+ if (b == 1 or b == in_blocks - 1) and attn:
228
+ self.in_blocks.append(AttnBlock3D(channels))
229
+ self.in_blocks.append(ResBlockEmb3D(channels, embed_dim, dropout))
230
+ if temporal_every > 0 and b % temporal_every == 0:
231
+ self.in_blocks.append(TemporalConv(channels, temporal_kernel))
232
+
233
+ self.out_blocks = nn.ModuleList()
234
+ for b in range(out_blocks):
235
+ if (b == 1 or b == out_blocks - 1) and attn:
236
+ self.out_blocks.append(AttnBlock3D(channels))
237
+ self.out_blocks.append(ResBlockEmb3D(channels, embed_dim, dropout))
238
+ if temporal_every > 0 and b % temporal_every == 0:
239
+ self.out_blocks.append(TemporalConv(channels, temporal_kernel))
240
+
241
+ self.norm_out = normalization(channels)
242
+ self.conv_out = nn.Conv3d(channels, in_channels, 3, padding=1)
243
+
244
+ def forward(self, x, scale=None, target_size=None, enable_chunking=True):
245
+ if target_size is not None:
246
+ size = target_size
247
+ elif scale is not None:
248
+ size = tuple(int(round(s * scale)) for s in x.shape[-3:])
249
+ else:
250
+ return x
251
+
252
+ if size == x.shape[-3:]:
253
+ return x
254
+
255
+ B, C, T, H, W = x.shape
256
+
257
+ tk = 0
258
+ for b in self.in_blocks:
259
+ if isinstance(b, TemporalConv):
260
+ tk = b.dwconv.weight.shape[2]
261
+ break
262
+
263
+ overlap = tk
264
+ chunk = 32
265
+
266
+ if not enable_chunking or T <= chunk:
267
+ return self._forward_seg(x, scale, size)
268
+
269
+ print(f"[MinimaxH3-3D] temporal chunking: T={T} chunks={(T + chunk - 1) // chunk} overlap={overlap}")
270
+
271
+ x_padded = F.pad(x, (0, 0, 0, 0, overlap, overlap), mode='replicate')
272
+
273
+ out_full = torch.zeros(B, C, T, size[-2], size[-1], device=x.device, dtype=x.dtype)
274
+ weight_full = torch.zeros(1, 1, T, 1, 1, device=x.device, dtype=x.dtype)
275
+
276
+ start = 0
277
+ while start < T:
278
+ seg_start = start
279
+ seg_end = min(T, start + chunk)
280
+ out_start = max(0, seg_start - overlap)
281
+ out_end = min(T, seg_end + overlap)
282
+ lo = max(0, out_start - overlap)
283
+ hi = min(T + 2 * overlap, out_end + overlap)
284
+
285
+ seg = x_padded[:, :, lo:hi].contiguous()
286
+ seg_size = (hi - lo, size[-2], size[-1])
287
+ seg_out = self._forward_seg(seg, scale, seg_size)
288
+
289
+ s0 = (out_start + overlap) - lo
290
+ s1 = s0 + (out_end - out_start)
291
+ valid_out = seg_out[:, :, s0:s1]
292
+ n_valid = out_end - out_start
293
+
294
+ weight = torch.ones(n_valid, device=x.device, dtype=x.dtype)
295
+ if seg_start > out_start:
296
+ blend_len = seg_start - out_start
297
+ weight[:blend_len] = torch.arange(1, blend_len + 1, device=x.device, dtype=x.dtype) / (blend_len + 1)
298
+ if out_end > seg_end:
299
+ blend_len = out_end - seg_end
300
+ weight[-blend_len:] = torch.arange(blend_len, 0, -1, device=x.device, dtype=x.dtype) / (blend_len + 1)
301
+
302
+ out_full[:, :, out_start:out_end] += valid_out * weight.view(1, 1, n_valid, 1, 1)
303
+ weight_full[:, :, out_start:out_end] += weight.view(1, 1, n_valid, 1, 1)
304
+
305
+ start += chunk
306
+ del seg, seg_out, valid_out
307
+ if start % (chunk * 4) == 0:
308
+ gc.collect()
309
+
310
+ out_full = out_full / weight_full.clamp(min=1e-8)
311
+ return out_full
312
+
313
+ def _forward_seg(self, x, scale, size):
314
+ scale_emb = torch.tensor(
315
+ [scale - 1 if scale is not None else 0.0],
316
+ dtype=x.dtype, device=x.device).unsqueeze(0)
317
+ emb = self.embed(scale_emb)
318
+
319
+ x = self.conv_in(x)
320
+ for b in self.in_blocks:
321
+ if isinstance(b, ResBlockEmb3D):
322
+ emb_t = emb.expand(x.shape[0], -1)
323
+ x = b(x, emb_t)
324
+ else:
325
+ x = b(x)
326
+
327
+ x = F.interpolate(x, size=size, mode="trilinear", align_corners=False)
328
+
329
+ for b in self.out_blocks:
330
+ if isinstance(b, ResBlockEmb3D):
331
+ emb_t = emb.expand(x.shape[0], -1)
332
+ x = b(x, emb_t)
333
+ else:
334
+ x = b(x)
335
+
336
+ x = self.norm_out(x)
337
+ x = F.silu(x)
338
+ x = self.conv_out(x)
339
+ return x
340
+
341
+ # ==========================================
342
+ # Model loading
343
+ # ==========================================
344
+ MODEL_CACHE = {}
345
+
346
+ def get_models_dir():
347
+ return folder_paths.get_folder_paths(_LATENT_UPSCALE_FOLDER)[0]
348
+
349
+ def scan_models():
350
+ names = [
351
+ name for name in folder_paths.get_filename_list(_LATENT_UPSCALE_FOLDER)
352
+ if os.path.splitext(name)[1].lower() in (".pth", ".safetensors")
353
+ ]
354
+ return names if names else [f"(place models in: {get_models_dir()})"]
355
+
356
+ def _load_raw_sd(path):
357
+ if path.endswith('.safetensors'):
358
+ try:
359
+ from safetensors import safe_open
360
+ with safe_open(path, framework="pt", device="cpu") as f:
361
+ sd = {k: f.get_tensor(k) for k in f.keys()}
362
+ except ImportError:
363
+ from safetensors.torch import load_file
364
+ sd = load_file(path, device='cpu')
365
+ else:
366
+ sd = torch.load(path, map_location='cpu', weights_only=False)
367
+
368
+ if isinstance(sd, dict) and 'model' in sd:
369
+ sd = sd['model']
370
+ sd = {k: v.to(torch.float16) if v.dtype == torch.float8_e4m3fn else v
371
+ for k, v in sd.items()}
372
+ return sd
373
+
374
+ def _extract_upscaler_sd(sd):
375
+ if any(k.startswith("upscaler.") for k in sd):
376
+ return {k[len("upscaler."):]: v for k, v in sd.items() if k.startswith("upscaler.")}
377
+ return sd
378
+
379
+ def _detect_arch(sd):
380
+ cfg = {
381
+ "in_channels": 24, "in_blocks": 12, "out_blocks": 12, "channels": 512,
382
+ "dropout": 0.1, "attn": False, "temporal_every": 2, "temporal_kernel": 5,
383
+ }
384
+ conv_key = 'conv_in.weight'
385
+ if conv_key in sd:
386
+ cfg["in_channels"] = sd[conv_key].shape[1]
387
+ cfg["channels"] = sd[conv_key].shape[0]
388
+
389
+ in_ids, out_ids = set(), set()
390
+ temporal_in_indices, temporal_out_indices = set(), set()
391
+ for k in sd.keys():
392
+ m = re.match(r'in_blocks\.(\d+)\.in_layers\.', k)
393
+ if m: in_ids.add(int(m.group(1)))
394
+ m = re.match(r'out_blocks\.(\d+)\.in_layers\.', k)
395
+ if m: out_ids.add(int(m.group(1)))
396
+ m = re.match(r'in_blocks\.(\d+)\.dwconv\.weight', k)
397
+ if m: temporal_in_indices.add(int(m.group(1)))
398
+ m = re.match(r'out_blocks\.(\d+)\.dwconv\.weight', k)
399
+ if m: temporal_out_indices.add(int(m.group(1)))
400
+
401
+ if in_ids: cfg["in_blocks"] = len(in_ids)
402
+ if out_ids: cfg["out_blocks"] = len(out_ids)
403
+
404
+ if temporal_in_indices or temporal_out_indices:
405
+ cfg["temporal_every"] = 2
406
+ for k in sd.keys():
407
+ if 'dwconv.weight' in k and k.endswith('dwconv.weight'):
408
+ cfg["temporal_kernel"] = sd[k].shape[2]
409
+ break
410
+ else:
411
+ cfg["temporal_every"] = 0
412
+
413
+ if any('attn' in k for k in sd): cfg["attn"] = True
414
+ cfg["attn"] = False
415
+ return cfg
416
+
417
+ def load_model(name, device, precision):
418
+ backend_lbl = _backend_label(device)
419
+ cache_key = f"{name}::{backend_lbl}::{precision}"
420
+ if cache_key in MODEL_CACHE:
421
+ model = MODEL_CACHE[cache_key]
422
+ return model.to(device, non_blocking=True)
423
+
424
+ try:
425
+ path = folder_paths.get_full_path_or_raise(_LATENT_UPSCALE_FOLDER, name)
426
+ except Exception as e:
427
+ raise FileNotFoundError(f"Model file not found: {name}") from e
428
+
429
+ raw_sd = _load_raw_sd(path)
430
+ up_sd = _extract_upscaler_sd(raw_sd)
431
+ cfg = _detect_arch(up_sd)
432
+
433
+ model = LatentResizer3D(
434
+ in_channels=cfg["in_channels"], in_blocks=cfg["in_blocks"], out_blocks=cfg["out_blocks"],
435
+ channels=cfg["channels"], dropout=cfg["dropout"], attn=cfg["attn"],
436
+ temporal_every=cfg["temporal_every"], temporal_kernel=cfg["temporal_kernel"],
437
+ )
438
+ model.load_state_dict(up_sd, strict=True)
439
+ dtype = {"fp32": torch.float32, "fp16": torch.float16, "bf16": torch.bfloat16}.get(precision, torch.float32)
440
+ model = model.to(device).eval().requires_grad_(False)
441
+ if dtype != torch.float32:
442
+ model = model.to(dtype)
443
+
444
+ MODEL_CACHE[cache_key] = model
445
+ print(f"[MinimaxH3-3D] Loaded upscale model: {name}")
446
+ print(f" Params: {sum(p.numel() for p in model.parameters()):,} | "
447
+ f"Attn: forced off | Temporal: {'on' if cfg['temporal_every'] > 0 else 'off'} "
448
+ f"(every={cfg['temporal_every']}, kernel={cfg['temporal_kernel']}) | "
449
+ f"Backend: {backend_lbl} | Precision: {precision}")
450
+ return model
451
+
452
+ # ==========================================
453
+ # ComfyUI node (new API)
454
+ # ==========================================
455
+ class UpscaleMode(str, Enum):
456
+ SCALE_BY = "scale by multiplier"
457
+ TARGET_DIMENSIONS = "target dimensions"
458
+ MEGAPIXELS = "megapixels"
459
+
460
+ class UpscaleConfig(TypedDict):
461
+ mode: UpscaleMode
462
+ scale: float
463
+ width: int
464
+ height: int
465
+ megapixels: float
466
+
467
+ class MinimaxH3LatentUpscaler3D(io.ComfyNode):
468
+ """Minimax H3 latent upscaler with Temporal Chunking and pixel-space alignment."""
469
+
470
+ @classmethod
471
+ def define_schema(cls):
472
+ return io.Schema(
473
+ node_id="MinimaxH3LatentUpscaler3D",
474
+ display_name="Minimax H3 Latent Upscaler (3D)",
475
+ category="video/MinimaxH3",
476
+ search_aliases=["minimax", "h3", "latent", "upscale", "3d"],
477
+ inputs=[
478
+ io.AnyType.Input("latent", tooltip="Input latent (image or video)."),
479
+ io.Combo.Input("model_name", options=scan_models(), tooltip="Minimax H3 upscale model."),
480
+
481
+ io.DynamicCombo.Input(
482
+ "mode",
483
+ tooltip="How the target size is computed.",
484
+ options=[
485
+ io.DynamicCombo.Option(UpscaleMode.SCALE_BY, [
486
+ io.Float.Input("scale", default=2.0, min=1.0, max=4.0, step=0.05, tooltip="Upscale factor."),
487
+ ]),
488
+ io.DynamicCombo.Option(UpscaleMode.TARGET_DIMENSIONS, [
489
+ io.Int.Input("width", default=1280, min=64, max=8192, step=8, tooltip="Target pixel width."),
490
+ io.Int.Input("height", default=704, min=64, max=8192, step=8, tooltip="Target pixel height.")
491
+ ]),
492
+ io.DynamicCombo.Option(UpscaleMode.MEGAPIXELS, [
493
+ io.Float.Input("megapixels", default=1.0, min=0.1, max=16.0, step=0.1, tooltip="Target megapixels.")
494
+ ])
495
+ ],
496
+ ),
497
+
498
+ io.Int.Input("align", default=32, min=1, max=512, step=1,
499
+ tooltip="Pixel-space alignment. 32 is strictly recommended."),
500
+
501
+ # ---- 推理行为开关组 ----
502
+ io.Boolean.Input("enable_temporal_chunking", default=True,
503
+ tooltip="Enable temporal chunking to save VRAM for long videos and fix end-frame flickering."),
504
+ io.Boolean.Input("force_unload", default=True,
505
+ tooltip="Unload model to CPU after inference to free VRAM for subsequent nodes. "
506
+ "Disable if you run this node repeatedly to avoid reload overhead."),
507
+
508
+ # ---- 硬件 / 精度选项组 ----
509
+ io.Combo.Input("device", options=["cuda", "rocm", "cpu"], default="cuda"),
510
+ io.Combo.Input("precision", options=["fp32", "fp16", "bf16"], default="fp16"),
511
+ ],
512
+ outputs=[
513
+ io.AnyType.Output("latent", tooltip="Upscaled latent."),
514
+ ],
515
+ )
516
+
517
+ @classmethod
518
+ def execute(cls, latent: dict, model_name: str, mode: UpscaleConfig,
519
+ align: int, enable_temporal_chunking: bool, force_unload: bool,
520
+ device: str, precision: str) -> io.NodeOutput:
521
+
522
+ if model_name.startswith('('):
523
+ raise ValueError("Please place model files into the latent_upscale_models directory")
524
+
525
+ selected_mode = mode["mode"]
526
+ src = latent["samples"]
527
+
528
+ # --- MiniMax H3 AV latent support ---------------------------------
529
+ # ComfyUI packs H3's joint video+audio latent as a NestedTensor:
530
+ # tensors[0] = video (B, 24, T, H, W)
531
+ # tensors[1] = audio (B, 32, ...)
532
+ # Only the video part is spatially upscalable; the audio latent is
533
+ # carried through untouched and re-packed on the way out.
534
+ audio_part = None
535
+ if getattr(src, "is_nested", False):
536
+ if len(src.tensors) != 2:
537
+ raise ValueError(
538
+ f"Expected a MiniMax H3 AV latent (video+audio), got a nested "
539
+ f"tensor with {len(src.tensors)} components."
540
+ )
541
+ src, audio_part = src.tensors[0], src.tensors[1]
542
+ print(f"[MinimaxH3-3D] AV latent detected: video {tuple(src.shape)}, "
543
+ f"audio {tuple(audio_part.shape)} (audio passed through).")
544
+ # -------------------------------------------------------------------
545
+
546
+ orig_dtype = src.dtype
547
+ was_4d = (src.ndim == 4)
548
+
549
+ dev = _resolve_device(device)
550
+ compute_dtype = {"fp32": torch.float32, "fp16": torch.float16, "bf16": torch.bfloat16}[precision]
551
+
552
+ s = src.to(device=dev, dtype=compute_dtype, copy=True)
553
+ if was_4d:
554
+ s = s.unsqueeze(2)
555
+
556
+ b, c, t, h_in, w_in = s.shape
557
+ downsample = VAE_DOWNSAMPLE
558
+
559
+ # 1. Calculate Target Size
560
+ if selected_mode == UpscaleMode.SCALE_BY:
561
+ scale_val = mode["scale"]
562
+ w_pixel_target = w_in * downsample * scale_val
563
+ h_pixel_target = h_in * downsample * scale_val
564
+ effective_scale = scale_val
565
+ elif selected_mode == UpscaleMode.TARGET_DIMENSIONS:
566
+ w_pixel_target = float(mode["width"])
567
+ h_pixel_target = float(mode["height"])
568
+ effective_scale = (w_pixel_target / (w_in * downsample) + h_pixel_target / (h_in * downsample)) / 2.0
569
+ elif selected_mode == UpscaleMode.MEGAPIXELS:
570
+ mp = mode["megapixels"]
571
+ target_pixels = mp * 1024 * 1024
572
+ aspect_ratio = w_in / h_in
573
+ h_pixel_target = (target_pixels / aspect_ratio) ** 0.5
574
+ w_pixel_target = h_pixel_target * aspect_ratio
575
+ effective_scale = (w_pixel_target / (w_in * downsample) + h_pixel_target / (h_in * downsample)) / 2.0
576
+ else:
577
+ raise ValueError(f"Unsupported mode: {selected_mode}")
578
+
579
+ # 2. Pixel-space alignment (双向对齐)
580
+ alignment = max(1, align)
581
+ w_pixel_aligned = round(w_pixel_target / alignment) * alignment
582
+ h_pixel_aligned = round(h_pixel_target / alignment) * alignment
583
+
584
+ w_pixel_final = round(w_pixel_aligned / downsample) * downsample
585
+ h_pixel_final = round(h_pixel_aligned / downsample) * downsample
586
+
587
+ w_out = max(1, int(w_pixel_final // downsample))
588
+ h_out = max(1, int(h_pixel_final // downsample))
589
+
590
+ if effective_scale < 1.0 and (w_out < w_in or h_out < h_in):
591
+ raise ValueError("This model only supports upscaling (effective scale >= 1.0).")
592
+
593
+ if w_out == w_in and h_out == h_in:
594
+ return io.NodeOutput(latent)
595
+
596
+ print(f"[MinimaxH3-3D] Latent {w_in}x{h_in} -> {w_out}x{h_out} | "
597
+ f"Pixels {w_out * downsample}x{h_out * downsample} | scale={effective_scale:.3f}")
598
+
599
+ # 3. Inference
600
+ model = load_model(model_name, dev, precision)
601
+ norm_mean, norm_std = _make_norm_tensors(dev, compute_dtype)
602
+
603
+ with torch.inference_mode():
604
+ s_norm = (s - norm_mean) / norm_std
605
+ del s
606
+
607
+ out = model(s_norm, scale=effective_scale, target_size=(t, h_out, w_out),
608
+ enable_chunking=enable_temporal_chunking)
609
+
610
+ del s_norm
611
+ out = out * norm_std + norm_mean
612
+
613
+ if was_4d:
614
+ out = out.squeeze(2)
615
+
616
+ out = out.to(device="cpu", dtype=orig_dtype, non_blocking=True)
617
+
618
+ # 4. VRAM Management
619
+ if dev.type == "cuda":
620
+ if force_unload:
621
+ model.to("cpu", non_blocking=True)
622
+ print("[MinimaxH3-3D] ✅ Model offloaded to CPU. VRAM released.")
623
+ if HAS_COMFY_MM:
624
+ mm.soft_empty_cache()
625
+ else:
626
+ torch.cuda.empty_cache()
627
+ gc.collect()
628
+
629
+ if audio_part is not None:
630
+ import comfy.nested_tensor
631
+ audio_out = audio_part.to(device=out.device)
632
+ return io.NodeOutput(
633
+ {"samples": comfy.nested_tensor.NestedTensor((out, audio_out))}
634
+ )
635
+
636
+ return io.NodeOutput({"samples": out})
637
+
638
+ # ==========================================
639
+ # Registration
640
+ # ==========================================
641
+ if USE_NEW_API:
642
+ class MinimaxH3Extension(ComfyExtension):
643
+ @override
644
+ async def get_node_list(self) -> list[type[io.ComfyNode]]:
645
+ return [MinimaxH3LatentUpscaler3D]
646
+
647
+ async def comfy_entrypoint() -> MinimaxH3Extension:
648
+ return MinimaxH3Extension()
649
+
650
+ NODE_CLASS_MAPPINGS = {
651
+ "MinimaxH3LatentUpscaler3D": MinimaxH3LatentUpscaler3D,
652
+ }
653
+ NODE_DISPLAY_NAME_MAPPINGS = {
654
+ "MinimaxH3LatentUpscaler3D": "Minimax H3 Latent Upscaler (3D)",
655
+ }
Comfyui_Minimax_h3_latent_Upscaler/workflow_templates/minimax_h3_i2v_Latent Upscaler example workflow2.json ADDED
@@ -0,0 +1,3003 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "b775e54a-5a89-47be-943b-be5a8059239c",
3
+ "revision": 0,
4
+ "last_node_id": 42,
5
+ "last_link_id": 58,
6
+ "nodes": [
7
+ {
8
+ "id": 1,
9
+ "type": "VHS_VideoCombine",
10
+ "pos": [
11
+ 3182.018173615327,
12
+ 5760.395250046636
13
+ ],
14
+ "size": [
15
+ 210,
16
+ 334
17
+ ],
18
+ "flags": {},
19
+ "order": 34,
20
+ "mode": 4,
21
+ "inputs": [
22
+ {
23
+ "label": "图像",
24
+ "name": "images",
25
+ "type": "IMAGE",
26
+ "link": 1
27
+ },
28
+ {
29
+ "label": "音频",
30
+ "name": "audio",
31
+ "shape": 7,
32
+ "type": "AUDIO",
33
+ "link": 2
34
+ },
35
+ {
36
+ "label": "批次管理",
37
+ "name": "meta_batch",
38
+ "shape": 7,
39
+ "type": "VHS_BatchManager",
40
+ "link": null
41
+ },
42
+ {
43
+ "name": "vae",
44
+ "shape": 7,
45
+ "type": "VAE",
46
+ "link": null
47
+ },
48
+ {
49
+ "label": "帧率",
50
+ "name": "frame_rate",
51
+ "type": "FLOAT",
52
+ "widget": {
53
+ "name": "frame_rate"
54
+ },
55
+ "link": null
56
+ },
57
+ {
58
+ "label": "循环次数",
59
+ "name": "loop_count",
60
+ "type": "INT",
61
+ "widget": {
62
+ "name": "loop_count"
63
+ },
64
+ "link": null
65
+ },
66
+ {
67
+ "label": "文件名前缀",
68
+ "name": "filename_prefix",
69
+ "type": "STRING",
70
+ "widget": {
71
+ "name": "filename_prefix"
72
+ },
73
+ "link": null
74
+ },
75
+ {
76
+ "label": "格式",
77
+ "name": "format",
78
+ "type": "COMBO",
79
+ "widget": {
80
+ "name": "format"
81
+ },
82
+ "link": null
83
+ },
84
+ {
85
+ "label": "Ping-Pong",
86
+ "name": "pingpong",
87
+ "type": "BOOLEAN",
88
+ "widget": {
89
+ "name": "pingpong"
90
+ },
91
+ "link": null
92
+ },
93
+ {
94
+ "label": "保存到输出文件夹",
95
+ "name": "save_output",
96
+ "type": "BOOLEAN",
97
+ "widget": {
98
+ "name": "save_output"
99
+ },
100
+ "link": null
101
+ },
102
+ {
103
+ "label": "保存元数据",
104
+ "name": "save_metadata",
105
+ "type": "BOOLEAN",
106
+ "widget": {
107
+ "name": "save_metadata"
108
+ },
109
+ "link": null
110
+ },
111
+ {
112
+ "label": "修剪音频",
113
+ "name": "trim_to_audio",
114
+ "type": "BOOLEAN",
115
+ "widget": {
116
+ "name": "trim_to_audio"
117
+ },
118
+ "link": null
119
+ }
120
+ ],
121
+ "outputs": [
122
+ {
123
+ "label": "文件名",
124
+ "name": "Filenames",
125
+ "type": "VHS_FILENAMES",
126
+ "links": null
127
+ }
128
+ ],
129
+ "title": "合并为视频",
130
+ "properties": {
131
+ "ue_properties": {
132
+ "widget_ue_connectable": {},
133
+ "input_ue_unconnectable": {},
134
+ "version": "7.8"
135
+ },
136
+ "cnr_id": "comfyui-videohelpersuite",
137
+ "ver": "4ee72c065db22c9d96c2427954dc69e7b908444b",
138
+ "Node name for S&R": "VHS_VideoCombine"
139
+ },
140
+ "widgets_values": {
141
+ "frame_rate": 24,
142
+ "loop_count": 0,
143
+ "filename_prefix": "AnimateDiff",
144
+ "format": "video/h264-mp4",
145
+ "pix_fmt": "yuv420p",
146
+ "crf": 19,
147
+ "save_metadata": true,
148
+ "trim_to_audio": false,
149
+ "pingpong": false,
150
+ "save_output": false,
151
+ "videopreview": {
152
+ "hidden": false,
153
+ "paused": false,
154
+ "params": {
155
+ "filename": "AnimateDiff_00001-audio.mp4",
156
+ "subfolder": "",
157
+ "type": "temp",
158
+ "format": "video/h264-mp4",
159
+ "frame_rate": 24,
160
+ "workflow": "AnimateDiff_00001.png",
161
+ "fullpath": "D:\\AI\\ComfyUI-aki-v2\\ComfyUI\\temp\\AnimateDiff_00001-audio.mp4"
162
+ }
163
+ }
164
+ },
165
+ "widgets_values_named": {
166
+ "frame_rate": 24,
167
+ "loop_count": 0,
168
+ "filename_prefix": "AnimateDiff",
169
+ "format": "video/h264-mp4",
170
+ "pix_fmt": "yuv420p",
171
+ "crf": 19,
172
+ "save_metadata": true,
173
+ "trim_to_audio": false,
174
+ "pingpong": false,
175
+ "save_output": false,
176
+ "videopreview": {
177
+ "hidden": false,
178
+ "paused": false,
179
+ "params": {
180
+ "filename": "AnimateDiff_00001-audio.mp4",
181
+ "subfolder": "",
182
+ "type": "temp",
183
+ "format": "video/h264-mp4",
184
+ "frame_rate": 24,
185
+ "workflow": "AnimateDiff_00001.png",
186
+ "fullpath": "D:\\AI\\ComfyUI-aki-v2\\ComfyUI\\temp\\AnimateDiff_00001-audio.mp4"
187
+ }
188
+ }
189
+ }
190
+ },
191
+ {
192
+ "id": 2,
193
+ "type": "VAEDecodeAudio",
194
+ "pos": [
195
+ 3176.503986022757,
196
+ 5589.336094022448
197
+ ],
198
+ "size": [
199
+ 230.98336128023698,
200
+ 46.99687563323096
201
+ ],
202
+ "flags": {
203
+ "collapsed": false
204
+ },
205
+ "order": 31,
206
+ "mode": 0,
207
+ "inputs": [
208
+ {
209
+ "name": "samples",
210
+ "type": "LATENT",
211
+ "link": 3
212
+ },
213
+ {
214
+ "name": "vae",
215
+ "type": "VAE",
216
+ "link": 4
217
+ }
218
+ ],
219
+ "outputs": [
220
+ {
221
+ "name": "AUDIO",
222
+ "type": "AUDIO",
223
+ "links": [
224
+ 2
225
+ ]
226
+ }
227
+ ],
228
+ "properties": {
229
+ "ue_properties": {
230
+ "widget_ue_connectable": {},
231
+ "version": "7.8",
232
+ "input_ue_unconnectable": {}
233
+ },
234
+ "cnr_id": "comfy-core",
235
+ "ver": "0.33.2",
236
+ "Node name for S&R": "VAEDecodeAudio"
237
+ }
238
+ },
239
+ {
240
+ "id": 3,
241
+ "type": "SplitSigmas",
242
+ "pos": [
243
+ 2823.6430428367066,
244
+ 5558.604634124167
245
+ ],
246
+ "size": [
247
+ 308.3164287851357,
248
+ 78
249
+ ],
250
+ "flags": {},
251
+ "order": 24,
252
+ "mode": 0,
253
+ "inputs": [
254
+ {
255
+ "name": "sigmas",
256
+ "type": "SIGMAS",
257
+ "link": 5
258
+ }
259
+ ],
260
+ "outputs": [
261
+ {
262
+ "name": "high_sigmas",
263
+ "type": "SIGMAS",
264
+ "links": [
265
+ 44
266
+ ]
267
+ },
268
+ {
269
+ "name": "low_sigmas",
270
+ "type": "SIGMAS",
271
+ "links": []
272
+ }
273
+ ],
274
+ "properties": {
275
+ "ue_properties": {
276
+ "widget_ue_connectable": {},
277
+ "input_ue_unconnectable": {},
278
+ "version": "7.5.2"
279
+ },
280
+ "cnr_id": "comfy-core",
281
+ "ver": "0.33.0",
282
+ "Node name for S&R": "SplitSigmas"
283
+ },
284
+ "widgets_values": [
285
+ 4
286
+ ],
287
+ "widgets_values_named": {
288
+ "step": 4
289
+ },
290
+ "color": "#223",
291
+ "bgcolor": "#335"
292
+ },
293
+ {
294
+ "id": 4,
295
+ "type": "SaveVideo",
296
+ "pos": [
297
+ 4514.64060004999,
298
+ 5293.5022981353995
299
+ ],
300
+ "size": [
301
+ 283.126933720908,
302
+ 106
303
+ ],
304
+ "flags": {},
305
+ "order": 41,
306
+ "mode": 0,
307
+ "inputs": [
308
+ {
309
+ "name": "video",
310
+ "type": "VIDEO",
311
+ "link": 6
312
+ }
313
+ ],
314
+ "outputs": [
315
+ {
316
+ "name": "video",
317
+ "type": "VIDEO",
318
+ "links": null
319
+ }
320
+ ],
321
+ "properties": {
322
+ "ue_properties": {
323
+ "widget_ue_connectable": {},
324
+ "version": "7.8",
325
+ "input_ue_unconnectable": {}
326
+ },
327
+ "cnr_id": "comfy-core",
328
+ "ver": "0.33.2",
329
+ "Node name for S&R": "SaveVideo"
330
+ },
331
+ "widgets_values": [
332
+ "video/MiniMax_H3",
333
+ "auto",
334
+ "auto"
335
+ ],
336
+ "widgets_values_named": {
337
+ "filename_prefix": "video/MiniMax_H3",
338
+ "format": "auto",
339
+ "codec": "auto"
340
+ }
341
+ },
342
+ {
343
+ "id": 5,
344
+ "type": "ManualSigmas",
345
+ "pos": [
346
+ 3908.508146540855,
347
+ 5496.223458932069
348
+ ],
349
+ "size": [
350
+ 308.3164287851357,
351
+ 58
352
+ ],
353
+ "flags": {},
354
+ "order": 0,
355
+ "mode": 0,
356
+ "inputs": [
357
+ {
358
+ "label": "sigmas",
359
+ "name": "sigmas",
360
+ "type": "STRING",
361
+ "widget": {
362
+ "name": "sigmas"
363
+ },
364
+ "link": null
365
+ }
366
+ ],
367
+ "outputs": [
368
+ {
369
+ "label": "SIGMAS",
370
+ "name": "SIGMAS",
371
+ "type": "SIGMAS",
372
+ "links": []
373
+ }
374
+ ],
375
+ "title": "5 step Sigmas",
376
+ "properties": {
377
+ "ue_properties": {
378
+ "widget_ue_connectable": {},
379
+ "version": "7.5.2",
380
+ "input_ue_unconnectable": {}
381
+ },
382
+ "cnr_id": "comfy-core",
383
+ "ver": "0.5.1",
384
+ "Node name for S&R": "ManualSigmas",
385
+ "enableTabs": false,
386
+ "tabWidth": 65,
387
+ "tabXOffset": 10,
388
+ "hasSecondTab": false,
389
+ "secondTabText": "Send Back",
390
+ "secondTabOffset": 80,
391
+ "secondTabWidth": 65
392
+ },
393
+ "widgets_values": [
394
+ "0.9231, 0.8780, 0.8000, 0.6316, 0.3158, 0.0000"
395
+ ],
396
+ "widgets_values_named": {
397
+ "sigmas": "0.9231, 0.8780, 0.8000, 0.6316, 0.3158, 0.0000"
398
+ }
399
+ },
400
+ {
401
+ "id": 6,
402
+ "type": "VAEDecode",
403
+ "pos": [
404
+ 3176.503986022757,
405
+ 5487.163373330627
406
+ ],
407
+ "size": [
408
+ 230.98336128023698,
409
+ 46
410
+ ],
411
+ "flags": {
412
+ "collapsed": false
413
+ },
414
+ "order": 32,
415
+ "mode": 0,
416
+ "inputs": [
417
+ {
418
+ "name": "samples",
419
+ "type": "LATENT",
420
+ "link": 7
421
+ },
422
+ {
423
+ "name": "vae",
424
+ "type": "VAE",
425
+ "link": 8
426
+ }
427
+ ],
428
+ "outputs": [
429
+ {
430
+ "name": "IMAGE",
431
+ "type": "IMAGE",
432
+ "links": [
433
+ 1
434
+ ]
435
+ }
436
+ ],
437
+ "properties": {
438
+ "ue_properties": {
439
+ "widget_ue_connectable": {},
440
+ "version": "7.8",
441
+ "input_ue_unconnectable": {}
442
+ },
443
+ "cnr_id": "comfy-core",
444
+ "ver": "0.33.2",
445
+ "Node name for S&R": "VAEDecode"
446
+ }
447
+ },
448
+ {
449
+ "id": 7,
450
+ "type": "VAELoader",
451
+ "pos": [
452
+ 1022.1892320604375,
453
+ 5463.23147307899
454
+ ],
455
+ "size": [
456
+ 640,
457
+ 70
458
+ ],
459
+ "flags": {},
460
+ "order": 1,
461
+ "mode": 0,
462
+ "inputs": [],
463
+ "outputs": [
464
+ {
465
+ "name": "VAE",
466
+ "type": "VAE",
467
+ "links": [
468
+ 8,
469
+ 11,
470
+ 16,
471
+ 28
472
+ ]
473
+ }
474
+ ],
475
+ "properties": {
476
+ "ue_properties": {
477
+ "widget_ue_connectable": {},
478
+ "version": "7.8",
479
+ "input_ue_unconnectable": {}
480
+ },
481
+ "cnr_id": "comfy-core",
482
+ "ver": "0.33.2",
483
+ "Node name for S&R": "VAELoader",
484
+ "models": [
485
+ {
486
+ "name": "minimax_h3_video_vae_fp16.safetensors",
487
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors",
488
+ "directory": "vae"
489
+ }
490
+ ]
491
+ },
492
+ "widgets_values": [
493
+ "minimax_h3_video_vae_fp16.safetensors"
494
+ ],
495
+ "widgets_values_named": {
496
+ "vae_name": "minimax_h3_video_vae_fp16.safetensors"
497
+ }
498
+ },
499
+ {
500
+ "id": 8,
501
+ "type": "BasicScheduler",
502
+ "pos": [
503
+ 2823.6430428367066,
504
+ 5388.297356844566
505
+ ],
506
+ "size": [
507
+ 308.3164287851357,
508
+ 111.22673919547651
509
+ ],
510
+ "flags": {},
511
+ "order": 20,
512
+ "mode": 0,
513
+ "inputs": [
514
+ {
515
+ "name": "model",
516
+ "type": "MODEL",
517
+ "link": 9
518
+ }
519
+ ],
520
+ "outputs": [
521
+ {
522
+ "name": "SIGMAS",
523
+ "type": "SIGMAS",
524
+ "links": [
525
+ 5
526
+ ]
527
+ }
528
+ ],
529
+ "properties": {
530
+ "ue_properties": {
531
+ "widget_ue_connectable": {},
532
+ "version": "7.8",
533
+ "input_ue_unconnectable": {}
534
+ },
535
+ "cnr_id": "comfy-core",
536
+ "ver": "0.33.2",
537
+ "Node name for S&R": "BasicScheduler"
538
+ },
539
+ "widgets_values": [
540
+ "simple",
541
+ 8,
542
+ 1
543
+ ],
544
+ "widgets_values_named": {
545
+ "scheduler": "simple",
546
+ "steps": 8,
547
+ "denoise": 1
548
+ }
549
+ },
550
+ {
551
+ "id": 9,
552
+ "type": "LoadImage",
553
+ "pos": [
554
+ 1343.819198857278,
555
+ 5833.004557721189
556
+ ],
557
+ "size": [
558
+ 290,
559
+ 330
560
+ ],
561
+ "flags": {},
562
+ "order": 2,
563
+ "mode": 4,
564
+ "inputs": [],
565
+ "outputs": [
566
+ {
567
+ "name": "IMAGE",
568
+ "type": "IMAGE",
569
+ "links": [
570
+ 17,
571
+ 29
572
+ ]
573
+ },
574
+ {
575
+ "name": "MASK",
576
+ "type": "MASK",
577
+ "links": null
578
+ }
579
+ ],
580
+ "properties": {
581
+ "ue_properties": {
582
+ "widget_ue_connectable": {},
583
+ "version": "7.8",
584
+ "input_ue_unconnectable": {}
585
+ },
586
+ "cnr_id": "comfy-core",
587
+ "ver": "0.33.2",
588
+ "Node name for S&R": "LoadImage"
589
+ },
590
+ "widgets_values": [
591
+ "09-55-07_00001.jpg",
592
+ "image"
593
+ ],
594
+ "widgets_values_named": {
595
+ "image": "09-55-07_00001.jpg",
596
+ "upload": "image"
597
+ }
598
+ },
599
+ {
600
+ "id": 10,
601
+ "type": "LoadImage",
602
+ "pos": [
603
+ 1676.074249167948,
604
+ 5831.024334938233
605
+ ],
606
+ "size": [
607
+ 290,
608
+ 330
609
+ ],
610
+ "flags": {},
611
+ "order": 3,
612
+ "mode": 4,
613
+ "inputs": [],
614
+ "outputs": [
615
+ {
616
+ "name": "IMAGE",
617
+ "type": "IMAGE",
618
+ "links": [
619
+ 18,
620
+ 30
621
+ ]
622
+ },
623
+ {
624
+ "name": "MASK",
625
+ "type": "MASK",
626
+ "links": null
627
+ }
628
+ ],
629
+ "properties": {
630
+ "ue_properties": {
631
+ "widget_ue_connectable": {},
632
+ "version": "7.8",
633
+ "input_ue_unconnectable": {}
634
+ },
635
+ "cnr_id": "comfy-core",
636
+ "ver": "0.33.2",
637
+ "Node name for S&R": "LoadImage"
638
+ },
639
+ "widgets_values": [
640
+ "09-55-07_00001.jpg",
641
+ "image"
642
+ ],
643
+ "widgets_values_named": {
644
+ "image": "09-55-07_00001.jpg",
645
+ "upload": "image"
646
+ }
647
+ },
648
+ {
649
+ "id": 11,
650
+ "type": "VAEDecode",
651
+ "pos": [
652
+ 4244.023207065458,
653
+ 5433.788422959353
654
+ ],
655
+ "size": [
656
+ 230,
657
+ 60
658
+ ],
659
+ "flags": {
660
+ "collapsed": false
661
+ },
662
+ "order": 38,
663
+ "mode": 0,
664
+ "inputs": [
665
+ {
666
+ "name": "samples",
667
+ "type": "LATENT",
668
+ "link": 10
669
+ },
670
+ {
671
+ "name": "vae",
672
+ "type": "VAE",
673
+ "link": 11
674
+ }
675
+ ],
676
+ "outputs": [
677
+ {
678
+ "name": "IMAGE",
679
+ "type": "IMAGE",
680
+ "links": [
681
+ 53
682
+ ]
683
+ }
684
+ ],
685
+ "properties": {
686
+ "ue_properties": {
687
+ "widget_ue_connectable": {},
688
+ "version": "7.8",
689
+ "input_ue_unconnectable": {}
690
+ },
691
+ "cnr_id": "comfy-core",
692
+ "ver": "0.33.2",
693
+ "Node name for S&R": "VAEDecode"
694
+ }
695
+ },
696
+ {
697
+ "id": 12,
698
+ "type": "VAEDecodeAudio",
699
+ "pos": [
700
+ 4246.139687501349,
701
+ 5553.202878575346
702
+ ],
703
+ "size": [
704
+ 230,
705
+ 60
706
+ ],
707
+ "flags": {
708
+ "collapsed": false
709
+ },
710
+ "order": 39,
711
+ "mode": 0,
712
+ "inputs": [
713
+ {
714
+ "name": "samples",
715
+ "type": "LATENT",
716
+ "link": 12
717
+ },
718
+ {
719
+ "name": "vae",
720
+ "type": "VAE",
721
+ "link": 13
722
+ }
723
+ ],
724
+ "outputs": [
725
+ {
726
+ "name": "AUDIO",
727
+ "type": "AUDIO",
728
+ "links": [
729
+ 54
730
+ ]
731
+ }
732
+ ],
733
+ "properties": {
734
+ "ue_properties": {
735
+ "widget_ue_connectable": {},
736
+ "version": "7.8",
737
+ "input_ue_unconnectable": {}
738
+ },
739
+ "cnr_id": "comfy-core",
740
+ "ver": "0.33.2",
741
+ "Node name for S&R": "VAEDecodeAudio"
742
+ }
743
+ },
744
+ {
745
+ "id": 13,
746
+ "type": "VAELoader",
747
+ "pos": [
748
+ 1022.1892320604375,
749
+ 5593.23147307899
750
+ ],
751
+ "size": [
752
+ 639.8453239311636,
753
+ 58
754
+ ],
755
+ "flags": {},
756
+ "order": 4,
757
+ "mode": 0,
758
+ "inputs": [],
759
+ "outputs": [
760
+ {
761
+ "name": "VAE",
762
+ "type": "VAE",
763
+ "links": [
764
+ 4,
765
+ 13
766
+ ]
767
+ }
768
+ ],
769
+ "properties": {
770
+ "ue_properties": {
771
+ "widget_ue_connectable": {},
772
+ "version": "7.8",
773
+ "input_ue_unconnectable": {}
774
+ },
775
+ "cnr_id": "comfy-core",
776
+ "ver": "0.33.2",
777
+ "Node name for S&R": "VAELoader",
778
+ "models": [
779
+ {
780
+ "name": "minimax_h3_audio_vae_fp32.safetensors",
781
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors",
782
+ "directory": "vae"
783
+ }
784
+ ]
785
+ },
786
+ "widgets_values": [
787
+ "minimax_h3_audio_vae_fp32.safetensors"
788
+ ],
789
+ "widgets_values_named": {
790
+ "vae_name": "minimax_h3_audio_vae_fp32.safetensors"
791
+ }
792
+ },
793
+ {
794
+ "id": 14,
795
+ "type": "PrimitiveStringMultiline",
796
+ "pos": [
797
+ 1334.8058493668113,
798
+ 6214.899932141244
799
+ ],
800
+ "size": [
801
+ 636.5456880478732,
802
+ 296.4539339258454
803
+ ],
804
+ "flags": {},
805
+ "order": 5,
806
+ "mode": 0,
807
+ "inputs": [],
808
+ "outputs": [
809
+ {
810
+ "name": "STRING",
811
+ "type": "STRING",
812
+ "links": [
813
+ 19,
814
+ 31
815
+ ]
816
+ }
817
+ ],
818
+ "title": "提示词",
819
+ "properties": {
820
+ "ue_properties": {
821
+ "widget_ue_connectable": {},
822
+ "version": "7.8",
823
+ "input_ue_unconnectable": {}
824
+ },
825
+ "cnr_id": "comfy-core",
826
+ "ver": "0.33.2",
827
+ "Node name for S&R": "PrimitiveStringMultiline"
828
+ },
829
+ "widgets_values": [
830
+ "资产角色:\n<Picture 1>\n国风动漫少女,深棕色发髻点缀红梅与蝶形发饰,身穿白金红相间的抹胸上衣与飘逸薄纱灯笼裤,周身环绕金红流光与炽炎花瓣特效。\n<Picture 2>\n硬派白发战将,身穿暗红色皮革长款风衣、黑色内衬与战术皮裤,手持重剑与双枪,周身散发冷冽红黑魔力气浪。\n\n一个低机位推近镜头框住\n<Picture 1>\n与\n<Picture 2>\n在废墟长廊两端对峙。\n<Picture 1>\n率先启动超音速贴地冲刺,足尖踏出金红烈焰莲华,甩出赤红绫缎如游龙贯空;\nthe camera cuts to\n侧面跟摇特写,\n<Picture 2>\n拔出重剑横向重劈,刀锋与炽炎绫缎剧烈碰撞,火星与雷光四向迸射,气浪撕裂地面石板。\nthe shot transitions to\n俯冲环绕镜头,\n<Picture 1>\n借力凌空翻腾,双掌结印召唤暴雨般金红火蝶与符文剑气垂直轰炸;\n<Picture 2>\n单手举剑格挡,魔力红光护盾展开,随即甩动红风衣滑步侧移,拔枪极速连射,火舌与剑气在半空接连引爆。\nthe camera dynamically follows\n贴地高速滑移,\n<Picture 1>\n在弹雨残影中多维瞬闪,瞬身突进至\n<Picture 2>\n身前旋身横扫,赤焰气刃斩开风衣下摆;\nthe shot changes to\n极速下坠定点特写,\n<Picture 2>\n反手抽刀上挑震开攻击,\n<Picture 1>\n空中旋身单手撑地滑退数米,\n<Picture 1>\n与\n<Picture 2>\n同时稳住身形横刃相对,周身烈火与魔能疯狂暴涨,在最强杀意临界点定格。\noverall_soundscape: Explosive shockwaves crack the stone ground as steel clashes with fiery energy ribbons. Gunfire roars in rapid bursts followed by the sizzling hum of burning petals and swirling demonic aura.non_diegetic_music: High-octane heavy metal hybrid with aggressive electric guitar riffs, pounding industrial drums, and intense symphonic brass, cutting off sharply on the final clash."
831
+ ],
832
+ "widgets_values_named": {
833
+ "value": "资产角色:\n<Picture 1>\n国风动漫少女,深棕色发髻点缀红梅与蝶形发饰,身穿白金红相间的抹胸上衣与飘逸薄纱灯笼裤,周身环绕金红流光与炽炎花瓣特效。\n<Picture 2>\n硬派白发战将,身穿暗红色皮革长款风衣、黑色内衬与战术皮裤,手持重剑与双枪,周身散发冷冽红黑魔力气浪。\n\n一个低机位推近镜头框住\n<Picture 1>\n与\n<Picture 2>\n在废墟长廊两端对峙。\n<Picture 1>\n率先启动超音速贴地冲刺,足尖踏出金红烈焰莲华,甩出赤红绫缎如游龙贯空;\nthe camera cuts to\n侧面跟摇特写,\n<Picture 2>\n拔出重剑横向重劈,刀锋与炽炎绫缎剧烈碰撞,火星与雷光四向迸射,气浪撕裂地面石板。\nthe shot transitions to\n俯冲环绕镜头,\n<Picture 1>\n借力凌空翻腾,双掌结印召唤暴雨般金红火蝶与符文剑气垂直轰炸;\n<Picture 2>\n单手举剑格挡,魔力红光护盾展开,随即甩动红风衣滑步侧移,拔枪极速连射,火舌与剑气在半空接连引爆。\nthe camera dynamically follows\n贴地高速滑移,\n<Picture 1>\n在弹雨残影中多维瞬闪,瞬身突进至\n<Picture 2>\n身前旋身横扫,赤焰气刃斩开风衣下摆;\nthe shot changes to\n极速下坠定点特写,\n<Picture 2>\n反手抽刀上挑震开攻击,\n<Picture 1>\n空中旋身单手撑地滑退数米,\n<Picture 1>\n与\n<Picture 2>\n同时稳住身形横刃相对,周身烈火与魔能疯狂暴涨,在最强杀意临界点定格。\noverall_soundscape: Explosive shockwaves crack the stone ground as steel clashes with fiery energy ribbons. Gunfire roars in rapid bursts followed by the sizzling hum of burning petals and swirling demonic aura.non_diegetic_music: High-octane heavy metal hybrid with aggressive electric guitar riffs, pounding industrial drums, and intense symphonic brass, cutting off sharply on the final clash."
834
+ },
835
+ "color": "#232",
836
+ "bgcolor": "#353"
837
+ },
838
+ {
839
+ "id": 15,
840
+ "type": "ResolutionSelector",
841
+ "pos": [
842
+ 1757.462855425223,
843
+ 5540.950633219013
844
+ ],
845
+ "size": [
846
+ 270.983361280237,
847
+ 126
848
+ ],
849
+ "flags": {},
850
+ "order": 19,
851
+ "mode": 0,
852
+ "showAdvanced": false,
853
+ "inputs": [
854
+ {
855
+ "name": "megapixels",
856
+ "type": "FLOAT",
857
+ "widget": {
858
+ "name": "megapixels"
859
+ },
860
+ "link": 14
861
+ }
862
+ ],
863
+ "outputs": [
864
+ {
865
+ "name": "width",
866
+ "type": "INT",
867
+ "links": [
868
+ 32,
869
+ 47
870
+ ]
871
+ },
872
+ {
873
+ "name": "height",
874
+ "type": "INT",
875
+ "links": [
876
+ 33,
877
+ 48
878
+ ]
879
+ }
880
+ ],
881
+ "title": "Resolution Selector (Size)",
882
+ "properties": {
883
+ "ue_properties": {
884
+ "widget_ue_connectable": {},
885
+ "version": "7.8",
886
+ "input_ue_unconnectable": {}
887
+ },
888
+ "cnr_id": "comfy-core",
889
+ "ver": "0.33.2",
890
+ "Node name for S&R": "ResolutionSelector"
891
+ },
892
+ "widgets_values": [
893
+ "16:9 (Widescreen)",
894
+ 1,
895
+ 32
896
+ ],
897
+ "widgets_values_named": {
898
+ "aspect_ratio": "16:9 (Widescreen)",
899
+ "megapixels": 1,
900
+ "multiple": 32
901
+ },
902
+ "color": "#322",
903
+ "bgcolor": "#533"
904
+ },
905
+ {
906
+ "id": 16,
907
+ "type": "MiniMaxH3ImageToVideo",
908
+ "pos": [
909
+ 1765.8316212818622,
910
+ 5272.664531479656
911
+ ],
912
+ "size": [
913
+ 257.521811503208,
914
+ 220
915
+ ],
916
+ "flags": {},
917
+ "order": 22,
918
+ "mode": 0,
919
+ "inputs": [
920
+ {
921
+ "name": "clip",
922
+ "type": "CLIP",
923
+ "link": 15
924
+ },
925
+ {
926
+ "name": "vae",
927
+ "type": "VAE",
928
+ "link": 16
929
+ },
930
+ {
931
+ "name": "first_frame",
932
+ "shape": 7,
933
+ "type": "IMAGE",
934
+ "link": 17
935
+ },
936
+ {
937
+ "name": "last_frame",
938
+ "shape": 7,
939
+ "type": "IMAGE",
940
+ "link": 18
941
+ },
942
+ {
943
+ "name": "prompt",
944
+ "type": "STRING",
945
+ "widget": {
946
+ "name": "prompt"
947
+ },
948
+ "link": 19
949
+ },
950
+ {
951
+ "name": "width",
952
+ "type": "INT",
953
+ "widget": {
954
+ "name": "width"
955
+ },
956
+ "link": 20
957
+ },
958
+ {
959
+ "name": "height",
960
+ "type": "INT",
961
+ "widget": {
962
+ "name": "height"
963
+ },
964
+ "link": 21
965
+ },
966
+ {
967
+ "name": "length",
968
+ "type": "INT",
969
+ "widget": {
970
+ "name": "length"
971
+ },
972
+ "link": 22
973
+ }
974
+ ],
975
+ "outputs": [
976
+ {
977
+ "name": "positive",
978
+ "type": "CONDITIONING",
979
+ "links": [
980
+ 50
981
+ ]
982
+ },
983
+ {
984
+ "name": "LATENT",
985
+ "type": "LATENT",
986
+ "links": [
987
+ 45
988
+ ]
989
+ }
990
+ ],
991
+ "properties": {
992
+ "ue_properties": {
993
+ "widget_ue_connectable": {},
994
+ "version": "7.8",
995
+ "input_ue_unconnectable": {}
996
+ },
997
+ "cnr_id": "comfy-core",
998
+ "ver": "0.32.0",
999
+ "Node name for S&R": "MiniMaxH3ImageToVideo"
1000
+ },
1001
+ "widgets_values": [
1002
+ "",
1003
+ 1344,
1004
+ 768,
1005
+ 73
1006
+ ],
1007
+ "widgets_values_named": {
1008
+ "prompt": "",
1009
+ "width": 1344,
1010
+ "height": 768,
1011
+ "length": 73
1012
+ }
1013
+ },
1014
+ {
1015
+ "id": 17,
1016
+ "type": "ModelPreviewOverrideKJ",
1017
+ "pos": [
1018
+ 2417.54562531032,
1019
+ 5122.681252342183
1020
+ ],
1021
+ "size": [
1022
+ 319.39965668617606,
1023
+ 411.607317175336
1024
+ ],
1025
+ "flags": {},
1026
+ "order": 27,
1027
+ "mode": 0,
1028
+ "inputs": [
1029
+ {
1030
+ "name": "model",
1031
+ "type": "MODEL",
1032
+ "link": 23
1033
+ },
1034
+ {
1035
+ "name": "vae",
1036
+ "shape": 7,
1037
+ "type": "VAE",
1038
+ "link": null
1039
+ },
1040
+ {
1041
+ "name": "preview_frames",
1042
+ "type": "INT",
1043
+ "widget": {
1044
+ "name": "preview_frames"
1045
+ },
1046
+ "link": 24
1047
+ }
1048
+ ],
1049
+ "outputs": [
1050
+ {
1051
+ "name": "MODEL",
1052
+ "type": "MODEL",
1053
+ "links": [
1054
+ 49
1055
+ ]
1056
+ }
1057
+ ],
1058
+ "properties": {
1059
+ "ue_properties": {
1060
+ "widget_ue_connectable": {},
1061
+ "input_ue_unconnectable": {},
1062
+ "version": "7.5.2"
1063
+ },
1064
+ "cnr_id": "comfyui-kjnodes",
1065
+ "ver": "3f20054214fec9f9234fd3841ae6f1e4287948f6",
1066
+ "Node name for S&R": "ModelPreviewOverrideKJ"
1067
+ },
1068
+ "widgets_values": [
1069
+ 1024,
1070
+ 80,
1071
+ true,
1072
+ 9,
1073
+ 12,
1074
+ "taeh3.safetensors",
1075
+ ""
1076
+ ],
1077
+ "widgets_values_named": {
1078
+ "max_resolution": 1024,
1079
+ "jpeg_quality": 80,
1080
+ "suppress_default_preview": true,
1081
+ "preview_frames": 9,
1082
+ "preview_fps": 12,
1083
+ "tiny_vae": "taeh3.safetensors",
1084
+ "preview": ""
1085
+ },
1086
+ "color": "#233",
1087
+ "bgcolor": "#355"
1088
+ },
1089
+ {
1090
+ "id": 18,
1091
+ "type": "LTXVConcatAVLatent",
1092
+ "pos": [
1093
+ 3519.8709916998964,
1094
+ 5544.8126149799
1095
+ ],
1096
+ "size": [
1097
+ 286.8360679651149,
1098
+ 46
1099
+ ],
1100
+ "flags": {},
1101
+ "order": 36,
1102
+ "mode": 0,
1103
+ "inputs": [
1104
+ {
1105
+ "label": "video_latent",
1106
+ "name": "video_latent",
1107
+ "type": "LATENT",
1108
+ "link": 25
1109
+ },
1110
+ {
1111
+ "label": "audio_latent",
1112
+ "name": "audio_latent",
1113
+ "type": "LATENT",
1114
+ "link": 26
1115
+ }
1116
+ ],
1117
+ "outputs": [
1118
+ {
1119
+ "label": "latent",
1120
+ "name": "latent",
1121
+ "type": "LATENT",
1122
+ "links": [
1123
+ 40
1124
+ ]
1125
+ }
1126
+ ],
1127
+ "properties": {
1128
+ "ue_properties": {
1129
+ "widget_ue_connectable": {},
1130
+ "version": "7.5.2",
1131
+ "input_ue_unconnectable": {}
1132
+ },
1133
+ "cnr_id": "comfy-core",
1134
+ "ver": "0.5.1",
1135
+ "Node name for S&R": "LTXVConcatAVLatent",
1136
+ "enableTabs": false,
1137
+ "tabWidth": 65,
1138
+ "tabXOffset": 10,
1139
+ "hasSecondTab": false,
1140
+ "secondTabText": "Send Back",
1141
+ "secondTabOffset": 80,
1142
+ "secondTabWidth": 65
1143
+ }
1144
+ },
1145
+ {
1146
+ "id": 19,
1147
+ "type": "MiniMaxH3ImageToVideo",
1148
+ "pos": [
1149
+ 2053.827625494082,
1150
+ 5271.729493415262
1151
+ ],
1152
+ "size": [
1153
+ 254.68831917761077,
1154
+ 220
1155
+ ],
1156
+ "flags": {},
1157
+ "order": 23,
1158
+ "mode": 0,
1159
+ "inputs": [
1160
+ {
1161
+ "name": "clip",
1162
+ "type": "CLIP",
1163
+ "link": 27
1164
+ },
1165
+ {
1166
+ "name": "vae",
1167
+ "type": "VAE",
1168
+ "link": 28
1169
+ },
1170
+ {
1171
+ "name": "first_frame",
1172
+ "shape": 7,
1173
+ "type": "IMAGE",
1174
+ "link": 29
1175
+ },
1176
+ {
1177
+ "name": "last_frame",
1178
+ "shape": 7,
1179
+ "type": "IMAGE",
1180
+ "link": 30
1181
+ },
1182
+ {
1183
+ "name": "prompt",
1184
+ "type": "STRING",
1185
+ "widget": {
1186
+ "name": "prompt"
1187
+ },
1188
+ "link": 31
1189
+ },
1190
+ {
1191
+ "name": "width",
1192
+ "type": "INT",
1193
+ "widget": {
1194
+ "name": "width"
1195
+ },
1196
+ "link": 32
1197
+ },
1198
+ {
1199
+ "name": "height",
1200
+ "type": "INT",
1201
+ "widget": {
1202
+ "name": "height"
1203
+ },
1204
+ "link": 33
1205
+ },
1206
+ {
1207
+ "name": "length",
1208
+ "type": "INT",
1209
+ "widget": {
1210
+ "name": "length"
1211
+ },
1212
+ "link": 34
1213
+ }
1214
+ ],
1215
+ "outputs": [
1216
+ {
1217
+ "name": "positive",
1218
+ "type": "CONDITIONING",
1219
+ "links": [
1220
+ 52
1221
+ ]
1222
+ },
1223
+ {
1224
+ "name": "LATENT",
1225
+ "type": "LATENT",
1226
+ "links": []
1227
+ }
1228
+ ],
1229
+ "properties": {
1230
+ "ue_properties": {
1231
+ "widget_ue_connectable": {},
1232
+ "version": "7.8",
1233
+ "input_ue_unconnectable": {}
1234
+ },
1235
+ "cnr_id": "comfy-core",
1236
+ "ver": "0.32.0",
1237
+ "Node name for S&R": "MiniMaxH3ImageToVideo"
1238
+ },
1239
+ "widgets_values": [
1240
+ "",
1241
+ 1344,
1242
+ 768,
1243
+ 73
1244
+ ],
1245
+ "widgets_values_named": {
1246
+ "prompt": "",
1247
+ "width": 1344,
1248
+ "height": 768,
1249
+ "length": 73
1250
+ }
1251
+ },
1252
+ {
1253
+ "id": 20,
1254
+ "type": "PrimitiveFloat",
1255
+ "pos": [
1256
+ 1032.884221724624,
1257
+ 6014.891597108754
1258
+ ],
1259
+ "size": [
1260
+ 270,
1261
+ 70
1262
+ ],
1263
+ "flags": {},
1264
+ "order": 6,
1265
+ "mode": 0,
1266
+ "inputs": [],
1267
+ "outputs": [
1268
+ {
1269
+ "name": "FLOAT",
1270
+ "type": "FLOAT",
1271
+ "links": [
1272
+ 35
1273
+ ]
1274
+ }
1275
+ ],
1276
+ "title": "Float (Duration)",
1277
+ "properties": {
1278
+ "ue_properties": {
1279
+ "widget_ue_connectable": {},
1280
+ "version": "7.8",
1281
+ "input_ue_unconnectable": {}
1282
+ },
1283
+ "cnr_id": "comfy-core",
1284
+ "ver": "0.33.2",
1285
+ "Node name for S&R": "PrimitiveFloat"
1286
+ },
1287
+ "widgets_values": [
1288
+ 5
1289
+ ],
1290
+ "widgets_values_named": {
1291
+ "value": 5
1292
+ },
1293
+ "color": "#322",
1294
+ "bgcolor": "#533"
1295
+ },
1296
+ {
1297
+ "id": 21,
1298
+ "type": "CLIPLoader",
1299
+ "pos": [
1300
+ 1022.1892320604375,
1301
+ 5283.23147307899
1302
+ ],
1303
+ "size": [
1304
+ 640,
1305
+ 120
1306
+ ],
1307
+ "flags": {},
1308
+ "order": 7,
1309
+ "mode": 0,
1310
+ "inputs": [],
1311
+ "outputs": [
1312
+ {
1313
+ "name": "CLIP",
1314
+ "type": "CLIP",
1315
+ "links": [
1316
+ 15,
1317
+ 27
1318
+ ]
1319
+ }
1320
+ ],
1321
+ "properties": {
1322
+ "ue_properties": {
1323
+ "widget_ue_connectable": {},
1324
+ "version": "7.8",
1325
+ "input_ue_unconnectable": {}
1326
+ },
1327
+ "cnr_id": "comfy-core",
1328
+ "ver": "0.33.2",
1329
+ "Node name for S&R": "CLIPLoader",
1330
+ "models": [
1331
+ {
1332
+ "name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
1333
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
1334
+ "directory": "text_encoders"
1335
+ }
1336
+ ]
1337
+ },
1338
+ "widgets_values": [
1339
+ "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
1340
+ "minimax",
1341
+ "default"
1342
+ ],
1343
+ "widgets_values_named": {
1344
+ "clip_name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
1345
+ "type": "minimax",
1346
+ "device": "default"
1347
+ }
1348
+ },
1349
+ {
1350
+ "id": 22,
1351
+ "type": "ResolutionSelector",
1352
+ "pos": [
1353
+ 1035.834305565335,
1354
+ 5835.209409598467
1355
+ ],
1356
+ "size": [
1357
+ 270.983361280237,
1358
+ 126
1359
+ ],
1360
+ "flags": {},
1361
+ "order": 8,
1362
+ "mode": 0,
1363
+ "showAdvanced": false,
1364
+ "inputs": [],
1365
+ "outputs": [
1366
+ {
1367
+ "name": "width",
1368
+ "type": "INT",
1369
+ "links": [
1370
+ 20
1371
+ ]
1372
+ },
1373
+ {
1374
+ "name": "height",
1375
+ "type": "INT",
1376
+ "links": [
1377
+ 21
1378
+ ]
1379
+ }
1380
+ ],
1381
+ "title": "Resolution Selector (Size)",
1382
+ "properties": {
1383
+ "ue_properties": {
1384
+ "widget_ue_connectable": {},
1385
+ "version": "7.8",
1386
+ "input_ue_unconnectable": {}
1387
+ },
1388
+ "cnr_id": "comfy-core",
1389
+ "ver": "0.33.2",
1390
+ "Node name for S&R": "ResolutionSelector"
1391
+ },
1392
+ "widgets_values": [
1393
+ "16:9 (Widescreen)",
1394
+ 0.2,
1395
+ 32
1396
+ ],
1397
+ "widgets_values_named": {
1398
+ "aspect_ratio": "16:9 (Widescreen)",
1399
+ "megapixels": 0.2,
1400
+ "multiple": 32
1401
+ },
1402
+ "color": "#322",
1403
+ "bgcolor": "#533"
1404
+ },
1405
+ {
1406
+ "id": 23,
1407
+ "type": "ComfyMathExpression",
1408
+ "pos": [
1409
+ 1161.2203497483204,
1410
+ 6140.088998712415
1411
+ ],
1412
+ "size": [
1413
+ 225,
1414
+ 116
1415
+ ],
1416
+ "flags": {
1417
+ "collapsed": true
1418
+ },
1419
+ "order": 18,
1420
+ "mode": 0,
1421
+ "inputs": [
1422
+ {
1423
+ "label": "a",
1424
+ "name": "values.a",
1425
+ "type": "FLOAT,INT,BOOLEAN",
1426
+ "link": 35
1427
+ },
1428
+ {
1429
+ "label": "b",
1430
+ "name": "values.b",
1431
+ "shape": 7,
1432
+ "type": "FLOAT,INT,BOOLEAN",
1433
+ "link": null
1434
+ }
1435
+ ],
1436
+ "outputs": [
1437
+ {
1438
+ "name": "FLOAT",
1439
+ "type": "FLOAT",
1440
+ "links": []
1441
+ },
1442
+ {
1443
+ "name": "INT",
1444
+ "type": "INT",
1445
+ "links": [
1446
+ 22,
1447
+ 24,
1448
+ 34
1449
+ ]
1450
+ },
1451
+ {
1452
+ "name": "BOOL",
1453
+ "type": "BOOLEAN",
1454
+ "links": []
1455
+ }
1456
+ ],
1457
+ "properties": {
1458
+ "ue_properties": {
1459
+ "widget_ue_connectable": {},
1460
+ "version": "7.8",
1461
+ "input_ue_unconnectable": {}
1462
+ },
1463
+ "cnr_id": "comfy-core",
1464
+ "ver": "0.33.2",
1465
+ "Node name for S&R": "ComfyMathExpression"
1466
+ },
1467
+ "widgets_values": [
1468
+ "max(5, round(a * 24)) + (5 - (max(5, round(a * 24)) % 17)) % 17"
1469
+ ],
1470
+ "widgets_values_named": {
1471
+ "expression": "max(5, round(a * 24)) + (5 - (max(5, round(a * 24)) % 17)) % 17"
1472
+ }
1473
+ },
1474
+ {
1475
+ "id": 24,
1476
+ "type": "ManualSigmas",
1477
+ "pos": [
1478
+ 3908.508146540855,
1479
+ 5381.63001827778
1480
+ ],
1481
+ "size": [
1482
+ 308.3164287851357,
1483
+ 58
1484
+ ],
1485
+ "flags": {},
1486
+ "order": 9,
1487
+ "mode": 0,
1488
+ "inputs": [
1489
+ {
1490
+ "label": "sigmas",
1491
+ "name": "sigmas",
1492
+ "type": "STRING",
1493
+ "widget": {
1494
+ "name": "sigmas"
1495
+ },
1496
+ "link": null
1497
+ }
1498
+ ],
1499
+ "outputs": [
1500
+ {
1501
+ "label": "SIGMAS",
1502
+ "name": "SIGMAS",
1503
+ "type": "SIGMAS",
1504
+ "links": []
1505
+ }
1506
+ ],
1507
+ "title": "4 step Sigmas",
1508
+ "properties": {
1509
+ "ue_properties": {
1510
+ "widget_ue_connectable": {},
1511
+ "version": "7.5.2",
1512
+ "input_ue_unconnectable": {}
1513
+ },
1514
+ "cnr_id": "comfy-core",
1515
+ "ver": "0.5.1",
1516
+ "Node name for S&R": "ManualSigmas",
1517
+ "enableTabs": false,
1518
+ "tabWidth": 65,
1519
+ "tabXOffset": 10,
1520
+ "hasSecondTab": false,
1521
+ "secondTabText": "Send Back",
1522
+ "secondTabOffset": 80,
1523
+ "secondTabWidth": 65
1524
+ },
1525
+ "widgets_values": [
1526
+ "0.9035, 0.8000, 0.6316, 0.3158, 0.0000"
1527
+ ],
1528
+ "widgets_values_named": {
1529
+ "sigmas": "0.9035, 0.8000, 0.6316, 0.3158, 0.0000"
1530
+ }
1531
+ },
1532
+ {
1533
+ "id": 25,
1534
+ "type": "SamplerCustomAdvanced",
1535
+ "pos": [
1536
+ 4246.03966844866,
1537
+ 5134.519207068676
1538
+ ],
1539
+ "size": [
1540
+ 230,
1541
+ 244.65625
1542
+ ],
1543
+ "flags": {},
1544
+ "order": 37,
1545
+ "mode": 0,
1546
+ "inputs": [
1547
+ {
1548
+ "name": "noise",
1549
+ "type": "NOISE",
1550
+ "link": 36
1551
+ },
1552
+ {
1553
+ "name": "guider",
1554
+ "type": "GUIDER",
1555
+ "link": 37
1556
+ },
1557
+ {
1558
+ "name": "sampler",
1559
+ "type": "SAMPLER",
1560
+ "link": 38
1561
+ },
1562
+ {
1563
+ "name": "sigmas",
1564
+ "type": "SIGMAS",
1565
+ "link": 39
1566
+ },
1567
+ {
1568
+ "name": "latent_image",
1569
+ "type": "LATENT",
1570
+ "link": 40
1571
+ }
1572
+ ],
1573
+ "outputs": [
1574
+ {
1575
+ "name": "output",
1576
+ "type": "LATENT",
1577
+ "links": [
1578
+ 10,
1579
+ 12
1580
+ ]
1581
+ },
1582
+ {
1583
+ "name": "denoised_output",
1584
+ "type": "LATENT",
1585
+ "links": []
1586
+ }
1587
+ ],
1588
+ "properties": {
1589
+ "ue_properties": {
1590
+ "widget_ue_connectable": {},
1591
+ "version": "7.8",
1592
+ "input_ue_unconnectable": {}
1593
+ },
1594
+ "cnr_id": "comfy-core",
1595
+ "ver": "0.33.2",
1596
+ "Node name for S&R": "SamplerCustomAdvanced"
1597
+ }
1598
+ },
1599
+ {
1600
+ "id": 26,
1601
+ "type": "SamplerCustomAdvanced",
1602
+ "pos": [
1603
+ 3176.503986022757,
1604
+ 5128.316087104825
1605
+ ],
1606
+ "size": [
1607
+ 230.98336128023698,
1608
+ 302.67456553398097
1609
+ ],
1610
+ "flags": {},
1611
+ "order": 30,
1612
+ "mode": 0,
1613
+ "inputs": [
1614
+ {
1615
+ "name": "noise",
1616
+ "type": "NOISE",
1617
+ "link": 41
1618
+ },
1619
+ {
1620
+ "name": "guider",
1621
+ "type": "GUIDER",
1622
+ "link": 42
1623
+ },
1624
+ {
1625
+ "name": "sampler",
1626
+ "type": "SAMPLER",
1627
+ "link": 43
1628
+ },
1629
+ {
1630
+ "name": "sigmas",
1631
+ "type": "SIGMAS",
1632
+ "link": 44
1633
+ },
1634
+ {
1635
+ "name": "latent_image",
1636
+ "type": "LATENT",
1637
+ "link": 45
1638
+ }
1639
+ ],
1640
+ "outputs": [
1641
+ {
1642
+ "name": "output",
1643
+ "type": "LATENT",
1644
+ "links": []
1645
+ },
1646
+ {
1647
+ "name": "denoised_output",
1648
+ "type": "LATENT",
1649
+ "links": [
1650
+ 3,
1651
+ 7,
1652
+ 55
1653
+ ]
1654
+ }
1655
+ ],
1656
+ "properties": {
1657
+ "ue_properties": {
1658
+ "widget_ue_connectable": {},
1659
+ "version": "7.8",
1660
+ "input_ue_unconnectable": {}
1661
+ },
1662
+ "cnr_id": "comfy-core",
1663
+ "ver": "0.33.2",
1664
+ "Node name for S&R": "SamplerCustomAdvanced"
1665
+ }
1666
+ },
1667
+ {
1668
+ "id": 27,
1669
+ "type": "PrimitiveFloat",
1670
+ "pos": [
1671
+ 1029.8193877921321,
1672
+ 6209.720798413607
1673
+ ],
1674
+ "size": [
1675
+ 275.0797862917766,
1676
+ 58
1677
+ ],
1678
+ "flags": {},
1679
+ "order": 10,
1680
+ "mode": 0,
1681
+ "inputs": [],
1682
+ "outputs": [
1683
+ {
1684
+ "name": "FLOAT",
1685
+ "type": "FLOAT",
1686
+ "links": [
1687
+ 14
1688
+ ]
1689
+ }
1690
+ ],
1691
+ "title": "target_megapixels(放大的像素数)",
1692
+ "properties": {
1693
+ "ue_properties": {
1694
+ "widget_ue_connectable": {},
1695
+ "input_ue_unconnectable": {},
1696
+ "version": "7.8"
1697
+ },
1698
+ "cnr_id": "comfy-core",
1699
+ "ver": "0.33.2",
1700
+ "Node name for S&R": "PrimitiveFloat"
1701
+ },
1702
+ "widgets_values": [
1703
+ 1
1704
+ ],
1705
+ "widgets_values_named": {
1706
+ "value": 1
1707
+ },
1708
+ "color": "#232",
1709
+ "bgcolor": "#353"
1710
+ },
1711
+ {
1712
+ "id": 28,
1713
+ "type": "MinimaxH3LatentUpscaler3D",
1714
+ "pos": [
1715
+ 3517.3533034183665,
1716
+ 5256.613801714128
1717
+ ],
1718
+ "size": [
1719
+ 286.836067965115,
1720
+ 226
1721
+ ],
1722
+ "flags": {},
1723
+ "order": 35,
1724
+ "mode": 0,
1725
+ "inputs": [
1726
+ {
1727
+ "name": "latent",
1728
+ "type": "*",
1729
+ "link": 46
1730
+ },
1731
+ {
1732
+ "name": "mode.width",
1733
+ "type": "INT",
1734
+ "widget": {
1735
+ "name": "mode.width"
1736
+ },
1737
+ "link": 47
1738
+ },
1739
+ {
1740
+ "name": "mode.height",
1741
+ "type": "INT",
1742
+ "widget": {
1743
+ "name": "mode.height"
1744
+ },
1745
+ "link": 48
1746
+ }
1747
+ ],
1748
+ "outputs": [
1749
+ {
1750
+ "name": "latent",
1751
+ "type": "*",
1752
+ "links": [
1753
+ 25
1754
+ ]
1755
+ }
1756
+ ],
1757
+ "properties": {
1758
+ "ue_properties": {
1759
+ "widget_ue_connectable": {},
1760
+ "input_ue_unconnectable": {},
1761
+ "version": "7.8"
1762
+ },
1763
+ "Node name for S&R": "MinimaxH3LatentUpscaler3D"
1764
+ },
1765
+ "widgets_values": [
1766
+ "minimax_h3_latent_upscaler_3d_fp16.safetensors",
1767
+ "target dimensions",
1768
+ 1280,
1769
+ 704,
1770
+ 32,
1771
+ false,
1772
+ "cuda",
1773
+ "fp16"
1774
+ ],
1775
+ "widgets_values_named": {
1776
+ "model_name": "minimax_h3_latent_upscaler_3d_fp16.safetensors",
1777
+ "mode": "target dimensions",
1778
+ "mode.width": 1280,
1779
+ "mode.height": 704,
1780
+ "align": 32,
1781
+ "keep_proportion": false,
1782
+ "device": "cuda",
1783
+ "precision": "fp16"
1784
+ }
1785
+ },
1786
+ {
1787
+ "id": 29,
1788
+ "type": "KSamplerSelect",
1789
+ "pos": [
1790
+ 2823.6430428367066,
1791
+ 5271.216818760441
1792
+ ],
1793
+ "size": [
1794
+ 308.3164287851357,
1795
+ 58
1796
+ ],
1797
+ "flags": {},
1798
+ "order": 11,
1799
+ "mode": 0,
1800
+ "inputs": [],
1801
+ "outputs": [
1802
+ {
1803
+ "name": "SAMPLER",
1804
+ "type": "SAMPLER",
1805
+ "links": [
1806
+ 38,
1807
+ 43
1808
+ ]
1809
+ }
1810
+ ],
1811
+ "properties": {
1812
+ "ue_properties": {
1813
+ "widget_ue_connectable": {},
1814
+ "version": "7.8",
1815
+ "input_ue_unconnectable": {}
1816
+ },
1817
+ "cnr_id": "comfy-core",
1818
+ "ver": "0.33.2",
1819
+ "Node name for S&R": "KSamplerSelect"
1820
+ },
1821
+ "widgets_values": [
1822
+ "euler"
1823
+ ],
1824
+ "widgets_values_named": {
1825
+ "sampler_name": "euler"
1826
+ }
1827
+ },
1828
+ {
1829
+ "id": 30,
1830
+ "type": "ManualSigmas",
1831
+ "pos": [
1832
+ 3908.508146540855,
1833
+ 5278.999981525025
1834
+ ],
1835
+ "size": [
1836
+ 308.3164287851357,
1837
+ 58
1838
+ ],
1839
+ "flags": {},
1840
+ "order": 12,
1841
+ "mode": 0,
1842
+ "inputs": [
1843
+ {
1844
+ "label": "sigmas",
1845
+ "name": "sigmas",
1846
+ "type": "STRING",
1847
+ "widget": {
1848
+ "name": "sigmas"
1849
+ },
1850
+ "link": null
1851
+ }
1852
+ ],
1853
+ "outputs": [
1854
+ {
1855
+ "label": "SIGMAS",
1856
+ "name": "SIGMAS",
1857
+ "type": "SIGMAS",
1858
+ "links": [
1859
+ 39
1860
+ ]
1861
+ }
1862
+ ],
1863
+ "title": "3 step Sigmas",
1864
+ "properties": {
1865
+ "ue_properties": {
1866
+ "widget_ue_connectable": {},
1867
+ "version": "7.5.2",
1868
+ "input_ue_unconnectable": {}
1869
+ },
1870
+ "cnr_id": "comfy-core",
1871
+ "ver": "0.5.1",
1872
+ "Node name for S&R": "ManualSigmas",
1873
+ "enableTabs": false,
1874
+ "tabWidth": 65,
1875
+ "tabXOffset": 10,
1876
+ "hasSecondTab": false,
1877
+ "secondTabText": "Send Back",
1878
+ "secondTabOffset": 80,
1879
+ "secondTabWidth": 65
1880
+ },
1881
+ "widgets_values": [
1882
+ "0.9035, 0.6316, 0.3158, 0.0000"
1883
+ ],
1884
+ "widgets_values_named": {
1885
+ "sigmas": "0.9035, 0.6316, 0.3158, 0.0000"
1886
+ }
1887
+ },
1888
+ {
1889
+ "id": 31,
1890
+ "type": "MarkdownNote",
1891
+ "pos": [
1892
+ 494.78201888763215,
1893
+ 5065.247043792415
1894
+ ],
1895
+ "size": [
1896
+ 440,
1897
+ 823.8125
1898
+ ],
1899
+ "flags": {},
1900
+ "order": 13,
1901
+ "mode": 0,
1902
+ "inputs": [],
1903
+ "outputs": [],
1904
+ "title": "Note: Model Links",
1905
+ "properties": {
1906
+ "ue_properties": {
1907
+ "widget_ue_connectable": {},
1908
+ "version": "7.8",
1909
+ "input_ue_unconnectable": {}
1910
+ }
1911
+ },
1912
+ "widgets_values": [
1913
+ "Guide: [Subgraph](https://docs.comfy.org/interface/features/subgraph)\n\n## Model Links\n\n**vae**\n\n- [minimax_h3_video_vae_fp16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors)\n- [minimax_h3_audio_vae_fp32.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors)\n\n**diffusion_models**\n\n- [minimax_h3_fl2va_pruned_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_fl2va_pruned_int8_convrot.safetensors)\n\n**text_encoders**\n\n- [qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors)\n\n**loras**\n\n- 8 steps: [minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors](https://huggingface.co/lightx2v/Minimax-h3-Turbo/resolve/main/minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors)\n- 4 steps: [minimax_h3_fl2v_turbo_4step_v1.0_768p_comfyui_bf16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/loras/minimax_h3_fl2v_turbo_4step_v1.0_768p_comfyui_bf16.safetensors)\n\n## Model Storage Location\n\n```\n📂 ComfyUI/\n├── 📂 models/\n│ ├── 📂 vae/\n│ │ ├── minimax_h3_video_vae_fp16.safetensors\n│ │ └── minimax_h3_audio_vae_fp32.safetensors\n│ ├── 📂 diffusion_models/\n│ │ └── minimax_h3_fl2va_pruned_int8_convrot.safetensors\n│ ├── 📂 text_encoders/\n│ │ └── qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors\n│ └── 📂 loras/\n│ └── minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors\n```\n\n## Report Issue\n\nNote: Please update ComfyUI first ([guide](https://docs.comfy.org/installation/update_comfyui)) and prepare required models. Desktop/Cloud updates follow stable releases, so some nightly-supported models may not be available yet.\n\n- Cannot run / runtime errors: [ComfyUI/issues](https://github.com/comfyanonymous/ComfyUI/issues)\n- UI / frontend issues: [ComfyUI_frontend/issues](https://github.com/Comfy-Org/ComfyUI_frontend/issues)\n- Workflow issues: [workflow_templates/issues](https://github.com/Comfy-Org/workflow_templates/issues)\n"
1914
+ ],
1915
+ "widgets_values_named": {
1916
+ "text": "Guide: [Subgraph](https://docs.comfy.org/interface/features/subgraph)\n\n## Model Links\n\n**vae**\n\n- [minimax_h3_video_vae_fp16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors)\n- [minimax_h3_audio_vae_fp32.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors)\n\n**diffusion_models**\n\n- [minimax_h3_fl2va_pruned_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_fl2va_pruned_int8_convrot.safetensors)\n\n**text_encoders**\n\n- [qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors)\n\n**loras**\n\n- 8 steps: [minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors](https://huggingface.co/lightx2v/Minimax-h3-Turbo/resolve/main/minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors)\n- 4 steps: [minimax_h3_fl2v_turbo_4step_v1.0_768p_comfyui_bf16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/loras/minimax_h3_fl2v_turbo_4step_v1.0_768p_comfyui_bf16.safetensors)\n\n## Model Storage Location\n\n```\n📂 ComfyUI/\n├── 📂 models/\n│ ├── 📂 vae/\n│ │ ├── minimax_h3_video_vae_fp16.safetensors\n│ │ └── minimax_h3_audio_vae_fp32.safetensors\n│ ├── 📂 diffusion_models/\n│ │ └── minimax_h3_fl2va_pruned_int8_convrot.safetensors\n│ ├── 📂 text_encoders/\n│ │ └── qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors\n│ └── 📂 loras/\n│ └── minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors\n```\n\n## Report Issue\n\nNote: Please update ComfyUI first ([guide](https://docs.comfy.org/installation/update_comfyui)) and prepare required models. Desktop/Cloud updates follow stable releases, so some nightly-supported models may not be available yet.\n\n- Cannot run / runtime errors: [ComfyUI/issues](https://github.com/comfyanonymous/ComfyUI/issues)\n- UI / frontend issues: [ComfyUI_frontend/issues](https://github.com/Comfy-Org/ComfyUI_frontend/issues)\n- Workflow issues: [workflow_templates/issues](https://github.com/Comfy-Org/workflow_templates/issues)\n"
1917
+ },
1918
+ "color": "#222",
1919
+ "bgcolor": "#000"
1920
+ },
1921
+ {
1922
+ "id": 32,
1923
+ "type": "MarkdownNote",
1924
+ "pos": [
1925
+ 619.2485783896982,
1926
+ 5976.897338708028
1927
+ ],
1928
+ "size": [
1929
+ 300,
1930
+ 520
1931
+ ],
1932
+ "flags": {},
1933
+ "order": 14,
1934
+ "mode": 0,
1935
+ "inputs": [],
1936
+ "outputs": [],
1937
+ "title": "Note: Size Settings Reference",
1938
+ "properties": {
1939
+ "ue_properties": {
1940
+ "widget_ue_connectable": {},
1941
+ "version": "7.8",
1942
+ "input_ue_unconnectable": {}
1943
+ }
1944
+ },
1945
+ "widgets_values": [
1946
+ "| megapixels | Aspect | Output (multiple=32) |\n|---|---|---|\n| 0.2 | 16:9 | 608 x 352 |\n| 0.3 | 16:9 | 736 x 416 |\n| 0.4 | 16:9 | 864 x 480 |\n| 0.5 | 16:9 | 960 x 544 |\n| 0.6 | 16:9 | 1056 x 608 |\n| 0.7 | 16:9 | 1152 x 640 |\n| 0.8 | 16:9 | 1216 x 672 |\n| 0.9 | 16:9 | 1280 x 736 |\n| 0.98 | 16:9 | 1344 x 768 |\n| 1.0 | 16:9 | 1376 x 768 |\n| 1.2 | 16:9 | 1504 x 832 |\n| 1.5 | 16:9 | 1664 x 928 |\n| 1.8 | 16:9 | 1824 x 1024 |\n| 2.0 | 16:9 | 1920 x 1088 |\n"
1947
+ ],
1948
+ "widgets_values_named": {
1949
+ "text": "| megapixels | Aspect | Output (multiple=32) |\n|---|---|---|\n| 0.2 | 16:9 | 608 x 352 |\n| 0.3 | 16:9 | 736 x 416 |\n| 0.4 | 16:9 | 864 x 480 |\n| 0.5 | 16:9 | 960 x 544 |\n| 0.6 | 16:9 | 1056 x 608 |\n| 0.7 | 16:9 | 1152 x 640 |\n| 0.8 | 16:9 | 1216 x 672 |\n| 0.9 | 16:9 | 1280 x 736 |\n| 0.98 | 16:9 | 1344 x 768 |\n| 1.0 | 16:9 | 1376 x 768 |\n| 1.2 | 16:9 | 1504 x 832 |\n| 1.5 | 16:9 | 1664 x 928 |\n| 1.8 | 16:9 | 1824 x 1024 |\n| 2.0 | 16:9 | 1920 x 1088 |\n"
1950
+ },
1951
+ "color": "#222",
1952
+ "bgcolor": "#000"
1953
+ },
1954
+ {
1955
+ "id": 33,
1956
+ "type": "BasicGuider",
1957
+ "pos": [
1958
+ 2823.6430428367066,
1959
+ 5152.136280676316
1960
+ ],
1961
+ "size": [
1962
+ 308.3164287851357,
1963
+ 60
1964
+ ],
1965
+ "flags": {},
1966
+ "order": 29,
1967
+ "mode": 0,
1968
+ "inputs": [
1969
+ {
1970
+ "name": "model",
1971
+ "type": "MODEL",
1972
+ "link": 49
1973
+ },
1974
+ {
1975
+ "name": "conditioning",
1976
+ "type": "CONDITIONING",
1977
+ "link": 50
1978
+ }
1979
+ ],
1980
+ "outputs": [
1981
+ {
1982
+ "name": "GUIDER",
1983
+ "type": "GUIDER",
1984
+ "links": [
1985
+ 42
1986
+ ]
1987
+ }
1988
+ ],
1989
+ "properties": {
1990
+ "ue_properties": {
1991
+ "widget_ue_connectable": {},
1992
+ "version": "7.8",
1993
+ "input_ue_unconnectable": {}
1994
+ },
1995
+ "cnr_id": "comfy-core",
1996
+ "ver": "0.33.2",
1997
+ "Node name for S&R": "BasicGuider"
1998
+ }
1999
+ },
2000
+ {
2001
+ "id": 34,
2002
+ "type": "UNETLoader",
2003
+ "pos": [
2004
+ 1021.6194926311771,
2005
+ 5128.795241774153
2006
+ ],
2007
+ "size": [
2008
+ 640,
2009
+ 90
2010
+ ],
2011
+ "flags": {},
2012
+ "order": 15,
2013
+ "mode": 0,
2014
+ "inputs": [],
2015
+ "outputs": [
2016
+ {
2017
+ "name": "MODEL",
2018
+ "type": "MODEL",
2019
+ "links": [
2020
+ 9,
2021
+ 57
2022
+ ]
2023
+ }
2024
+ ],
2025
+ "properties": {
2026
+ "ue_properties": {
2027
+ "widget_ue_connectable": {},
2028
+ "version": "7.8",
2029
+ "input_ue_unconnectable": {}
2030
+ },
2031
+ "cnr_id": "comfy-core",
2032
+ "ver": "0.33.2",
2033
+ "Node name for S&R": "UNETLoader",
2034
+ "models": [
2035
+ {
2036
+ "name": "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
2037
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors",
2038
+ "directory": "diffusion_models"
2039
+ }
2040
+ ]
2041
+ },
2042
+ "widgets_values": [
2043
+ "minimax_h3_fl2va_int8_convrot.safetensors",
2044
+ "default"
2045
+ ],
2046
+ "widgets_values_named": {
2047
+ "unet_name": "minimax_h3_fl2va_int8_convrot.safetensors",
2048
+ "weight_dtype": "default"
2049
+ }
2050
+ },
2051
+ {
2052
+ "id": 35,
2053
+ "type": "BasicGuider",
2054
+ "pos": [
2055
+ 3908.508146540855,
2056
+ 5153.527207254698
2057
+ ],
2058
+ "size": [
2059
+ 308.3164287851357,
2060
+ 60
2061
+ ],
2062
+ "flags": {},
2063
+ "order": 28,
2064
+ "mode": 0,
2065
+ "inputs": [
2066
+ {
2067
+ "name": "model",
2068
+ "type": "MODEL",
2069
+ "link": 51
2070
+ },
2071
+ {
2072
+ "name": "conditioning",
2073
+ "type": "CONDITIONING",
2074
+ "link": 52
2075
+ }
2076
+ ],
2077
+ "outputs": [
2078
+ {
2079
+ "name": "GUIDER",
2080
+ "type": "GUIDER",
2081
+ "links": [
2082
+ 37
2083
+ ]
2084
+ }
2085
+ ],
2086
+ "properties": {
2087
+ "ue_properties": {
2088
+ "widget_ue_connectable": {},
2089
+ "version": "7.8",
2090
+ "input_ue_unconnectable": {}
2091
+ },
2092
+ "cnr_id": "comfy-core",
2093
+ "ver": "0.33.2",
2094
+ "Node name for S&R": "BasicGuider"
2095
+ }
2096
+ },
2097
+ {
2098
+ "id": 36,
2099
+ "type": "CreateVideo",
2100
+ "pos": [
2101
+ 4513.419976243165,
2102
+ 5133.073653450162
2103
+ ],
2104
+ "size": [
2105
+ 283.1269337209078,
2106
+ 102
2107
+ ],
2108
+ "flags": {},
2109
+ "order": 40,
2110
+ "mode": 0,
2111
+ "inputs": [
2112
+ {
2113
+ "name": "images",
2114
+ "type": "IMAGE",
2115
+ "link": 53
2116
+ },
2117
+ {
2118
+ "name": "audio",
2119
+ "shape": 7,
2120
+ "type": "AUDIO",
2121
+ "link": 54
2122
+ }
2123
+ ],
2124
+ "outputs": [
2125
+ {
2126
+ "name": "VIDEO",
2127
+ "type": "VIDEO",
2128
+ "links": [
2129
+ 6
2130
+ ]
2131
+ }
2132
+ ],
2133
+ "properties": {
2134
+ "ue_properties": {
2135
+ "widget_ue_connectable": {},
2136
+ "version": "7.8",
2137
+ "input_ue_unconnectable": {}
2138
+ },
2139
+ "cnr_id": "comfy-core",
2140
+ "ver": "0.33.2",
2141
+ "Node name for S&R": "CreateVideo"
2142
+ },
2143
+ "widgets_values": [
2144
+ 24,
2145
+ 8
2146
+ ],
2147
+ "widgets_values_named": {
2148
+ "fps": 24,
2149
+ "bit_depth": 8
2150
+ }
2151
+ },
2152
+ {
2153
+ "id": 37,
2154
+ "type": "RandomNoise",
2155
+ "pos": [
2156
+ 1762.6607460983612,
2157
+ 5127.777700325522
2158
+ ],
2159
+ "size": [
2160
+ 258.683290941065,
2161
+ 82
2162
+ ],
2163
+ "flags": {},
2164
+ "order": 16,
2165
+ "mode": 0,
2166
+ "inputs": [],
2167
+ "outputs": [
2168
+ {
2169
+ "name": "NOISE",
2170
+ "type": "NOISE",
2171
+ "links": [
2172
+ 36,
2173
+ 41
2174
+ ]
2175
+ }
2176
+ ],
2177
+ "properties": {
2178
+ "ue_properties": {
2179
+ "widget_ue_connectable": {},
2180
+ "version": "7.8",
2181
+ "input_ue_unconnectable": {}
2182
+ },
2183
+ "cnr_id": "comfy-core",
2184
+ "ver": "0.33.2",
2185
+ "Node name for S&R": "RandomNoise"
2186
+ },
2187
+ "widgets_values": [
2188
+ 42,
2189
+ "fixed"
2190
+ ],
2191
+ "widgets_values_named": {
2192
+ "noise_seed": 42,
2193
+ "control_after_generate": "fixed"
2194
+ }
2195
+ },
2196
+ {
2197
+ "id": 38,
2198
+ "type": "LTXVSeparateAVLatent",
2199
+ "pos": [
2200
+ 3515.6748445640137,
2201
+ 5141.589345008434
2202
+ ],
2203
+ "size": [
2204
+ 286.836067965115,
2205
+ 48.43467905382113
2206
+ ],
2207
+ "flags": {},
2208
+ "order": 33,
2209
+ "mode": 0,
2210
+ "inputs": [
2211
+ {
2212
+ "label": "av_latent",
2213
+ "name": "av_latent",
2214
+ "type": "LATENT",
2215
+ "link": 55
2216
+ }
2217
+ ],
2218
+ "outputs": [
2219
+ {
2220
+ "label": "video_latent",
2221
+ "name": "video_latent",
2222
+ "type": "LATENT",
2223
+ "links": [
2224
+ 46
2225
+ ]
2226
+ },
2227
+ {
2228
+ "label": "audio_latent",
2229
+ "name": "audio_latent",
2230
+ "type": "LATENT",
2231
+ "links": [
2232
+ 26
2233
+ ]
2234
+ }
2235
+ ],
2236
+ "properties": {
2237
+ "ue_properties": {
2238
+ "widget_ue_connectable": {},
2239
+ "version": "7.5.2",
2240
+ "input_ue_unconnectable": {}
2241
+ },
2242
+ "cnr_id": "comfy-core",
2243
+ "ver": "0.5.1",
2244
+ "Node name for S&R": "LTXVSeparateAVLatent",
2245
+ "enableTabs": false,
2246
+ "tabWidth": 65,
2247
+ "tabXOffset": 10,
2248
+ "hasSecondTab": false,
2249
+ "secondTabText": "Send Back",
2250
+ "secondTabOffset": 80,
2251
+ "secondTabWidth": 65
2252
+ }
2253
+ },
2254
+ {
2255
+ "id": 39,
2256
+ "type": "MarkdownNote",
2257
+ "pos": [
2258
+ -248.89143937390827,
2259
+ 5059.017541561554
2260
+ ],
2261
+ "size": [
2262
+ 704.1847986543371,
2263
+ 1486.7010497507154
2264
+ ],
2265
+ "flags": {},
2266
+ "order": 17,
2267
+ "mode": 0,
2268
+ "inputs": [],
2269
+ "outputs": [],
2270
+ "title": "Note: Model Links",
2271
+ "properties": {
2272
+ "ue_properties": {
2273
+ "widget_ue_connectable": {},
2274
+ "version": "7.5.2",
2275
+ "input_ue_unconnectable": {}
2276
+ }
2277
+ },
2278
+ "widgets_values": [
2279
+ "# 工作流说明 / Workflow Notes\n\n## 需要安装的第三方节点\n\n[🤗 H3 的浅空间放大节点](https://github.com/LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler)\n\n```bash\ncd ComfyUI/custom_nodes\ngit clone https://github.com/LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler.git\n```\n\n---\n\n## 模型下载与放置\n\n**H3 浅空间放大模型,放置在 `ComfyUI/models/latent_upscale_models/`**\n\n| 文件名 | 精度 | 大小 | 适用场景 |\n| :--- | :--- | :--- | :--- |\n| [minimax_h3_latent_upscaler_3d_bf16.safetensors](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler/blob/main/minimax_h3_latent_upscaler_3d_bf16.safetensors) | bf16 | ~691 MB | Ampere/Ada 显卡上最快 |\n| [minimax_h3_latent_upscaler_3d_fp16.safetensors](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler/blob/main/minimax_h3_latent_upscaler_3d_fp16.safetensors) | fp16 | ~691 MB | 速度与显存平衡(推荐) |\n| [minimax_h3_latent_upscaler_3d_fp32.pth](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler/blob/main/minimax_h3_latent_upscaler_3d_fp32.pth) | fp32 | ~1.38 GB | 数值精度最高 |\n\n> 三个文件结构相同,选一个你显卡和 workflow 能承受的精度即可。节点下拉框会自动扫描到它们。\n\n---\n\n\n### ⚠️ 3D 倍率节点必须配合音视频分离/合并节���\n\n`Minimax H3 Latent Upscaler (3D)` 因为 H3 latent 里同时含视频与音频,不能直接接原始 `latent`:\n\n```\n[LTXV分离音视频潜空间] → video_latent → [Minimax H3 Latent Upscaler (3D)] → [LTXVConcatAVLatent]\n │ audio_latent(原样传回)\n```\n\n即:前接 `LTXV分离音视频潜空间`,只把 `video_latent` 喂给放大节点,放大后由 `LTXVConcatAVLatent` 把 `audio_latent` 合并回去。\n\n> 其余2个节点(Target Resolution / Megapixels)都不会处理音频,直接接 `latent` 即可,无需分离/合并。\n\n\n\n# 工作流说明 / Workflow Notes\n\n## ⚠️ 重要:`Minimax H3 Latent Upscaler (3D) 节点必须配合音视频分离节点使用\n\n`Minimax H3 Latent Upscaler (3D)` 节点**不能直接接在原始 `latent` 后面**,因为 Minimax H3 的 latent 里同时包含了视频和音频潜空间,直接一起放大可能会破坏音频。\n\n正确连接方式(参考截图):\n\n```\n[av_latent]\n │\n ▼\n┌─────────────────────────┐\n│ LTXV分离音视频潜空间 │ ← 把 latent 拆成 video_latent + audio_latent\n└─────────────────────────┘\n │ video_latent\n ▼\n┌─────────────────────────┐\n│ Minimax H3 Latent │ ← 只放大 video_latent\n│ Upscaler (3D) │\n└─────────────────────────┘\n │ latent (已放大)\n ▼\n┌─────────────────────────┐\n│ LTXVConcatAVLatent │ ← 把放大的 video_latent 和原始 audio_latent 合并\n└─────────────────────────┘\n │\n ▼\n[VAE Decode / 后续节点]\n```\n\n即:\n\n- **前节点**:`LTXV分离音视频潜空间`(输出 `video_latent` + `audio_latent`)\n- **中间**:`Minimax H3 Latent Upscaler (3D)`,只连接 `video_latent`\n- **后节点**:`LTXVConcatAVLatent`,把放大后的 `latent` 和未改动的 `audio_latent` 重新拼回\n\n---\n\n## 节点参数建议\n\n| 参数 | 推荐值 | 说明 |\n| :--- | :--- | :--- |\n| `model_name` | `minimax_h3_latent_upscaler_3d_fp16.safetensors` | 按需选择精度 |\n| `scale` | `2.0` | 1.0–4.0,常用 2× |\n| `device` | `cuda` | 没有显卡可选 `cpu`,但速度很慢 |\n| `precision` | `fp16` | 与模型文件对应;想稳可选 `fp32` |\n\n---\n\n## 完整流程示意\n\n```\nH3 低分辨率生成\n │\n ▼\nVAE Encode(得到 av_latent)\n │\n ▼\nLTXV分离音视频潜空间\n │ video_latent\n ▼\nMinimax H3 Latent Upscaler (3D) ← 在这里放大\n │\n ▼\nLTXVConcatAVLatent\n │\n ▼\n第二阶段二次采样/重绘精修\n │\n ▼\nVAE Decode → 高清视频\n```\n\n> 这个流程跳过了「VAE 解码 → 像素放大 → 再编码」的笨重往返,也避免了对 latent 直接插值带来的鬼影/重影问题。\n"
2280
+ ],
2281
+ "widgets_values_named": {
2282
+ "text": "# 工作流说明 / Workflow Notes\n\n## 需要安装的第三方节点\n\n[🤗 H3 的浅空间放大节点](https://github.com/LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler)\n\n```bash\ncd ComfyUI/custom_nodes\ngit clone https://github.com/LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler.git\n```\n\n---\n\n## 模型下载与放置\n\n**H3 浅空间放大模型,放置在 `ComfyUI/models/latent_upscale_models/`**\n\n| 文件名 | 精度 | 大小 | 适用场景 |\n| :--- | :--- | :--- | :--- |\n| [minimax_h3_latent_upscaler_3d_bf16.safetensors](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler/blob/main/minimax_h3_latent_upscaler_3d_bf16.safetensors) | bf16 | ~691 MB | Ampere/Ada 显卡上最快 |\n| [minimax_h3_latent_upscaler_3d_fp16.safetensors](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler/blob/main/minimax_h3_latent_upscaler_3d_fp16.safetensors) | fp16 | ~691 MB | 速度与显存平衡(推荐) |\n| [minimax_h3_latent_upscaler_3d_fp32.pth](https://huggingface.co/LBH-123-AI/Minimax_h3_latent_Upscaler/blob/main/minimax_h3_latent_upscaler_3d_fp32.pth) | fp32 | ~1.38 GB | 数值精度最高 |\n\n> 三个文件结构相同,选一个你显卡和 workflow 能承受的精度即可。节点下拉框会自动扫描到它们。\n\n---\n\n\n### ⚠️ 3D 倍率节点必须配合音视频分离/合并节点\n\n`Minimax H3 Latent Upscaler (3D)` 因为 H3 latent 里同时含视频与音频,不能直接接原始 `latent`:\n\n```\n[LTXV分离音视频潜空间] → video_latent → [Minimax H3 Latent Upscaler (3D)] → [LTXVConcatAVLatent]\n │ audio_latent(原样传回)\n```\n\n即:前接 `LTXV分离音视频潜空间`,只把 `video_latent` 喂给放大节点,放大后由 `LTXVConcatAVLatent` 把 `audio_latent` 合并回去。\n\n> 其余2个节点(Target Resolution / Megapixels)都不会处理音频,直接接 `latent` 即可,无需分离/合并。\n\n\n\n# 工作流说明 / Workflow Notes\n\n## ⚠️ 重要:`Minimax H3 Latent Upscaler (3D) 节点必须配合音视频分离节点使用\n\n`Minimax H3 Latent Upscaler (3D)` 节点**不能直接接在原始 `latent` 后面**,因为 Minimax H3 的 latent 里同时包含了视频和音频潜空间,直接一起放大可能会破坏音频。\n\n正确连接方式(参考截图):\n\n```\n[av_latent]\n │\n ▼\n┌─────────────────────────┐\n│ LTXV分离音视频潜空间 │ ← 把 latent 拆成 video_latent + audio_latent\n└─────────────────────────┘\n │ video_latent\n ▼\n┌─────────────────────────┐\n│ Minimax H3 Latent │ ← 只放大 video_latent\n│ Upscaler (3D) │\n└─────────────────────────┘\n │ latent (已放大)\n ▼\n┌─────────────────────────┐\n│ LTXVConcatAVLatent │ ← 把放大的 video_latent 和原始 audio_latent 合并\n└─────────────────────────┘\n │\n ▼\n[VAE Decode / 后续节点]\n```\n\n即:\n\n- **前节点**:`LTXV分离音视频潜空间`(输出 `video_latent` + `audio_latent`)\n- **中间**:`Minimax H3 Latent Upscaler (3D)`,只连接 `video_latent`\n- **后节点**:`LTXVConcatAVLatent`,把放大后的 `latent` 和未改动的 `audio_latent` 重新拼回\n\n---\n\n## 节点参数建议\n\n| 参数 | 推荐值 | 说明 |\n| :--- | :--- | :--- |\n| `model_name` | `minimax_h3_latent_upscaler_3d_fp16.safetensors` | 按需选择精度 |\n| `scale` | `2.0` | 1.0–4.0,常用 2× |\n| `device` | `cuda` | 没有显卡可选 `cpu`,但速度很慢 |\n| `precision` | `fp16` | 与模型文件对应;想稳可选 `fp32` |\n\n---\n\n## 完整流程示意\n\n```\nH3 低分辨率生成\n │\n ▼\nVAE Encode(得到 av_latent)\n │\n ▼\nLTXV分离音视频潜空间\n │ video_latent\n ▼\nMinimax H3 Latent Upscaler (3D) ← 在这里放大\n │\n ▼\nLTXVConcatAVLatent\n │\n ▼\n第二阶段二次采样/重绘精修\n │\n ▼\nVAE Decode → 高清视频\n```\n\n> 这个流程跳过了「VAE 解码 → 像素放大 → 再编码」的笨重往返,也避免了对 latent 直接插值带来的鬼影/重影问题。\n"
2283
+ },
2284
+ "color": "#222",
2285
+ "bgcolor": "#000"
2286
+ },
2287
+ {
2288
+ "id": 40,
2289
+ "type": "ModelAttentionBackend",
2290
+ "pos": [
2291
+ 2428.2578085907203,
2292
+ 4920.293966332052
2293
+ ],
2294
+ "size": [
2295
+ 270,
2296
+ 62
2297
+ ],
2298
+ "flags": {},
2299
+ "order": 26,
2300
+ "mode": 0,
2301
+ "inputs": [
2302
+ {
2303
+ "name": "model",
2304
+ "type": "MODEL",
2305
+ "link": 56
2306
+ }
2307
+ ],
2308
+ "outputs": [
2309
+ {
2310
+ "name": "MODEL",
2311
+ "type": "MODEL",
2312
+ "links": [
2313
+ 23,
2314
+ 51
2315
+ ]
2316
+ }
2317
+ ],
2318
+ "properties": {
2319
+ "ue_properties": {
2320
+ "widget_ue_connectable": {},
2321
+ "version": "7.8",
2322
+ "input_ue_unconnectable": {}
2323
+ },
2324
+ "cnr_id": "comfy-core",
2325
+ "ver": "0.33.2",
2326
+ "Node name for S&R": "ModelAttentionBackend"
2327
+ },
2328
+ "widgets_values": [
2329
+ "comfy kitchen attention"
2330
+ ],
2331
+ "widgets_values_named": {
2332
+ "attention": "comfy kitchen attention"
2333
+ }
2334
+ },
2335
+ {
2336
+ "id": 41,
2337
+ "type": "LoraLoaderModelOnly",
2338
+ "pos": [
2339
+ 1733.9262755570603,
2340
+ 4920.745239746706
2341
+ ],
2342
+ "size": [
2343
+ 381.22282887292226,
2344
+ 82
2345
+ ],
2346
+ "flags": {},
2347
+ "order": 21,
2348
+ "mode": 0,
2349
+ "inputs": [
2350
+ {
2351
+ "name": "model",
2352
+ "type": "MODEL",
2353
+ "link": 57
2354
+ }
2355
+ ],
2356
+ "outputs": [
2357
+ {
2358
+ "name": "MODEL",
2359
+ "type": "MODEL",
2360
+ "links": [
2361
+ 58
2362
+ ]
2363
+ }
2364
+ ],
2365
+ "properties": {
2366
+ "ue_properties": {
2367
+ "widget_ue_connectable": {},
2368
+ "version": "7.8",
2369
+ "input_ue_unconnectable": {}
2370
+ },
2371
+ "cnr_id": "comfy-core",
2372
+ "ver": "0.33.2",
2373
+ "Node name for S&R": "LoraLoaderModelOnly"
2374
+ },
2375
+ "widgets_values": [
2376
+ "Minimax_H3\\minimax_h3_fl2v_lightx2v_turbo_4step_v0.1_comfy.safetensors",
2377
+ 1
2378
+ ],
2379
+ "widgets_values_named": {
2380
+ "lora_name": "Minimax_H3\\minimax_h3_fl2v_lightx2v_turbo_4step_v0.1_comfy.safetensors",
2381
+ "strength_model": 1
2382
+ }
2383
+ },
2384
+ {
2385
+ "id": 42,
2386
+ "type": "MiniMaxH3SigmaShift",
2387
+ "pos": [
2388
+ 2138.9374852454953,
2389
+ 4919.377082432047
2390
+ ],
2391
+ "size": [
2392
+ 265.53194252971207,
2393
+ 82
2394
+ ],
2395
+ "flags": {},
2396
+ "order": 25,
2397
+ "mode": 0,
2398
+ "inputs": [
2399
+ {
2400
+ "name": "model",
2401
+ "type": "MODEL",
2402
+ "link": 58
2403
+ }
2404
+ ],
2405
+ "outputs": [
2406
+ {
2407
+ "name": "MODEL",
2408
+ "type": "MODEL",
2409
+ "links": [
2410
+ 56
2411
+ ]
2412
+ }
2413
+ ],
2414
+ "properties": {
2415
+ "ue_properties": {
2416
+ "widget_ue_connectable": {},
2417
+ "input_ue_unconnectable": {},
2418
+ "version": "7.8"
2419
+ },
2420
+ "cnr_id": "comfy-core",
2421
+ "ver": "0.30.0",
2422
+ "Node name for S&R": "MiniMaxH3SigmaShift"
2423
+ },
2424
+ "widgets_values": [
2425
+ 12,
2426
+ 3
2427
+ ],
2428
+ "widgets_values_named": {
2429
+ "shift_video": 12,
2430
+ "shift_audio": 3
2431
+ }
2432
+ }
2433
+ ],
2434
+ "links": [
2435
+ [
2436
+ 1,
2437
+ 6,
2438
+ 0,
2439
+ 1,
2440
+ 0,
2441
+ "IMAGE"
2442
+ ],
2443
+ [
2444
+ 2,
2445
+ 2,
2446
+ 0,
2447
+ 1,
2448
+ 1,
2449
+ "AUDIO"
2450
+ ],
2451
+ [
2452
+ 3,
2453
+ 26,
2454
+ 1,
2455
+ 2,
2456
+ 0,
2457
+ "LATENT"
2458
+ ],
2459
+ [
2460
+ 4,
2461
+ 13,
2462
+ 0,
2463
+ 2,
2464
+ 1,
2465
+ "VAE"
2466
+ ],
2467
+ [
2468
+ 5,
2469
+ 8,
2470
+ 0,
2471
+ 3,
2472
+ 0,
2473
+ "SIGMAS"
2474
+ ],
2475
+ [
2476
+ 6,
2477
+ 36,
2478
+ 0,
2479
+ 4,
2480
+ 0,
2481
+ "VIDEO"
2482
+ ],
2483
+ [
2484
+ 7,
2485
+ 26,
2486
+ 1,
2487
+ 6,
2488
+ 0,
2489
+ "LATENT"
2490
+ ],
2491
+ [
2492
+ 8,
2493
+ 7,
2494
+ 0,
2495
+ 6,
2496
+ 1,
2497
+ "VAE"
2498
+ ],
2499
+ [
2500
+ 9,
2501
+ 34,
2502
+ 0,
2503
+ 8,
2504
+ 0,
2505
+ "MODEL"
2506
+ ],
2507
+ [
2508
+ 10,
2509
+ 25,
2510
+ 0,
2511
+ 11,
2512
+ 0,
2513
+ "LATENT"
2514
+ ],
2515
+ [
2516
+ 11,
2517
+ 7,
2518
+ 0,
2519
+ 11,
2520
+ 1,
2521
+ "VAE"
2522
+ ],
2523
+ [
2524
+ 12,
2525
+ 25,
2526
+ 0,
2527
+ 12,
2528
+ 0,
2529
+ "LATENT"
2530
+ ],
2531
+ [
2532
+ 13,
2533
+ 13,
2534
+ 0,
2535
+ 12,
2536
+ 1,
2537
+ "VAE"
2538
+ ],
2539
+ [
2540
+ 14,
2541
+ 27,
2542
+ 0,
2543
+ 15,
2544
+ 0,
2545
+ "FLOAT"
2546
+ ],
2547
+ [
2548
+ 15,
2549
+ 21,
2550
+ 0,
2551
+ 16,
2552
+ 0,
2553
+ "CLIP"
2554
+ ],
2555
+ [
2556
+ 16,
2557
+ 7,
2558
+ 0,
2559
+ 16,
2560
+ 1,
2561
+ "VAE"
2562
+ ],
2563
+ [
2564
+ 17,
2565
+ 9,
2566
+ 0,
2567
+ 16,
2568
+ 2,
2569
+ "IMAGE"
2570
+ ],
2571
+ [
2572
+ 18,
2573
+ 10,
2574
+ 0,
2575
+ 16,
2576
+ 3,
2577
+ "IMAGE"
2578
+ ],
2579
+ [
2580
+ 19,
2581
+ 14,
2582
+ 0,
2583
+ 16,
2584
+ 4,
2585
+ "STRING"
2586
+ ],
2587
+ [
2588
+ 20,
2589
+ 22,
2590
+ 0,
2591
+ 16,
2592
+ 5,
2593
+ "INT"
2594
+ ],
2595
+ [
2596
+ 21,
2597
+ 22,
2598
+ 1,
2599
+ 16,
2600
+ 6,
2601
+ "INT"
2602
+ ],
2603
+ [
2604
+ 22,
2605
+ 23,
2606
+ 1,
2607
+ 16,
2608
+ 7,
2609
+ "INT"
2610
+ ],
2611
+ [
2612
+ 23,
2613
+ 40,
2614
+ 0,
2615
+ 17,
2616
+ 0,
2617
+ "MODEL"
2618
+ ],
2619
+ [
2620
+ 24,
2621
+ 23,
2622
+ 1,
2623
+ 17,
2624
+ 2,
2625
+ "INT"
2626
+ ],
2627
+ [
2628
+ 25,
2629
+ 28,
2630
+ 0,
2631
+ 18,
2632
+ 0,
2633
+ "LATENT"
2634
+ ],
2635
+ [
2636
+ 26,
2637
+ 38,
2638
+ 1,
2639
+ 18,
2640
+ 1,
2641
+ "LATENT"
2642
+ ],
2643
+ [
2644
+ 27,
2645
+ 21,
2646
+ 0,
2647
+ 19,
2648
+ 0,
2649
+ "CLIP"
2650
+ ],
2651
+ [
2652
+ 28,
2653
+ 7,
2654
+ 0,
2655
+ 19,
2656
+ 1,
2657
+ "VAE"
2658
+ ],
2659
+ [
2660
+ 29,
2661
+ 9,
2662
+ 0,
2663
+ 19,
2664
+ 2,
2665
+ "IMAGE"
2666
+ ],
2667
+ [
2668
+ 30,
2669
+ 10,
2670
+ 0,
2671
+ 19,
2672
+ 3,
2673
+ "IMAGE"
2674
+ ],
2675
+ [
2676
+ 31,
2677
+ 14,
2678
+ 0,
2679
+ 19,
2680
+ 4,
2681
+ "STRING"
2682
+ ],
2683
+ [
2684
+ 32,
2685
+ 15,
2686
+ 0,
2687
+ 19,
2688
+ 5,
2689
+ "INT"
2690
+ ],
2691
+ [
2692
+ 33,
2693
+ 15,
2694
+ 1,
2695
+ 19,
2696
+ 6,
2697
+ "INT"
2698
+ ],
2699
+ [
2700
+ 34,
2701
+ 23,
2702
+ 1,
2703
+ 19,
2704
+ 7,
2705
+ "INT"
2706
+ ],
2707
+ [
2708
+ 35,
2709
+ 20,
2710
+ 0,
2711
+ 23,
2712
+ 0,
2713
+ "FLOAT"
2714
+ ],
2715
+ [
2716
+ 36,
2717
+ 37,
2718
+ 0,
2719
+ 25,
2720
+ 0,
2721
+ "NOISE"
2722
+ ],
2723
+ [
2724
+ 37,
2725
+ 35,
2726
+ 0,
2727
+ 25,
2728
+ 1,
2729
+ "GUIDER"
2730
+ ],
2731
+ [
2732
+ 38,
2733
+ 29,
2734
+ 0,
2735
+ 25,
2736
+ 2,
2737
+ "SAMPLER"
2738
+ ],
2739
+ [
2740
+ 39,
2741
+ 30,
2742
+ 0,
2743
+ 25,
2744
+ 3,
2745
+ "SIGMAS"
2746
+ ],
2747
+ [
2748
+ 40,
2749
+ 18,
2750
+ 0,
2751
+ 25,
2752
+ 4,
2753
+ "LATENT"
2754
+ ],
2755
+ [
2756
+ 41,
2757
+ 37,
2758
+ 0,
2759
+ 26,
2760
+ 0,
2761
+ "NOISE"
2762
+ ],
2763
+ [
2764
+ 42,
2765
+ 33,
2766
+ 0,
2767
+ 26,
2768
+ 1,
2769
+ "GUIDER"
2770
+ ],
2771
+ [
2772
+ 43,
2773
+ 29,
2774
+ 0,
2775
+ 26,
2776
+ 2,
2777
+ "SAMPLER"
2778
+ ],
2779
+ [
2780
+ 44,
2781
+ 3,
2782
+ 0,
2783
+ 26,
2784
+ 3,
2785
+ "SIGMAS"
2786
+ ],
2787
+ [
2788
+ 45,
2789
+ 16,
2790
+ 1,
2791
+ 26,
2792
+ 4,
2793
+ "LATENT"
2794
+ ],
2795
+ [
2796
+ 46,
2797
+ 38,
2798
+ 0,
2799
+ 28,
2800
+ 0,
2801
+ "LATENT"
2802
+ ],
2803
+ [
2804
+ 47,
2805
+ 15,
2806
+ 0,
2807
+ 28,
2808
+ 1,
2809
+ "INT"
2810
+ ],
2811
+ [
2812
+ 48,
2813
+ 15,
2814
+ 1,
2815
+ 28,
2816
+ 2,
2817
+ "INT"
2818
+ ],
2819
+ [
2820
+ 49,
2821
+ 17,
2822
+ 0,
2823
+ 33,
2824
+ 0,
2825
+ "MODEL"
2826
+ ],
2827
+ [
2828
+ 50,
2829
+ 16,
2830
+ 0,
2831
+ 33,
2832
+ 1,
2833
+ "CONDITIONING"
2834
+ ],
2835
+ [
2836
+ 51,
2837
+ 40,
2838
+ 0,
2839
+ 35,
2840
+ 0,
2841
+ "MODEL"
2842
+ ],
2843
+ [
2844
+ 52,
2845
+ 19,
2846
+ 0,
2847
+ 35,
2848
+ 1,
2849
+ "CONDITIONING"
2850
+ ],
2851
+ [
2852
+ 53,
2853
+ 11,
2854
+ 0,
2855
+ 36,
2856
+ 0,
2857
+ "IMAGE"
2858
+ ],
2859
+ [
2860
+ 54,
2861
+ 12,
2862
+ 0,
2863
+ 36,
2864
+ 1,
2865
+ "AUDIO"
2866
+ ],
2867
+ [
2868
+ 55,
2869
+ 26,
2870
+ 1,
2871
+ 38,
2872
+ 0,
2873
+ "LATENT"
2874
+ ],
2875
+ [
2876
+ 56,
2877
+ 42,
2878
+ 0,
2879
+ 40,
2880
+ 0,
2881
+ "MODEL"
2882
+ ],
2883
+ [
2884
+ 57,
2885
+ 34,
2886
+ 0,
2887
+ 41,
2888
+ 0,
2889
+ "MODEL"
2890
+ ],
2891
+ [
2892
+ 58,
2893
+ 41,
2894
+ 0,
2895
+ 42,
2896
+ 0,
2897
+ "MODEL"
2898
+ ]
2899
+ ],
2900
+ "groups": [
2901
+ {
2902
+ "id": 1,
2903
+ "title": "User Inputs",
2904
+ "bounding": [
2905
+ 992.884221724624,
2906
+ 5724.891597108754,
2907
+ 1208.9503194675362,
2908
+ 834.450029042503
2909
+ ],
2910
+ "color": "#3f789e",
2911
+ "flags": {}
2912
+ },
2913
+ {
2914
+ "id": 2,
2915
+ "title": "Models",
2916
+ "bounding": [
2917
+ 992.1892320604375,
2918
+ 5033.23147307899,
2919
+ 700,
2920
+ 670
2921
+ ],
2922
+ "color": "#3f789e",
2923
+ "flags": {}
2924
+ },
2925
+ {
2926
+ "id": 3,
2927
+ "title": "Sampling",
2928
+ "bounding": [
2929
+ 2786.1892320604375,
2930
+ 5033.23147307899,
2931
+ 670.6723003979018,
2932
+ 670
2933
+ ],
2934
+ "color": "#3f789e",
2935
+ "flags": {}
2936
+ },
2937
+ {
2938
+ "id": 4,
2939
+ "title": "Conditioning",
2940
+ "bounding": [
2941
+ 1710.1892320604375,
2942
+ 5033.23147307899,
2943
+ 657,
2944
+ 670
2945
+ ],
2946
+ "color": "#3f789e",
2947
+ "flags": {}
2948
+ },
2949
+ {
2950
+ "id": 5,
2951
+ "title": "Two-stage sampling upscaling - Decoding and create video",
2952
+ "bounding": [
2953
+ 3876.1892320604375,
2954
+ 5033.23147307899,
2955
+ 963,
2956
+ 670
2957
+ ],
2958
+ "color": "#3f789e",
2959
+ "flags": {}
2960
+ },
2961
+ {
2962
+ "id": 6,
2963
+ "title": "H3 Latent Upscaler",
2964
+ "bounding": [
2965
+ 3474.8615324583393,
2966
+ 5033.23147307899,
2967
+ 383,
2968
+ 670
2969
+ ],
2970
+ "color": "#3f789e",
2971
+ "flags": {}
2972
+ },
2973
+ {
2974
+ "id": 7,
2975
+ "title": "preview",
2976
+ "bounding": [
2977
+ 2385.1892320604375,
2978
+ 5033.23147307899,
2979
+ 383,
2980
+ 670
2981
+ ],
2982
+ "color": "#3f789e",
2983
+ "flags": {}
2984
+ }
2985
+ ],
2986
+ "config": {},
2987
+ "extra": {
2988
+ "ds": {
2989
+ "scale": 0.392221789683935,
2990
+ "offset": [
2991
+ 1806.6773443253683,
2992
+ -4318.606286467836
2993
+ ]
2994
+ },
2995
+ "ue_links": [],
2996
+ "frontendVersion": "1.49.6",
2997
+ "VHS_latentpreview": false,
2998
+ "VHS_latentpreviewrate": 0,
2999
+ "VHS_MetadataImage": true,
3000
+ "VHS_KeepIntermediate": true
3001
+ },
3002
+ "version": 0.4
3003
+ }
Comfyui_Minimax_h3_latent_Upscaler/workflow_templates/minimax_h3_r2v_Latent Upscaler example workflow3.json ADDED
@@ -0,0 +1,2671 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "1e132da8-4308-4d7e-b766-009313e961c8",
3
+ "revision": 0,
4
+ "last_node_id": 38,
5
+ "last_link_id": 49,
6
+ "nodes": [
7
+ {
8
+ "id": 1,
9
+ "type": "VHS_VideoCombine",
10
+ "pos": [
11
+ 1672.3340244896142,
12
+ 5341.889808999437
13
+ ],
14
+ "size": [
15
+ 210,
16
+ 334
17
+ ],
18
+ "flags": {},
19
+ "order": 30,
20
+ "mode": 4,
21
+ "inputs": [
22
+ {
23
+ "label": "图像",
24
+ "name": "images",
25
+ "type": "IMAGE",
26
+ "link": 1
27
+ },
28
+ {
29
+ "label": "音频",
30
+ "name": "audio",
31
+ "shape": 7,
32
+ "type": "AUDIO",
33
+ "link": 2
34
+ },
35
+ {
36
+ "label": "批次管理",
37
+ "name": "meta_batch",
38
+ "shape": 7,
39
+ "type": "VHS_BatchManager",
40
+ "link": null
41
+ },
42
+ {
43
+ "name": "vae",
44
+ "shape": 7,
45
+ "type": "VAE",
46
+ "link": null
47
+ },
48
+ {
49
+ "label": "帧率",
50
+ "name": "frame_rate",
51
+ "type": "FLOAT",
52
+ "widget": {
53
+ "name": "frame_rate"
54
+ },
55
+ "link": null
56
+ },
57
+ {
58
+ "label": "循环次数",
59
+ "name": "loop_count",
60
+ "type": "INT",
61
+ "widget": {
62
+ "name": "loop_count"
63
+ },
64
+ "link": null
65
+ },
66
+ {
67
+ "label": "文件名前缀",
68
+ "name": "filename_prefix",
69
+ "type": "STRING",
70
+ "widget": {
71
+ "name": "filename_prefix"
72
+ },
73
+ "link": null
74
+ },
75
+ {
76
+ "label": "格式",
77
+ "name": "format",
78
+ "type": "COMBO",
79
+ "widget": {
80
+ "name": "format"
81
+ },
82
+ "link": null
83
+ },
84
+ {
85
+ "label": "Ping-Pong",
86
+ "name": "pingpong",
87
+ "type": "BOOLEAN",
88
+ "widget": {
89
+ "name": "pingpong"
90
+ },
91
+ "link": null
92
+ },
93
+ {
94
+ "label": "保存到输出文件夹",
95
+ "name": "save_output",
96
+ "type": "BOOLEAN",
97
+ "widget": {
98
+ "name": "save_output"
99
+ },
100
+ "link": null
101
+ },
102
+ {
103
+ "label": "保存元数据",
104
+ "name": "save_metadata",
105
+ "type": "BOOLEAN",
106
+ "widget": {
107
+ "name": "save_metadata"
108
+ },
109
+ "link": null
110
+ },
111
+ {
112
+ "label": "修剪音频",
113
+ "name": "trim_to_audio",
114
+ "type": "BOOLEAN",
115
+ "widget": {
116
+ "name": "trim_to_audio"
117
+ },
118
+ "link": null
119
+ }
120
+ ],
121
+ "outputs": [
122
+ {
123
+ "label": "文件名",
124
+ "name": "Filenames",
125
+ "type": "VHS_FILENAMES",
126
+ "links": null
127
+ }
128
+ ],
129
+ "title": "合并为视频",
130
+ "properties": {
131
+ "cnr_id": "comfyui-videohelpersuite",
132
+ "ver": "4ee72c065db22c9d96c2427954dc69e7b908444b",
133
+ "Node name for S&R": "VHS_VideoCombine",
134
+ "ue_properties": {
135
+ "widget_ue_connectable": {},
136
+ "input_ue_unconnectable": {},
137
+ "version": "7.8"
138
+ }
139
+ },
140
+ "widgets_values": {
141
+ "frame_rate": 24,
142
+ "loop_count": 0,
143
+ "filename_prefix": "AnimateDiff",
144
+ "format": "video/h264-mp4",
145
+ "pix_fmt": "yuv420p",
146
+ "crf": 19,
147
+ "save_metadata": true,
148
+ "trim_to_audio": false,
149
+ "pingpong": false,
150
+ "save_output": false,
151
+ "videopreview": {
152
+ "hidden": false,
153
+ "paused": false,
154
+ "params": {
155
+ "filename": "AnimateDiff_00001-audio.mp4",
156
+ "subfolder": "",
157
+ "type": "temp",
158
+ "format": "video/h264-mp4",
159
+ "frame_rate": 24,
160
+ "workflow": "AnimateDiff_00001.png",
161
+ "fullpath": "D:\\AI\\ComfyUI-aki-v2\\ComfyUI\\temp\\AnimateDiff_00001-audio.mp4"
162
+ }
163
+ }
164
+ },
165
+ "widgets_values_named": {
166
+ "frame_rate": 24,
167
+ "loop_count": 0,
168
+ "filename_prefix": "AnimateDiff",
169
+ "format": "video/h264-mp4",
170
+ "pix_fmt": "yuv420p",
171
+ "crf": 19,
172
+ "save_metadata": true,
173
+ "trim_to_audio": false,
174
+ "pingpong": false,
175
+ "save_output": false,
176
+ "videopreview": {
177
+ "hidden": false,
178
+ "paused": false,
179
+ "params": {
180
+ "filename": "AnimateDiff_00001-audio.mp4",
181
+ "subfolder": "",
182
+ "type": "temp",
183
+ "format": "video/h264-mp4",
184
+ "frame_rate": 24,
185
+ "workflow": "AnimateDiff_00001.png",
186
+ "fullpath": "D:\\AI\\ComfyUI-aki-v2\\ComfyUI\\temp\\AnimateDiff_00001-audio.mp4"
187
+ }
188
+ }
189
+ }
190
+ },
191
+ {
192
+ "id": 2,
193
+ "type": "PrimitiveStringMultiline",
194
+ "pos": [
195
+ 337.6228951554299,
196
+ 5390.6781334546085
197
+ ],
198
+ "size": [
199
+ 370,
200
+ 390
201
+ ],
202
+ "flags": {},
203
+ "order": 0,
204
+ "mode": 0,
205
+ "inputs": [],
206
+ "outputs": [
207
+ {
208
+ "name": "STRING",
209
+ "type": "STRING",
210
+ "links": []
211
+ }
212
+ ],
213
+ "title": "提示词",
214
+ "properties": {
215
+ "cnr_id": "comfy-core",
216
+ "ver": "0.33.2",
217
+ "Node name for S&R": "PrimitiveStringMultiline",
218
+ "ue_properties": {
219
+ "widget_ue_connectable": {},
220
+ "version": "7.8",
221
+ "input_ue_unconnectable": {}
222
+ }
223
+ },
224
+ "widgets_values": [
225
+ "资产角色:\n<Picture 1>\n国风动漫少女,深棕色发髻点缀红梅与蝶形发饰,身穿白金红相间的抹胸上衣与飘逸薄纱灯笼裤,周身环绕金红流光与炽炎花瓣特效。\n<Picture 2>\n硬派白发战将,身穿暗红色皮革长款风衣、黑色内衬与战术皮裤,手持重剑与双枪,周身散发冷冽红黑魔力气浪。\n\n一个低机位推近镜头框住\n<Picture 1>\n与\n<Picture 2>\n在废墟长廊两端对峙。\n<Picture 1>\n率先启动超音速贴地冲刺,足尖踏出金红烈焰莲华,甩出赤红绫缎如游龙贯空;\nthe camera cuts to\n侧面跟摇特写,\n<Picture 2>\n拔出重剑横向重劈,刀锋与炽炎绫缎剧烈碰撞,火星与雷光四向迸射,气浪撕裂地面石板。\nthe shot transitions to\n俯冲环绕镜头,\n<Picture 1>\n借力凌空翻腾,双掌结印召唤暴雨般金红火蝶与符文剑气垂直轰炸;\n<Picture 2>\n单手举剑格挡,魔力红光护盾展开,随即甩动红风衣滑步侧移,拔枪极速连射,火舌与剑气在半空接连引爆。\nthe camera dynamically follows\n贴地高速滑移,\n<Picture 1>\n在弹雨残影中多维瞬闪,瞬身突进至\n<Picture 2>\n身前旋身横扫,赤焰气刃斩开风衣下摆;\nthe shot changes to\n极速下坠定点特写,\n<Picture 2>\n反手抽刀上挑震开攻击,\n<Picture 1>\n空中旋身单手撑地滑退数米,\n<Picture 1>\n与\n<Picture 2>\n同时稳住身形横刃相对,周身烈火与魔能疯狂暴涨,在最强杀意临界点定格。\noverall_soundscape: Explosive shockwaves crack the stone ground as steel clashes with fiery energy ribbons. Gunfire roars in rapid bursts followed by the sizzling hum of burning petals and swirling demonic aura.non_diegetic_music: High-octane heavy metal hybrid with aggressive electric guitar riffs, pounding industrial drums, and intense symphonic brass, cutting off sharply on the final clash."
226
+ ],
227
+ "widgets_values_named": {
228
+ "value": "资产角色:\n<Picture 1>\n国风动漫少女,深棕色发髻点缀红梅与蝶形发饰,身穿白金红相间的抹胸上衣与飘逸薄纱灯笼裤,周身环绕金红流光与炽炎花瓣特效。\n<Picture 2>\n硬派白发战将,身穿暗红色皮革长款风衣、黑色内衬与战术皮裤,手持重剑与双枪,周身散发冷冽红黑魔力气浪。\n\n一个低机位推近镜头框住\n<Picture 1>\n与\n<Picture 2>\n在废墟长廊两端对峙。\n<Picture 1>\n率先启动超音速贴地冲刺,足尖踏出金红烈焰莲华,甩出赤红绫缎如游龙贯空;\nthe camera cuts to\n侧面跟摇特写,\n<Picture 2>\n拔出重剑横向重劈,刀锋与炽炎绫缎剧烈碰撞,火星与雷光四向迸射,气浪撕裂地面石板。\nthe shot transitions to\n俯冲环绕镜头,\n<Picture 1>\n借力凌空翻腾,双掌结印召唤暴雨般金红火蝶与符文剑气垂直轰炸;\n<Picture 2>\n单手举剑格挡,魔力红光护盾展开,随即甩动红风衣滑步侧移,拔枪极速连射,火舌与剑气在半空接连引爆。\nthe camera dynamically follows\n贴地高速滑移,\n<Picture 1>\n在弹雨残影中多维瞬闪,瞬身突进至\n<Picture 2>\n身前旋身横扫,赤焰气刃斩开风衣下摆;\nthe shot changes to\n极速下坠定点特写,\n<Picture 2>\n反手抽刀上挑震开攻击,\n<Picture 1>\n空中旋身单手撑地滑退数米,\n<Picture 1>\n与\n<Picture 2>\n同时稳住身形横刃相对,周身烈火与魔能疯狂暴涨,在最强杀意临界点定格。\noverall_soundscape: Explosive shockwaves crack the stone ground as steel clashes with fiery energy ribbons. Gunfire roars in rapid bursts followed by the sizzling hum of burning petals and swirling demonic aura.non_diegetic_music: High-octane heavy metal hybrid with aggressive electric guitar riffs, pounding industrial drums, and intense symphonic brass, cutting off sharply on the final clash."
229
+ },
230
+ "color": "#232",
231
+ "bgcolor": "#353"
232
+ },
233
+ {
234
+ "id": 3,
235
+ "type": "VAELoader",
236
+ "pos": [
237
+ -306.15299615894105,
238
+ 5023.880667348764
239
+ ],
240
+ "size": [
241
+ 640,
242
+ 70
243
+ ],
244
+ "flags": {},
245
+ "order": 1,
246
+ "mode": 0,
247
+ "inputs": [],
248
+ "outputs": [
249
+ {
250
+ "name": "VAE",
251
+ "type": "VAE",
252
+ "links": [
253
+ 5,
254
+ 11,
255
+ 34
256
+ ]
257
+ }
258
+ ],
259
+ "properties": {
260
+ "cnr_id": "comfy-core",
261
+ "ver": "0.33.2",
262
+ "Node name for S&R": "VAELoader",
263
+ "ue_properties": {
264
+ "widget_ue_connectable": {},
265
+ "version": "7.8",
266
+ "input_ue_unconnectable": {}
267
+ },
268
+ "models": [
269
+ {
270
+ "name": "minimax_h3_video_vae_fp16.safetensors",
271
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors",
272
+ "directory": "vae"
273
+ }
274
+ ]
275
+ },
276
+ "widgets_values": [
277
+ "minimax_h3_video_vae_fp16.safetensors"
278
+ ],
279
+ "widgets_values_named": {
280
+ "vae_name": "minimax_h3_video_vae_fp16.safetensors"
281
+ }
282
+ },
283
+ {
284
+ "id": 4,
285
+ "type": "VAELoader",
286
+ "pos": [
287
+ -306.15299615894105,
288
+ 5153.880667348764
289
+ ],
290
+ "size": [
291
+ 650,
292
+ 70
293
+ ],
294
+ "flags": {},
295
+ "order": 2,
296
+ "mode": 0,
297
+ "inputs": [],
298
+ "outputs": [
299
+ {
300
+ "name": "VAE",
301
+ "type": "VAE",
302
+ "links": [
303
+ 7,
304
+ 12,
305
+ 20
306
+ ]
307
+ }
308
+ ],
309
+ "properties": {
310
+ "cnr_id": "comfy-core",
311
+ "ver": "0.33.2",
312
+ "Node name for S&R": "VAELoader",
313
+ "ue_properties": {
314
+ "widget_ue_connectable": {},
315
+ "version": "7.8",
316
+ "input_ue_unconnectable": {}
317
+ },
318
+ "models": [
319
+ {
320
+ "name": "minimax_h3_audio_vae_fp32.safetensors",
321
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors",
322
+ "directory": "vae"
323
+ }
324
+ ]
325
+ },
326
+ "widgets_values": [
327
+ "minimax_h3_audio_vae_fp32.safetensors"
328
+ ],
329
+ "widgets_values_named": {
330
+ "vae_name": "minimax_h3_audio_vae_fp32.safetensors"
331
+ }
332
+ },
333
+ {
334
+ "id": 5,
335
+ "type": "SaveVideo",
336
+ "pos": [
337
+ 2942.544119477948,
338
+ 4853.660006083442
339
+ ],
340
+ "size": [
341
+ 283.126933720908,
342
+ 106
343
+ ],
344
+ "flags": {},
345
+ "order": 37,
346
+ "mode": 0,
347
+ "inputs": [
348
+ {
349
+ "name": "video",
350
+ "type": "VIDEO",
351
+ "link": 3
352
+ }
353
+ ],
354
+ "outputs": [
355
+ {
356
+ "name": "video",
357
+ "type": "VIDEO",
358
+ "links": null
359
+ }
360
+ ],
361
+ "properties": {
362
+ "cnr_id": "comfy-core",
363
+ "ver": "0.33.2",
364
+ "Node name for S&R": "SaveVideo",
365
+ "ue_properties": {
366
+ "widget_ue_connectable": {},
367
+ "version": "7.8",
368
+ "input_ue_unconnectable": {}
369
+ }
370
+ },
371
+ "widgets_values": [
372
+ "video/MiniMax_H3",
373
+ "auto",
374
+ "auto"
375
+ ],
376
+ "widgets_values_named": {
377
+ "filename_prefix": "video/MiniMax_H3",
378
+ "format": "auto",
379
+ "codec": "auto"
380
+ }
381
+ },
382
+ {
383
+ "id": 6,
384
+ "type": "ManualSigmas",
385
+ "pos": [
386
+ 2358.2357570959043,
387
+ 5038.7065251752965
388
+ ],
389
+ "size": [
390
+ 266.579898552601,
391
+ 58
392
+ ],
393
+ "flags": {},
394
+ "order": 3,
395
+ "mode": 0,
396
+ "inputs": [
397
+ {
398
+ "label": "sigmas",
399
+ "name": "sigmas",
400
+ "type": "STRING",
401
+ "widget": {
402
+ "name": "sigmas"
403
+ },
404
+ "link": null
405
+ }
406
+ ],
407
+ "outputs": [
408
+ {
409
+ "label": "SIGMAS",
410
+ "name": "SIGMAS",
411
+ "type": "SIGMAS",
412
+ "links": []
413
+ }
414
+ ],
415
+ "title": "5 step Sigmas",
416
+ "properties": {
417
+ "cnr_id": "comfy-core",
418
+ "ver": "0.5.1",
419
+ "Node name for S&R": "ManualSigmas",
420
+ "ue_properties": {
421
+ "widget_ue_connectable": {},
422
+ "version": "7.5.2",
423
+ "input_ue_unconnectable": {}
424
+ },
425
+ "enableTabs": false,
426
+ "tabWidth": 65,
427
+ "tabXOffset": 10,
428
+ "hasSecondTab": false,
429
+ "secondTabText": "Send Back",
430
+ "secondTabOffset": 80,
431
+ "secondTabWidth": 65
432
+ },
433
+ "widgets_values": [
434
+ "0.9231, 0.8780, 0.8000, 0.6316, 0.3158, 0.0000"
435
+ ],
436
+ "widgets_values_named": {
437
+ "sigmas": "0.9231, 0.8780, 0.8000, 0.6316, 0.3158, 0.0000"
438
+ }
439
+ },
440
+ {
441
+ "id": 7,
442
+ "type": "VAEDecode",
443
+ "pos": [
444
+ 1637.6859974582662,
445
+ 5047.812567600401
446
+ ],
447
+ "size": [
448
+ 230.98336128023698,
449
+ 46
450
+ ],
451
+ "flags": {
452
+ "collapsed": false
453
+ },
454
+ "order": 27,
455
+ "mode": 0,
456
+ "inputs": [
457
+ {
458
+ "name": "samples",
459
+ "type": "LATENT",
460
+ "link": 4
461
+ },
462
+ {
463
+ "name": "vae",
464
+ "type": "VAE",
465
+ "link": 5
466
+ }
467
+ ],
468
+ "outputs": [
469
+ {
470
+ "name": "IMAGE",
471
+ "type": "IMAGE",
472
+ "links": [
473
+ 1
474
+ ]
475
+ }
476
+ ],
477
+ "properties": {
478
+ "cnr_id": "comfy-core",
479
+ "ver": "0.33.2",
480
+ "Node name for S&R": "VAEDecode",
481
+ "ue_properties": {
482
+ "widget_ue_connectable": {},
483
+ "version": "7.8",
484
+ "input_ue_unconnectable": {}
485
+ }
486
+ }
487
+ },
488
+ {
489
+ "id": 8,
490
+ "type": "VAEDecodeAudio",
491
+ "pos": [
492
+ 1637.6859974582662,
493
+ 5149.985288292222
494
+ ],
495
+ "size": [
496
+ 230.98336128023698,
497
+ 46.99687563323096
498
+ ],
499
+ "flags": {
500
+ "collapsed": false
501
+ },
502
+ "order": 28,
503
+ "mode": 0,
504
+ "inputs": [
505
+ {
506
+ "name": "samples",
507
+ "type": "LATENT",
508
+ "link": 6
509
+ },
510
+ {
511
+ "name": "vae",
512
+ "type": "VAE",
513
+ "link": 7
514
+ }
515
+ ],
516
+ "outputs": [
517
+ {
518
+ "name": "AUDIO",
519
+ "type": "AUDIO",
520
+ "links": [
521
+ 2
522
+ ]
523
+ }
524
+ ],
525
+ "properties": {
526
+ "cnr_id": "comfy-core",
527
+ "ver": "0.33.2",
528
+ "Node name for S&R": "VAEDecodeAudio",
529
+ "ue_properties": {
530
+ "widget_ue_connectable": {},
531
+ "version": "7.8",
532
+ "input_ue_unconnectable": {}
533
+ }
534
+ }
535
+ },
536
+ {
537
+ "id": 9,
538
+ "type": "LoadImage",
539
+ "pos": [
540
+ 15.476970637899512,
541
+ 5397.098522753795
542
+ ],
543
+ "size": [
544
+ 290,
545
+ 330
546
+ ],
547
+ "flags": {},
548
+ "order": 4,
549
+ "mode": 4,
550
+ "inputs": [],
551
+ "outputs": [
552
+ {
553
+ "name": "IMAGE",
554
+ "type": "IMAGE",
555
+ "links": [
556
+ 13
557
+ ]
558
+ },
559
+ {
560
+ "name": "MASK",
561
+ "type": "MASK",
562
+ "links": null
563
+ }
564
+ ],
565
+ "properties": {
566
+ "cnr_id": "comfy-core",
567
+ "ver": "0.33.2",
568
+ "Node name for S&R": "LoadImage",
569
+ "ue_properties": {
570
+ "widget_ue_connectable": {},
571
+ "version": "7.8",
572
+ "input_ue_unconnectable": {}
573
+ }
574
+ },
575
+ "widgets_values": [
576
+ "09-55-07_00001.jpg",
577
+ "image"
578
+ ],
579
+ "widgets_values_named": {
580
+ "image": "09-55-07_00001.jpg",
581
+ "upload": "image"
582
+ }
583
+ },
584
+ {
585
+ "id": 10,
586
+ "type": "LTXVConcatAVLatent",
587
+ "pos": [
588
+ 1970.9114206444888,
589
+ 5102.2627638016265
590
+ ],
591
+ "size": [
592
+ 286.8360679651149,
593
+ 46
594
+ ],
595
+ "flags": {},
596
+ "order": 32,
597
+ "mode": 0,
598
+ "inputs": [
599
+ {
600
+ "label": "video_latent",
601
+ "name": "video_latent",
602
+ "type": "LATENT",
603
+ "link": 8
604
+ },
605
+ {
606
+ "label": "audio_latent",
607
+ "name": "audio_latent",
608
+ "type": "LATENT",
609
+ "link": 9
610
+ }
611
+ ],
612
+ "outputs": [
613
+ {
614
+ "label": "latent",
615
+ "name": "latent",
616
+ "type": "LATENT",
617
+ "links": [
618
+ 25
619
+ ]
620
+ }
621
+ ],
622
+ "properties": {
623
+ "cnr_id": "comfy-core",
624
+ "ver": "0.5.1",
625
+ "Node name for S&R": "LTXVConcatAVLatent",
626
+ "ue_properties": {
627
+ "widget_ue_connectable": {},
628
+ "version": "7.5.2",
629
+ "input_ue_unconnectable": {}
630
+ },
631
+ "enableTabs": false,
632
+ "tabWidth": 65,
633
+ "tabXOffset": 10,
634
+ "hasSecondTab": false,
635
+ "secondTabText": "Send Back",
636
+ "secondTabOffset": 80,
637
+ "secondTabWidth": 65
638
+ }
639
+ },
640
+ {
641
+ "id": 11,
642
+ "type": "MiniMaxH3ReferenceToVideo",
643
+ "pos": [
644
+ 427.616431673551,
645
+ 4842.454751659
646
+ ],
647
+ "size": [
648
+ 375.96979953612185,
649
+ 348.76458454401836
650
+ ],
651
+ "flags": {},
652
+ "order": 19,
653
+ "mode": 0,
654
+ "inputs": [
655
+ {
656
+ "name": "clip",
657
+ "type": "CLIP",
658
+ "link": 10
659
+ },
660
+ {
661
+ "name": "vae",
662
+ "type": "VAE",
663
+ "link": 11
664
+ },
665
+ {
666
+ "name": "audio_vae",
667
+ "type": "VAE",
668
+ "link": 12
669
+ },
670
+ {
671
+ "label": "ref_image_0",
672
+ "name": "ref_images.ref_image_0",
673
+ "shape": 7,
674
+ "type": "IMAGE",
675
+ "link": 13
676
+ },
677
+ {
678
+ "label": "ref_image_1",
679
+ "name": "ref_images.ref_image_1",
680
+ "shape": 7,
681
+ "type": "IMAGE",
682
+ "link": null
683
+ },
684
+ {
685
+ "label": "ref_video_0",
686
+ "name": "ref_videos.ref_video_0",
687
+ "shape": 7,
688
+ "type": "IMAGE",
689
+ "link": null
690
+ },
691
+ {
692
+ "label": "ref_video_audio_0",
693
+ "name": "ref_video_audios.ref_video_audio_0",
694
+ "shape": 7,
695
+ "type": "AUDIO",
696
+ "link": null
697
+ },
698
+ {
699
+ "label": "ref_audio_0",
700
+ "name": "ref_audios.ref_audio_0",
701
+ "shape": 7,
702
+ "type": "AUDIO",
703
+ "link": null
704
+ },
705
+ {
706
+ "name": "width",
707
+ "type": "INT",
708
+ "widget": {
709
+ "name": "width"
710
+ },
711
+ "link": 47
712
+ },
713
+ {
714
+ "name": "height",
715
+ "type": "INT",
716
+ "widget": {
717
+ "name": "height"
718
+ },
719
+ "link": 48
720
+ },
721
+ {
722
+ "name": "length",
723
+ "type": "INT",
724
+ "widget": {
725
+ "name": "length"
726
+ },
727
+ "link": 49
728
+ }
729
+ ],
730
+ "outputs": [
731
+ {
732
+ "name": "positive",
733
+ "type": "CONDITIONING",
734
+ "links": [
735
+ 38,
736
+ 40
737
+ ]
738
+ },
739
+ {
740
+ "name": "LATENT",
741
+ "type": "LATENT",
742
+ "links": [
743
+ 31
744
+ ]
745
+ }
746
+ ],
747
+ "properties": {
748
+ "cnr_id": "comfy-core",
749
+ "ver": "0.33.2",
750
+ "Node name for S&R": "MiniMaxH3ReferenceToVideo",
751
+ "ue_properties": {
752
+ "widget_ue_connectable": {
753
+ "prompt": true,
754
+ "width": true,
755
+ "height": true,
756
+ "length": true
757
+ },
758
+ "version": "7.8",
759
+ "input_ue_unconnectable": {}
760
+ }
761
+ },
762
+ "widgets_values": [
763
+ "",
764
+ 1344,
765
+ 768,
766
+ 124,
767
+ "match"
768
+ ],
769
+ "widgets_values_named": {
770
+ "prompt": "",
771
+ "width": 1344,
772
+ "height": 768,
773
+ "length": 124,
774
+ "ref_image_size": "match"
775
+ }
776
+ },
777
+ {
778
+ "id": 12,
779
+ "type": "ModelPreviewOverrideKJ",
780
+ "pos": [
781
+ 904.139041498252,
782
+ 4675.511346038954
783
+ ],
784
+ "size": [
785
+ 296.3668204268381,
786
+ 462.7777453538065
787
+ ],
788
+ "flags": {},
789
+ "order": 23,
790
+ "mode": 0,
791
+ "inputs": [
792
+ {
793
+ "name": "model",
794
+ "type": "MODEL",
795
+ "link": 16
796
+ },
797
+ {
798
+ "name": "vae",
799
+ "shape": 7,
800
+ "type": "VAE",
801
+ "link": null
802
+ },
803
+ {
804
+ "name": "preview_frames",
805
+ "type": "INT",
806
+ "widget": {
807
+ "name": "preview_frames"
808
+ },
809
+ "link": 17
810
+ }
811
+ ],
812
+ "outputs": [
813
+ {
814
+ "name": "MODEL",
815
+ "type": "MODEL",
816
+ "links": [
817
+ 37
818
+ ]
819
+ }
820
+ ],
821
+ "properties": {
822
+ "cnr_id": "comfyui-kjnodes",
823
+ "ver": "3f20054214fec9f9234fd3841ae6f1e4287948f6",
824
+ "Node name for S&R": "ModelPreviewOverrideKJ",
825
+ "ue_properties": {
826
+ "widget_ue_connectable": {},
827
+ "input_ue_unconnectable": {},
828
+ "version": "7.5.2"
829
+ }
830
+ },
831
+ "widgets_values": [
832
+ 1024,
833
+ 80,
834
+ true,
835
+ 9,
836
+ 12,
837
+ "taeh3.safetensors",
838
+ ""
839
+ ],
840
+ "widgets_values_named": {
841
+ "max_resolution": 1024,
842
+ "jpeg_quality": 80,
843
+ "suppress_default_preview": true,
844
+ "preview_frames": 9,
845
+ "preview_fps": 12,
846
+ "tiny_vae": "taeh3.safetensors",
847
+ "preview": ""
848
+ },
849
+ "color": "#233",
850
+ "bgcolor": "#355"
851
+ },
852
+ {
853
+ "id": 13,
854
+ "type": "SplitSigmas",
855
+ "pos": [
856
+ 1284.8250542722158,
857
+ 5119.253828393941
858
+ ],
859
+ "size": [
860
+ 308.3164287851357,
861
+ 78
862
+ ],
863
+ "flags": {},
864
+ "order": 20,
865
+ "mode": 0,
866
+ "inputs": [
867
+ {
868
+ "name": "sigmas",
869
+ "type": "SIGMAS",
870
+ "link": 18
871
+ }
872
+ ],
873
+ "outputs": [
874
+ {
875
+ "name": "high_sigmas",
876
+ "type": "SIGMAS",
877
+ "links": [
878
+ 30
879
+ ]
880
+ },
881
+ {
882
+ "name": "low_sigmas",
883
+ "type": "SIGMAS",
884
+ "links": []
885
+ }
886
+ ],
887
+ "properties": {
888
+ "cnr_id": "comfy-core",
889
+ "ver": "0.33.0",
890
+ "Node name for S&R": "SplitSigmas",
891
+ "ue_properties": {
892
+ "widget_ue_connectable": {},
893
+ "input_ue_unconnectable": {},
894
+ "version": "7.5.2"
895
+ }
896
+ },
897
+ "widgets_values": [
898
+ 4
899
+ ],
900
+ "widgets_values_named": {
901
+ "step": 4
902
+ },
903
+ "color": "#223",
904
+ "bgcolor": "#335"
905
+ },
906
+ {
907
+ "id": 14,
908
+ "type": "VAEDecodeAudio",
909
+ "pos": [
910
+ 2670.464205116373,
911
+ 5117.045715347668
912
+ ],
913
+ "size": [
914
+ 230,
915
+ 60
916
+ ],
917
+ "flags": {
918
+ "collapsed": false
919
+ },
920
+ "order": 34,
921
+ "mode": 0,
922
+ "inputs": [
923
+ {
924
+ "name": "samples",
925
+ "type": "LATENT",
926
+ "link": 19
927
+ },
928
+ {
929
+ "name": "vae",
930
+ "type": "VAE",
931
+ "link": 20
932
+ }
933
+ ],
934
+ "outputs": [
935
+ {
936
+ "name": "AUDIO",
937
+ "type": "AUDIO",
938
+ "links": [
939
+ 42
940
+ ]
941
+ }
942
+ ],
943
+ "properties": {
944
+ "cnr_id": "comfy-core",
945
+ "ver": "0.33.2",
946
+ "Node name for S&R": "VAEDecodeAudio",
947
+ "ue_properties": {
948
+ "widget_ue_connectable": {},
949
+ "version": "7.8",
950
+ "input_ue_unconnectable": {}
951
+ }
952
+ }
953
+ },
954
+ {
955
+ "id": 15,
956
+ "type": "CLIPLoader",
957
+ "pos": [
958
+ -306.15299615894105,
959
+ 4843.880667348764
960
+ ],
961
+ "size": [
962
+ 640,
963
+ 120
964
+ ],
965
+ "flags": {},
966
+ "order": 5,
967
+ "mode": 0,
968
+ "inputs": [],
969
+ "outputs": [
970
+ {
971
+ "name": "CLIP",
972
+ "type": "CLIP",
973
+ "links": [
974
+ 10
975
+ ]
976
+ }
977
+ ],
978
+ "properties": {
979
+ "cnr_id": "comfy-core",
980
+ "ver": "0.33.2",
981
+ "Node name for S&R": "CLIPLoader",
982
+ "ue_properties": {
983
+ "widget_ue_connectable": {},
984
+ "version": "7.8",
985
+ "input_ue_unconnectable": {}
986
+ },
987
+ "models": [
988
+ {
989
+ "name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
990
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
991
+ "directory": "text_encoders"
992
+ }
993
+ ]
994
+ },
995
+ "widgets_values": [
996
+ "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
997
+ "minimax",
998
+ "default"
999
+ ],
1000
+ "widgets_values_named": {
1001
+ "clip_name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
1002
+ "type": "minimax",
1003
+ "device": "default"
1004
+ }
1005
+ },
1006
+ {
1007
+ "id": 16,
1008
+ "type": "SamplerCustomAdvanced",
1009
+ "pos": [
1010
+ 2671.2544142840693,
1011
+ 4689.961821972248
1012
+ ],
1013
+ "size": [
1014
+ 230,
1015
+ 244.65625
1016
+ ],
1017
+ "flags": {},
1018
+ "order": 33,
1019
+ "mode": 0,
1020
+ "inputs": [
1021
+ {
1022
+ "name": "noise",
1023
+ "type": "NOISE",
1024
+ "link": 21
1025
+ },
1026
+ {
1027
+ "name": "guider",
1028
+ "type": "GUIDER",
1029
+ "link": 22
1030
+ },
1031
+ {
1032
+ "name": "sampler",
1033
+ "type": "SAMPLER",
1034
+ "link": 23
1035
+ },
1036
+ {
1037
+ "name": "sigmas",
1038
+ "type": "SIGMAS",
1039
+ "link": 24
1040
+ },
1041
+ {
1042
+ "name": "latent_image",
1043
+ "type": "LATENT",
1044
+ "link": 25
1045
+ }
1046
+ ],
1047
+ "outputs": [
1048
+ {
1049
+ "name": "output",
1050
+ "type": "LATENT",
1051
+ "links": [
1052
+ 19,
1053
+ 33
1054
+ ]
1055
+ },
1056
+ {
1057
+ "name": "denoised_output",
1058
+ "type": "LATENT",
1059
+ "links": []
1060
+ }
1061
+ ],
1062
+ "properties": {
1063
+ "cnr_id": "comfy-core",
1064
+ "ver": "0.33.2",
1065
+ "Node name for S&R": "SamplerCustomAdvanced",
1066
+ "ue_properties": {
1067
+ "widget_ue_connectable": {},
1068
+ "version": "7.8",
1069
+ "input_ue_unconnectable": {}
1070
+ }
1071
+ }
1072
+ },
1073
+ {
1074
+ "id": 17,
1075
+ "type": "PrimitiveFloat",
1076
+ "pos": [
1077
+ -295.4580064947545,
1078
+ 5575.5407913785275
1079
+ ],
1080
+ "size": [
1081
+ 270,
1082
+ 70
1083
+ ],
1084
+ "flags": {},
1085
+ "order": 6,
1086
+ "mode": 0,
1087
+ "inputs": [],
1088
+ "outputs": [
1089
+ {
1090
+ "name": "FLOAT",
1091
+ "type": "FLOAT",
1092
+ "links": [
1093
+ 26
1094
+ ]
1095
+ }
1096
+ ],
1097
+ "title": "Float (Duration)",
1098
+ "properties": {
1099
+ "cnr_id": "comfy-core",
1100
+ "ver": "0.33.2",
1101
+ "Node name for S&R": "PrimitiveFloat",
1102
+ "ue_properties": {
1103
+ "widget_ue_connectable": {},
1104
+ "version": "7.8",
1105
+ "input_ue_unconnectable": {}
1106
+ }
1107
+ },
1108
+ "widgets_values": [
1109
+ 5
1110
+ ],
1111
+ "widgets_values_named": {
1112
+ "value": 5
1113
+ },
1114
+ "color": "#322",
1115
+ "bgcolor": "#533"
1116
+ },
1117
+ {
1118
+ "id": 18,
1119
+ "type": "KSamplerSelect",
1120
+ "pos": [
1121
+ 1284.8250542722158,
1122
+ 4831.866013030215
1123
+ ],
1124
+ "size": [
1125
+ 308.3164287851357,
1126
+ 58
1127
+ ],
1128
+ "flags": {},
1129
+ "order": 7,
1130
+ "mode": 0,
1131
+ "inputs": [],
1132
+ "outputs": [
1133
+ {
1134
+ "name": "SAMPLER",
1135
+ "type": "SAMPLER",
1136
+ "links": [
1137
+ 23,
1138
+ 29
1139
+ ]
1140
+ }
1141
+ ],
1142
+ "properties": {
1143
+ "cnr_id": "comfy-core",
1144
+ "ver": "0.33.2",
1145
+ "Node name for S&R": "KSamplerSelect",
1146
+ "ue_properties": {
1147
+ "widget_ue_connectable": {},
1148
+ "version": "7.8",
1149
+ "input_ue_unconnectable": {}
1150
+ }
1151
+ },
1152
+ "widgets_values": [
1153
+ "euler"
1154
+ ],
1155
+ "widgets_values_named": {
1156
+ "sampler_name": "euler"
1157
+ }
1158
+ },
1159
+ {
1160
+ "id": 21,
1161
+ "type": "SamplerCustomAdvanced",
1162
+ "pos": [
1163
+ 1637.6859974582662,
1164
+ 4688.965281374599
1165
+ ],
1166
+ "size": [
1167
+ 230.98336128023698,
1168
+ 302.67456553398097
1169
+ ],
1170
+ "flags": {},
1171
+ "order": 26,
1172
+ "mode": 0,
1173
+ "inputs": [
1174
+ {
1175
+ "name": "noise",
1176
+ "type": "NOISE",
1177
+ "link": 27
1178
+ },
1179
+ {
1180
+ "name": "guider",
1181
+ "type": "GUIDER",
1182
+ "link": 28
1183
+ },
1184
+ {
1185
+ "name": "sampler",
1186
+ "type": "SAMPLER",
1187
+ "link": 29
1188
+ },
1189
+ {
1190
+ "name": "sigmas",
1191
+ "type": "SIGMAS",
1192
+ "link": 30
1193
+ },
1194
+ {
1195
+ "name": "latent_image",
1196
+ "type": "LATENT",
1197
+ "link": 31
1198
+ }
1199
+ ],
1200
+ "outputs": [
1201
+ {
1202
+ "name": "output",
1203
+ "type": "LATENT",
1204
+ "links": []
1205
+ },
1206
+ {
1207
+ "name": "denoised_output",
1208
+ "type": "LATENT",
1209
+ "links": [
1210
+ 4,
1211
+ 6,
1212
+ 43
1213
+ ]
1214
+ }
1215
+ ],
1216
+ "properties": {
1217
+ "cnr_id": "comfy-core",
1218
+ "ver": "0.33.2",
1219
+ "Node name for S&R": "SamplerCustomAdvanced",
1220
+ "ue_properties": {
1221
+ "widget_ue_connectable": {},
1222
+ "version": "7.8",
1223
+ "input_ue_unconnectable": {}
1224
+ }
1225
+ }
1226
+ },
1227
+ {
1228
+ "id": 22,
1229
+ "type": "ManualSigmas",
1230
+ "pos": [
1231
+ 2358.2357570959043,
1232
+ 4924.113084521008
1233
+ ],
1234
+ "size": [
1235
+ 266.579898552601,
1236
+ 58
1237
+ ],
1238
+ "flags": {},
1239
+ "order": 8,
1240
+ "mode": 0,
1241
+ "inputs": [
1242
+ {
1243
+ "label": "sigmas",
1244
+ "name": "sigmas",
1245
+ "type": "STRING",
1246
+ "widget": {
1247
+ "name": "sigmas"
1248
+ },
1249
+ "link": null
1250
+ }
1251
+ ],
1252
+ "outputs": [
1253
+ {
1254
+ "label": "SIGMAS",
1255
+ "name": "SIGMAS",
1256
+ "type": "SIGMAS",
1257
+ "links": []
1258
+ }
1259
+ ],
1260
+ "title": "4 step Sigmas",
1261
+ "properties": {
1262
+ "cnr_id": "comfy-core",
1263
+ "ver": "0.5.1",
1264
+ "Node name for S&R": "ManualSigmas",
1265
+ "ue_properties": {
1266
+ "widget_ue_connectable": {},
1267
+ "version": "7.5.2",
1268
+ "input_ue_unconnectable": {}
1269
+ },
1270
+ "enableTabs": false,
1271
+ "tabWidth": 65,
1272
+ "tabXOffset": 10,
1273
+ "hasSecondTab": false,
1274
+ "secondTabText": "Send Back",
1275
+ "secondTabOffset": 80,
1276
+ "secondTabWidth": 65
1277
+ },
1278
+ "widgets_values": [
1279
+ "0.9035, 0.8000, 0.6316, 0.3158, 0.0000"
1280
+ ],
1281
+ "widgets_values_named": {
1282
+ "sigmas": "0.9035, 0.8000, 0.6316, 0.3158, 0.0000"
1283
+ }
1284
+ },
1285
+ {
1286
+ "id": 23,
1287
+ "type": "PrimitiveFloat",
1288
+ "pos": [
1289
+ -300.93105593155974,
1290
+ 5772.312661072873
1291
+ ],
1292
+ "size": [
1293
+ 291.8643748353079,
1294
+ 58
1295
+ ],
1296
+ "flags": {},
1297
+ "order": 9,
1298
+ "mode": 0,
1299
+ "inputs": [],
1300
+ "outputs": [
1301
+ {
1302
+ "name": "FLOAT",
1303
+ "type": "FLOAT",
1304
+ "links": [
1305
+ 36
1306
+ ]
1307
+ }
1308
+ ],
1309
+ "title": "target_megapixels(放大的像素数)",
1310
+ "properties": {
1311
+ "cnr_id": "comfy-core",
1312
+ "ver": "0.33.2",
1313
+ "Node name for S&R": "PrimitiveFloat",
1314
+ "ue_properties": {
1315
+ "widget_ue_connectable": {},
1316
+ "input_ue_unconnectable": {},
1317
+ "version": "7.8"
1318
+ }
1319
+ },
1320
+ "widgets_values": [
1321
+ 1
1322
+ ],
1323
+ "widgets_values_named": {
1324
+ "value": 1
1325
+ },
1326
+ "color": "#232",
1327
+ "bgcolor": "#353"
1328
+ },
1329
+ {
1330
+ "id": 24,
1331
+ "type": "BasicScheduler",
1332
+ "pos": [
1333
+ 1284.8250542722158,
1334
+ 4948.94655111434
1335
+ ],
1336
+ "size": [
1337
+ 308.3164287851357,
1338
+ 111.22673919547651
1339
+ ],
1340
+ "flags": {},
1341
+ "order": 17,
1342
+ "mode": 0,
1343
+ "inputs": [
1344
+ {
1345
+ "name": "model",
1346
+ "type": "MODEL",
1347
+ "link": 32
1348
+ }
1349
+ ],
1350
+ "outputs": [
1351
+ {
1352
+ "name": "SIGMAS",
1353
+ "type": "SIGMAS",
1354
+ "links": [
1355
+ 18
1356
+ ]
1357
+ }
1358
+ ],
1359
+ "properties": {
1360
+ "cnr_id": "comfy-core",
1361
+ "ver": "0.33.2",
1362
+ "Node name for S&R": "BasicScheduler",
1363
+ "ue_properties": {
1364
+ "widget_ue_connectable": {},
1365
+ "version": "7.8",
1366
+ "input_ue_unconnectable": {}
1367
+ }
1368
+ },
1369
+ "widgets_values": [
1370
+ "simple",
1371
+ 8,
1372
+ 1
1373
+ ],
1374
+ "widgets_values_named": {
1375
+ "scheduler": "simple",
1376
+ "steps": 8,
1377
+ "denoise": 1
1378
+ }
1379
+ },
1380
+ {
1381
+ "id": 25,
1382
+ "type": "VAEDecode",
1383
+ "pos": [
1384
+ 2671.3761513913773,
1385
+ 4995.482627248038
1386
+ ],
1387
+ "size": [
1388
+ 230,
1389
+ 60
1390
+ ],
1391
+ "flags": {
1392
+ "collapsed": false
1393
+ },
1394
+ "order": 35,
1395
+ "mode": 0,
1396
+ "inputs": [
1397
+ {
1398
+ "name": "samples",
1399
+ "type": "LATENT",
1400
+ "link": 33
1401
+ },
1402
+ {
1403
+ "name": "vae",
1404
+ "type": "VAE",
1405
+ "link": 34
1406
+ }
1407
+ ],
1408
+ "outputs": [
1409
+ {
1410
+ "name": "IMAGE",
1411
+ "type": "IMAGE",
1412
+ "links": [
1413
+ 41
1414
+ ]
1415
+ }
1416
+ ],
1417
+ "properties": {
1418
+ "cnr_id": "comfy-core",
1419
+ "ver": "0.33.2",
1420
+ "Node name for S&R": "VAEDecode",
1421
+ "ue_properties": {
1422
+ "widget_ue_connectable": {},
1423
+ "version": "7.8",
1424
+ "input_ue_unconnectable": {}
1425
+ }
1426
+ }
1427
+ },
1428
+ {
1429
+ "id": 27,
1430
+ "type": "MarkdownNote",
1431
+ "pos": [
1432
+ -827.4982958786786,
1433
+ 4626.87618265607
1434
+ ],
1435
+ "size": [
1436
+ 440,
1437
+ 740
1438
+ ],
1439
+ "flags": {},
1440
+ "order": 10,
1441
+ "mode": 0,
1442
+ "inputs": [],
1443
+ "outputs": [],
1444
+ "title": "Note: Model Links",
1445
+ "properties": {
1446
+ "ue_properties": {
1447
+ "widget_ue_connectable": {},
1448
+ "version": "7.8",
1449
+ "input_ue_unconnectable": {}
1450
+ }
1451
+ },
1452
+ "widgets_values": [
1453
+ "## Model Links\n[🤗 Comfy-Org/MiniMax-H3](https://huggingface.co/Comfy-Org/MiniMax-H3)\n\n**vae**\n\n- [minimax_h3_video_vae_fp16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors)\n- [minimax_h3_audio_vae_fp32.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors)\n\n**diffusion_models**\n\n- [minimax_h3_ref2va_pruned_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors)\n\n**text_encoders**\n\n- [qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors)\n\n\n## Model Storage Location\n\n```\n📂 ComfyUI/\n├── 📂 models/\n│ ├── 📂 vae/\n│ │ ├── minimax_h3_video_vae_fp16.safetensors\n│ │ └── minimax_h3_audio_vae_fp32.safetensors\n│ ├── 📂 diffusion_models/\n│ │ └── minimax_h3_ref2va_pruned_int8_convrot.safetensors\n│ └── 📂 text_encoders/\n│ └── qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors\n```\n\n## Report Issue\n\nNote: Please update ComfyUI first ([guide](https://docs.comfy.org/installation/update_comfyui)) and prepare required models. Desktop/Cloud updates follow stable releases, so some nightly-supported models may not be available yet.\n\n- Cannot run / runtime errors: [ComfyUI/issues](https://github.com/comfyanonymous/ComfyUI/issues)\n- UI / frontend issues: [ComfyUI_frontend/issues](https://github.com/Comfy-Org/ComfyUI_frontend/issues)\n- Workflow issues: [workflow_templates/issues](https://github.com/Comfy-Org/workflow_templates/issues)\n"
1454
+ ],
1455
+ "widgets_values_named": {
1456
+ "text": "## Model Links\n[🤗 Comfy-Org/MiniMax-H3](https://huggingface.co/Comfy-Org/MiniMax-H3)\n\n**vae**\n\n- [minimax_h3_video_vae_fp16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors)\n- [minimax_h3_audio_vae_fp32.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors)\n\n**diffusion_models**\n\n- [minimax_h3_ref2va_pruned_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors)\n\n**text_encoders**\n\n- [qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors)\n\n\n## Model Storage Location\n\n```\n📂 ComfyUI/\n├── 📂 models/\n│ ├── 📂 vae/\n│ │ ├── minimax_h3_video_vae_fp16.safetensors\n│ │ └── minimax_h3_audio_vae_fp32.safetensors\n│ ├── 📂 diffusion_models/\n│ │ └── minimax_h3_ref2va_pruned_int8_convrot.safetensors\n│ └── 📂 text_encoders/\n│ └── qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors\n```\n\n## Report Issue\n\nNote: Please update ComfyUI first ([guide](https://docs.comfy.org/installation/update_comfyui)) and prepare required models. Desktop/Cloud updates follow stable releases, so some nightly-supported models may not be available yet.\n\n- Cannot run / runtime errors: [ComfyUI/issues](https://github.com/comfyanonymous/ComfyUI/issues)\n- UI / frontend issues: [ComfyUI_frontend/issues](https://github.com/Comfy-Org/ComfyUI_frontend/issues)\n- Workflow issues: [workflow_templates/issues](https://github.com/Comfy-Org/workflow_templates/issues)\n"
1457
+ },
1458
+ "color": "#222",
1459
+ "bgcolor": "#000"
1460
+ },
1461
+ {
1462
+ "id": 28,
1463
+ "type": "MarkdownNote",
1464
+ "pos": [
1465
+ -698.29987297497,
1466
+ 5452.995280949237
1467
+ ],
1468
+ "size": [
1469
+ 300,
1470
+ 520
1471
+ ],
1472
+ "flags": {},
1473
+ "order": 11,
1474
+ "mode": 0,
1475
+ "inputs": [],
1476
+ "outputs": [],
1477
+ "title": "Note: Size Settings Reference",
1478
+ "properties": {
1479
+ "ue_properties": {
1480
+ "widget_ue_connectable": {},
1481
+ "version": "7.8",
1482
+ "input_ue_unconnectable": {}
1483
+ }
1484
+ },
1485
+ "widgets_values": [
1486
+ "| megapixels | Aspect | Output (multiple=32) |\n|---|---|---|\n| 0.2 | 16:9 | 608 x 352 |\n| 0.3 | 16:9 | 736 x 416 |\n| 0.4 | 16:9 | 864 x 480 |\n| 0.5 | 16:9 | 960 x 544 |\n| 0.6 | 16:9 | 1056 x 608 |\n| 0.7 | 16:9 | 1152 x 640 |\n| 0.8 | 16:9 | 1216 x 672 |\n| 0.9 | 16:9 | 1280 x 736 |\n| 0.98 | 16:9 | 1344 x 768 |\n| 1.0 | 16:9 | 1376 x 768 |\n| 1.2 | 16:9 | 1504 x 832 |\n| 1.5 | 16:9 | 1664 x 928 |\n| 1.8 | 16:9 | 1824 x 1024 |\n| 2.0 | 16:9 | 1920 x 1088 |\n"
1487
+ ],
1488
+ "widgets_values_named": {
1489
+ "text": "| megapixels | Aspect | Output (multiple=32) |\n|---|---|---|\n| 0.2 | 16:9 | 608 x 352 |\n| 0.3 | 16:9 | 736 x 416 |\n| 0.4 | 16:9 | 864 x 480 |\n| 0.5 | 16:9 | 960 x 544 |\n| 0.6 | 16:9 | 1056 x 608 |\n| 0.7 | 16:9 | 1152 x 640 |\n| 0.8 | 16:9 | 1216 x 672 |\n| 0.9 | 16:9 | 1280 x 736 |\n| 0.98 | 16:9 | 1344 x 768 |\n| 1.0 | 16:9 | 1376 x 768 |\n| 1.2 | 16:9 | 1504 x 832 |\n| 1.5 | 16:9 | 1664 x 928 |\n| 1.8 | 16:9 | 1824 x 1024 |\n| 2.0 | 16:9 | 1920 x 1088 |\n"
1490
+ },
1491
+ "color": "#222",
1492
+ "bgcolor": "#000"
1493
+ },
1494
+ {
1495
+ "id": 29,
1496
+ "type": "BasicGuider",
1497
+ "pos": [
1498
+ 1284.8250542722158,
1499
+ 4712.78547494609
1500
+ ],
1501
+ "size": [
1502
+ 308.3164287851357,
1503
+ 60
1504
+ ],
1505
+ "flags": {},
1506
+ "order": 25,
1507
+ "mode": 0,
1508
+ "inputs": [
1509
+ {
1510
+ "name": "model",
1511
+ "type": "MODEL",
1512
+ "link": 37
1513
+ },
1514
+ {
1515
+ "name": "conditioning",
1516
+ "type": "CONDITIONING",
1517
+ "link": 38
1518
+ }
1519
+ ],
1520
+ "outputs": [
1521
+ {
1522
+ "name": "GUIDER",
1523
+ "type": "GUIDER",
1524
+ "links": [
1525
+ 28
1526
+ ]
1527
+ }
1528
+ ],
1529
+ "properties": {
1530
+ "cnr_id": "comfy-core",
1531
+ "ver": "0.33.2",
1532
+ "Node name for S&R": "BasicGuider",
1533
+ "ue_properties": {
1534
+ "widget_ue_connectable": {},
1535
+ "version": "7.8",
1536
+ "input_ue_unconnectable": {}
1537
+ }
1538
+ }
1539
+ },
1540
+ {
1541
+ "id": 30,
1542
+ "type": "UNETLoader",
1543
+ "pos": [
1544
+ -306.72273558820143,
1545
+ 4689.4444360439265
1546
+ ],
1547
+ "size": [
1548
+ 640,
1549
+ 90
1550
+ ],
1551
+ "flags": {},
1552
+ "order": 12,
1553
+ "mode": 0,
1554
+ "inputs": [],
1555
+ "outputs": [
1556
+ {
1557
+ "name": "MODEL",
1558
+ "type": "MODEL",
1559
+ "links": [
1560
+ 32,
1561
+ 44
1562
+ ]
1563
+ }
1564
+ ],
1565
+ "properties": {
1566
+ "cnr_id": "comfy-core",
1567
+ "ver": "0.33.2",
1568
+ "Node name for S&R": "UNETLoader",
1569
+ "ue_properties": {
1570
+ "widget_ue_connectable": {},
1571
+ "version": "7.8",
1572
+ "input_ue_unconnectable": {}
1573
+ },
1574
+ "models": [
1575
+ {
1576
+ "name": "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
1577
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors",
1578
+ "directory": "diffusion_models"
1579
+ }
1580
+ ]
1581
+ },
1582
+ "widgets_values": [
1583
+ "minimax_h3_ref2va_int8_convrot.safetensors",
1584
+ "default"
1585
+ ],
1586
+ "widgets_values_named": {
1587
+ "unet_name": "minimax_h3_ref2va_int8_convrot.safetensors",
1588
+ "weight_dtype": "default"
1589
+ }
1590
+ },
1591
+ {
1592
+ "id": 31,
1593
+ "type": "RandomNoise",
1594
+ "pos": [
1595
+ 427.616431673551,
1596
+ 4690.66092333044
1597
+ ],
1598
+ "size": [
1599
+ 375.96979953612185,
1600
+ 82
1601
+ ],
1602
+ "flags": {},
1603
+ "order": 13,
1604
+ "mode": 0,
1605
+ "inputs": [],
1606
+ "outputs": [
1607
+ {
1608
+ "name": "NOISE",
1609
+ "type": "NOISE",
1610
+ "links": [
1611
+ 21,
1612
+ 27
1613
+ ]
1614
+ }
1615
+ ],
1616
+ "properties": {
1617
+ "cnr_id": "comfy-core",
1618
+ "ver": "0.33.2",
1619
+ "Node name for S&R": "RandomNoise",
1620
+ "ue_properties": {
1621
+ "widget_ue_connectable": {},
1622
+ "version": "7.8",
1623
+ "input_ue_unconnectable": {}
1624
+ }
1625
+ },
1626
+ "widgets_values": [
1627
+ 42,
1628
+ "fixed"
1629
+ ],
1630
+ "widgets_values_named": {
1631
+ "noise_seed": 42,
1632
+ "control_after_generate": "fixed"
1633
+ }
1634
+ },
1635
+ {
1636
+ "id": 32,
1637
+ "type": "BasicGuider",
1638
+ "pos": [
1639
+ 2357.730698917854,
1640
+ 4699.904827320822
1641
+ ],
1642
+ "size": [
1643
+ 270,
1644
+ 60
1645
+ ],
1646
+ "flags": {},
1647
+ "order": 24,
1648
+ "mode": 0,
1649
+ "inputs": [
1650
+ {
1651
+ "name": "model",
1652
+ "type": "MODEL",
1653
+ "link": 39
1654
+ },
1655
+ {
1656
+ "name": "conditioning",
1657
+ "type": "CONDITIONING",
1658
+ "link": 40
1659
+ }
1660
+ ],
1661
+ "outputs": [
1662
+ {
1663
+ "name": "GUIDER",
1664
+ "type": "GUIDER",
1665
+ "links": [
1666
+ 22
1667
+ ]
1668
+ }
1669
+ ],
1670
+ "properties": {
1671
+ "cnr_id": "comfy-core",
1672
+ "ver": "0.33.2",
1673
+ "Node name for S&R": "BasicGuider",
1674
+ "ue_properties": {
1675
+ "widget_ue_connectable": {},
1676
+ "version": "7.8",
1677
+ "input_ue_unconnectable": {}
1678
+ }
1679
+ }
1680
+ },
1681
+ {
1682
+ "id": 33,
1683
+ "type": "ManualSigmas",
1684
+ "pos": [
1685
+ 2358.2357570959043,
1686
+ 4821.483047768253
1687
+ ],
1688
+ "size": [
1689
+ 266.579898552601,
1690
+ 58
1691
+ ],
1692
+ "flags": {},
1693
+ "order": 14,
1694
+ "mode": 0,
1695
+ "inputs": [
1696
+ {
1697
+ "label": "sigmas",
1698
+ "name": "sigmas",
1699
+ "type": "STRING",
1700
+ "widget": {
1701
+ "name": "sigmas"
1702
+ },
1703
+ "link": null
1704
+ }
1705
+ ],
1706
+ "outputs": [
1707
+ {
1708
+ "label": "SIGMAS",
1709
+ "name": "SIGMAS",
1710
+ "type": "SIGMAS",
1711
+ "links": [
1712
+ 24
1713
+ ]
1714
+ }
1715
+ ],
1716
+ "title": "3 step Sigmas",
1717
+ "properties": {
1718
+ "cnr_id": "comfy-core",
1719
+ "ver": "0.5.1",
1720
+ "Node name for S&R": "ManualSigmas",
1721
+ "ue_properties": {
1722
+ "widget_ue_connectable": {},
1723
+ "version": "7.5.2",
1724
+ "input_ue_unconnectable": {}
1725
+ },
1726
+ "enableTabs": false,
1727
+ "tabWidth": 65,
1728
+ "tabXOffset": 10,
1729
+ "hasSecondTab": false,
1730
+ "secondTabText": "Send Back",
1731
+ "secondTabOffset": 80,
1732
+ "secondTabWidth": 65
1733
+ },
1734
+ "widgets_values": [
1735
+ "0.9035, 0.6316, 0.3158, 0.0000"
1736
+ ],
1737
+ "widgets_values_named": {
1738
+ "sigmas": "0.9035, 0.6316, 0.3158, 0.0000"
1739
+ }
1740
+ },
1741
+ {
1742
+ "id": 34,
1743
+ "type": "CreateVideo",
1744
+ "pos": [
1745
+ 2941.323495671123,
1746
+ 4693.231361398204
1747
+ ],
1748
+ "size": [
1749
+ 283.1269337209078,
1750
+ 102
1751
+ ],
1752
+ "flags": {},
1753
+ "order": 36,
1754
+ "mode": 0,
1755
+ "inputs": [
1756
+ {
1757
+ "name": "images",
1758
+ "type": "IMAGE",
1759
+ "link": 41
1760
+ },
1761
+ {
1762
+ "name": "audio",
1763
+ "shape": 7,
1764
+ "type": "AUDIO",
1765
+ "link": 42
1766
+ }
1767
+ ],
1768
+ "outputs": [
1769
+ {
1770
+ "name": "VIDEO",
1771
+ "type": "VIDEO",
1772
+ "links": [
1773
+ 3
1774
+ ]
1775
+ }
1776
+ ],
1777
+ "properties": {
1778
+ "cnr_id": "comfy-core",
1779
+ "ver": "0.33.2",
1780
+ "Node name for S&R": "CreateVideo",
1781
+ "ue_properties": {
1782
+ "widget_ue_connectable": {},
1783
+ "version": "7.8",
1784
+ "input_ue_unconnectable": {}
1785
+ }
1786
+ },
1787
+ "widgets_values": [
1788
+ 24,
1789
+ 8
1790
+ ],
1791
+ "widgets_values_named": {
1792
+ "fps": 24,
1793
+ "bit_depth": 8
1794
+ }
1795
+ },
1796
+ {
1797
+ "id": 35,
1798
+ "type": "LTXVSeparateAVLatent",
1799
+ "pos": [
1800
+ 1966.715273508606,
1801
+ 4699.039493830161
1802
+ ],
1803
+ "size": [
1804
+ 286.836067965115,
1805
+ 48.43467905382113
1806
+ ],
1807
+ "flags": {},
1808
+ "order": 29,
1809
+ "mode": 0,
1810
+ "inputs": [
1811
+ {
1812
+ "label": "av_latent",
1813
+ "name": "av_latent",
1814
+ "type": "LATENT",
1815
+ "link": 43
1816
+ }
1817
+ ],
1818
+ "outputs": [
1819
+ {
1820
+ "label": "video_latent",
1821
+ "name": "video_latent",
1822
+ "type": "LATENT",
1823
+ "links": [
1824
+ 35
1825
+ ]
1826
+ },
1827
+ {
1828
+ "label": "audio_latent",
1829
+ "name": "audio_latent",
1830
+ "type": "LATENT",
1831
+ "links": [
1832
+ 9
1833
+ ]
1834
+ }
1835
+ ],
1836
+ "properties": {
1837
+ "cnr_id": "comfy-core",
1838
+ "ver": "0.5.1",
1839
+ "Node name for S&R": "LTXVSeparateAVLatent",
1840
+ "ue_properties": {
1841
+ "widget_ue_connectable": {},
1842
+ "version": "7.5.2",
1843
+ "input_ue_unconnectable": {}
1844
+ },
1845
+ "enableTabs": false,
1846
+ "tabWidth": 65,
1847
+ "tabXOffset": 10,
1848
+ "hasSecondTab": false,
1849
+ "secondTabText": "Send Back",
1850
+ "secondTabOffset": 80,
1851
+ "secondTabWidth": 65
1852
+ }
1853
+ },
1854
+ {
1855
+ "id": 36,
1856
+ "type": "LoraLoaderModelOnly",
1857
+ "pos": [
1858
+ 437.53065825024066,
1859
+ 4481.39443401648
1860
+ ],
1861
+ "size": [
1862
+ 453.3210289616586,
1863
+ 82
1864
+ ],
1865
+ "flags": {},
1866
+ "order": 18,
1867
+ "mode": 0,
1868
+ "inputs": [
1869
+ {
1870
+ "name": "model",
1871
+ "type": "MODEL",
1872
+ "link": 44
1873
+ }
1874
+ ],
1875
+ "outputs": [
1876
+ {
1877
+ "name": "MODEL",
1878
+ "type": "MODEL",
1879
+ "links": [
1880
+ 46
1881
+ ]
1882
+ }
1883
+ ],
1884
+ "properties": {
1885
+ "cnr_id": "comfy-core",
1886
+ "ver": "0.33.2",
1887
+ "Node name for S&R": "LoraLoaderModelOnly",
1888
+ "ue_properties": {
1889
+ "widget_ue_connectable": {},
1890
+ "version": "7.8",
1891
+ "input_ue_unconnectable": {}
1892
+ }
1893
+ },
1894
+ "widgets_values": [
1895
+ "Minimax_H3\\minimax_h3_fl2v_lightx2v_turbo_4step_v0.1_comfy.safetensors",
1896
+ 1
1897
+ ],
1898
+ "widgets_values_named": {
1899
+ "lora_name": "Minimax_H3\\minimax_h3_fl2v_lightx2v_turbo_4step_v0.1_comfy.safetensors",
1900
+ "strength_model": 1
1901
+ }
1902
+ },
1903
+ {
1904
+ "id": 37,
1905
+ "type": "ModelAttentionBackend",
1906
+ "pos": [
1907
+ 1212.250299654286,
1908
+ 4477.499802262122
1909
+ ],
1910
+ "size": [
1911
+ 270,
1912
+ 62
1913
+ ],
1914
+ "flags": {},
1915
+ "order": 22,
1916
+ "mode": 0,
1917
+ "inputs": [
1918
+ {
1919
+ "name": "model",
1920
+ "type": "MODEL",
1921
+ "link": 45
1922
+ }
1923
+ ],
1924
+ "outputs": [
1925
+ {
1926
+ "name": "MODEL",
1927
+ "type": "MODEL",
1928
+ "links": [
1929
+ 16,
1930
+ 39
1931
+ ]
1932
+ }
1933
+ ],
1934
+ "properties": {
1935
+ "cnr_id": "comfy-core",
1936
+ "ver": "0.33.2",
1937
+ "Node name for S&R": "ModelAttentionBackend",
1938
+ "ue_properties": {
1939
+ "widget_ue_connectable": {},
1940
+ "version": "7.8",
1941
+ "input_ue_unconnectable": {}
1942
+ }
1943
+ },
1944
+ "widgets_values": [
1945
+ "comfy kitchen attention"
1946
+ ],
1947
+ "widgets_values_named": {
1948
+ "attention": "comfy kitchen attention"
1949
+ }
1950
+ },
1951
+ {
1952
+ "id": 26,
1953
+ "type": "MinimaxH3LatentUpscaler3D",
1954
+ "pos": [
1955
+ 1969.409199969843,
1956
+ 4827.265029425342
1957
+ ],
1958
+ "size": [
1959
+ 286.836067965115,
1960
+ 202
1961
+ ],
1962
+ "flags": {},
1963
+ "order": 31,
1964
+ "mode": 0,
1965
+ "inputs": [
1966
+ {
1967
+ "name": "latent",
1968
+ "type": "*",
1969
+ "link": 35
1970
+ },
1971
+ {
1972
+ "name": "mode.megapixels",
1973
+ "type": "FLOAT",
1974
+ "widget": {
1975
+ "name": "mode.megapixels"
1976
+ },
1977
+ "link": 36
1978
+ }
1979
+ ],
1980
+ "outputs": [
1981
+ {
1982
+ "name": "latent",
1983
+ "type": "*",
1984
+ "links": [
1985
+ 8
1986
+ ]
1987
+ }
1988
+ ],
1989
+ "properties": {
1990
+ "Node name for S&R": "MinimaxH3LatentUpscaler3D",
1991
+ "ue_properties": {
1992
+ "widget_ue_connectable": {},
1993
+ "input_ue_unconnectable": {},
1994
+ "version": "7.8"
1995
+ }
1996
+ },
1997
+ "widgets_values": [
1998
+ "minimax_h3_latent_upscaler_3d_fp16.safetensors",
1999
+ "megapixels",
2000
+ 1,
2001
+ 32,
2002
+ false,
2003
+ "cuda",
2004
+ "fp16"
2005
+ ],
2006
+ "widgets_values_named": {
2007
+ "model_name": "minimax_h3_latent_upscaler_3d_fp16.safetensors",
2008
+ "mode": "megapixels",
2009
+ "mode.megapixels": 1,
2010
+ "align": 32,
2011
+ "keep_proportion": false,
2012
+ "device": "cuda",
2013
+ "precision": "fp16"
2014
+ }
2015
+ },
2016
+ {
2017
+ "id": 20,
2018
+ "type": "ResolutionSelector",
2019
+ "pos": [
2020
+ -292.50792265404357,
2021
+ 5395.858603868241
2022
+ ],
2023
+ "size": [
2024
+ 270.983361280237,
2025
+ 126
2026
+ ],
2027
+ "flags": {},
2028
+ "order": 15,
2029
+ "mode": 0,
2030
+ "showAdvanced": false,
2031
+ "inputs": [],
2032
+ "outputs": [
2033
+ {
2034
+ "name": "width",
2035
+ "type": "INT",
2036
+ "links": [
2037
+ 47
2038
+ ]
2039
+ },
2040
+ {
2041
+ "name": "height",
2042
+ "type": "INT",
2043
+ "links": [
2044
+ 48
2045
+ ]
2046
+ }
2047
+ ],
2048
+ "title": "Resolution Selector (Size)",
2049
+ "properties": {
2050
+ "cnr_id": "comfy-core",
2051
+ "ver": "0.33.2",
2052
+ "Node name for S&R": "ResolutionSelector",
2053
+ "ue_properties": {
2054
+ "widget_ue_connectable": {},
2055
+ "version": "7.8",
2056
+ "input_ue_unconnectable": {}
2057
+ }
2058
+ },
2059
+ "widgets_values": [
2060
+ "16:9 (Widescreen)",
2061
+ 0.2,
2062
+ 32
2063
+ ],
2064
+ "widgets_values_named": {
2065
+ "aspect_ratio": "16:9 (Widescreen)",
2066
+ "megapixels": 0.2,
2067
+ "multiple": 32
2068
+ },
2069
+ "color": "#322",
2070
+ "bgcolor": "#533"
2071
+ },
2072
+ {
2073
+ "id": 19,
2074
+ "type": "ComfyMathExpression",
2075
+ "pos": [
2076
+ -168.6086245942965,
2077
+ 5700.738192982189
2078
+ ],
2079
+ "size": [
2080
+ 225,
2081
+ 116
2082
+ ],
2083
+ "flags": {
2084
+ "collapsed": true
2085
+ },
2086
+ "order": 16,
2087
+ "mode": 0,
2088
+ "inputs": [
2089
+ {
2090
+ "label": "a",
2091
+ "name": "values.a",
2092
+ "type": "FLOAT,INT,BOOLEAN",
2093
+ "link": 26
2094
+ },
2095
+ {
2096
+ "label": "b",
2097
+ "name": "values.b",
2098
+ "shape": 7,
2099
+ "type": "FLOAT,INT,BOOLEAN",
2100
+ "link": null
2101
+ }
2102
+ ],
2103
+ "outputs": [
2104
+ {
2105
+ "name": "FLOAT",
2106
+ "type": "FLOAT",
2107
+ "links": []
2108
+ },
2109
+ {
2110
+ "name": "INT",
2111
+ "type": "INT",
2112
+ "links": [
2113
+ 17,
2114
+ 49
2115
+ ]
2116
+ },
2117
+ {
2118
+ "name": "BOOL",
2119
+ "type": "BOOLEAN",
2120
+ "links": []
2121
+ }
2122
+ ],
2123
+ "properties": {
2124
+ "cnr_id": "comfy-core",
2125
+ "ver": "0.33.2",
2126
+ "Node name for S&R": "ComfyMathExpression",
2127
+ "ue_properties": {
2128
+ "widget_ue_connectable": {},
2129
+ "version": "7.8",
2130
+ "input_ue_unconnectable": {}
2131
+ }
2132
+ },
2133
+ "widgets_values": [
2134
+ "max(5, round(a * 24)) + (5 - (max(5, round(a * 24)) % 17)) % 17"
2135
+ ],
2136
+ "widgets_values_named": {
2137
+ "expression": "max(5, round(a * 24)) + (5 - (max(5, round(a * 24)) % 17)) % 17"
2138
+ }
2139
+ },
2140
+ {
2141
+ "id": 38,
2142
+ "type": "MiniMaxH3SigmaShift",
2143
+ "pos": [
2144
+ 913.6385462171465,
2145
+ 4479.056966713434
2146
+ ],
2147
+ "size": [
2148
+ 272.23402873514397,
2149
+ 82
2150
+ ],
2151
+ "flags": {},
2152
+ "order": 21,
2153
+ "mode": 0,
2154
+ "inputs": [
2155
+ {
2156
+ "name": "model",
2157
+ "type": "MODEL",
2158
+ "link": 46
2159
+ }
2160
+ ],
2161
+ "outputs": [
2162
+ {
2163
+ "name": "MODEL",
2164
+ "type": "MODEL",
2165
+ "links": [
2166
+ 45
2167
+ ]
2168
+ }
2169
+ ],
2170
+ "properties": {
2171
+ "cnr_id": "comfy-core",
2172
+ "ver": "0.30.0",
2173
+ "Node name for S&R": "MiniMaxH3SigmaShift",
2174
+ "ue_properties": {
2175
+ "widget_ue_connectable": {},
2176
+ "input_ue_unconnectable": {},
2177
+ "version": "7.8"
2178
+ }
2179
+ },
2180
+ "widgets_values": [
2181
+ 12,
2182
+ 3
2183
+ ],
2184
+ "widgets_values_named": {
2185
+ "shift_video": 12,
2186
+ "shift_audio": 3
2187
+ }
2188
+ }
2189
+ ],
2190
+ "links": [
2191
+ [
2192
+ 1,
2193
+ 7,
2194
+ 0,
2195
+ 1,
2196
+ 0,
2197
+ "IMAGE"
2198
+ ],
2199
+ [
2200
+ 2,
2201
+ 8,
2202
+ 0,
2203
+ 1,
2204
+ 1,
2205
+ "AUDIO"
2206
+ ],
2207
+ [
2208
+ 3,
2209
+ 34,
2210
+ 0,
2211
+ 5,
2212
+ 0,
2213
+ "VIDEO"
2214
+ ],
2215
+ [
2216
+ 4,
2217
+ 21,
2218
+ 1,
2219
+ 7,
2220
+ 0,
2221
+ "LATENT"
2222
+ ],
2223
+ [
2224
+ 5,
2225
+ 3,
2226
+ 0,
2227
+ 7,
2228
+ 1,
2229
+ "VAE"
2230
+ ],
2231
+ [
2232
+ 6,
2233
+ 21,
2234
+ 1,
2235
+ 8,
2236
+ 0,
2237
+ "LATENT"
2238
+ ],
2239
+ [
2240
+ 7,
2241
+ 4,
2242
+ 0,
2243
+ 8,
2244
+ 1,
2245
+ "VAE"
2246
+ ],
2247
+ [
2248
+ 8,
2249
+ 26,
2250
+ 0,
2251
+ 10,
2252
+ 0,
2253
+ "LATENT"
2254
+ ],
2255
+ [
2256
+ 9,
2257
+ 35,
2258
+ 1,
2259
+ 10,
2260
+ 1,
2261
+ "LATENT"
2262
+ ],
2263
+ [
2264
+ 10,
2265
+ 15,
2266
+ 0,
2267
+ 11,
2268
+ 0,
2269
+ "CLIP"
2270
+ ],
2271
+ [
2272
+ 11,
2273
+ 3,
2274
+ 0,
2275
+ 11,
2276
+ 1,
2277
+ "VAE"
2278
+ ],
2279
+ [
2280
+ 12,
2281
+ 4,
2282
+ 0,
2283
+ 11,
2284
+ 2,
2285
+ "VAE"
2286
+ ],
2287
+ [
2288
+ 13,
2289
+ 9,
2290
+ 0,
2291
+ 11,
2292
+ 3,
2293
+ "IMAGE"
2294
+ ],
2295
+ [
2296
+ 16,
2297
+ 37,
2298
+ 0,
2299
+ 12,
2300
+ 0,
2301
+ "MODEL"
2302
+ ],
2303
+ [
2304
+ 17,
2305
+ 19,
2306
+ 1,
2307
+ 12,
2308
+ 2,
2309
+ "INT"
2310
+ ],
2311
+ [
2312
+ 18,
2313
+ 24,
2314
+ 0,
2315
+ 13,
2316
+ 0,
2317
+ "SIGMAS"
2318
+ ],
2319
+ [
2320
+ 19,
2321
+ 16,
2322
+ 0,
2323
+ 14,
2324
+ 0,
2325
+ "LATENT"
2326
+ ],
2327
+ [
2328
+ 20,
2329
+ 4,
2330
+ 0,
2331
+ 14,
2332
+ 1,
2333
+ "VAE"
2334
+ ],
2335
+ [
2336
+ 21,
2337
+ 31,
2338
+ 0,
2339
+ 16,
2340
+ 0,
2341
+ "NOISE"
2342
+ ],
2343
+ [
2344
+ 22,
2345
+ 32,
2346
+ 0,
2347
+ 16,
2348
+ 1,
2349
+ "GUIDER"
2350
+ ],
2351
+ [
2352
+ 23,
2353
+ 18,
2354
+ 0,
2355
+ 16,
2356
+ 2,
2357
+ "SAMPLER"
2358
+ ],
2359
+ [
2360
+ 24,
2361
+ 33,
2362
+ 0,
2363
+ 16,
2364
+ 3,
2365
+ "SIGMAS"
2366
+ ],
2367
+ [
2368
+ 25,
2369
+ 10,
2370
+ 0,
2371
+ 16,
2372
+ 4,
2373
+ "LATENT"
2374
+ ],
2375
+ [
2376
+ 26,
2377
+ 17,
2378
+ 0,
2379
+ 19,
2380
+ 0,
2381
+ "FLOAT"
2382
+ ],
2383
+ [
2384
+ 27,
2385
+ 31,
2386
+ 0,
2387
+ 21,
2388
+ 0,
2389
+ "NOISE"
2390
+ ],
2391
+ [
2392
+ 28,
2393
+ 29,
2394
+ 0,
2395
+ 21,
2396
+ 1,
2397
+ "GUIDER"
2398
+ ],
2399
+ [
2400
+ 29,
2401
+ 18,
2402
+ 0,
2403
+ 21,
2404
+ 2,
2405
+ "SAMPLER"
2406
+ ],
2407
+ [
2408
+ 30,
2409
+ 13,
2410
+ 0,
2411
+ 21,
2412
+ 3,
2413
+ "SIGMAS"
2414
+ ],
2415
+ [
2416
+ 31,
2417
+ 11,
2418
+ 1,
2419
+ 21,
2420
+ 4,
2421
+ "LATENT"
2422
+ ],
2423
+ [
2424
+ 32,
2425
+ 30,
2426
+ 0,
2427
+ 24,
2428
+ 0,
2429
+ "MODEL"
2430
+ ],
2431
+ [
2432
+ 33,
2433
+ 16,
2434
+ 0,
2435
+ 25,
2436
+ 0,
2437
+ "LATENT"
2438
+ ],
2439
+ [
2440
+ 34,
2441
+ 3,
2442
+ 0,
2443
+ 25,
2444
+ 1,
2445
+ "VAE"
2446
+ ],
2447
+ [
2448
+ 35,
2449
+ 35,
2450
+ 0,
2451
+ 26,
2452
+ 0,
2453
+ "LATENT"
2454
+ ],
2455
+ [
2456
+ 36,
2457
+ 23,
2458
+ 0,
2459
+ 26,
2460
+ 1,
2461
+ "FLOAT"
2462
+ ],
2463
+ [
2464
+ 37,
2465
+ 12,
2466
+ 0,
2467
+ 29,
2468
+ 0,
2469
+ "MODEL"
2470
+ ],
2471
+ [
2472
+ 38,
2473
+ 11,
2474
+ 0,
2475
+ 29,
2476
+ 1,
2477
+ "CONDITIONING"
2478
+ ],
2479
+ [
2480
+ 39,
2481
+ 37,
2482
+ 0,
2483
+ 32,
2484
+ 0,
2485
+ "MODEL"
2486
+ ],
2487
+ [
2488
+ 40,
2489
+ 11,
2490
+ 0,
2491
+ 32,
2492
+ 1,
2493
+ "CONDITIONING"
2494
+ ],
2495
+ [
2496
+ 41,
2497
+ 25,
2498
+ 0,
2499
+ 34,
2500
+ 0,
2501
+ "IMAGE"
2502
+ ],
2503
+ [
2504
+ 42,
2505
+ 14,
2506
+ 0,
2507
+ 34,
2508
+ 1,
2509
+ "AUDIO"
2510
+ ],
2511
+ [
2512
+ 43,
2513
+ 21,
2514
+ 1,
2515
+ 35,
2516
+ 0,
2517
+ "LATENT"
2518
+ ],
2519
+ [
2520
+ 44,
2521
+ 30,
2522
+ 0,
2523
+ 36,
2524
+ 0,
2525
+ "MODEL"
2526
+ ],
2527
+ [
2528
+ 45,
2529
+ 38,
2530
+ 0,
2531
+ 37,
2532
+ 0,
2533
+ "MODEL"
2534
+ ],
2535
+ [
2536
+ 46,
2537
+ 36,
2538
+ 0,
2539
+ 38,
2540
+ 0,
2541
+ "MODEL"
2542
+ ],
2543
+ [
2544
+ 47,
2545
+ 20,
2546
+ 0,
2547
+ 11,
2548
+ 8,
2549
+ "INT"
2550
+ ],
2551
+ [
2552
+ 48,
2553
+ 20,
2554
+ 1,
2555
+ 11,
2556
+ 9,
2557
+ "INT"
2558
+ ],
2559
+ [
2560
+ 49,
2561
+ 19,
2562
+ 1,
2563
+ 11,
2564
+ 10,
2565
+ "INT"
2566
+ ]
2567
+ ],
2568
+ "groups": [
2569
+ {
2570
+ "id": 1,
2571
+ "title": "User Inputs",
2572
+ "bounding": [
2573
+ -335.4580064947545,
2574
+ 5285.5407913785275,
2575
+ 1208.9503194675362,
2576
+ 834.450029042503
2577
+ ],
2578
+ "color": "#3f789e",
2579
+ "flags": {}
2580
+ },
2581
+ {
2582
+ "id": 2,
2583
+ "title": "Models",
2584
+ "bounding": [
2585
+ -336.15299615894105,
2586
+ 4593.880667348764,
2587
+ 700,
2588
+ 674
2589
+ ],
2590
+ "color": "#3f789e",
2591
+ "flags": {}
2592
+ },
2593
+ {
2594
+ "id": 3,
2595
+ "title": "Sampling",
2596
+ "bounding": [
2597
+ 1247.847003841059,
2598
+ 4593.880667348764,
2599
+ 659,
2600
+ 674
2601
+ ],
2602
+ "color": "#3f789e",
2603
+ "flags": {}
2604
+ },
2605
+ {
2606
+ "id": 4,
2607
+ "title": "Conditioning",
2608
+ "bounding": [
2609
+ 381.84700384105895,
2610
+ 4593.880667348764,
2611
+ 480,
2612
+ 674
2613
+ ],
2614
+ "color": "#3f789e",
2615
+ "flags": {}
2616
+ },
2617
+ {
2618
+ "id": 5,
2619
+ "title": "Two-stage sampling upscaling - Decoding and create video",
2620
+ "bounding": [
2621
+ 2310.3892605227284,
2622
+ 4593.880667348764,
2623
+ 948.4270012610004,
2624
+ 674.0547621542864
2625
+ ],
2626
+ "color": "#3f789e",
2627
+ "flags": {}
2628
+ },
2629
+ {
2630
+ "id": 6,
2631
+ "title": "H3 Latent Upscaler",
2632
+ "bounding": [
2633
+ 1924.847003841059,
2634
+ 4593.880667348764,
2635
+ 368,
2636
+ 674
2637
+ ],
2638
+ "color": "#3f789e",
2639
+ "flags": {}
2640
+ },
2641
+ {
2642
+ "id": 7,
2643
+ "title": "preview",
2644
+ "bounding": [
2645
+ 879.847003841059,
2646
+ 4593.880667348764,
2647
+ 350,
2648
+ 674
2649
+ ],
2650
+ "color": "#3f789e",
2651
+ "flags": {}
2652
+ }
2653
+ ],
2654
+ "config": {},
2655
+ "extra": {
2656
+ "ue_links": [],
2657
+ "ds": {
2658
+ "scale": 0.6316771145038458,
2659
+ "offset": [
2660
+ 2201.5181287178216,
2661
+ -4262.109523178327
2662
+ ]
2663
+ },
2664
+ "frontendVersion": "1.49.6",
2665
+ "VHS_latentpreview": false,
2666
+ "VHS_latentpreviewrate": 0,
2667
+ "VHS_MetadataImage": true,
2668
+ "VHS_KeepIntermediate": true
2669
+ },
2670
+ "version": 0.4
2671
+ }
h3_bundle/__init__.py ADDED
@@ -0,0 +1,475 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ H3 Bundle — sauvegarde et rechargement de latents AV + conditioning MiniMax H3.
3
+
4
+ Objectif : découpler la passe de génération (locale) de la passe d'upscaling
5
+ (instance Vast.ai), sans avoir à réimporter les images de référence ni le
6
+ CLIP qwen3vl 32B.
7
+
8
+ Installation :
9
+ cp -r h3_bundle /workspace/ComfyUI/custom_nodes/
10
+ (idem en local dans ComfyUI/custom_nodes/)
11
+ """
12
+
13
+ import os
14
+ import json
15
+ import time
16
+ import shutil
17
+ import torch
18
+
19
+ import folder_paths
20
+
21
+
22
+ # --------------------------------------------------------------------------
23
+ # helpers
24
+ # --------------------------------------------------------------------------
25
+
26
+ def _to_cpu(obj):
27
+ """Descend récursivement la structure et rapatrie tous les tenseurs en CPU."""
28
+ if torch.is_tensor(obj):
29
+ return obj.detach().cpu()
30
+ if isinstance(obj, dict):
31
+ return {k: _to_cpu(v) for k, v in obj.items()}
32
+ if isinstance(obj, (list, tuple)):
33
+ return type(obj)(_to_cpu(v) for v in obj)
34
+ return obj
35
+
36
+
37
+ def _shapes(obj):
38
+ """Cartographie des shapes/dtypes — c'est ce qui te sert à câbler l'amont."""
39
+ if torch.is_tensor(obj):
40
+ return f"Tensor{tuple(obj.shape)} {str(obj.dtype).replace('torch.', '')}"
41
+ if isinstance(obj, dict):
42
+ return {k: _shapes(v) for k, v in obj.items()}
43
+ if isinstance(obj, (list, tuple)):
44
+ return [_shapes(v) for v in obj]
45
+ if isinstance(obj, (int, float, str, bool, type(None))):
46
+ return repr(obj)
47
+ return type(obj).__name__
48
+
49
+
50
+ def _dir_size(path):
51
+ total = 0
52
+ for root, _, files in os.walk(path):
53
+ for f in files:
54
+ total += os.path.getsize(os.path.join(root, f))
55
+ return total
56
+
57
+
58
+ def _human(n):
59
+ for unit in ("B", "KB", "MB", "GB"):
60
+ if n < 1024:
61
+ return f"{n:.1f} {unit}"
62
+ n /= 1024
63
+ return f"{n:.1f} TB"
64
+
65
+
66
+ def _bundles_root():
67
+ return os.path.join(folder_paths.get_output_directory(), "h3_bundles")
68
+
69
+
70
+ # --------------------------------------------------------------------------
71
+ # preview
72
+ # --------------------------------------------------------------------------
73
+
74
+ def _tensor_to_pil(frame, max_width=512):
75
+ """[H,W,C] float 0-1 -> PIL, redimensionné pour rester léger."""
76
+ from PIL import Image
77
+ import numpy as np
78
+ arr = (frame.cpu().numpy() * 255.0).clip(0, 255).astype(np.uint8)
79
+ img = Image.fromarray(arr)
80
+ if img.width > max_width:
81
+ ratio = max_width / img.width
82
+ img = img.resize((max_width, int(img.height * ratio)), Image.LANCZOS)
83
+ return img
84
+
85
+
86
+ def _sample_frames(images, count):
87
+ """Échantillonne count frames réparties sur toute la séquence."""
88
+ total = images.shape[0]
89
+ if total <= count:
90
+ return list(range(total))
91
+ step = (total - 1) / (count - 1) if count > 1 else 1
92
+ return [min(total - 1, int(round(i * step))) for i in range(count)]
93
+
94
+
95
+ def _write_wav(audio, path):
96
+ """AUDIO ComfyUI ({waveform:[B,C,S], sample_rate}) -> wav 16 bits."""
97
+ import wave
98
+ import numpy as np
99
+ wav = audio["waveform"]
100
+ if wav.dim() == 3:
101
+ wav = wav[0]
102
+ data = wav.transpose(0, 1).cpu().numpy()
103
+ data = (data.clip(-1, 1) * 32767).astype(np.int16)
104
+ with wave.open(path, "wb") as fh:
105
+ fh.setnchannels(data.shape[1])
106
+ fh.setsampwidth(2)
107
+ fh.setframerate(int(audio["sample_rate"]))
108
+ fh.writeframes(data.tobytes())
109
+
110
+
111
+ def _encode_mp4(images, fps, out_path, audio=None):
112
+ """Encode la séquence en mp4 via ffmpeg. Retourne True si ça a marché."""
113
+ import subprocess
114
+ import tempfile
115
+
116
+ if shutil.which("ffmpeg") is None:
117
+ print("[SaveH3Bundle] ffmpeg introuvable, preview mp4 ignorée.")
118
+ return False
119
+
120
+ tmp = tempfile.mkdtemp(prefix="h3prev_")
121
+ try:
122
+ for i in range(images.shape[0]):
123
+ _tensor_to_pil(images[i], max_width=720).save(
124
+ os.path.join(tmp, f"{i:06d}.png"))
125
+
126
+ cmd = ["ffmpeg", "-y", "-loglevel", "error",
127
+ "-framerate", str(fps), "-i", os.path.join(tmp, "%06d.png")]
128
+
129
+ wav_path = None
130
+ if audio is not None:
131
+ wav_path = os.path.join(tmp, "audio.wav")
132
+ try:
133
+ _write_wav(audio, wav_path)
134
+ cmd += ["-i", wav_path]
135
+ except Exception as exc:
136
+ print(f"[SaveH3Bundle] audio preview ignoré : {exc}")
137
+ wav_path = None
138
+
139
+ cmd += ["-c:v", "libx264", "-pix_fmt", "yuv420p", "-crf", "20"]
140
+ if wav_path:
141
+ cmd += ["-c:a", "aac", "-shortest"]
142
+ cmd.append(out_path)
143
+
144
+ subprocess.run(cmd, check=True)
145
+ return True
146
+ except Exception as exc:
147
+ print(f"[SaveH3Bundle] échec encodage preview : {exc}")
148
+ return False
149
+ finally:
150
+ shutil.rmtree(tmp, ignore_errors=True)
151
+
152
+
153
+ # --------------------------------------------------------------------------
154
+ # SAVE
155
+ # --------------------------------------------------------------------------
156
+
157
+ class SaveH3Bundle:
158
+ """
159
+ Regroupe tout ce dont la passe d'upscale a besoin dans un dossier unique.
160
+
161
+ Le latent MiniMax H3 porte déjà vidéo + audio dans sa structure nested,
162
+ donc un seul torch.save suffit — contrairement au SaveLatent natif qui
163
+ ne sérialise que la clé `samples`.
164
+ """
165
+
166
+ @classmethod
167
+ def INPUT_TYPES(cls):
168
+ return {
169
+ "required": {
170
+ "latent": ("LATENT",),
171
+ "bundle_name": ("STRING", {"default": "run"}),
172
+ "mode": (["save", "replace_last", "skip"],),
173
+ },
174
+ "optional": {
175
+ "conditioning": ("CONDITIONING",),
176
+ "video": ("VIDEO",),
177
+ "video_path": ("STRING", {"default": ""}),
178
+ "images": ("IMAGE",),
179
+ "audio": ("AUDIO",),
180
+ "preview_frames": ("INT", {"default": 6, "min": 0, "max": 24}),
181
+ "preview_mp4": ("BOOLEAN", {"default": True}),
182
+ "keep_last_n": ("INT", {"default": 0, "min": 0, "max": 999}),
183
+ "width": ("INT", {"default": 0, "min": 0, "max": 16384}),
184
+ "height": ("INT", {"default": 0, "min": 0, "max": 16384}),
185
+ "seed": ("INT", {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF}),
186
+ "fps": ("INT", {"default": 24, "min": 1, "max": 240}),
187
+ "generation_seconds": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 600.0}),
188
+ "notes": ("STRING", {"default": "", "multiline": True}),
189
+ },
190
+ }
191
+
192
+ RETURN_TYPES = ("STRING",)
193
+ RETURN_NAMES = ("bundle_path",)
194
+ FUNCTION = "save"
195
+ OUTPUT_NODE = True
196
+ CATEGORY = "vast/h3"
197
+
198
+ @staticmethod
199
+ def _existing_bundles():
200
+ """Bundles valides, du plus ancien au plus récent."""
201
+ root = _bundles_root()
202
+ if not os.path.isdir(root):
203
+ return []
204
+ found = []
205
+ for name in sorted(os.listdir(root)):
206
+ path = os.path.join(root, name)
207
+ if os.path.isdir(path) and os.path.isfile(os.path.join(path, "latent.pt")):
208
+ found.append(path)
209
+ return found
210
+
211
+ @staticmethod
212
+ def _delete_bundle(path):
213
+ """Suppression volontairement paranoïaque : jamais hors de h3_bundles,
214
+ et uniquement un dossier qui contient bien un latent.pt."""
215
+ root = os.path.abspath(_bundles_root())
216
+ target = os.path.abspath(path)
217
+ if not target.startswith(root + os.sep):
218
+ print(f"[SaveH3Bundle] REFUS suppression hors bundles : {target}")
219
+ return False
220
+ if not os.path.isfile(os.path.join(target, "latent.pt")):
221
+ print(f"[SaveH3Bundle] REFUS suppression, pas un bundle : {target}")
222
+ return False
223
+ shutil.rmtree(target)
224
+ print(f"[SaveH3Bundle] supprimé : {os.path.basename(target)}")
225
+ return True
226
+
227
+ def save(self, latent, bundle_name, mode="save", conditioning=None,
228
+ video=None, video_path="", images=None, audio=None,
229
+ preview_frames=6, preview_mp4=True,
230
+ keep_last_n=0, width=0, height=0, seed=0, fps=24,
231
+ generation_seconds=0.0, notes=""):
232
+
233
+ if mode == "skip":
234
+ print("[SaveH3Bundle] mode 'skip' — rien n'est écrit sur le disque.")
235
+ return {"ui": {"text": ["skip"]}, "result": ("",)}
236
+
237
+ if mode == "replace_last":
238
+ existing = self._existing_bundles()
239
+ if existing:
240
+ self._delete_bundle(existing[-1])
241
+ else:
242
+ print("[SaveH3Bundle] 'replace_last' : aucun bundle à supprimer.")
243
+
244
+ safe = "".join(c for c in bundle_name if c.isalnum() or c in "-_") or "run"
245
+ stamp = time.strftime("%Y%m%d_%H%M%S")
246
+ root = os.path.join(_bundles_root(), f"{safe}_{stamp}")
247
+ os.makedirs(root, exist_ok=True)
248
+
249
+ manifest = {
250
+ "bundle_name": safe,
251
+ "created": stamp,
252
+ "width": width,
253
+ "height": height,
254
+ "seed": seed,
255
+ "fps": fps,
256
+ "generation_seconds": generation_seconds,
257
+ "notes": notes,
258
+ "has_conditioning": conditioning is not None,
259
+ }
260
+
261
+ torch.save(_to_cpu(latent), os.path.join(root, "latent.pt"))
262
+ manifest["latent_structure"] = _shapes(latent)
263
+
264
+ if conditioning is not None:
265
+ torch.save(_to_cpu(conditioning), os.path.join(root, "cond.pt"))
266
+ manifest["cond_structure"] = _shapes(conditioning)
267
+
268
+ manifest["files"] = {
269
+ f: _human(os.path.getsize(os.path.join(root, f)))
270
+ for f in sorted(os.listdir(root))
271
+ }
272
+ manifest["total_size"] = _human(_dir_size(root))
273
+
274
+ with open(os.path.join(root, "manifest.json"), "w") as fh:
275
+ json.dump(manifest, fh, indent=2, default=str)
276
+
277
+ print("\n" + "=" * 66)
278
+ print(f"[SaveH3Bundle] {root}")
279
+ print(f" total : {manifest['total_size']}")
280
+ print(" structure latent :")
281
+ print(json.dumps(manifest["latent_structure"], indent=4, default=str))
282
+ if conditioning is not None:
283
+ print(" structure conditioning :")
284
+ print(json.dumps(manifest["cond_structure"], indent=4, default=str))
285
+ print("=" * 66 + "\n")
286
+
287
+ # ---- preview ----------------------------------------------------
288
+ ui_images = []
289
+ dest_mp4 = os.path.join(root, "preview.mp4")
290
+ got_video = False
291
+
292
+ # 1. objet VIDEO natif (sortie de CreateVideo) — écriture directe
293
+ if video is not None:
294
+ try:
295
+ video.save_to(dest_mp4)
296
+ got_video = True
297
+ print(f"[SaveH3Bundle] vidéo écrite : {dest_mp4}")
298
+ except Exception as exc:
299
+ print(f"[SaveH3Bundle] save_to a échoué ({exc}), on tente autre chose.")
300
+
301
+ # 2. chemin d'un fichier déjà écrit par un autre node — simple copie
302
+ if not got_video and video_path:
303
+ src = video_path
304
+ if not os.path.isabs(src):
305
+ src = os.path.join(folder_paths.get_output_directory(), src)
306
+ if os.path.isfile(src):
307
+ shutil.copy2(src, os.path.join(root, os.path.basename(src)))
308
+ got_video = True
309
+ print(f"[SaveH3Bundle] vidéo copiée : {os.path.basename(src)}")
310
+ else:
311
+ print(f"[SaveH3Bundle] video_path introuvable : {src}")
312
+
313
+ # 3. dernier recours — ré-encodage depuis les frames
314
+ if not got_video and preview_mp4 and images is not None and images.shape[0] > 0:
315
+ if _encode_mp4(images, fps, dest_mp4, audio=audio):
316
+ got_video = True
317
+
318
+ manifest["has_video"] = got_video
319
+
320
+ if images is not None and images.shape[0] > 0 and preview_frames > 0:
321
+ sub = os.path.join("h3_bundles", os.path.basename(root))
322
+ for n, idx in enumerate(_sample_frames(images, preview_frames)):
323
+ fname = f"preview_{n:02d}.png"
324
+ _tensor_to_pil(images[idx]).save(os.path.join(root, fname))
325
+ ui_images.append({
326
+ "filename": fname,
327
+ "subfolder": sub,
328
+ "type": "output",
329
+ })
330
+
331
+ manifest["files"] = {
332
+ f: _human(os.path.getsize(os.path.join(root, f)))
333
+ for f in sorted(os.listdir(root)) if os.path.isfile(os.path.join(root, f))
334
+ }
335
+ manifest["total_size"] = _human(_dir_size(root))
336
+ with open(os.path.join(root, "manifest.json"), "w") as fh:
337
+ json.dump(manifest, fh, indent=2, default=str)
338
+
339
+ if keep_last_n > 0:
340
+ everything = self._existing_bundles()
341
+ for old in everything[:-keep_last_n]:
342
+ self._delete_bundle(old)
343
+
344
+ return {"ui": {"images": ui_images, "text": [root]}, "result": (root,)}
345
+
346
+
347
+ # --------------------------------------------------------------------------
348
+ # LOAD
349
+ # --------------------------------------------------------------------------
350
+
351
+ class LoadH3BundleBatch:
352
+ """
353
+ Recharge un bundle. ComfyUI n'a pas de boucle interne : le batch séquentiel
354
+ se fait en empilant N runs dans la queue.
355
+
356
+ mode = "index" -> tu choisis le bundle à la main (debug / rerun)
357
+ mode = "next_pending" -> avance tout seul dans le dossier, un bundle par
358
+ run. Tu cliques Queue N fois (ou tu mets le batch
359
+ count à N) et il déroule la liste.
360
+
361
+ Un bundle est considéré comme traité si un fichier de sortie portant son
362
+ nom existe déjà dans output/<output_subdir>/. Pas de marqueur : un run qui
363
+ plante est repris automatiquement au run suivant.
364
+ """
365
+
366
+ @classmethod
367
+ def INPUT_TYPES(cls):
368
+ return {
369
+ "required": {
370
+ "bundles_dir": ("STRING", {"default": "h3_bundles"}),
371
+ "mode": (["next_pending", "index"],),
372
+ "index": ("INT", {"default": 0, "min": 0, "max": 9999}),
373
+ },
374
+ "optional": {
375
+ "output_subdir": ("STRING", {"default": "minimax-h3"}),
376
+ },
377
+ }
378
+
379
+ RETURN_TYPES = ("LATENT", "CONDITIONING", "STRING", "INT", "INT", "INT")
380
+ RETURN_NAMES = ("latent", "conditioning", "filename_prefix",
381
+ "width", "height", "remaining")
382
+ FUNCTION = "load"
383
+ CATEGORY = "vast/h3"
384
+
385
+ @classmethod
386
+ def IS_CHANGED(cls, mode, **kwargs):
387
+ # en next_pending l'état change à chaque run : on casse le cache
388
+ if mode == "next_pending":
389
+ return float("nan")
390
+ return json.dumps(kwargs, sort_keys=True, default=str)
391
+
392
+ def _resolve_dir(self, bundles_dir):
393
+ if os.path.isabs(bundles_dir):
394
+ return bundles_dir
395
+ for base in (folder_paths.get_output_directory(),
396
+ folder_paths.get_input_directory()):
397
+ cand = os.path.join(base, bundles_dir)
398
+ if os.path.isdir(cand):
399
+ return cand
400
+ return os.path.join(folder_paths.get_output_directory(), bundles_dir)
401
+
402
+ def _list_bundles(self, root):
403
+ if not os.path.isdir(root):
404
+ raise FileNotFoundError(f"Dossier de bundles introuvable : {root}")
405
+ out = []
406
+ for name in sorted(os.listdir(root)):
407
+ path = os.path.join(root, name)
408
+ if os.path.isdir(path) and os.path.isfile(os.path.join(path, "latent.pt")):
409
+ out.append(path)
410
+ if not out:
411
+ raise FileNotFoundError(f"Aucun bundle valide dans {root}")
412
+ return out
413
+
414
+ def _has_output(self, bundle_path, output_subdir):
415
+ """Un bundle est traité si un fichier de sortie porte son nom."""
416
+ out_dir = os.path.join(folder_paths.get_output_directory(), output_subdir)
417
+ if not os.path.isdir(out_dir):
418
+ return False
419
+ name = os.path.basename(bundle_path)
420
+ return any(f.startswith(name) for f in os.listdir(out_dir))
421
+
422
+ def load(self, bundles_dir, mode, index, output_subdir="minimax-h3"):
423
+ root = self._resolve_dir(bundles_dir)
424
+ bundles = self._list_bundles(root)
425
+
426
+ if mode == "index":
427
+ if index >= len(bundles):
428
+ raise IndexError(f"index {index} hors bornes ({len(bundles)} bundles)")
429
+ target = bundles[index]
430
+ remaining = len(bundles) - index - 1
431
+ else:
432
+ pending = [b for b in bundles if not self._has_output(b, output_subdir)]
433
+ if not pending:
434
+ raise RuntimeError(
435
+ f"Les {len(bundles)} bundles de {root} ont déjà une sortie dans "
436
+ f"output/{output_subdir}/. Supprime les mp4 correspondants pour "
437
+ f"les relancer, ou passe en mode 'index'."
438
+ )
439
+ target = pending[0]
440
+ remaining = len(pending) - 1
441
+
442
+ latent = torch.load(os.path.join(target, "latent.pt"),
443
+ map_location="cpu", weights_only=False)
444
+
445
+ cond_file = os.path.join(target, "cond.pt")
446
+ conditioning = []
447
+ if os.path.isfile(cond_file):
448
+ conditioning = torch.load(cond_file, map_location="cpu", weights_only=False)
449
+
450
+ width = height = 0
451
+ manifest_file = os.path.join(target, "manifest.json")
452
+ if os.path.isfile(manifest_file):
453
+ with open(manifest_file) as fh:
454
+ m = json.load(fh)
455
+ width = int(m.get("width", 0) or 0)
456
+ height = int(m.get("height", 0) or 0)
457
+
458
+ name = os.path.basename(target)
459
+ prefix = f"minimax-h3/{name}_upscaled"
460
+
461
+ print(f"[LoadH3BundleBatch] {name} | cond={'oui' if conditioning else 'non'} "
462
+ f"| {width}x{height} | restants : {remaining}")
463
+
464
+ return (latent, conditioning, prefix, width, height, remaining)
465
+
466
+
467
+ NODE_CLASS_MAPPINGS = {
468
+ "SaveH3Bundle": SaveH3Bundle,
469
+ "LoadH3BundleBatch": LoadH3BundleBatch,
470
+ }
471
+
472
+ NODE_DISPLAY_NAME_MAPPINGS = {
473
+ "SaveH3Bundle": "Save H3 Bundle (latent AV + cond)",
474
+ "LoadH3BundleBatch": "Load H3 Bundle (batch séquentiel)",
475
+ }
h3_bundle/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (25.9 kB). View file
 
note.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ https://github.com/Saganaki22/ComfyUI-VDN-H3
workflow/Bundle_h3.json ADDED
@@ -0,0 +1,1978 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "159c3537-7c23-4c93-bd07-e5439b5c4017",
3
+ "revision": 0,
4
+ "last_node_id": 36,
5
+ "last_link_id": 38,
6
+ "nodes": [
7
+ {
8
+ "id": 1,
9
+ "type": "MinimaxH3LatentUpscaler3D",
10
+ "pos": [
11
+ 3856.1660843903683,
12
+ 5916.413832444967
13
+ ],
14
+ "size": [
15
+ 461.3766842951726,
16
+ 226
17
+ ],
18
+ "flags": {},
19
+ "order": 14,
20
+ "mode": 0,
21
+ "inputs": [
22
+ {
23
+ "name": "latent",
24
+ "type": "*",
25
+ "link": 18
26
+ }
27
+ ],
28
+ "outputs": [
29
+ {
30
+ "name": "latent",
31
+ "type": "*",
32
+ "links": [
33
+ 36
34
+ ]
35
+ }
36
+ ],
37
+ "properties": {
38
+ "aux_id": "LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler",
39
+ "ver": "d7c01b9011f2e8439493f6c02c29995a27df276f",
40
+ "Node name for S&R": "MinimaxH3LatentUpscaler3D",
41
+ "ue_properties": {
42
+ "widget_ue_connectable": {},
43
+ "input_ue_unconnectable": {},
44
+ "version": "7.5.1"
45
+ }
46
+ },
47
+ "widgets_values": [
48
+ "minimax_h3_latent_upscaler_3d_bf16.safetensors",
49
+ "scale by multiplier",
50
+ 1.5,
51
+ 32,
52
+ true,
53
+ true,
54
+ "cuda",
55
+ "fp16"
56
+ ],
57
+ "widgets_values_named": {
58
+ "model_name": "minimax_h3_latent_upscaler_3d_bf16.safetensors",
59
+ "mode": "scale by multiplier",
60
+ "mode.scale": 1.5,
61
+ "align": 32,
62
+ "enable_temporal_chunking": true,
63
+ "force_unload": true,
64
+ "device": "cuda",
65
+ "precision": "fp16"
66
+ }
67
+ },
68
+ {
69
+ "id": 2,
70
+ "type": "GetNode",
71
+ "pos": [
72
+ 4189.533821259078,
73
+ 6352.722810277472
74
+ ],
75
+ "size": [
76
+ 210,
77
+ 58
78
+ ],
79
+ "flags": {},
80
+ "order": 3,
81
+ "mode": 0,
82
+ "inputs": [],
83
+ "outputs": [
84
+ {
85
+ "name": "MODEL",
86
+ "type": "MODEL",
87
+ "links": [
88
+ 1,
89
+ 3
90
+ ]
91
+ }
92
+ ],
93
+ "title": "Get_model_VDN",
94
+ "properties": {
95
+ "Node name for S&R": "GetNode",
96
+ "aux_id": "kijai/ComfyUI-KJNodes",
97
+ "ue_properties": {
98
+ "widget_ue_connectable": {},
99
+ "version": "7.5.1",
100
+ "input_ue_unconnectable": {}
101
+ }
102
+ },
103
+ "widgets_values": [
104
+ "model_VDN"
105
+ ],
106
+ "widgets_values_named": {
107
+ "Constant": "model_VDN"
108
+ },
109
+ "color": "#1f1f48",
110
+ "bgcolor": "rgba(24,24,27,.9)"
111
+ },
112
+ {
113
+ "id": 4,
114
+ "type": "KSamplerSelect",
115
+ "pos": [
116
+ 4540.866963201227,
117
+ 6206.558421641109
118
+ ],
119
+ "size": [
120
+ 361.19999999999993,
121
+ 66.19999999999982
122
+ ],
123
+ "flags": {},
124
+ "order": 0,
125
+ "mode": 0,
126
+ "inputs": [],
127
+ "outputs": [
128
+ {
129
+ "name": "SAMPLER",
130
+ "type": "SAMPLER",
131
+ "links": [
132
+ 6
133
+ ]
134
+ }
135
+ ],
136
+ "properties": {
137
+ "cnr_id": "comfy-core",
138
+ "ver": "0.30.0",
139
+ "Node name for S&R": "KSamplerSelect",
140
+ "ue_properties": {
141
+ "widget_ue_connectable": {},
142
+ "version": "7.5.1",
143
+ "input_ue_unconnectable": {}
144
+ }
145
+ },
146
+ "widgets_values": [
147
+ "euler"
148
+ ],
149
+ "widgets_values_named": {
150
+ "sampler_name": "euler"
151
+ }
152
+ },
153
+ {
154
+ "id": 5,
155
+ "type": "BasicGuider",
156
+ "pos": [
157
+ 4530.087815400926,
158
+ 6089.176927689423
159
+ ],
160
+ "size": [
161
+ 360,
162
+ 60
163
+ ],
164
+ "flags": {},
165
+ "order": 16,
166
+ "mode": 0,
167
+ "inputs": [
168
+ {
169
+ "name": "model",
170
+ "type": "MODEL",
171
+ "link": 1
172
+ },
173
+ {
174
+ "name": "conditioning",
175
+ "type": "CONDITIONING",
176
+ "link": 19
177
+ }
178
+ ],
179
+ "outputs": [
180
+ {
181
+ "name": "GUIDER",
182
+ "type": "GUIDER",
183
+ "links": [
184
+ 5
185
+ ]
186
+ }
187
+ ],
188
+ "properties": {
189
+ "cnr_id": "comfy-core",
190
+ "ver": "0.30.0",
191
+ "Node name for S&R": "BasicGuider",
192
+ "ue_properties": {
193
+ "widget_ue_connectable": {},
194
+ "version": "7.5.1",
195
+ "input_ue_unconnectable": {}
196
+ }
197
+ }
198
+ },
199
+ {
200
+ "id": 6,
201
+ "type": "RandomNoise",
202
+ "pos": [
203
+ 4540.866963201227,
204
+ 5947.758421641106
205
+ ],
206
+ "size": [
207
+ 360,
208
+ 90
209
+ ],
210
+ "flags": {},
211
+ "order": 1,
212
+ "mode": 0,
213
+ "inputs": [],
214
+ "outputs": [
215
+ {
216
+ "name": "NOISE",
217
+ "type": "NOISE",
218
+ "links": [
219
+ 4
220
+ ]
221
+ }
222
+ ],
223
+ "properties": {
224
+ "cnr_id": "comfy-core",
225
+ "ver": "0.30.0",
226
+ "Node name for S&R": "RandomNoise",
227
+ "ue_properties": {
228
+ "widget_ue_connectable": {},
229
+ "version": "7.5.1",
230
+ "input_ue_unconnectable": {}
231
+ }
232
+ },
233
+ "widgets_values": [
234
+ 42,
235
+ "fixed"
236
+ ],
237
+ "widgets_values_named": {
238
+ "noise_seed": 42,
239
+ "control_after_generate": "fixed"
240
+ }
241
+ },
242
+ {
243
+ "id": 7,
244
+ "type": "BasicScheduler",
245
+ "pos": [
246
+ 4540.866963201227,
247
+ 6328.758421641109
248
+ ],
249
+ "size": [
250
+ 370,
251
+ 130
252
+ ],
253
+ "flags": {},
254
+ "order": 9,
255
+ "mode": 0,
256
+ "inputs": [
257
+ {
258
+ "name": "model",
259
+ "type": "MODEL",
260
+ "link": 3
261
+ }
262
+ ],
263
+ "outputs": [
264
+ {
265
+ "name": "SIGMAS",
266
+ "type": "SIGMAS",
267
+ "links": [
268
+ 7
269
+ ]
270
+ }
271
+ ],
272
+ "properties": {
273
+ "cnr_id": "comfy-core",
274
+ "ver": "0.30.0",
275
+ "Node name for S&R": "BasicScheduler",
276
+ "ue_properties": {
277
+ "widget_ue_connectable": {},
278
+ "version": "7.5.1",
279
+ "input_ue_unconnectable": {}
280
+ }
281
+ },
282
+ "widgets_values": [
283
+ "simple",
284
+ 3,
285
+ 0.2
286
+ ],
287
+ "widgets_values_named": {
288
+ "scheduler": "simple",
289
+ "steps": 3,
290
+ "denoise": 0.2
291
+ }
292
+ },
293
+ {
294
+ "id": 8,
295
+ "type": "SamplerCustomAdvanced",
296
+ "pos": [
297
+ 5102.116963201228,
298
+ 6078.758421641109
299
+ ],
300
+ "size": [
301
+ 239.76709241172045,
302
+ 326
303
+ ],
304
+ "flags": {},
305
+ "order": 20,
306
+ "mode": 0,
307
+ "inputs": [
308
+ {
309
+ "name": "noise",
310
+ "type": "NOISE",
311
+ "link": 4
312
+ },
313
+ {
314
+ "name": "guider",
315
+ "type": "GUIDER",
316
+ "link": 5
317
+ },
318
+ {
319
+ "name": "sampler",
320
+ "type": "SAMPLER",
321
+ "link": 6
322
+ },
323
+ {
324
+ "name": "sigmas",
325
+ "type": "SIGMAS",
326
+ "link": 7
327
+ },
328
+ {
329
+ "name": "latent_image",
330
+ "type": "LATENT",
331
+ "link": 36
332
+ }
333
+ ],
334
+ "outputs": [
335
+ {
336
+ "name": "output",
337
+ "type": "LATENT",
338
+ "links": [
339
+ 9
340
+ ]
341
+ },
342
+ {
343
+ "name": "denoised_output",
344
+ "type": "LATENT",
345
+ "links": []
346
+ }
347
+ ],
348
+ "properties": {
349
+ "cnr_id": "comfy-core",
350
+ "ver": "0.30.0",
351
+ "Node name for S&R": "SamplerCustomAdvanced",
352
+ "ue_properties": {
353
+ "widget_ue_connectable": {},
354
+ "version": "7.5.1",
355
+ "input_ue_unconnectable": {}
356
+ }
357
+ }
358
+ },
359
+ {
360
+ "id": 9,
361
+ "type": "GetNode",
362
+ "pos": [
363
+ 5462.805825592742,
364
+ 6109.340215847699
365
+ ],
366
+ "size": [
367
+ 210,
368
+ 58
369
+ ],
370
+ "flags": {
371
+ "collapsed": false
372
+ },
373
+ "order": 5,
374
+ "mode": 0,
375
+ "inputs": [],
376
+ "outputs": [
377
+ {
378
+ "name": "VAE",
379
+ "type": "VAE",
380
+ "links": [
381
+ 10
382
+ ]
383
+ }
384
+ ],
385
+ "title": "Get_vae_video",
386
+ "properties": {
387
+ "Node name for S&R": "GetNode",
388
+ "aux_id": "kijai/ComfyUI-KJNodes",
389
+ "ue_properties": {
390
+ "widget_ue_connectable": {},
391
+ "version": "7.5.1",
392
+ "input_ue_unconnectable": {}
393
+ }
394
+ },
395
+ "widgets_values": [
396
+ "vae_video"
397
+ ],
398
+ "widgets_values_named": {
399
+ "Constant": "vae_video"
400
+ },
401
+ "color": "#af3535",
402
+ "bgcolor": "rgba(24,24,27,.9)"
403
+ },
404
+ {
405
+ "id": 10,
406
+ "type": "VAEDecode",
407
+ "pos": [
408
+ 5477.721985489667,
409
+ 6271.643325921581
410
+ ],
411
+ "size": [
412
+ 230,
413
+ 60
414
+ ],
415
+ "flags": {
416
+ "collapsed": false
417
+ },
418
+ "order": 21,
419
+ "mode": 0,
420
+ "inputs": [
421
+ {
422
+ "name": "samples",
423
+ "type": "LATENT",
424
+ "link": 9
425
+ },
426
+ {
427
+ "name": "vae",
428
+ "type": "VAE",
429
+ "link": 10
430
+ }
431
+ ],
432
+ "outputs": [
433
+ {
434
+ "name": "IMAGE",
435
+ "type": "IMAGE",
436
+ "links": [
437
+ 11
438
+ ]
439
+ }
440
+ ],
441
+ "properties": {
442
+ "cnr_id": "comfy-core",
443
+ "ver": "0.30.0",
444
+ "Node name for S&R": "VAEDecode",
445
+ "ue_properties": {
446
+ "widget_ue_connectable": {},
447
+ "version": "7.5.1",
448
+ "input_ue_unconnectable": {}
449
+ }
450
+ }
451
+ },
452
+ {
453
+ "id": 11,
454
+ "type": "MathExpression|pysssss",
455
+ "pos": [
456
+ 5860.105045064689,
457
+ 6373.189217624035
458
+ ],
459
+ "size": [
460
+ 400,
461
+ 200
462
+ ],
463
+ "flags": {},
464
+ "order": 6,
465
+ "mode": 0,
466
+ "inputs": [
467
+ {
468
+ "name": "a",
469
+ "shape": 7,
470
+ "type": "INT,FLOAT,IMAGE,LATENT",
471
+ "link": null
472
+ },
473
+ {
474
+ "name": "b",
475
+ "shape": 7,
476
+ "type": "INT,FLOAT,IMAGE,LATENT",
477
+ "link": null
478
+ },
479
+ {
480
+ "name": "c",
481
+ "shape": 7,
482
+ "type": "INT,FLOAT,IMAGE,LATENT",
483
+ "link": null
484
+ }
485
+ ],
486
+ "outputs": [
487
+ {
488
+ "name": "INT",
489
+ "type": "INT",
490
+ "links": null
491
+ },
492
+ {
493
+ "name": "FLOAT",
494
+ "type": "FLOAT",
495
+ "links": [
496
+ 14,
497
+ 35
498
+ ]
499
+ }
500
+ ],
501
+ "properties": {
502
+ "cnr_id": "comfyui-custom-scripts",
503
+ "ver": "1.2.5",
504
+ "ue_properties": {
505
+ "widget_ue_connectable": {},
506
+ "input_ue_unconnectable": {},
507
+ "version": "7.5.1"
508
+ }
509
+ },
510
+ "widgets_values": [
511
+ "24*2"
512
+ ],
513
+ "widgets_values_named": {
514
+ "expression": "24*2"
515
+ }
516
+ },
517
+ {
518
+ "id": 12,
519
+ "type": "RIFEInterpolation",
520
+ "pos": [
521
+ 6289.458038457433,
522
+ 6271.208568461926
523
+ ],
524
+ "size": [
525
+ 270,
526
+ 178
527
+ ],
528
+ "flags": {},
529
+ "order": 22,
530
+ "mode": 0,
531
+ "inputs": [
532
+ {
533
+ "name": "images",
534
+ "type": "IMAGE",
535
+ "link": 11
536
+ },
537
+ {
538
+ "name": "target_fps",
539
+ "type": "FLOAT",
540
+ "widget": {
541
+ "name": "target_fps"
542
+ },
543
+ "link": 35
544
+ }
545
+ ],
546
+ "outputs": [
547
+ {
548
+ "name": "images",
549
+ "type": "IMAGE",
550
+ "links": [
551
+ 12
552
+ ]
553
+ }
554
+ ],
555
+ "properties": {
556
+ "aux_id": "GACLove/ComfyUI-VFI",
557
+ "ver": "6176a430f12cd16003f4664c1e3c6af8e96cc3c6",
558
+ "Node name for S&R": "RIFEInterpolation",
559
+ "ue_properties": {
560
+ "widget_ue_connectable": {},
561
+ "input_ue_unconnectable": {},
562
+ "version": "7.5.1"
563
+ }
564
+ },
565
+ "widgets_values": [
566
+ 24,
567
+ 48,
568
+ 1,
569
+ "flownet.pkl",
570
+ 8,
571
+ true
572
+ ],
573
+ "widgets_values_named": {
574
+ "source_fps": 24,
575
+ "target_fps": 48,
576
+ "scale": 1,
577
+ "model_name": "flownet.pkl",
578
+ "batch_size": 8,
579
+ "use_fp16": true
580
+ },
581
+ "ndSuperSelectorEnabled": false,
582
+ "ndPowerEnabled": false
583
+ },
584
+ {
585
+ "id": 13,
586
+ "type": "VHS_VideoCombine",
587
+ "pos": [
588
+ 7003.629054557495,
589
+ 5614.858443597528
590
+ ],
591
+ "size": [
592
+ 693.741563959413,
593
+ 1470.9026065990217
594
+ ],
595
+ "flags": {
596
+ "collapsed": false
597
+ },
598
+ "order": 23,
599
+ "mode": 0,
600
+ "inputs": [
601
+ {
602
+ "name": "images",
603
+ "type": "IMAGE",
604
+ "link": 12
605
+ },
606
+ {
607
+ "name": "audio",
608
+ "shape": 7,
609
+ "type": "AUDIO",
610
+ "link": 37
611
+ },
612
+ {
613
+ "name": "meta_batch",
614
+ "shape": 7,
615
+ "type": "VHS_BatchManager",
616
+ "link": null
617
+ },
618
+ {
619
+ "name": "vae",
620
+ "shape": 7,
621
+ "type": "VAE",
622
+ "link": null
623
+ },
624
+ {
625
+ "name": "frame_rate",
626
+ "type": "FLOAT",
627
+ "widget": {
628
+ "name": "frame_rate"
629
+ },
630
+ "link": 14
631
+ }
632
+ ],
633
+ "outputs": [
634
+ {
635
+ "name": "Filenames",
636
+ "type": "VHS_FILENAMES",
637
+ "links": null
638
+ }
639
+ ],
640
+ "title": "Video Output 2 (Output)",
641
+ "properties": {
642
+ "cnr_id": "comfyui-videohelpersuite",
643
+ "ver": "993082e4f2473bf4acaf06f51e33877a7eb38960",
644
+ "Node name for S&R": "VHS_VideoCombine",
645
+ "ue_properties": {
646
+ "widget_ue_connectable": {
647
+ "frame_rate": true
648
+ },
649
+ "version": "7.5.1",
650
+ "input_ue_unconnectable": {}
651
+ },
652
+ "aux_id": "kosinkadink/ComfyUI-VideoHelperSuite"
653
+ },
654
+ "widgets_values": {
655
+ "frame_rate": 24,
656
+ "loop_count": 0,
657
+ "filename_prefix": "minimax-h3/Upscaled_24_fps_video_",
658
+ "format": "video/h264-mp4",
659
+ "pix_fmt": "yuv420p",
660
+ "crf": 12,
661
+ "save_metadata": true,
662
+ "trim_to_audio": false,
663
+ "pingpong": false,
664
+ "save_output": true,
665
+ "videopreview": {
666
+ "hidden": false,
667
+ "paused": false,
668
+ "params": {
669
+ "filename": "Upscaled_24_fps_video__00006-audio.mp4",
670
+ "subfolder": "minimax-h3",
671
+ "type": "output",
672
+ "format": "video/h264-mp4",
673
+ "frame_rate": 48,
674
+ "workflow": "Upscaled_24_fps_video__00006.png",
675
+ "fullpath": "/home/bryan/Documents/ComfyUI/ComfyUI/output/minimax-h3/Upscaled_24_fps_video__00006-audio.mp4"
676
+ },
677
+ "muted": false
678
+ }
679
+ },
680
+ "widgets_values_named": {
681
+ "frame_rate": 24,
682
+ "loop_count": 0,
683
+ "filename_prefix": "minimax-h3/Upscaled_24_fps_video_",
684
+ "format": "video/h264-mp4",
685
+ "pix_fmt": "yuv420p",
686
+ "crf": 12,
687
+ "save_metadata": true,
688
+ "trim_to_audio": false,
689
+ "pingpong": false,
690
+ "save_output": true,
691
+ "videopreview": {
692
+ "hidden": false,
693
+ "paused": false,
694
+ "params": {
695
+ "filename": "Upscaled_24_fps_video__00006-audio.mp4",
696
+ "subfolder": "minimax-h3",
697
+ "type": "output",
698
+ "format": "video/h264-mp4",
699
+ "frame_rate": 48,
700
+ "workflow": "Upscaled_24_fps_video__00006.png",
701
+ "fullpath": "/home/bryan/Documents/ComfyUI/ComfyUI/output/minimax-h3/Upscaled_24_fps_video__00006-audio.mp4"
702
+ },
703
+ "muted": false
704
+ }
705
+ },
706
+ "ndSuperSelectorEnabled": false,
707
+ "ndPowerEnabled": false
708
+ },
709
+ {
710
+ "id": 14,
711
+ "type": "GetNode",
712
+ "pos": [
713
+ 4024.055823306182,
714
+ 5553.142281680486
715
+ ],
716
+ "size": [
717
+ 210,
718
+ 58
719
+ ],
720
+ "flags": {},
721
+ "order": 2,
722
+ "mode": 0,
723
+ "inputs": [],
724
+ "outputs": [
725
+ {
726
+ "name": "*",
727
+ "type": "*",
728
+ "links": []
729
+ }
730
+ ],
731
+ "title": "Get_src_audio",
732
+ "properties": {
733
+ "Node name for S&R": "GetNode",
734
+ "aux_id": "kijai/ComfyUI-KJNodes",
735
+ "ue_properties": {
736
+ "widget_ue_connectable": {},
737
+ "version": "7.5.1",
738
+ "input_ue_unconnectable": {}
739
+ }
740
+ },
741
+ "widgets_values": [
742
+ "src_audio"
743
+ ],
744
+ "widgets_values_named": {
745
+ "Constant": "src_audio"
746
+ }
747
+ },
748
+ {
749
+ "id": 15,
750
+ "type": "LoadH3BundleBatch",
751
+ "pos": [
752
+ 3663.0697659653974,
753
+ 6211.159206074967
754
+ ],
755
+ "size": [
756
+ 329.2798828125,
757
+ 230
758
+ ],
759
+ "flags": {},
760
+ "order": 13,
761
+ "mode": 0,
762
+ "inputs": [
763
+ {
764
+ "name": "index",
765
+ "type": "INT",
766
+ "widget": {
767
+ "name": "index"
768
+ },
769
+ "link": 38
770
+ }
771
+ ],
772
+ "outputs": [
773
+ {
774
+ "name": "latent",
775
+ "type": "LATENT",
776
+ "links": [
777
+ 18,
778
+ 29
779
+ ]
780
+ },
781
+ {
782
+ "name": "conditioning",
783
+ "type": "CONDITIONING",
784
+ "links": [
785
+ 19
786
+ ]
787
+ },
788
+ {
789
+ "name": "filename_prefix",
790
+ "type": "STRING",
791
+ "links": null
792
+ },
793
+ {
794
+ "name": "width",
795
+ "type": "INT",
796
+ "links": [
797
+ 17
798
+ ]
799
+ },
800
+ {
801
+ "name": "height",
802
+ "type": "INT",
803
+ "links": [
804
+ 16
805
+ ]
806
+ },
807
+ {
808
+ "name": "remaining",
809
+ "type": "INT",
810
+ "links": [
811
+ 15
812
+ ]
813
+ }
814
+ ],
815
+ "properties": {
816
+ "Node name for S&R": "LoadH3BundleBatch",
817
+ "ue_properties": {
818
+ "widget_ue_connectable": {},
819
+ "input_ue_unconnectable": {},
820
+ "version": "7.5.1"
821
+ }
822
+ },
823
+ "widgets_values": [
824
+ "h3_bundles/",
825
+ "index",
826
+ 0,
827
+ false
828
+ ],
829
+ "widgets_values_named": {
830
+ "bundles_dir": "h3_bundles/",
831
+ "mode": "index",
832
+ "index": 0,
833
+ "output_subdir": false
834
+ }
835
+ },
836
+ {
837
+ "id": 17,
838
+ "type": "easy showAnything",
839
+ "pos": [
840
+ 4021.6464033959273,
841
+ 6558.944584421644
842
+ ],
843
+ "size": [
844
+ 210,
845
+ 88
846
+ ],
847
+ "flags": {},
848
+ "order": 19,
849
+ "mode": 0,
850
+ "inputs": [
851
+ {
852
+ "name": "anything",
853
+ "shape": 7,
854
+ "type": "*",
855
+ "link": 15
856
+ }
857
+ ],
858
+ "outputs": [
859
+ {
860
+ "name": "output",
861
+ "type": "*",
862
+ "links": null
863
+ }
864
+ ],
865
+ "properties": {
866
+ "cnr_id": "comfyui-easy-use",
867
+ "ver": "1.3.6",
868
+ "Node name for S&R": "easy showAnything",
869
+ "ue_properties": {
870
+ "widget_ue_connectable": {},
871
+ "input_ue_unconnectable": {},
872
+ "version": "7.5.1"
873
+ }
874
+ },
875
+ "widgets_values": [
876
+ "0"
877
+ ],
878
+ "widgets_values_named": {
879
+ "text": "0"
880
+ }
881
+ },
882
+ {
883
+ "id": 18,
884
+ "type": "easy showAnything",
885
+ "pos": [
886
+ 4286.225331937098,
887
+ 6495.741734554551
888
+ ],
889
+ "size": [
890
+ 210,
891
+ 88
892
+ ],
893
+ "flags": {},
894
+ "order": 18,
895
+ "mode": 0,
896
+ "inputs": [
897
+ {
898
+ "name": "anything",
899
+ "shape": 7,
900
+ "type": "*",
901
+ "link": 16
902
+ }
903
+ ],
904
+ "outputs": [
905
+ {
906
+ "name": "output",
907
+ "type": "*",
908
+ "links": null
909
+ }
910
+ ],
911
+ "properties": {
912
+ "cnr_id": "comfyui-easy-use",
913
+ "ver": "1.3.6",
914
+ "Node name for S&R": "easy showAnything",
915
+ "ue_properties": {
916
+ "widget_ue_connectable": {},
917
+ "input_ue_unconnectable": {},
918
+ "version": "7.5.1"
919
+ }
920
+ },
921
+ "widgets_values": [
922
+ "416"
923
+ ],
924
+ "widgets_values_named": {
925
+ "text": "416"
926
+ }
927
+ },
928
+ {
929
+ "id": 19,
930
+ "type": "easy showAnything",
931
+ "pos": [
932
+ 4020.4387216756945,
933
+ 6286.107615783938
934
+ ],
935
+ "size": [
936
+ 210,
937
+ 88
938
+ ],
939
+ "flags": {},
940
+ "order": 17,
941
+ "mode": 0,
942
+ "inputs": [
943
+ {
944
+ "name": "anything",
945
+ "shape": 7,
946
+ "type": "*",
947
+ "link": 17
948
+ }
949
+ ],
950
+ "outputs": [
951
+ {
952
+ "name": "output",
953
+ "type": "*",
954
+ "links": null
955
+ }
956
+ ],
957
+ "properties": {
958
+ "cnr_id": "comfyui-easy-use",
959
+ "ver": "1.3.6",
960
+ "Node name for S&R": "easy showAnything",
961
+ "ue_properties": {
962
+ "widget_ue_connectable": {},
963
+ "input_ue_unconnectable": {},
964
+ "version": "7.5.1"
965
+ }
966
+ },
967
+ "widgets_values": [
968
+ "256"
969
+ ],
970
+ "widgets_values_named": {
971
+ "text": "256"
972
+ }
973
+ },
974
+ {
975
+ "id": 26,
976
+ "type": "deb3547e-1d90-4a4b-8f05-6e17727281b0",
977
+ "pos": [
978
+ 3080.3347470774556,
979
+ 5784.654012641178
980
+ ],
981
+ "size": [
982
+ 530.5983197868572,
983
+ 237.79108895109584
984
+ ],
985
+ "flags": {},
986
+ "order": 4,
987
+ "mode": 0,
988
+ "inputs": [],
989
+ "outputs": [
990
+ {
991
+ "name": "MODEL",
992
+ "type": "MODEL",
993
+ "links": [
994
+ 28
995
+ ]
996
+ },
997
+ {
998
+ "label": "Vae_Audio",
999
+ "name": "VAE",
1000
+ "type": "VAE",
1001
+ "links": [
1002
+ 32
1003
+ ]
1004
+ },
1005
+ {
1006
+ "label": "VAE_Video",
1007
+ "name": "VAE_1",
1008
+ "type": "VAE",
1009
+ "links": [
1010
+ 33
1011
+ ]
1012
+ }
1013
+ ],
1014
+ "properties": {
1015
+ "cnr_id": "comfy-core",
1016
+ "ver": "0.34.5",
1017
+ "ue_properties": {
1018
+ "widget_ue_connectable": {},
1019
+ "input_ue_unconnectable": {},
1020
+ "version": "7.5.1"
1021
+ },
1022
+ "previewExposures": []
1023
+ }
1024
+ },
1025
+ {
1026
+ "id": 27,
1027
+ "type": "SetNode",
1028
+ "pos": [
1029
+ 3863.182966811336,
1030
+ 5730.639268000472
1031
+ ],
1032
+ "size": [
1033
+ 210,
1034
+ 58
1035
+ ],
1036
+ "flags": {},
1037
+ "order": 10,
1038
+ "mode": 0,
1039
+ "inputs": [
1040
+ {
1041
+ "name": "MODEL",
1042
+ "type": "MODEL",
1043
+ "link": 28
1044
+ }
1045
+ ],
1046
+ "outputs": [
1047
+ {
1048
+ "name": "MODEL",
1049
+ "type": "MODEL",
1050
+ "links": []
1051
+ }
1052
+ ],
1053
+ "title": "Set_model_VDN",
1054
+ "properties": {
1055
+ "Node name for S&R": "SetNode",
1056
+ "aux_id": "kijai/ComfyUI-KJNodes",
1057
+ "previousName": "model_VDN",
1058
+ "ue_properties": {
1059
+ "widget_ue_connectable": {},
1060
+ "version": "7.5.1",
1061
+ "input_ue_unconnectable": {}
1062
+ }
1063
+ },
1064
+ "widgets_values": [
1065
+ "model_VDN"
1066
+ ],
1067
+ "widgets_values_named": {
1068
+ "Constant": "model_VDN"
1069
+ },
1070
+ "color": "#1f1f48",
1071
+ "bgcolor": "rgba(24,24,27,.9)"
1072
+ },
1073
+ {
1074
+ "id": 28,
1075
+ "type": "VAEDecodeAudio",
1076
+ "pos": [
1077
+ 5610.404818473734,
1078
+ 5931.430221895427
1079
+ ],
1080
+ "size": [
1081
+ 164.2388671875,
1082
+ 46
1083
+ ],
1084
+ "flags": {},
1085
+ "order": 15,
1086
+ "mode": 0,
1087
+ "inputs": [
1088
+ {
1089
+ "name": "samples",
1090
+ "type": "LATENT",
1091
+ "link": 29
1092
+ },
1093
+ {
1094
+ "name": "vae",
1095
+ "type": "VAE",
1096
+ "link": 34
1097
+ }
1098
+ ],
1099
+ "outputs": [
1100
+ {
1101
+ "name": "AUDIO",
1102
+ "type": "AUDIO",
1103
+ "links": [
1104
+ 37
1105
+ ]
1106
+ }
1107
+ ],
1108
+ "properties": {
1109
+ "cnr_id": "comfy-core",
1110
+ "ver": "0.34.5",
1111
+ "Node name for S&R": "VAEDecodeAudio",
1112
+ "ue_properties": {
1113
+ "widget_ue_connectable": {},
1114
+ "input_ue_unconnectable": {},
1115
+ "version": "7.5.1"
1116
+ }
1117
+ }
1118
+ },
1119
+ {
1120
+ "id": 32,
1121
+ "type": "SetNode",
1122
+ "pos": [
1123
+ 3666.164256167578,
1124
+ 5819.700639749696
1125
+ ],
1126
+ "size": [
1127
+ 210,
1128
+ 60
1129
+ ],
1130
+ "flags": {},
1131
+ "order": 11,
1132
+ "mode": 0,
1133
+ "inputs": [
1134
+ {
1135
+ "name": "VAE",
1136
+ "type": "VAE",
1137
+ "link": 32
1138
+ }
1139
+ ],
1140
+ "outputs": [
1141
+ {
1142
+ "name": "VAE",
1143
+ "type": "VAE",
1144
+ "links": null
1145
+ }
1146
+ ],
1147
+ "title": "Set_vae_audio",
1148
+ "properties": {
1149
+ "Node name for S&R": "SetNode",
1150
+ "aux_id": "kijai/ComfyUI-KJNodes",
1151
+ "previousName": "vae_audio",
1152
+ "ue_properties": {
1153
+ "widget_ue_connectable": {},
1154
+ "version": "7.5.1",
1155
+ "input_ue_unconnectable": {}
1156
+ }
1157
+ },
1158
+ "widgets_values": [
1159
+ "vae_audio"
1160
+ ],
1161
+ "widgets_values_named": {
1162
+ "Constant": "vae_audio"
1163
+ },
1164
+ "color": "#af3535",
1165
+ "bgcolor": "rgba(24,24,27,.9)"
1166
+ },
1167
+ {
1168
+ "id": 33,
1169
+ "type": "SetNode",
1170
+ "pos": [
1171
+ 3629.1238607063815,
1172
+ 5971.820043351726
1173
+ ],
1174
+ "size": [
1175
+ 210,
1176
+ 58
1177
+ ],
1178
+ "flags": {},
1179
+ "order": 12,
1180
+ "mode": 0,
1181
+ "inputs": [
1182
+ {
1183
+ "name": "VAE",
1184
+ "type": "VAE",
1185
+ "link": 33
1186
+ }
1187
+ ],
1188
+ "outputs": [
1189
+ {
1190
+ "name": "VAE",
1191
+ "type": "VAE",
1192
+ "links": null
1193
+ }
1194
+ ],
1195
+ "title": "Set_vae_video",
1196
+ "properties": {
1197
+ "Node name for S&R": "SetNode",
1198
+ "aux_id": "kijai/ComfyUI-KJNodes",
1199
+ "previousName": "vae_video",
1200
+ "ue_properties": {
1201
+ "widget_ue_connectable": {},
1202
+ "version": "7.5.1",
1203
+ "input_ue_unconnectable": {}
1204
+ }
1205
+ },
1206
+ "widgets_values": [
1207
+ "vae_video"
1208
+ ],
1209
+ "widgets_values_named": {
1210
+ "Constant": "vae_video"
1211
+ },
1212
+ "color": "#af3535",
1213
+ "bgcolor": "rgba(24,24,27,.9)"
1214
+ },
1215
+ {
1216
+ "id": 34,
1217
+ "type": "GetNode",
1218
+ "pos": [
1219
+ 5349.028602450984,
1220
+ 5868.56737955779
1221
+ ],
1222
+ "size": [
1223
+ 210,
1224
+ 60
1225
+ ],
1226
+ "flags": {},
1227
+ "order": 7,
1228
+ "mode": 0,
1229
+ "inputs": [],
1230
+ "outputs": [
1231
+ {
1232
+ "name": "VAE",
1233
+ "type": "VAE",
1234
+ "links": [
1235
+ 34
1236
+ ]
1237
+ }
1238
+ ],
1239
+ "title": "Get_vae_audio",
1240
+ "properties": {
1241
+ "Node name for S&R": "GetNode",
1242
+ "aux_id": "kijai/ComfyUI-KJNodes",
1243
+ "ue_properties": {
1244
+ "widget_ue_connectable": {},
1245
+ "version": "7.5.1",
1246
+ "input_ue_unconnectable": {}
1247
+ }
1248
+ },
1249
+ "widgets_values": [
1250
+ "vae_audio"
1251
+ ],
1252
+ "widgets_values_named": {
1253
+ "Constant": "vae_audio"
1254
+ },
1255
+ "color": "#af3535",
1256
+ "bgcolor": "rgba(24,24,27,.9)"
1257
+ },
1258
+ {
1259
+ "id": 36,
1260
+ "type": "PrimitiveInt",
1261
+ "pos": [
1262
+ 3288.91510592369,
1263
+ 6382.083130778668
1264
+ ],
1265
+ "size": [
1266
+ 270,
1267
+ 82
1268
+ ],
1269
+ "flags": {},
1270
+ "order": 8,
1271
+ "mode": 0,
1272
+ "inputs": [],
1273
+ "outputs": [
1274
+ {
1275
+ "name": "INT",
1276
+ "type": "INT",
1277
+ "links": [
1278
+ 38
1279
+ ]
1280
+ }
1281
+ ],
1282
+ "properties": {
1283
+ "cnr_id": "comfy-core",
1284
+ "ver": "0.34.5",
1285
+ "Node name for S&R": "PrimitiveInt",
1286
+ "ue_properties": {
1287
+ "widget_ue_connectable": {},
1288
+ "input_ue_unconnectable": {},
1289
+ "version": "7.5.1"
1290
+ }
1291
+ },
1292
+ "widgets_values": [
1293
+ 2,
1294
+ "increment"
1295
+ ],
1296
+ "widgets_values_named": {
1297
+ "value": 2,
1298
+ "fixed": "increment"
1299
+ }
1300
+ }
1301
+ ],
1302
+ "links": [
1303
+ [
1304
+ 1,
1305
+ 2,
1306
+ 0,
1307
+ 5,
1308
+ 0,
1309
+ "MODEL"
1310
+ ],
1311
+ [
1312
+ 3,
1313
+ 2,
1314
+ 0,
1315
+ 7,
1316
+ 0,
1317
+ "MODEL"
1318
+ ],
1319
+ [
1320
+ 4,
1321
+ 6,
1322
+ 0,
1323
+ 8,
1324
+ 0,
1325
+ "NOISE"
1326
+ ],
1327
+ [
1328
+ 5,
1329
+ 5,
1330
+ 0,
1331
+ 8,
1332
+ 1,
1333
+ "GUIDER"
1334
+ ],
1335
+ [
1336
+ 6,
1337
+ 4,
1338
+ 0,
1339
+ 8,
1340
+ 2,
1341
+ "SAMPLER"
1342
+ ],
1343
+ [
1344
+ 7,
1345
+ 7,
1346
+ 0,
1347
+ 8,
1348
+ 3,
1349
+ "SIGMAS"
1350
+ ],
1351
+ [
1352
+ 9,
1353
+ 8,
1354
+ 0,
1355
+ 10,
1356
+ 0,
1357
+ "LATENT"
1358
+ ],
1359
+ [
1360
+ 10,
1361
+ 9,
1362
+ 0,
1363
+ 10,
1364
+ 1,
1365
+ "VAE"
1366
+ ],
1367
+ [
1368
+ 11,
1369
+ 10,
1370
+ 0,
1371
+ 12,
1372
+ 0,
1373
+ "IMAGE"
1374
+ ],
1375
+ [
1376
+ 12,
1377
+ 12,
1378
+ 0,
1379
+ 13,
1380
+ 0,
1381
+ "IMAGE"
1382
+ ],
1383
+ [
1384
+ 14,
1385
+ 11,
1386
+ 1,
1387
+ 13,
1388
+ 4,
1389
+ "FLOAT"
1390
+ ],
1391
+ [
1392
+ 15,
1393
+ 15,
1394
+ 5,
1395
+ 17,
1396
+ 0,
1397
+ "INT"
1398
+ ],
1399
+ [
1400
+ 16,
1401
+ 15,
1402
+ 4,
1403
+ 18,
1404
+ 0,
1405
+ "INT"
1406
+ ],
1407
+ [
1408
+ 17,
1409
+ 15,
1410
+ 3,
1411
+ 19,
1412
+ 0,
1413
+ "INT"
1414
+ ],
1415
+ [
1416
+ 18,
1417
+ 15,
1418
+ 0,
1419
+ 1,
1420
+ 0,
1421
+ "LATENT"
1422
+ ],
1423
+ [
1424
+ 19,
1425
+ 15,
1426
+ 1,
1427
+ 5,
1428
+ 1,
1429
+ "CONDITIONING"
1430
+ ],
1431
+ [
1432
+ 28,
1433
+ 26,
1434
+ 0,
1435
+ 27,
1436
+ 0,
1437
+ "MODEL"
1438
+ ],
1439
+ [
1440
+ 29,
1441
+ 15,
1442
+ 0,
1443
+ 28,
1444
+ 0,
1445
+ "LATENT"
1446
+ ],
1447
+ [
1448
+ 32,
1449
+ 26,
1450
+ 1,
1451
+ 32,
1452
+ 0,
1453
+ "VAE"
1454
+ ],
1455
+ [
1456
+ 33,
1457
+ 26,
1458
+ 2,
1459
+ 33,
1460
+ 0,
1461
+ "VAE"
1462
+ ],
1463
+ [
1464
+ 34,
1465
+ 34,
1466
+ 0,
1467
+ 28,
1468
+ 1,
1469
+ "VAE"
1470
+ ],
1471
+ [
1472
+ 35,
1473
+ 11,
1474
+ 1,
1475
+ 12,
1476
+ 1,
1477
+ "FLOAT"
1478
+ ],
1479
+ [
1480
+ 36,
1481
+ 1,
1482
+ 0,
1483
+ 8,
1484
+ 4,
1485
+ "LATENT"
1486
+ ],
1487
+ [
1488
+ 37,
1489
+ 28,
1490
+ 0,
1491
+ 13,
1492
+ 1,
1493
+ "AUDIO"
1494
+ ],
1495
+ [
1496
+ 38,
1497
+ 36,
1498
+ 0,
1499
+ 15,
1500
+ 0,
1501
+ "INT"
1502
+ ]
1503
+ ],
1504
+ "groups": [],
1505
+ "definitions": {
1506
+ "subgraphs": [
1507
+ {
1508
+ "id": "deb3547e-1d90-4a4b-8f05-6e17727281b0",
1509
+ "version": 1,
1510
+ "state": {
1511
+ "lastGroupId": 0,
1512
+ "lastNodeId": 36,
1513
+ "lastLinkId": 38,
1514
+ "lastRerouteId": 0
1515
+ },
1516
+ "revision": 0,
1517
+ "config": {},
1518
+ "name": "Model_VDN_Loading",
1519
+ "inputNode": {
1520
+ "id": -10,
1521
+ "bounding": [
1522
+ 1512.2050049277864,
1523
+ 6045.092780484874,
1524
+ 128,
1525
+ 48
1526
+ ]
1527
+ },
1528
+ "outputNode": {
1529
+ "id": -20,
1530
+ "bounding": [
1531
+ 3719.5565366738974,
1532
+ 6045.092780484874,
1533
+ 128,
1534
+ 108
1535
+ ]
1536
+ },
1537
+ "inputs": [],
1538
+ "outputs": [
1539
+ {
1540
+ "id": "d6df7459-c732-4567-9bed-8e37206efabe",
1541
+ "name": "MODEL",
1542
+ "type": "MODEL",
1543
+ "linkIds": [
1544
+ 27
1545
+ ],
1546
+ "pos": [
1547
+ 3743.5565366738974,
1548
+ 6069.092780484874
1549
+ ]
1550
+ },
1551
+ {
1552
+ "id": "0493d6cb-919f-44db-b324-35c212134764",
1553
+ "name": "VAE",
1554
+ "type": "VAE",
1555
+ "linkIds": [
1556
+ 30
1557
+ ],
1558
+ "pos": [
1559
+ 3743.5565366738974,
1560
+ 6089.092780484874
1561
+ ]
1562
+ },
1563
+ {
1564
+ "id": "cb29645c-2136-4a21-9ddd-04a64e2b232c",
1565
+ "name": "VAE_1",
1566
+ "type": "VAE",
1567
+ "linkIds": [
1568
+ 31
1569
+ ],
1570
+ "pos": [
1571
+ 3743.5565366738974,
1572
+ 6109.092780484874
1573
+ ]
1574
+ }
1575
+ ],
1576
+ "widgets": [],
1577
+ "nodes": [
1578
+ {
1579
+ "id": 23,
1580
+ "type": "UNETLoader",
1581
+ "pos": [
1582
+ 1700.2050049277864,
1583
+ 6377.496467251863
1584
+ ],
1585
+ "size": [
1586
+ 648.390625,
1587
+ 113.859375
1588
+ ],
1589
+ "flags": {},
1590
+ "order": 0,
1591
+ "mode": 0,
1592
+ "inputs": [],
1593
+ "outputs": [
1594
+ {
1595
+ "localized_name": "MODEL",
1596
+ "name": "MODEL",
1597
+ "type": "MODEL",
1598
+ "links": [
1599
+ 25
1600
+ ]
1601
+ }
1602
+ ],
1603
+ "properties": {
1604
+ "cnr_id": "comfy-core",
1605
+ "ver": "0.29.0",
1606
+ "Node name for S&R": "UNETLoader",
1607
+ "ue_properties": {
1608
+ "widget_ue_connectable": {},
1609
+ "version": "7.5.1",
1610
+ "input_ue_unconnectable": {}
1611
+ },
1612
+ "models": [
1613
+ {
1614
+ "name": "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
1615
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors",
1616
+ "directory": "diffusion_models"
1617
+ }
1618
+ ]
1619
+ },
1620
+ "widgets_values": [
1621
+ "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
1622
+ "default"
1623
+ ],
1624
+ "widgets_values_named": {
1625
+ "unet_name": "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
1626
+ "weight_dtype": "default"
1627
+ },
1628
+ "ndSuperSelectorEnabled": false,
1629
+ "ndPowerEnabled": false
1630
+ },
1631
+ {
1632
+ "id": 22,
1633
+ "type": "ApplyVDNH3Advanced",
1634
+ "pos": [
1635
+ 2431.818086194477,
1636
+ 5762.34511632811
1637
+ ],
1638
+ "size": [
1639
+ 442.609375,
1640
+ 477.453125
1641
+ ],
1642
+ "flags": {},
1643
+ "order": 3,
1644
+ "mode": 0,
1645
+ "inputs": [
1646
+ {
1647
+ "localized_name": "model",
1648
+ "name": "model",
1649
+ "type": "MODEL",
1650
+ "link": 25
1651
+ }
1652
+ ],
1653
+ "outputs": [
1654
+ {
1655
+ "localized_name": "MODEL",
1656
+ "name": "MODEL",
1657
+ "type": "MODEL",
1658
+ "links": [
1659
+ 20
1660
+ ]
1661
+ }
1662
+ ],
1663
+ "properties": {
1664
+ "cnr_id": "comfyui-vdn-h3",
1665
+ "ver": "183f33d8a7b3c6322d83be95ae369251a63b3198",
1666
+ "Node name for S&R": "ApplyVDNH3Advanced",
1667
+ "ue_properties": {
1668
+ "widget_ue_connectable": {},
1669
+ "version": "7.5.1",
1670
+ "input_ue_unconnectable": {}
1671
+ },
1672
+ "aux_id": "Saganaki22/ComfyUI-VDN-H3"
1673
+ },
1674
+ "widgets_values": [
1675
+ "stage-dmd-step-250",
1676
+ true,
1677
+ 1,
1678
+ 1,
1679
+ "merge",
1680
+ "stream",
1681
+ "off",
1682
+ "grouped",
1683
+ "grouped",
1684
+ 1,
1685
+ 5,
1686
+ "both",
1687
+ true,
1688
+ true,
1689
+ false
1690
+ ],
1691
+ "widgets_values_named": {
1692
+ "vdn_checkpoint": "stage-dmd-step-250",
1693
+ "apply_turbo_adapter": true,
1694
+ "stage_b_strength": 1,
1695
+ "turbo_strength": 1,
1696
+ "lora_mode": "merge",
1697
+ "branch_weights": "stream",
1698
+ "retain_buffers": "off",
1699
+ "verbose": "grouped",
1700
+ "attention_backend": "grouped",
1701
+ "window_radius": 1,
1702
+ "window_chunk": 5,
1703
+ "anchor_frames": "both",
1704
+ "text_state": true,
1705
+ "linear_branch": true,
1706
+ "fast_kernels": false
1707
+ }
1708
+ },
1709
+ {
1710
+ "id": 20,
1711
+ "type": "MiniMaxChunkFeedForward",
1712
+ "pos": [
1713
+ 2980.6390337676967,
1714
+ 5875.486515660144
1715
+ ],
1716
+ "size": [
1717
+ 324.1875,
1718
+ 113.859375
1719
+ ],
1720
+ "flags": {},
1721
+ "order": 4,
1722
+ "mode": 0,
1723
+ "inputs": [
1724
+ {
1725
+ "localized_name": "model",
1726
+ "name": "model",
1727
+ "type": "MODEL",
1728
+ "link": 20
1729
+ }
1730
+ ],
1731
+ "outputs": [
1732
+ {
1733
+ "localized_name": "model",
1734
+ "name": "model",
1735
+ "type": "MODEL",
1736
+ "links": [
1737
+ 21
1738
+ ]
1739
+ }
1740
+ ],
1741
+ "properties": {
1742
+ "cnr_id": "comfyui-kjnodes",
1743
+ "ver": "1.5.0",
1744
+ "Node name for S&R": "MiniMaxChunkFeedForward",
1745
+ "ue_properties": {
1746
+ "widget_ue_connectable": {},
1747
+ "input_ue_unconnectable": {},
1748
+ "version": "7.8"
1749
+ }
1750
+ },
1751
+ "widgets_values": [
1752
+ 2,
1753
+ 4096
1754
+ ],
1755
+ "widgets_values_named": {
1756
+ "chunks": 2,
1757
+ "seq_threshold": 4096
1758
+ }
1759
+ },
1760
+ {
1761
+ "id": 21,
1762
+ "type": "ModelPatchTorchSettings",
1763
+ "pos": [
1764
+ 3343.6918658984664,
1765
+ 5891.365402174691
1766
+ ],
1767
+ "size": [
1768
+ 312.078125,
1769
+ 85.890625
1770
+ ],
1771
+ "flags": {
1772
+ "collapsed": false
1773
+ },
1774
+ "order": 5,
1775
+ "mode": 0,
1776
+ "inputs": [
1777
+ {
1778
+ "localized_name": "model",
1779
+ "name": "model",
1780
+ "type": "MODEL",
1781
+ "link": 21
1782
+ }
1783
+ ],
1784
+ "outputs": [
1785
+ {
1786
+ "localized_name": "MODEL",
1787
+ "name": "MODEL",
1788
+ "type": "MODEL",
1789
+ "links": [
1790
+ 27
1791
+ ]
1792
+ }
1793
+ ],
1794
+ "properties": {
1795
+ "cnr_id": "comfyui-kjnodes",
1796
+ "ver": "e8e88f7c88e3f6205b122f5de87e69a09fbce5ac",
1797
+ "Node name for S&R": "ModelPatchTorchSettings",
1798
+ "ue_properties": {
1799
+ "widget_ue_connectable": {},
1800
+ "version": "7.5.1",
1801
+ "input_ue_unconnectable": {}
1802
+ }
1803
+ },
1804
+ "widgets_values": [
1805
+ true
1806
+ ],
1807
+ "widgets_values_named": {
1808
+ "enable_fp16_accumulation": true
1809
+ }
1810
+ },
1811
+ {
1812
+ "id": 29,
1813
+ "type": "VAELoader",
1814
+ "pos": [
1815
+ 3359.1089537220587,
1816
+ 6062.769321627355
1817
+ ],
1818
+ "size": [
1819
+ 270,
1820
+ 58
1821
+ ],
1822
+ "flags": {},
1823
+ "order": 1,
1824
+ "mode": 0,
1825
+ "inputs": [],
1826
+ "outputs": [
1827
+ {
1828
+ "label": "Vae_Audio",
1829
+ "localized_name": "VAE",
1830
+ "name": "VAE",
1831
+ "type": "VAE",
1832
+ "links": [
1833
+ 30
1834
+ ]
1835
+ }
1836
+ ],
1837
+ "properties": {
1838
+ "cnr_id": "comfy-core",
1839
+ "ver": "0.34.5",
1840
+ "Node name for S&R": "VAELoader",
1841
+ "ue_properties": {
1842
+ "widget_ue_connectable": {},
1843
+ "input_ue_unconnectable": {},
1844
+ "version": "7.5.1"
1845
+ }
1846
+ },
1847
+ "widgets_values": [
1848
+ "minimax_h3_audio_vae_fp32.safetensors"
1849
+ ],
1850
+ "widgets_values_named": {
1851
+ "vae_name": "minimax_h3_audio_vae_fp32.safetensors"
1852
+ },
1853
+ "ndSuperSelectorEnabled": false,
1854
+ "ndPowerEnabled": false
1855
+ },
1856
+ {
1857
+ "id": 31,
1858
+ "type": "VAELoader",
1859
+ "pos": [
1860
+ 3362.8387747424795,
1861
+ 6184.03950060693
1862
+ ],
1863
+ "size": [
1864
+ 270,
1865
+ 58
1866
+ ],
1867
+ "flags": {},
1868
+ "order": 2,
1869
+ "mode": 0,
1870
+ "inputs": [],
1871
+ "outputs": [
1872
+ {
1873
+ "label": "VAE_Video",
1874
+ "localized_name": "VAE",
1875
+ "name": "VAE",
1876
+ "type": "VAE",
1877
+ "links": [
1878
+ 31
1879
+ ]
1880
+ }
1881
+ ],
1882
+ "properties": {
1883
+ "cnr_id": "comfy-core",
1884
+ "ver": "0.34.5",
1885
+ "Node name for S&R": "VAELoader",
1886
+ "ue_properties": {
1887
+ "widget_ue_connectable": {},
1888
+ "input_ue_unconnectable": {},
1889
+ "version": "7.5.1"
1890
+ }
1891
+ },
1892
+ "widgets_values": [
1893
+ "minimax_h3_video_vae_int8_convrot.safetensors"
1894
+ ],
1895
+ "widgets_values_named": {
1896
+ "vae_name": "minimax_h3_video_vae_int8_convrot.safetensors"
1897
+ },
1898
+ "ndSuperSelectorEnabled": false,
1899
+ "ndPowerEnabled": false
1900
+ }
1901
+ ],
1902
+ "groups": [],
1903
+ "links": [
1904
+ {
1905
+ "id": 25,
1906
+ "origin_id": 23,
1907
+ "origin_slot": 0,
1908
+ "target_id": 22,
1909
+ "target_slot": 0,
1910
+ "type": "MODEL"
1911
+ },
1912
+ {
1913
+ "id": 20,
1914
+ "origin_id": 22,
1915
+ "origin_slot": 0,
1916
+ "target_id": 20,
1917
+ "target_slot": 0,
1918
+ "type": "MODEL"
1919
+ },
1920
+ {
1921
+ "id": 21,
1922
+ "origin_id": 20,
1923
+ "origin_slot": 0,
1924
+ "target_id": 21,
1925
+ "target_slot": 0,
1926
+ "type": "MODEL"
1927
+ },
1928
+ {
1929
+ "id": 27,
1930
+ "origin_id": 21,
1931
+ "origin_slot": 0,
1932
+ "target_id": -20,
1933
+ "target_slot": 0,
1934
+ "type": "MODEL"
1935
+ },
1936
+ {
1937
+ "id": 30,
1938
+ "origin_id": 29,
1939
+ "origin_slot": 0,
1940
+ "target_id": -20,
1941
+ "target_slot": 1,
1942
+ "type": "VAE"
1943
+ },
1944
+ {
1945
+ "id": 31,
1946
+ "origin_id": 31,
1947
+ "origin_slot": 0,
1948
+ "target_id": -20,
1949
+ "target_slot": 2,
1950
+ "type": "VAE"
1951
+ }
1952
+ ],
1953
+ "extra": {
1954
+ "ue_links": [],
1955
+ "links_added_by_ue": []
1956
+ }
1957
+ }
1958
+ ]
1959
+ },
1960
+ "config": {},
1961
+ "extra": {
1962
+ "ue_links": [],
1963
+ "ds": {
1964
+ "scale": 0.9277171243279716,
1965
+ "offset": [
1966
+ -2712.6235131313183,
1967
+ -5254.730090894639
1968
+ ]
1969
+ },
1970
+ "links_added_by_ue": [],
1971
+ "frontendVersion": "1.49.6",
1972
+ "VHS_latentpreview": false,
1973
+ "VHS_latentpreviewrate": 0,
1974
+ "VHS_MetadataImage": true,
1975
+ "VHS_KeepIntermediate": true
1976
+ },
1977
+ "version": 0.4
1978
+ }
workflow/Minimax_Timeline.json ADDED
@@ -0,0 +1,3192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "42476cc0-ba47-4042-ad72-3802b573afb3",
3
+ "revision": 0,
4
+ "last_node_id": 220,
5
+ "last_link_id": 393,
6
+ "nodes": [
7
+ {
8
+ "id": 92,
9
+ "type": "SaveVideo",
10
+ "pos": [
11
+ 1275.5521965719986,
12
+ 4499.325535955995
13
+ ],
14
+ "size": [
15
+ 612.3666583336471,
16
+ 1093.0958197921766
17
+ ],
18
+ "flags": {},
19
+ "order": 43,
20
+ "mode": 0,
21
+ "inputs": [
22
+ {
23
+ "name": "video",
24
+ "type": "VIDEO",
25
+ "link": 260
26
+ }
27
+ ],
28
+ "outputs": [
29
+ {
30
+ "name": "video",
31
+ "type": "VIDEO",
32
+ "links": null
33
+ }
34
+ ],
35
+ "properties": {
36
+ "cnr_id": "comfy-core",
37
+ "ver": "0.29.0",
38
+ "Node name for S&R": "SaveVideo",
39
+ "ue_properties": {
40
+ "widget_ue_connectable": {},
41
+ "version": "7.5.1",
42
+ "input_ue_unconnectable": {}
43
+ }
44
+ },
45
+ "widgets_values": [
46
+ "video/MiniMax_H3",
47
+ "auto",
48
+ "auto",
49
+ "auto"
50
+ ],
51
+ "widgets_values_named": {
52
+ "filename_prefix": "video/MiniMax_H3",
53
+ "format": "auto",
54
+ "format.codec": "auto",
55
+ "codec": "auto"
56
+ }
57
+ },
58
+ {
59
+ "id": 115,
60
+ "type": "ResolutionSelector",
61
+ "pos": [
62
+ -862.4467856615897,
63
+ 5609.97531007646
64
+ ],
65
+ "size": [
66
+ 248.46875,
67
+ 161.828125
68
+ ],
69
+ "flags": {},
70
+ "order": 18,
71
+ "mode": 0,
72
+ "showAdvanced": false,
73
+ "inputs": [],
74
+ "outputs": [
75
+ {
76
+ "name": "width",
77
+ "type": "INT",
78
+ "links": [
79
+ 285,
80
+ 349,
81
+ 382
82
+ ]
83
+ },
84
+ {
85
+ "name": "height",
86
+ "type": "INT",
87
+ "links": [
88
+ 286,
89
+ 350,
90
+ 383
91
+ ]
92
+ }
93
+ ],
94
+ "title": "Resolution Selector (Size)",
95
+ "properties": {
96
+ "cnr_id": "comfy-core",
97
+ "ver": "0.29.0",
98
+ "Node name for S&R": "ResolutionSelector",
99
+ "ue_properties": {
100
+ "widget_ue_connectable": {},
101
+ "version": "7.5.1",
102
+ "input_ue_unconnectable": {}
103
+ }
104
+ },
105
+ "widgets_values": [
106
+ "9:16 (Portrait Widescreen)",
107
+ 0.1,
108
+ 32
109
+ ],
110
+ "widgets_values_named": {
111
+ "aspect_ratio": "9:16 (Portrait Widescreen)",
112
+ "megapixels": 0.1,
113
+ "multiple": 32
114
+ },
115
+ "color": "#322",
116
+ "bgcolor": "#533"
117
+ },
118
+ {
119
+ "id": 116,
120
+ "type": "MarkdownNote",
121
+ "pos": [
122
+ -2033.7082424262605,
123
+ 4829.138252930259
124
+ ],
125
+ "size": [
126
+ 450,
127
+ 860.71875
128
+ ],
129
+ "flags": {},
130
+ "order": 0,
131
+ "mode": 0,
132
+ "inputs": [],
133
+ "outputs": [],
134
+ "title": "Note: MiniMax H3",
135
+ "properties": {
136
+ "ue_properties": {
137
+ "widget_ue_connectable": {},
138
+ "version": "7.5.1",
139
+ "input_ue_unconnectable": {}
140
+ }
141
+ },
142
+ "widgets_values": [
143
+ "## MiniMax H3\n\n[MiniMax H3](https://www.minimax.io/blog/minimax-h3) is MiniMax's general-purpose, omni-modal generation model. It jointly understands text, image, video, and audio, and generates video with **native stereo audio**: voice, sound effects, and music are modeled jointly in a single forward pass, not layered on afterward. Output is up to 2K resolution, 24fps, and up to about 15 seconds.\n\nH3 removes the usual task boundaries between generation modes. Text-to-video, image-to-video, first/last-frame control, and reference-driven generation (character, motion, camera, voice, style) are all handled by one model instead of separate expert pipelines.\n\n## About this workflow\n\nThis template runs the **reference-to-video (ref2va)** task using the `MiniMaxH3ReferenceToVideo` node. It takes any mix of reference images, videos, and standalone audio, and weaves them into the generation to lock in a character's identity, a style, a motion, a camera move, or a voice.\n\n**Key inputs**\n\n- **ref_images / ref_videos / ref_video_audios / ref_audios**: up to 9 reference images, 3 reference videos (each may carry its own paired soundtrack), and 3 standalone reference audio clips\n- **prompt**: reference the inputs by tag, in the exact order they were connected, for example `<Picture 1>`, `<Video 1>`, `<Audio 1>`, then describe the target scene, motion, and audio\n- **ref_image_size**: `match` scales references down to the generation's resolution (faster); `max` keeps up to a 2048px short edge for stronger identity fidelity, at the cost of speed since reference tokens ride along every sampling step\n- **width / height**: set via Resolution Selector. H3's native canvas is a 768px short edge, capped at 768x1344 pixels, rounded to a multiple of 32\n- **duration (seconds)**: converted to a valid frame `length` by the Math Expression node, snapping up to the model's 17-frame-per-block (17k+5) grid at 24fps\n\n**Sampling and decode**\n\n- Sampler: `res_multistep`. `beta` or `normal` scheduler tends to outperform `simple` for reference-heavy prompts like this one\n- The sampler's joint audio+video `LATENT` output feeds directly into both `VAEDecode` (video, `minimax_h3_video_vae_fp16`) and `VAEDecodeAudio` (audio, `minimax_h3_audio_vae_fp32`); each decode node automatically pulls its own half out of the packed latent. `CreateVideo` then muxes the two into a single MP4 with synced sound\n- The diffusion model here is `minimax_h3_ref2va_pruned_int8_convrot.safetensors`, a different set of weights from the `fl2va` model used by the t2v/i2v templates\n\nRef2va's output is very sensitive to prompt wording; matching the reference tags precisely and being explicit about which reference drives which part of the shot tends to work best."
144
+ ],
145
+ "widgets_values_named": {
146
+ "text": "## MiniMax H3\n\n[MiniMax H3](https://www.minimax.io/blog/minimax-h3) is MiniMax's general-purpose, omni-modal generation model. It jointly understands text, image, video, and audio, and generates video with **native stereo audio**: voice, sound effects, and music are modeled jointly in a single forward pass, not layered on afterward. Output is up to 2K resolution, 24fps, and up to about 15 seconds.\n\nH3 removes the usual task boundaries between generation modes. Text-to-video, image-to-video, first/last-frame control, and reference-driven generation (character, motion, camera, voice, style) are all handled by one model instead of separate expert pipelines.\n\n## About this workflow\n\nThis template runs the **reference-to-video (ref2va)** task using the `MiniMaxH3ReferenceToVideo` node. It takes any mix of reference images, videos, and standalone audio, and weaves them into the generation to lock in a character's identity, a style, a motion, a camera move, or a voice.\n\n**Key inputs**\n\n- **ref_images / ref_videos / ref_video_audios / ref_audios**: up to 9 reference images, 3 reference videos (each may carry its own paired soundtrack), and 3 standalone reference audio clips\n- **prompt**: reference the inputs by tag, in the exact order they were connected, for example `<Picture 1>`, `<Video 1>`, `<Audio 1>`, then describe the target scene, motion, and audio\n- **ref_image_size**: `match` scales references down to the generation's resolution (faster); `max` keeps up to a 2048px short edge for stronger identity fidelity, at the cost of speed since reference tokens ride along every sampling step\n- **width / height**: set via Resolution Selector. H3's native canvas is a 768px short edge, capped at 768x1344 pixels, rounded to a multiple of 32\n- **duration (seconds)**: converted to a valid frame `length` by the Math Expression node, snapping up to the model's 17-frame-per-block (17k+5) grid at 24fps\n\n**Sampling and decode**\n\n- Sampler: `res_multistep`. `beta` or `normal` scheduler tends to outperform `simple` for reference-heavy prompts like this one\n- The sampler's joint audio+video `LATENT` output feeds directly into both `VAEDecode` (video, `minimax_h3_video_vae_fp16`) and `VAEDecodeAudio` (audio, `minimax_h3_audio_vae_fp32`); each decode node automatically pulls its own half out of the packed latent. `CreateVideo` then muxes the two into a single MP4 with synced sound\n- The diffusion model here is `minimax_h3_ref2va_pruned_int8_convrot.safetensors`, a different set of weights from the `fl2va` model used by the t2v/i2v templates\n\nRef2va's output is very sensitive to prompt wording; matching the reference tags precisely and being explicit about which reference drives which part of the shot tends to work best."
147
+ },
148
+ "color": "#222",
149
+ "bgcolor": "#000"
150
+ },
151
+ {
152
+ "id": 117,
153
+ "type": "MarkdownNote",
154
+ "pos": [
155
+ -2500,
156
+ 4850
157
+ ],
158
+ "size": [
159
+ 440,
160
+ 740
161
+ ],
162
+ "flags": {},
163
+ "order": 1,
164
+ "mode": 0,
165
+ "inputs": [],
166
+ "outputs": [],
167
+ "title": "Note: Model Links",
168
+ "properties": {
169
+ "ue_properties": {
170
+ "widget_ue_connectable": {},
171
+ "version": "7.5.1",
172
+ "input_ue_unconnectable": {}
173
+ }
174
+ },
175
+ "widgets_values": [
176
+ "## Model Links\n\n**vae**\n\n- [minimax_h3_video_vae_fp16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors)\n- [minimax_h3_audio_vae_fp32.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors)\n\n**diffusion_models**\n\n- [minimax_h3_ref2va_pruned_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors)\n\n**text_encoders**\n\n- [qwen3vl_32b_minimax_h3_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_int8_convrot.safetensors)\n\n\n## Model Storage Location\n\n```\n📂 ComfyUI/\n├── 📂 models/\n│ ├── 📂 vae/\n│ │ ├── minimax_h3_video_vae_fp16.safetensors\n│ │ └── minimax_h3_audio_vae_fp32.safetensors\n│ ├── 📂 diffusion_models/\n│ │ └── minimax_h3_ref2va_pruned_int8_convrot.safetensors\n│ └── 📂 text_encoders/\n│ └── qwen3vl_32b_minimax_h3_int8_convrot.safetensors\n```\n\n## Report Issue\n\nNote: Please update ComfyUI first ([guide](https://docs.comfy.org/installation/update_comfyui)) and prepare required models. Desktop/Cloud updates follow stable releases, so some nightly-supported models may not be available yet.\n\n- Cannot run / runtime errors: [ComfyUI/issues](https://github.com/comfyanonymous/ComfyUI/issues)\n- UI / frontend issues: [ComfyUI_frontend/issues](https://github.com/Comfy-Org/ComfyUI_frontend/issues)\n- Workflow issues: [workflow_templates/issues](https://github.com/Comfy-Org/workflow_templates/issues)\n"
177
+ ],
178
+ "widgets_values_named": {
179
+ "text": "## Model Links\n\n**vae**\n\n- [minimax_h3_video_vae_fp16.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors)\n- [minimax_h3_audio_vae_fp32.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors)\n\n**diffusion_models**\n\n- [minimax_h3_ref2va_pruned_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors)\n\n**text_encoders**\n\n- [qwen3vl_32b_minimax_h3_int8_convrot.safetensors](https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_int8_convrot.safetensors)\n\n\n## Model Storage Location\n\n```\n📂 ComfyUI/\n├── 📂 models/\n│ ├── 📂 vae/\n│ │ ├── minimax_h3_video_vae_fp16.safetensors\n│ │ └── minimax_h3_audio_vae_fp32.safetensors\n│ ├── 📂 diffusion_models/\n│ │ └── minimax_h3_ref2va_pruned_int8_convrot.safetensors\n│ └── 📂 text_encoders/\n│ └── qwen3vl_32b_minimax_h3_int8_convrot.safetensors\n```\n\n## Report Issue\n\nNote: Please update ComfyUI first ([guide](https://docs.comfy.org/installation/update_comfyui)) and prepare required models. Desktop/Cloud updates follow stable releases, so some nightly-supported models may not be available yet.\n\n- Cannot run / runtime errors: [ComfyUI/issues](https://github.com/comfyanonymous/ComfyUI/issues)\n- UI / frontend issues: [ComfyUI_frontend/issues](https://github.com/Comfy-Org/ComfyUI_frontend/issues)\n- Workflow issues: [workflow_templates/issues](https://github.com/Comfy-Org/workflow_templates/issues)\n"
180
+ },
181
+ "color": "#222",
182
+ "bgcolor": "#000"
183
+ },
184
+ {
185
+ "id": 119,
186
+ "type": "VAELoader",
187
+ "pos": [
188
+ -1494.30411371666,
189
+ 5272.8694091444395
190
+ ],
191
+ "size": [
192
+ 640,
193
+ 85.890625
194
+ ],
195
+ "flags": {},
196
+ "order": 2,
197
+ "mode": 0,
198
+ "inputs": [],
199
+ "outputs": [
200
+ {
201
+ "name": "VAE",
202
+ "type": "VAE",
203
+ "links": [
204
+ 251,
205
+ 347
206
+ ]
207
+ }
208
+ ],
209
+ "properties": {
210
+ "cnr_id": "comfy-core",
211
+ "ver": "0.29.0",
212
+ "Node name for S&R": "VAELoader",
213
+ "models": [
214
+ {
215
+ "name": "minimax_h3_video_vae_fp16.safetensors",
216
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors",
217
+ "directory": "vae"
218
+ }
219
+ ],
220
+ "ue_properties": {
221
+ "widget_ue_connectable": {},
222
+ "version": "7.5.1",
223
+ "input_ue_unconnectable": {}
224
+ }
225
+ },
226
+ "widgets_values": [
227
+ "minimax_h3_video_vae_int8_convrot.safetensors"
228
+ ],
229
+ "widgets_values_named": {
230
+ "vae_name": "minimax_h3_video_vae_int8_convrot.safetensors"
231
+ },
232
+ "ndSuperSelectorEnabled": false,
233
+ "ndPowerEnabled": false
234
+ },
235
+ {
236
+ "id": 120,
237
+ "type": "VAELoader",
238
+ "pos": [
239
+ -1502.0675653264077,
240
+ 5390.29777908046
241
+ ],
242
+ "size": [
243
+ 650,
244
+ 85.890625
245
+ ],
246
+ "flags": {},
247
+ "order": 3,
248
+ "mode": 0,
249
+ "inputs": [],
250
+ "outputs": [
251
+ {
252
+ "name": "VAE",
253
+ "type": "VAE",
254
+ "links": [
255
+ 250,
256
+ 348
257
+ ]
258
+ }
259
+ ],
260
+ "properties": {
261
+ "cnr_id": "comfy-core",
262
+ "ver": "0.29.0",
263
+ "Node name for S&R": "VAELoader",
264
+ "models": [
265
+ {
266
+ "name": "minimax_h3_audio_vae_fp32.safetensors",
267
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors",
268
+ "directory": "vae"
269
+ }
270
+ ],
271
+ "ue_properties": {
272
+ "widget_ue_connectable": {},
273
+ "version": "7.5.1",
274
+ "input_ue_unconnectable": {}
275
+ }
276
+ },
277
+ "widgets_values": [
278
+ "minimax_h3_audio_vae_fp32.safetensors"
279
+ ],
280
+ "widgets_values_named": {
281
+ "vae_name": "minimax_h3_audio_vae_fp32.safetensors"
282
+ },
283
+ "ndSuperSelectorEnabled": false,
284
+ "ndPowerEnabled": false
285
+ },
286
+ {
287
+ "id": 121,
288
+ "type": "VAEDecodeAudio",
289
+ "pos": [
290
+ 914.7436379821778,
291
+ 5253.488956759807
292
+ ],
293
+ "size": [
294
+ 230,
295
+ 77.921875
296
+ ],
297
+ "flags": {
298
+ "collapsed": false
299
+ },
300
+ "order": 38,
301
+ "mode": 0,
302
+ "inputs": [
303
+ {
304
+ "name": "samples",
305
+ "type": "LATENT",
306
+ "link": 281
307
+ },
308
+ {
309
+ "name": "vae",
310
+ "type": "VAE",
311
+ "link": 250
312
+ }
313
+ ],
314
+ "outputs": [
315
+ {
316
+ "name": "AUDIO",
317
+ "type": "AUDIO",
318
+ "links": [
319
+ 328,
320
+ 373
321
+ ]
322
+ }
323
+ ],
324
+ "properties": {
325
+ "cnr_id": "comfy-core",
326
+ "ver": "0.29.0",
327
+ "Node name for S&R": "VAEDecodeAudio",
328
+ "ue_properties": {
329
+ "widget_ue_connectable": {},
330
+ "version": "7.5.1",
331
+ "input_ue_unconnectable": {}
332
+ }
333
+ }
334
+ },
335
+ {
336
+ "id": 122,
337
+ "type": "VAEDecode",
338
+ "pos": [
339
+ 916.1098723933795,
340
+ 5097.97485199241
341
+ ],
342
+ "size": [
343
+ 230,
344
+ 77.921875
345
+ ],
346
+ "flags": {
347
+ "collapsed": false
348
+ },
349
+ "order": 37,
350
+ "mode": 0,
351
+ "inputs": [
352
+ {
353
+ "name": "samples",
354
+ "type": "LATENT",
355
+ "link": 280
356
+ },
357
+ {
358
+ "name": "vae",
359
+ "type": "VAE",
360
+ "link": 251
361
+ }
362
+ ],
363
+ "outputs": [
364
+ {
365
+ "name": "IMAGE",
366
+ "type": "IMAGE",
367
+ "links": [
368
+ 258
369
+ ]
370
+ }
371
+ ],
372
+ "properties": {
373
+ "cnr_id": "comfy-core",
374
+ "ver": "0.29.0",
375
+ "Node name for S&R": "VAEDecode",
376
+ "ue_properties": {
377
+ "widget_ue_connectable": {},
378
+ "version": "7.5.1",
379
+ "input_ue_unconnectable": {}
380
+ }
381
+ }
382
+ },
383
+ {
384
+ "id": 124,
385
+ "type": "BasicScheduler",
386
+ "pos": [
387
+ 160.77997741238457,
388
+ 5312.837864849799
389
+ ],
390
+ "size": [
391
+ 348.90625,
392
+ 149.625
393
+ ],
394
+ "flags": {},
395
+ "order": 34,
396
+ "mode": 0,
397
+ "inputs": [
398
+ {
399
+ "name": "model",
400
+ "type": "MODEL",
401
+ "link": 358
402
+ }
403
+ ],
404
+ "outputs": [
405
+ {
406
+ "name": "SIGMAS",
407
+ "type": "SIGMAS",
408
+ "links": [
409
+ 256
410
+ ]
411
+ }
412
+ ],
413
+ "properties": {
414
+ "cnr_id": "comfy-core",
415
+ "ver": "0.29.0",
416
+ "Node name for S&R": "BasicScheduler",
417
+ "ue_properties": {
418
+ "widget_ue_connectable": {},
419
+ "version": "7.5.1",
420
+ "input_ue_unconnectable": {}
421
+ }
422
+ },
423
+ "widgets_values": [
424
+ "simple",
425
+ 8,
426
+ 1
427
+ ],
428
+ "widgets_values_named": {
429
+ "scheduler": "simple",
430
+ "steps": 8,
431
+ "denoise": 1
432
+ }
433
+ },
434
+ {
435
+ "id": 125,
436
+ "type": "SamplerCustomAdvanced",
437
+ "pos": [
438
+ 556.8556745238828,
439
+ 4933.173657183853
440
+ ],
441
+ "size": [
442
+ 252.546875,
443
+ 389.84375
444
+ ],
445
+ "flags": {},
446
+ "order": 36,
447
+ "mode": 0,
448
+ "inputs": [
449
+ {
450
+ "name": "noise",
451
+ "type": "NOISE",
452
+ "link": 253
453
+ },
454
+ {
455
+ "name": "guider",
456
+ "type": "GUIDER",
457
+ "link": 254
458
+ },
459
+ {
460
+ "name": "sampler",
461
+ "type": "SAMPLER",
462
+ "link": 341
463
+ },
464
+ {
465
+ "name": "sigmas",
466
+ "type": "SIGMAS",
467
+ "link": 256
468
+ },
469
+ {
470
+ "name": "latent_image",
471
+ "type": "LATENT",
472
+ "link": 345
473
+ }
474
+ ],
475
+ "outputs": [
476
+ {
477
+ "name": "output",
478
+ "type": "LATENT",
479
+ "links": [
480
+ 280,
481
+ 281,
482
+ 378,
483
+ 391
484
+ ]
485
+ },
486
+ {
487
+ "name": "denoised_output",
488
+ "type": "LATENT",
489
+ "links": []
490
+ }
491
+ ],
492
+ "properties": {
493
+ "cnr_id": "comfy-core",
494
+ "ver": "0.29.0",
495
+ "Node name for S&R": "SamplerCustomAdvanced",
496
+ "ue_properties": {
497
+ "widget_ue_connectable": {},
498
+ "version": "7.5.1",
499
+ "input_ue_unconnectable": {}
500
+ }
501
+ }
502
+ },
503
+ {
504
+ "id": 126,
505
+ "type": "BasicGuider",
506
+ "pos": [
507
+ 156.29100926618642,
508
+ 5074.271224643126
509
+ ],
510
+ "size": [
511
+ 360,
512
+ 77.921875
513
+ ],
514
+ "flags": {},
515
+ "order": 33,
516
+ "mode": 0,
517
+ "inputs": [
518
+ {
519
+ "name": "model",
520
+ "type": "MODEL",
521
+ "link": 357
522
+ },
523
+ {
524
+ "name": "conditioning",
525
+ "type": "CONDITIONING",
526
+ "link": 344
527
+ }
528
+ ],
529
+ "outputs": [
530
+ {
531
+ "name": "GUIDER",
532
+ "type": "GUIDER",
533
+ "links": [
534
+ 254
535
+ ]
536
+ }
537
+ ],
538
+ "properties": {
539
+ "cnr_id": "comfy-core",
540
+ "ver": "0.29.0",
541
+ "Node name for S&R": "BasicGuider",
542
+ "ue_properties": {
543
+ "widget_ue_connectable": {},
544
+ "version": "7.5.1",
545
+ "input_ue_unconnectable": {}
546
+ }
547
+ }
548
+ },
549
+ {
550
+ "id": 127,
551
+ "type": "UNETLoader",
552
+ "pos": [
553
+ -1503.0984969025762,
554
+ 4941.480443405995
555
+ ],
556
+ "size": [
557
+ 648.390625,
558
+ 113.859375
559
+ ],
560
+ "flags": {},
561
+ "order": 4,
562
+ "mode": 0,
563
+ "inputs": [],
564
+ "outputs": [
565
+ {
566
+ "name": "MODEL",
567
+ "type": "MODEL",
568
+ "links": [
569
+ 332
570
+ ]
571
+ }
572
+ ],
573
+ "properties": {
574
+ "cnr_id": "comfy-core",
575
+ "ver": "0.29.0",
576
+ "Node name for S&R": "UNETLoader",
577
+ "models": [
578
+ {
579
+ "name": "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
580
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors",
581
+ "directory": "diffusion_models"
582
+ }
583
+ ],
584
+ "ue_properties": {
585
+ "widget_ue_connectable": {},
586
+ "version": "7.5.1",
587
+ "input_ue_unconnectable": {}
588
+ }
589
+ },
590
+ "widgets_values": [
591
+ "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
592
+ "default"
593
+ ],
594
+ "widgets_values_named": {
595
+ "unet_name": "minimax_h3_ref2va_pruned_int8_convrot.safetensors",
596
+ "weight_dtype": "default"
597
+ },
598
+ "ndSuperSelectorEnabled": false,
599
+ "ndPowerEnabled": false
600
+ },
601
+ {
602
+ "id": 128,
603
+ "type": "CLIPLoader",
604
+ "pos": [
605
+ -1495.9462293764273,
606
+ 5091.377600569795
607
+ ],
608
+ "size": [
609
+ 640,
610
+ 141.828125
611
+ ],
612
+ "flags": {},
613
+ "order": 5,
614
+ "mode": 0,
615
+ "inputs": [],
616
+ "outputs": [
617
+ {
618
+ "name": "CLIP",
619
+ "type": "CLIP",
620
+ "links": [
621
+ 346
622
+ ]
623
+ }
624
+ ],
625
+ "properties": {
626
+ "cnr_id": "comfy-core",
627
+ "ver": "0.29.0",
628
+ "Node name for S&R": "CLIPLoader",
629
+ "models": [
630
+ {
631
+ "name": "qwen3vl_32b_minimax_h3_int8_convrot.safetensors",
632
+ "url": "https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_int8_convrot.safetensors",
633
+ "directory": "text_encoders"
634
+ }
635
+ ],
636
+ "ue_properties": {
637
+ "widget_ue_connectable": {},
638
+ "version": "7.5.1",
639
+ "input_ue_unconnectable": {}
640
+ }
641
+ },
642
+ "widgets_values": [
643
+ "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
644
+ "minimax",
645
+ "default"
646
+ ],
647
+ "widgets_values_named": {
648
+ "clip_name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
649
+ "type": "minimax",
650
+ "device": "default"
651
+ },
652
+ "ndSuperSelectorEnabled": false,
653
+ "ndPowerEnabled": false
654
+ },
655
+ {
656
+ "id": 129,
657
+ "type": "RandomNoise",
658
+ "pos": [
659
+ 156.29100926618642,
660
+ 4934.271224643126
661
+ ],
662
+ "size": [
663
+ 360,
664
+ 90
665
+ ],
666
+ "flags": {},
667
+ "order": 22,
668
+ "mode": 0,
669
+ "inputs": [
670
+ {
671
+ "name": "noise_seed",
672
+ "type": "INT",
673
+ "widget": {
674
+ "name": "noise_seed"
675
+ },
676
+ "link": 389
677
+ }
678
+ ],
679
+ "outputs": [
680
+ {
681
+ "name": "NOISE",
682
+ "type": "NOISE",
683
+ "links": [
684
+ 253
685
+ ]
686
+ }
687
+ ],
688
+ "properties": {
689
+ "cnr_id": "comfy-core",
690
+ "ver": "0.29.0",
691
+ "Node name for S&R": "RandomNoise",
692
+ "ue_properties": {
693
+ "widget_ue_connectable": {},
694
+ "version": "7.5.1",
695
+ "input_ue_unconnectable": {}
696
+ }
697
+ },
698
+ "widgets_values": [
699
+ 4244,
700
+ "increment"
701
+ ],
702
+ "widgets_values_named": {
703
+ "noise_seed": 4244,
704
+ "control_after_generate": "increment"
705
+ }
706
+ },
707
+ {
708
+ "id": 130,
709
+ "type": "CreateVideo",
710
+ "pos": [
711
+ 1230.4944002147352,
712
+ 4911.021740537447
713
+ ],
714
+ "size": [
715
+ 270,
716
+ 161.828125
717
+ ],
718
+ "flags": {},
719
+ "order": 40,
720
+ "mode": 0,
721
+ "inputs": [
722
+ {
723
+ "name": "images",
724
+ "type": "IMAGE",
725
+ "link": 258
726
+ },
727
+ {
728
+ "name": "audio",
729
+ "shape": 7,
730
+ "type": "AUDIO",
731
+ "link": 328
732
+ }
733
+ ],
734
+ "outputs": [
735
+ {
736
+ "name": "VIDEO",
737
+ "type": "VIDEO",
738
+ "links": [
739
+ 260,
740
+ 392
741
+ ]
742
+ }
743
+ ],
744
+ "properties": {
745
+ "cnr_id": "comfy-core",
746
+ "ver": "0.29.0",
747
+ "Node name for S&R": "CreateVideo",
748
+ "ue_properties": {
749
+ "widget_ue_connectable": {},
750
+ "version": "7.5.1",
751
+ "input_ue_unconnectable": {}
752
+ }
753
+ },
754
+ "widgets_values": [
755
+ 24,
756
+ 8,
757
+ "sRGB"
758
+ ],
759
+ "widgets_values_named": {
760
+ "fps": 24,
761
+ "bit_depth": 8,
762
+ "color_space": "sRGB"
763
+ }
764
+ },
765
+ {
766
+ "id": 144,
767
+ "type": "easy showAnything",
768
+ "pos": [
769
+ -1493.8902038554618,
770
+ 5927.232535398474
771
+ ],
772
+ "size": [
773
+ 225,
774
+ 125.890625
775
+ ],
776
+ "flags": {},
777
+ "order": 23,
778
+ "mode": 0,
779
+ "inputs": [
780
+ {
781
+ "name": "anything",
782
+ "shape": 7,
783
+ "type": "*",
784
+ "link": 285
785
+ }
786
+ ],
787
+ "outputs": [
788
+ {
789
+ "name": "output",
790
+ "type": "*",
791
+ "links": null
792
+ }
793
+ ],
794
+ "properties": {
795
+ "cnr_id": "comfyui-easy-use",
796
+ "ver": "5618a748c14858a6e95a583baa28bb7c8da7976a",
797
+ "Node name for S&R": "easy showAnything",
798
+ "ue_properties": {
799
+ "widget_ue_connectable": {},
800
+ "version": "7.5.1",
801
+ "input_ue_unconnectable": {}
802
+ }
803
+ },
804
+ "widgets_values": [
805
+ "256"
806
+ ],
807
+ "widgets_values_named": {
808
+ "text": "256"
809
+ }
810
+ },
811
+ {
812
+ "id": 145,
813
+ "type": "easy showAnything",
814
+ "pos": [
815
+ -1245.9659302340724,
816
+ 5936.131811630934
817
+ ],
818
+ "size": [
819
+ 225,
820
+ 125.890625
821
+ ],
822
+ "flags": {},
823
+ "order": 25,
824
+ "mode": 0,
825
+ "inputs": [
826
+ {
827
+ "name": "anything",
828
+ "shape": 7,
829
+ "type": "*",
830
+ "link": 286
831
+ }
832
+ ],
833
+ "outputs": [
834
+ {
835
+ "name": "output",
836
+ "type": "*",
837
+ "links": null
838
+ }
839
+ ],
840
+ "properties": {
841
+ "cnr_id": "comfyui-easy-use",
842
+ "ver": "5618a748c14858a6e95a583baa28bb7c8da7976a",
843
+ "Node name for S&R": "easy showAnything",
844
+ "ue_properties": {
845
+ "widget_ue_connectable": {},
846
+ "version": "7.5.1",
847
+ "input_ue_unconnectable": {}
848
+ }
849
+ },
850
+ "widgets_values": [
851
+ "416"
852
+ ],
853
+ "widgets_values_named": {
854
+ "text": "416"
855
+ }
856
+ },
857
+ {
858
+ "id": 177,
859
+ "type": "LoraLoaderModelOnly",
860
+ "pos": [
861
+ -767.5236112457903,
862
+ 4944.179109005764
863
+ ],
864
+ "size": [
865
+ 355.203125,
866
+ 113.859375
867
+ ],
868
+ "flags": {},
869
+ "order": 19,
870
+ "mode": 4,
871
+ "inputs": [
872
+ {
873
+ "name": "model",
874
+ "type": "MODEL",
875
+ "link": 332
876
+ }
877
+ ],
878
+ "outputs": [
879
+ {
880
+ "name": "MODEL",
881
+ "type": "MODEL",
882
+ "links": [
883
+ 356
884
+ ]
885
+ }
886
+ ],
887
+ "properties": {
888
+ "cnr_id": "comfy-core",
889
+ "ver": "0.33.0",
890
+ "Node name for S&R": "LoraLoaderModelOnly",
891
+ "ue_properties": {
892
+ "widget_ue_connectable": {},
893
+ "version": "7.5.1",
894
+ "input_ue_unconnectable": {}
895
+ }
896
+ },
897
+ "widgets_values": [
898
+ "minimax_h3_fl2v_lightx2v_turbo_4step_v1.0_768p_resized_avg_rank_31_bf16.safetensors",
899
+ 1
900
+ ],
901
+ "widgets_values_named": {
902
+ "lora_name": "minimax_h3_fl2v_lightx2v_turbo_4step_v1.0_768p_resized_avg_rank_31_bf16.safetensors",
903
+ "strength_model": 1
904
+ },
905
+ "ndSuperSelectorEnabled": false,
906
+ "ndPowerEnabled": false
907
+ },
908
+ {
909
+ "id": 179,
910
+ "type": "KSamplerSelect",
911
+ "pos": [
912
+ 209.49743383365987,
913
+ 5183.705023289966
914
+ ],
915
+ "size": [
916
+ 270,
917
+ 85.890625
918
+ ],
919
+ "flags": {},
920
+ "order": 6,
921
+ "mode": 0,
922
+ "inputs": [],
923
+ "outputs": [
924
+ {
925
+ "name": "SAMPLER",
926
+ "type": "SAMPLER",
927
+ "links": [
928
+ 341
929
+ ]
930
+ }
931
+ ],
932
+ "properties": {
933
+ "cnr_id": "comfy-core",
934
+ "ver": "0.33.0",
935
+ "Node name for S&R": "KSamplerSelect",
936
+ "ue_properties": {
937
+ "widget_ue_connectable": {},
938
+ "version": "7.5.1",
939
+ "input_ue_unconnectable": {}
940
+ }
941
+ },
942
+ "widgets_values": [
943
+ "euler"
944
+ ],
945
+ "widgets_values_named": {
946
+ "sampler_name": "euler"
947
+ }
948
+ },
949
+ {
950
+ "id": 184,
951
+ "type": "MiniMaxH3TimelinePlanner",
952
+ "pos": [
953
+ -527.8950941395228,
954
+ 5708.606113290952
955
+ ],
956
+ "size": [
957
+ 1715.078125,
958
+ 804
959
+ ],
960
+ "flags": {},
961
+ "order": 26,
962
+ "mode": 0,
963
+ "inputs": [
964
+ {
965
+ "label": "Prompt Index",
966
+ "name": "prompt_index",
967
+ "shape": 7,
968
+ "type": "INT",
969
+ "link": null
970
+ },
971
+ {
972
+ "name": "width",
973
+ "type": "INT",
974
+ "widget": {
975
+ "name": "width"
976
+ },
977
+ "link": 349
978
+ },
979
+ {
980
+ "name": "height",
981
+ "type": "INT",
982
+ "widget": {
983
+ "name": "height"
984
+ },
985
+ "link": 350
986
+ }
987
+ ],
988
+ "outputs": [
989
+ {
990
+ "name": "Material Plan",
991
+ "type": "MINIMAX_H3_TIMELINE_PLAN",
992
+ "links": [
993
+ 353
994
+ ]
995
+ },
996
+ {
997
+ "name": "Omni Media Bundle",
998
+ "type": "MINIMAX_H3_OMNI_MEDIA_BUNDLE",
999
+ "links": null
1000
+ }
1001
+ ],
1002
+ "properties": {
1003
+ "aux_id": "Songssx/ComfyUI-MiniMaxH3-TimelineDirector",
1004
+ "ver": "e4d6d5ea44eb00e2414d16dd94883be8e2661213",
1005
+ "Node name for S&R": "MiniMaxH3TimelinePlanner",
1006
+ "ue_properties": {
1007
+ "widget_ue_connectable": {
1008
+ "width": true,
1009
+ "height": true
1010
+ },
1011
+ "version": "7.5.1",
1012
+ "input_ue_unconnectable": {}
1013
+ }
1014
+ },
1015
+ "widgets_values": [
1016
+ 1344,
1017
+ 768,
1018
+ 10,
1019
+ "{\"version\":4,\"fps\":24,\"selection\":{\"start\":0,\"duration\":10},\"videoAudioEnabled\":true,\"videoClips\":[],\"images\":[{\"id\":\"mtpncdu2-o1oklx\",\"file\":\"minimax_h3_timeline_director/1788689161191_lin01_KreaEdit1__00148_.png\",\"name\":\"KreaEdit1__00148_.png\",\"width\":1088,\"height\":1920},{\"id\":\"mtpncjay-7eso16\",\"file\":\"minimax_h3_timeline_director/1788689168287_mn5mv_KreaEdit1__00147_.png\",\"name\":\"KreaEdit1__00147_.png\",\"width\":1088,\"height\":1920}],\"audios\":[],\"segmentConfig\":{\"count\":2,\"segments\":[{\"images\":[],\"audios\":[]},{\"images\":[],\"audios\":[]}]}}",
1020
+ ""
1021
+ ],
1022
+ "widgets_values_named": {
1023
+ "width": 1344,
1024
+ "height": 768,
1025
+ "generation_seconds": 10,
1026
+ "timeline_data": "{\"version\":4,\"fps\":24,\"selection\":{\"start\":0,\"duration\":10},\"videoAudioEnabled\":true,\"videoClips\":[],\"images\":[{\"id\":\"mtpncdu2-o1oklx\",\"file\":\"minimax_h3_timeline_director/1788689161191_lin01_KreaEdit1__00148_.png\",\"name\":\"KreaEdit1__00148_.png\",\"width\":1088,\"height\":1920},{\"id\":\"mtpncjay-7eso16\",\"file\":\"minimax_h3_timeline_director/1788689168287_mn5mv_KreaEdit1__00147_.png\",\"name\":\"KreaEdit1__00147_.png\",\"width\":1088,\"height\":1920}],\"audios\":[],\"segmentConfig\":{\"count\":2,\"segments\":[{\"images\":[],\"audios\":[]},{\"images\":[],\"audios\":[]}]}}",
1027
+ "minimax_h3_timeline": ""
1028
+ }
1029
+ },
1030
+ {
1031
+ "id": 185,
1032
+ "type": "MiniMaxH3TimelineEncoder",
1033
+ "pos": [
1034
+ 1199.243073032633,
1035
+ 5684.742013884508
1036
+ ],
1037
+ "size": [
1038
+ 620,
1039
+ 520
1040
+ ],
1041
+ "flags": {},
1042
+ "order": 29,
1043
+ "mode": 0,
1044
+ "inputs": [
1045
+ {
1046
+ "name": "clip",
1047
+ "type": "CLIP",
1048
+ "link": 346
1049
+ },
1050
+ {
1051
+ "name": "vae",
1052
+ "type": "VAE",
1053
+ "link": 347
1054
+ },
1055
+ {
1056
+ "name": "audio_vae",
1057
+ "type": "VAE",
1058
+ "link": 348
1059
+ },
1060
+ {
1061
+ "name": "plan",
1062
+ "type": "MINIMAX_H3_TIMELINE_PLAN",
1063
+ "link": 353
1064
+ }
1065
+ ],
1066
+ "outputs": [
1067
+ {
1068
+ "name": "positive",
1069
+ "type": "CONDITIONING",
1070
+ "links": [
1071
+ 344,
1072
+ 380,
1073
+ 381
1074
+ ]
1075
+ },
1076
+ {
1077
+ "name": "LATENT",
1078
+ "type": "LATENT",
1079
+ "links": [
1080
+ 345
1081
+ ]
1082
+ },
1083
+ {
1084
+ "name": "Merged Video Audio",
1085
+ "type": "AUDIO",
1086
+ "links": null
1087
+ },
1088
+ {
1089
+ "name": "Merged Standalone Audio",
1090
+ "type": "AUDIO",
1091
+ "links": null
1092
+ }
1093
+ ],
1094
+ "properties": {
1095
+ "aux_id": "Songssx/ComfyUI-MiniMaxH3-TimelineDirector",
1096
+ "ver": "e4d6d5ea44eb00e2414d16dd94883be8e2661213",
1097
+ "Node name for S&R": "MiniMaxH3TimelineEncoder",
1098
+ "ue_properties": {
1099
+ "widget_ue_connectable": {},
1100
+ "version": "7.5.1",
1101
+ "input_ue_unconnectable": {}
1102
+ }
1103
+ },
1104
+ "widgets_values": [
1105
+ "subject_definitions:\n<Picture 1> and <Picture 2> show the same young woman: long wavy dark brown hair, brown eyes, black lipstick, freckles, black nail polish, large breasts, black triangle bikini top, black string bottoms worn closed, gray sofa, pink-lit wall.\n\nsummary:\nreference generation. Segment 1 of 2, 10 seconds. Live-action cinematic shot of the woman standing in front of the gray sofa, walking toward the lens while stroking her breasts over the bikini. At 00:07.000 a slow dissolve lands on her kneeling. The final 0.917 seconds hold that kneeling pose, both hands on her breasts, string bottoms still closed, for latent handover.\n\nretention_analysis:\nfully_preserved <Picture 1>\nfully_preserved <Picture 2>\n\ndetailed_description:\n[Shot 1] Live-action, cinematic, ultra realistic. The young woman shown in <Picture 1> and <Picture 2> stands in front of the gray sofa against the pink wall, preserving her long wavy dark brown hair, brown eyes, black lipstick, freckles, black nail polish, black triangle bikini top and closed black string bottoms. The camera performs a tracking shot at slow speed at chest level. She walks toward the lens, leans her torso forward, and strokes her breasts over the bikini cups. She blinks once, looks at the camera, then blinks again as her lips part. [Shot 2] At 00:07.000, the shot slow-dissolves to the same woman in the same room now kneeling on the wooden floor facing the lens, knees together, both hands still on her breasts, string bottoms still closed. The camera lowers toward ground level during the dissolve and then holds a slow tracking shot. She blinks slowly, a small smile forms and holds, and her lips stay slightly parted. During 00:09.083-00:10.000 the camera keeps that ground-level tracking shot. She remains kneeling facing the lens, both hands stroking her breasts over the bikini, smile held, one slow blink. No new pose.\n\noverall_soundscape:\nBikini fabric shifts as she walks. Palms rub the cups. Knees meet the floor through the dissolve. Steady breathing and short sighs. During 00:09.083-00:10.000 the same fabric rub, room-floor contact and breathing continue without a new sound event.\n\nnon_diegetic_music:\nN/A\n\n--- SEGMENT ---\n\nsubject_definitions:\nSame woman already established from <Picture 1> and <Picture 2>. No new subject.\n\nsummary:\nvideo continuation + reference generation. Segment 2 of 2, 10 seconds. Opens by repeating the kneeling handover pose for 0.917 seconds, then she places her palms on the floor, goes to all fours, crawls toward the lens at ground level, tilts her head and holds the smile.\n\nretention_analysis:\nfully_preserved <Picture 1>\nfully_preserved <Picture 2>\n\ndetailed_description:\n[Shot 1] Live-action, cinematic, ultra realistic. During 00:00.000-00:00.917 the young woman shown in <Picture 1> and <Picture 2> remains kneeling on the wooden floor in front of the gray sofa against the pink wall, preserving her long wavy dark brown hair, brown eyes, black lipstick, freckles, black nail polish, black triangle bikini top and closed black string bottoms. She faces the lens, both hands on her breasts, smile held, one slow blink. The camera holds the same ground-level tracking shot and the same distance as the end of the previous segment. From 00:00.917, without a cut, she slides her palms down onto the floor, leans her torso forward onto all fours, crawls one slow step toward the lens, blinks, tilts her head a little, and the smile holds. The camera keeps tracking at slow speed at ground level.\n\noverall_soundscape:\nDuring 00:00.000-00:00.917 preceding fabric rub, knee contact and breathing continue. After 00:00.917 palms meet the floor, knees slide, bikini strings shift, steady breathing and short sighs.\n\nnon_diegetic_music:\nN/A",
1106
+ "match"
1107
+ ],
1108
+ "widgets_values_named": {
1109
+ "prompt": "subject_definitions:\n<Picture 1> and <Picture 2> show the same young woman: long wavy dark brown hair, brown eyes, black lipstick, freckles, black nail polish, large breasts, black triangle bikini top, black string bottoms worn closed, gray sofa, pink-lit wall.\n\nsummary:\nreference generation. Segment 1 of 2, 10 seconds. Live-action cinematic shot of the woman standing in front of the gray sofa, walking toward the lens while stroking her breasts over the bikini. At 00:07.000 a slow dissolve lands on her kneeling. The final 0.917 seconds hold that kneeling pose, both hands on her breasts, string bottoms still closed, for latent handover.\n\nretention_analysis:\nfully_preserved <Picture 1>\nfully_preserved <Picture 2>\n\ndetailed_description:\n[Shot 1] Live-action, cinematic, ultra realistic. The young woman shown in <Picture 1> and <Picture 2> stands in front of the gray sofa against the pink wall, preserving her long wavy dark brown hair, brown eyes, black lipstick, freckles, black nail polish, black triangle bikini top and closed black string bottoms. The camera performs a tracking shot at slow speed at chest level. She walks toward the lens, leans her torso forward, and strokes her breasts over the bikini cups. She blinks once, looks at the camera, then blinks again as her lips part. [Shot 2] At 00:07.000, the shot slow-dissolves to the same woman in the same room now kneeling on the wooden floor facing the lens, knees together, both hands still on her breasts, string bottoms still closed. The camera lowers toward ground level during the dissolve and then holds a slow tracking shot. She blinks slowly, a small smile forms and holds, and her lips stay slightly parted. During 00:09.083-00:10.000 the camera keeps that ground-level tracking shot. She remains kneeling facing the lens, both hands stroking her breasts over the bikini, smile held, one slow blink. No new pose.\n\noverall_soundscape:\nBikini fabric shifts as she walks. Palms rub the cups. Knees meet the floor through the dissolve. Steady breathing and short sighs. During 00:09.083-00:10.000 the same fabric rub, room-floor contact and breathing continue without a new sound event.\n\nnon_diegetic_music:\nN/A\n\n--- SEGMENT ---\n\nsubject_definitions:\nSame woman already established from <Picture 1> and <Picture 2>. No new subject.\n\nsummary:\nvideo continuation + reference generation. Segment 2 of 2, 10 seconds. Opens by repeating the kneeling handover pose for 0.917 seconds, then she places her palms on the floor, goes to all fours, crawls toward the lens at ground level, tilts her head and holds the smile.\n\nretention_analysis:\nfully_preserved <Picture 1>\nfully_preserved <Picture 2>\n\ndetailed_description:\n[Shot 1] Live-action, cinematic, ultra realistic. During 00:00.000-00:00.917 the young woman shown in <Picture 1> and <Picture 2> remains kneeling on the wooden floor in front of the gray sofa against the pink wall, preserving her long wavy dark brown hair, brown eyes, black lipstick, freckles, black nail polish, black triangle bikini top and closed black string bottoms. She faces the lens, both hands on her breasts, smile held, one slow blink. The camera holds the same ground-level tracking shot and the same distance as the end of the previous segment. From 00:00.917, without a cut, she slides her palms down onto the floor, leans her torso forward onto all fours, crawls one slow step toward the lens, blinks, tilts her head a little, and the smile holds. The camera keeps tracking at slow speed at ground level.\n\noverall_soundscape:\nDuring 00:00.000-00:00.917 preceding fabric rub, knee contact and breathing continue. After 00:00.917 palms meet the floor, knees slide, bikini strings shift, steady breathing and short sighs.\n\nnon_diegetic_music:\nN/A",
1110
+ "ref_image_size": "match"
1111
+ }
1112
+ },
1113
+ {
1114
+ "id": 186,
1115
+ "type": "ModelPatchTorchSettings",
1116
+ "pos": [
1117
+ 144.17490984353213,
1118
+ 4440.202848550011
1119
+ ],
1120
+ "size": [
1121
+ 312.078125,
1122
+ 85.890625
1123
+ ],
1124
+ "flags": {
1125
+ "collapsed": false
1126
+ },
1127
+ "order": 32,
1128
+ "mode": 0,
1129
+ "inputs": [
1130
+ {
1131
+ "name": "model",
1132
+ "type": "MODEL",
1133
+ "link": 354
1134
+ }
1135
+ ],
1136
+ "outputs": [
1137
+ {
1138
+ "name": "MODEL",
1139
+ "type": "MODEL",
1140
+ "links": [
1141
+ 357,
1142
+ 358,
1143
+ 379
1144
+ ]
1145
+ }
1146
+ ],
1147
+ "properties": {
1148
+ "cnr_id": "comfyui-kjnodes",
1149
+ "ver": "e8e88f7c88e3f6205b122f5de87e69a09fbce5ac",
1150
+ "Node name for S&R": "ModelPatchTorchSettings",
1151
+ "ue_properties": {
1152
+ "widget_ue_connectable": {},
1153
+ "version": "7.5.1",
1154
+ "input_ue_unconnectable": {}
1155
+ }
1156
+ },
1157
+ "widgets_values": [
1158
+ true
1159
+ ],
1160
+ "widgets_values_named": {
1161
+ "enable_fp16_accumulation": true
1162
+ }
1163
+ },
1164
+ {
1165
+ "id": 187,
1166
+ "type": "MiniMaxChunkFeedForward",
1167
+ "pos": [
1168
+ -222.66446806266873,
1169
+ 4439.470491814276
1170
+ ],
1171
+ "size": [
1172
+ 324.1875,
1173
+ 113.859375
1174
+ ],
1175
+ "flags": {},
1176
+ "order": 30,
1177
+ "mode": 0,
1178
+ "inputs": [
1179
+ {
1180
+ "name": "model",
1181
+ "type": "MODEL",
1182
+ "link": 355
1183
+ }
1184
+ ],
1185
+ "outputs": [
1186
+ {
1187
+ "name": "model",
1188
+ "type": "MODEL",
1189
+ "links": [
1190
+ 354
1191
+ ]
1192
+ }
1193
+ ],
1194
+ "properties": {
1195
+ "cnr_id": "comfyui-kjnodes",
1196
+ "ver": "1.5.0",
1197
+ "Node name for S&R": "MiniMaxChunkFeedForward",
1198
+ "ue_properties": {
1199
+ "widget_ue_connectable": {},
1200
+ "input_ue_unconnectable": {},
1201
+ "version": "7.8"
1202
+ }
1203
+ },
1204
+ "widgets_values": [
1205
+ 2,
1206
+ 4096
1207
+ ],
1208
+ "widgets_values_named": {
1209
+ "chunks": 2,
1210
+ "seq_threshold": 4096
1211
+ }
1212
+ },
1213
+ {
1214
+ "id": 188,
1215
+ "type": "ApplyVDNH3Advanced",
1216
+ "pos": [
1217
+ -771.4854156358887,
1218
+ 4326.329092482242
1219
+ ],
1220
+ "size": [
1221
+ 442.609375,
1222
+ 477.453125
1223
+ ],
1224
+ "flags": {},
1225
+ "order": 28,
1226
+ "mode": 0,
1227
+ "inputs": [
1228
+ {
1229
+ "name": "model",
1230
+ "type": "MODEL",
1231
+ "link": 356
1232
+ }
1233
+ ],
1234
+ "outputs": [
1235
+ {
1236
+ "name": "MODEL",
1237
+ "type": "MODEL",
1238
+ "links": [
1239
+ 355
1240
+ ]
1241
+ }
1242
+ ],
1243
+ "properties": {
1244
+ "cnr_id": "comfyui-vdn-h3",
1245
+ "ver": "183f33d8a7b3c6322d83be95ae369251a63b3198",
1246
+ "Node name for S&R": "ApplyVDNH3Advanced",
1247
+ "ue_properties": {
1248
+ "widget_ue_connectable": {},
1249
+ "version": "7.5.1",
1250
+ "input_ue_unconnectable": {}
1251
+ },
1252
+ "aux_id": "Saganaki22/ComfyUI-VDN-H3"
1253
+ },
1254
+ "widgets_values": [
1255
+ "stage-dmd-step-250",
1256
+ true,
1257
+ 1,
1258
+ 1,
1259
+ "merge",
1260
+ "stream",
1261
+ "off",
1262
+ "grouped",
1263
+ "grouped",
1264
+ 1,
1265
+ 5,
1266
+ "both",
1267
+ true,
1268
+ true,
1269
+ false
1270
+ ],
1271
+ "widgets_values_named": {
1272
+ "vdn_checkpoint": "stage-dmd-step-250",
1273
+ "apply_turbo_adapter": true,
1274
+ "stage_b_strength": 1,
1275
+ "turbo_strength": 1,
1276
+ "lora_mode": "merge",
1277
+ "branch_weights": "stream",
1278
+ "retain_buffers": "off",
1279
+ "verbose": "grouped",
1280
+ "attention_backend": "grouped",
1281
+ "window_radius": 1,
1282
+ "window_chunk": 5,
1283
+ "anchor_frames": "both",
1284
+ "text_state": true,
1285
+ "linear_branch": true,
1286
+ "fast_kernels": false
1287
+ }
1288
+ },
1289
+ {
1290
+ "id": 190,
1291
+ "type": "GetNode",
1292
+ "pos": [
1293
+ 3019.596094983624,
1294
+ 5877.152914338328
1295
+ ],
1296
+ "size": [
1297
+ 210,
1298
+ 58
1299
+ ],
1300
+ "flags": {},
1301
+ "order": 7,
1302
+ "mode": 4,
1303
+ "inputs": [],
1304
+ "outputs": [
1305
+ {
1306
+ "name": "MODEL",
1307
+ "type": "MODEL",
1308
+ "links": [
1309
+ 359,
1310
+ 361
1311
+ ]
1312
+ }
1313
+ ],
1314
+ "title": "Get_model_VDN",
1315
+ "properties": {
1316
+ "Node name for S&R": "GetNode",
1317
+ "aux_id": "kijai/ComfyUI-KJNodes",
1318
+ "ue_properties": {
1319
+ "widget_ue_connectable": {},
1320
+ "version": "7.5.1",
1321
+ "input_ue_unconnectable": {}
1322
+ }
1323
+ },
1324
+ "widgets_values": [
1325
+ "model_VDN"
1326
+ ],
1327
+ "widgets_values_named": {
1328
+ "Constant": "model_VDN"
1329
+ },
1330
+ "color": "#1f1f48",
1331
+ "bgcolor": "rgba(24,24,27,.9)"
1332
+ },
1333
+ {
1334
+ "id": 191,
1335
+ "type": "GetNode",
1336
+ "pos": [
1337
+ 3023.5065112803254,
1338
+ 5739.272025023764
1339
+ ],
1340
+ "size": [
1341
+ 210,
1342
+ 58
1343
+ ],
1344
+ "flags": {},
1345
+ "order": 12,
1346
+ "mode": 4,
1347
+ "inputs": [],
1348
+ "outputs": [
1349
+ {
1350
+ "name": "CONDITIONING",
1351
+ "type": "CONDITIONING",
1352
+ "links": [
1353
+ 360
1354
+ ]
1355
+ }
1356
+ ],
1357
+ "title": "Get_conditionning",
1358
+ "properties": {
1359
+ "Node name for S&R": "GetNode",
1360
+ "aux_id": "kijai/ComfyUI-KJNodes",
1361
+ "ue_properties": {
1362
+ "widget_ue_connectable": {},
1363
+ "version": "7.5.1",
1364
+ "input_ue_unconnectable": {}
1365
+ }
1366
+ },
1367
+ "widgets_values": [
1368
+ "conditionning"
1369
+ ],
1370
+ "widgets_values_named": {
1371
+ "Constant": "conditionning"
1372
+ },
1373
+ "color": "#38291f",
1374
+ "bgcolor": "rgba(24,24,27,.9)"
1375
+ },
1376
+ {
1377
+ "id": 192,
1378
+ "type": "MinimaxH3LatentUpscaler3D",
1379
+ "pos": [
1380
+ 2686.2283581149145,
1381
+ 5440.843936505823
1382
+ ],
1383
+ "size": [
1384
+ 461.3766842951726,
1385
+ 226
1386
+ ],
1387
+ "flags": {},
1388
+ "order": 39,
1389
+ "mode": 4,
1390
+ "inputs": [
1391
+ {
1392
+ "name": "latent",
1393
+ "type": "*",
1394
+ "link": 378
1395
+ }
1396
+ ],
1397
+ "outputs": [
1398
+ {
1399
+ "name": "latent",
1400
+ "type": "*",
1401
+ "links": [
1402
+ 372
1403
+ ]
1404
+ }
1405
+ ],
1406
+ "properties": {
1407
+ "aux_id": "LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler",
1408
+ "ver": "d7c01b9011f2e8439493f6c02c29995a27df276f",
1409
+ "Node name for S&R": "MinimaxH3LatentUpscaler3D",
1410
+ "ue_properties": {
1411
+ "widget_ue_connectable": {},
1412
+ "input_ue_unconnectable": {},
1413
+ "version": "7.5.1"
1414
+ }
1415
+ },
1416
+ "widgets_values": [
1417
+ "minimax_h3_latent_upscaler_3d_bf16.safetensors",
1418
+ "scale by multiplier",
1419
+ 1,
1420
+ 32,
1421
+ true,
1422
+ true,
1423
+ "cuda",
1424
+ "fp16"
1425
+ ],
1426
+ "widgets_values_named": {
1427
+ "model_name": "minimax_h3_latent_upscaler_3d_bf16.safetensors",
1428
+ "mode": "scale by multiplier",
1429
+ "mode.scale": 1,
1430
+ "align": 32,
1431
+ "enable_temporal_chunking": true,
1432
+ "force_unload": true,
1433
+ "device": "cuda",
1434
+ "precision": "fp16"
1435
+ }
1436
+ },
1437
+ {
1438
+ "id": 193,
1439
+ "type": "GetNode",
1440
+ "pos": [
1441
+ 2854.118097030728,
1442
+ 5077.572385741342
1443
+ ],
1444
+ "size": [
1445
+ 210,
1446
+ 58
1447
+ ],
1448
+ "flags": {},
1449
+ "order": 8,
1450
+ "mode": 0,
1451
+ "inputs": [],
1452
+ "outputs": [
1453
+ {
1454
+ "name": "AUDIO",
1455
+ "type": "AUDIO",
1456
+ "links": [
1457
+ 370
1458
+ ]
1459
+ }
1460
+ ],
1461
+ "title": "Get_src_audio",
1462
+ "properties": {
1463
+ "Node name for S&R": "GetNode",
1464
+ "aux_id": "kijai/ComfyUI-KJNodes",
1465
+ "ue_properties": {
1466
+ "widget_ue_connectable": {},
1467
+ "version": "7.5.1",
1468
+ "input_ue_unconnectable": {}
1469
+ }
1470
+ },
1471
+ "widgets_values": [
1472
+ "src_audio"
1473
+ ],
1474
+ "widgets_values_named": {
1475
+ "Constant": "src_audio"
1476
+ }
1477
+ },
1478
+ {
1479
+ "id": 194,
1480
+ "type": "KSamplerSelect",
1481
+ "pos": [
1482
+ 3370.9292369257732,
1483
+ 5730.988525701965
1484
+ ],
1485
+ "size": [
1486
+ 361.19999999999993,
1487
+ 66.19999999999982
1488
+ ],
1489
+ "flags": {},
1490
+ "order": 9,
1491
+ "mode": 4,
1492
+ "inputs": [],
1493
+ "outputs": [
1494
+ {
1495
+ "name": "SAMPLER",
1496
+ "type": "SAMPLER",
1497
+ "links": [
1498
+ 364
1499
+ ]
1500
+ }
1501
+ ],
1502
+ "properties": {
1503
+ "cnr_id": "comfy-core",
1504
+ "ver": "0.30.0",
1505
+ "Node name for S&R": "KSamplerSelect",
1506
+ "ue_properties": {
1507
+ "widget_ue_connectable": {},
1508
+ "version": "7.5.1",
1509
+ "input_ue_unconnectable": {}
1510
+ }
1511
+ },
1512
+ "widgets_values": [
1513
+ "euler"
1514
+ ],
1515
+ "widgets_values_named": {
1516
+ "sampler_name": "euler"
1517
+ }
1518
+ },
1519
+ {
1520
+ "id": 195,
1521
+ "type": "BasicGuider",
1522
+ "pos": [
1523
+ 3370.9292369257732,
1524
+ 5623.188525701965
1525
+ ],
1526
+ "size": [
1527
+ 360,
1528
+ 60
1529
+ ],
1530
+ "flags": {},
1531
+ "order": 21,
1532
+ "mode": 4,
1533
+ "inputs": [
1534
+ {
1535
+ "name": "model",
1536
+ "type": "MODEL",
1537
+ "link": 359
1538
+ },
1539
+ {
1540
+ "name": "conditioning",
1541
+ "type": "CONDITIONING",
1542
+ "link": 360
1543
+ }
1544
+ ],
1545
+ "outputs": [
1546
+ {
1547
+ "name": "GUIDER",
1548
+ "type": "GUIDER",
1549
+ "links": [
1550
+ 363
1551
+ ]
1552
+ }
1553
+ ],
1554
+ "properties": {
1555
+ "cnr_id": "comfy-core",
1556
+ "ver": "0.30.0",
1557
+ "Node name for S&R": "BasicGuider",
1558
+ "ue_properties": {
1559
+ "widget_ue_connectable": {},
1560
+ "version": "7.5.1",
1561
+ "input_ue_unconnectable": {}
1562
+ }
1563
+ }
1564
+ },
1565
+ {
1566
+ "id": 196,
1567
+ "type": "RandomNoise",
1568
+ "pos": [
1569
+ 3370.9292369257732,
1570
+ 5472.188525701962
1571
+ ],
1572
+ "size": [
1573
+ 360,
1574
+ 90
1575
+ ],
1576
+ "flags": {},
1577
+ "order": 10,
1578
+ "mode": 4,
1579
+ "inputs": [],
1580
+ "outputs": [
1581
+ {
1582
+ "name": "NOISE",
1583
+ "type": "NOISE",
1584
+ "links": [
1585
+ 362
1586
+ ]
1587
+ }
1588
+ ],
1589
+ "properties": {
1590
+ "cnr_id": "comfy-core",
1591
+ "ver": "0.30.0",
1592
+ "Node name for S&R": "RandomNoise",
1593
+ "ue_properties": {
1594
+ "widget_ue_connectable": {},
1595
+ "version": "7.5.1",
1596
+ "input_ue_unconnectable": {}
1597
+ }
1598
+ },
1599
+ "widgets_values": [
1600
+ 42,
1601
+ "fixed"
1602
+ ],
1603
+ "widgets_values_named": {
1604
+ "noise_seed": 42,
1605
+ "control_after_generate": "fixed"
1606
+ }
1607
+ },
1608
+ {
1609
+ "id": 197,
1610
+ "type": "BasicScheduler",
1611
+ "pos": [
1612
+ 3370.9292369257732,
1613
+ 5853.188525701965
1614
+ ],
1615
+ "size": [
1616
+ 370,
1617
+ 130
1618
+ ],
1619
+ "flags": {},
1620
+ "order": 20,
1621
+ "mode": 4,
1622
+ "inputs": [
1623
+ {
1624
+ "name": "model",
1625
+ "type": "MODEL",
1626
+ "link": 361
1627
+ }
1628
+ ],
1629
+ "outputs": [
1630
+ {
1631
+ "name": "SIGMAS",
1632
+ "type": "SIGMAS",
1633
+ "links": [
1634
+ 365
1635
+ ]
1636
+ }
1637
+ ],
1638
+ "properties": {
1639
+ "cnr_id": "comfy-core",
1640
+ "ver": "0.30.0",
1641
+ "Node name for S&R": "BasicScheduler",
1642
+ "ue_properties": {
1643
+ "widget_ue_connectable": {},
1644
+ "version": "7.5.1",
1645
+ "input_ue_unconnectable": {}
1646
+ }
1647
+ },
1648
+ "widgets_values": [
1649
+ "simple",
1650
+ 3,
1651
+ 0.2
1652
+ ],
1653
+ "widgets_values_named": {
1654
+ "scheduler": "simple",
1655
+ "steps": 3,
1656
+ "denoise": 0.2
1657
+ }
1658
+ },
1659
+ {
1660
+ "id": 198,
1661
+ "type": "SamplerCustomAdvanced",
1662
+ "pos": [
1663
+ 3932.179236925774,
1664
+ 5603.188525701965
1665
+ ],
1666
+ "size": [
1667
+ 239.76709241172045,
1668
+ 326
1669
+ ],
1670
+ "flags": {},
1671
+ "order": 42,
1672
+ "mode": 4,
1673
+ "inputs": [
1674
+ {
1675
+ "name": "noise",
1676
+ "type": "NOISE",
1677
+ "link": 362
1678
+ },
1679
+ {
1680
+ "name": "guider",
1681
+ "type": "GUIDER",
1682
+ "link": 363
1683
+ },
1684
+ {
1685
+ "name": "sampler",
1686
+ "type": "SAMPLER",
1687
+ "link": 364
1688
+ },
1689
+ {
1690
+ "name": "sigmas",
1691
+ "type": "SIGMAS",
1692
+ "link": 365
1693
+ },
1694
+ {
1695
+ "name": "latent_image",
1696
+ "type": "LATENT",
1697
+ "link": 372
1698
+ }
1699
+ ],
1700
+ "outputs": [
1701
+ {
1702
+ "name": "output",
1703
+ "type": "LATENT",
1704
+ "links": [
1705
+ 367
1706
+ ]
1707
+ },
1708
+ {
1709
+ "name": "denoised_output",
1710
+ "type": "LATENT",
1711
+ "links": []
1712
+ }
1713
+ ],
1714
+ "properties": {
1715
+ "cnr_id": "comfy-core",
1716
+ "ver": "0.30.0",
1717
+ "Node name for S&R": "SamplerCustomAdvanced",
1718
+ "ue_properties": {
1719
+ "widget_ue_connectable": {},
1720
+ "version": "7.5.1",
1721
+ "input_ue_unconnectable": {}
1722
+ }
1723
+ }
1724
+ },
1725
+ {
1726
+ "id": 199,
1727
+ "type": "GetNode",
1728
+ "pos": [
1729
+ 4284.484259214214,
1730
+ 5735.573429982442
1731
+ ],
1732
+ "size": [
1733
+ 210,
1734
+ 50
1735
+ ],
1736
+ "flags": {
1737
+ "collapsed": true
1738
+ },
1739
+ "order": 13,
1740
+ "mode": 4,
1741
+ "inputs": [],
1742
+ "outputs": [
1743
+ {
1744
+ "name": "*",
1745
+ "type": "*",
1746
+ "links": [
1747
+ 368
1748
+ ]
1749
+ }
1750
+ ],
1751
+ "title": "Get_VAE",
1752
+ "properties": {
1753
+ "Node name for S&R": "GetNode",
1754
+ "aux_id": "kijai/ComfyUI-KJNodes",
1755
+ "ue_properties": {
1756
+ "widget_ue_connectable": {},
1757
+ "version": "7.5.1",
1758
+ "input_ue_unconnectable": {}
1759
+ }
1760
+ },
1761
+ "widgets_values": [
1762
+ "VAE"
1763
+ ],
1764
+ "widgets_values_named": {
1765
+ "Constant": "VAE"
1766
+ }
1767
+ },
1768
+ {
1769
+ "id": 200,
1770
+ "type": "VAEDecode",
1771
+ "pos": [
1772
+ 4307.784259214213,
1773
+ 5796.073429982437
1774
+ ],
1775
+ "size": [
1776
+ 230,
1777
+ 60
1778
+ ],
1779
+ "flags": {
1780
+ "collapsed": false
1781
+ },
1782
+ "order": 45,
1783
+ "mode": 4,
1784
+ "inputs": [
1785
+ {
1786
+ "name": "samples",
1787
+ "type": "LATENT",
1788
+ "link": 367
1789
+ },
1790
+ {
1791
+ "name": "vae",
1792
+ "type": "VAE",
1793
+ "link": 368
1794
+ }
1795
+ ],
1796
+ "outputs": [
1797
+ {
1798
+ "name": "IMAGE",
1799
+ "type": "IMAGE",
1800
+ "links": [
1801
+ 376
1802
+ ]
1803
+ }
1804
+ ],
1805
+ "properties": {
1806
+ "cnr_id": "comfy-core",
1807
+ "ver": "0.30.0",
1808
+ "Node name for S&R": "VAEDecode",
1809
+ "ue_properties": {
1810
+ "widget_ue_connectable": {},
1811
+ "version": "7.5.1",
1812
+ "input_ue_unconnectable": {}
1813
+ }
1814
+ }
1815
+ },
1816
+ {
1817
+ "id": 202,
1818
+ "type": "VHS_VideoCombine",
1819
+ "pos": [
1820
+ 5567.506210306146,
1821
+ 5320.6776134084175
1822
+ ],
1823
+ "size": [
1824
+ 693.741563959413,
1825
+ 1518.1827163505593
1826
+ ],
1827
+ "flags": {
1828
+ "collapsed": false
1829
+ },
1830
+ "order": 48,
1831
+ "mode": 0,
1832
+ "inputs": [
1833
+ {
1834
+ "name": "images",
1835
+ "type": "IMAGE",
1836
+ "link": 377
1837
+ },
1838
+ {
1839
+ "name": "audio",
1840
+ "shape": 7,
1841
+ "type": "AUDIO",
1842
+ "link": 370
1843
+ },
1844
+ {
1845
+ "name": "meta_batch",
1846
+ "shape": 7,
1847
+ "type": "VHS_BatchManager",
1848
+ "link": null
1849
+ },
1850
+ {
1851
+ "name": "vae",
1852
+ "shape": 7,
1853
+ "type": "VAE",
1854
+ "link": null
1855
+ },
1856
+ {
1857
+ "name": "frame_rate",
1858
+ "type": "FLOAT",
1859
+ "widget": {
1860
+ "name": "frame_rate"
1861
+ },
1862
+ "link": 375
1863
+ }
1864
+ ],
1865
+ "outputs": [
1866
+ {
1867
+ "name": "Filenames",
1868
+ "type": "VHS_FILENAMES",
1869
+ "links": null
1870
+ }
1871
+ ],
1872
+ "title": "Video Output 2 (Output)",
1873
+ "properties": {
1874
+ "cnr_id": "comfyui-videohelpersuite",
1875
+ "ver": "993082e4f2473bf4acaf06f51e33877a7eb38960",
1876
+ "Node name for S&R": "VHS_VideoCombine",
1877
+ "ue_properties": {
1878
+ "widget_ue_connectable": {
1879
+ "frame_rate": true
1880
+ },
1881
+ "version": "7.5.1",
1882
+ "input_ue_unconnectable": {}
1883
+ },
1884
+ "aux_id": "kosinkadink/ComfyUI-VideoHelperSuite"
1885
+ },
1886
+ "widgets_values": {
1887
+ "frame_rate": 24,
1888
+ "loop_count": 0,
1889
+ "filename_prefix": "minimax-h3/Upscaled_24_fps_video_",
1890
+ "format": "video/h264-mp4",
1891
+ "pix_fmt": "yuv420p",
1892
+ "crf": 12,
1893
+ "save_metadata": true,
1894
+ "trim_to_audio": false,
1895
+ "pingpong": false,
1896
+ "save_output": true,
1897
+ "videopreview": {
1898
+ "hidden": false,
1899
+ "paused": false,
1900
+ "params": {
1901
+ "filename": "vid-patch1_00002-audio.mp4",
1902
+ "subfolder": "minimax-h3",
1903
+ "type": "output",
1904
+ "format": "video/h264-mp4",
1905
+ "frame_rate": 24,
1906
+ "workflow": "vid-patch1_00002.png",
1907
+ "fullpath": "/home/bryan/Documents/ComfyUI/ComfyUI/output/minimax-h3/vid-patch1_00002-audio.mp4"
1908
+ },
1909
+ "muted": false
1910
+ }
1911
+ },
1912
+ "widgets_values_named": {
1913
+ "frame_rate": 24,
1914
+ "loop_count": 0,
1915
+ "filename_prefix": "minimax-h3/Upscaled_24_fps_video_",
1916
+ "format": "video/h264-mp4",
1917
+ "pix_fmt": "yuv420p",
1918
+ "crf": 12,
1919
+ "save_metadata": true,
1920
+ "trim_to_audio": false,
1921
+ "pingpong": false,
1922
+ "save_output": true,
1923
+ "videopreview": {
1924
+ "hidden": false,
1925
+ "paused": false,
1926
+ "params": {
1927
+ "filename": "vid-patch1_00002-audio.mp4",
1928
+ "subfolder": "minimax-h3",
1929
+ "type": "output",
1930
+ "format": "video/h264-mp4",
1931
+ "frame_rate": 24,
1932
+ "workflow": "vid-patch1_00002.png",
1933
+ "fullpath": "/home/bryan/Documents/ComfyUI/ComfyUI/output/minimax-h3/vid-patch1_00002-audio.mp4"
1934
+ },
1935
+ "muted": false
1936
+ }
1937
+ },
1938
+ "ndSuperSelectorEnabled": false,
1939
+ "ndPowerEnabled": false
1940
+ },
1941
+ {
1942
+ "id": 203,
1943
+ "type": "SetNode",
1944
+ "pos": [
1945
+ 1286.4724929438958,
1946
+ 5255.62196170261
1947
+ ],
1948
+ "size": [
1949
+ 210,
1950
+ 60
1951
+ ],
1952
+ "flags": {},
1953
+ "order": 41,
1954
+ "mode": 0,
1955
+ "inputs": [
1956
+ {
1957
+ "name": "AUDIO",
1958
+ "type": "AUDIO",
1959
+ "link": 373
1960
+ }
1961
+ ],
1962
+ "outputs": [
1963
+ {
1964
+ "name": "AUDIO",
1965
+ "type": "AUDIO",
1966
+ "links": null
1967
+ }
1968
+ ],
1969
+ "title": "Set_src_audio",
1970
+ "properties": {
1971
+ "Node name for S&R": "SetNode",
1972
+ "aux_id": "kijai/ComfyUI-KJNodes",
1973
+ "previousName": "src_audio",
1974
+ "ue_properties": {
1975
+ "widget_ue_connectable": {},
1976
+ "version": "7.5.1",
1977
+ "input_ue_unconnectable": {}
1978
+ }
1979
+ },
1980
+ "widgets_values": [
1981
+ "src_audio"
1982
+ ],
1983
+ "widgets_values_named": {
1984
+ "Constant": "src_audio"
1985
+ }
1986
+ },
1987
+ {
1988
+ "id": 204,
1989
+ "type": "MathExpression|pysssss",
1990
+ "pos": [
1991
+ 4523.449955620569,
1992
+ 6055.593667019151
1993
+ ],
1994
+ "size": [
1995
+ 400,
1996
+ 200
1997
+ ],
1998
+ "flags": {},
1999
+ "order": 11,
2000
+ "mode": 4,
2001
+ "inputs": [
2002
+ {
2003
+ "name": "a",
2004
+ "shape": 7,
2005
+ "type": "INT,FLOAT,IMAGE,LATENT",
2006
+ "link": null
2007
+ },
2008
+ {
2009
+ "name": "b",
2010
+ "shape": 7,
2011
+ "type": "INT,FLOAT,IMAGE,LATENT",
2012
+ "link": null
2013
+ },
2014
+ {
2015
+ "name": "c",
2016
+ "shape": 7,
2017
+ "type": "INT,FLOAT,IMAGE,LATENT",
2018
+ "link": null
2019
+ }
2020
+ ],
2021
+ "outputs": [
2022
+ {
2023
+ "name": "INT",
2024
+ "type": "INT",
2025
+ "links": null
2026
+ },
2027
+ {
2028
+ "name": "FLOAT",
2029
+ "type": "FLOAT",
2030
+ "links": [
2031
+ 375
2032
+ ]
2033
+ }
2034
+ ],
2035
+ "properties": {
2036
+ "cnr_id": "comfyui-custom-scripts",
2037
+ "ver": "1.2.5",
2038
+ "ue_properties": {
2039
+ "widget_ue_connectable": {},
2040
+ "input_ue_unconnectable": {},
2041
+ "version": "7.5.1"
2042
+ }
2043
+ },
2044
+ "widgets_values": [
2045
+ "24*2"
2046
+ ],
2047
+ "widgets_values_named": {
2048
+ "expression": "24*2"
2049
+ }
2050
+ },
2051
+ {
2052
+ "id": 206,
2053
+ "type": "RIFEInterpolation",
2054
+ "pos": [
2055
+ 5119.520312181979,
2056
+ 5795.638672522782
2057
+ ],
2058
+ "size": [
2059
+ 270,
2060
+ 178
2061
+ ],
2062
+ "flags": {},
2063
+ "order": 47,
2064
+ "mode": 0,
2065
+ "inputs": [
2066
+ {
2067
+ "name": "images",
2068
+ "type": "IMAGE",
2069
+ "link": 376
2070
+ }
2071
+ ],
2072
+ "outputs": [
2073
+ {
2074
+ "name": "images",
2075
+ "type": "IMAGE",
2076
+ "links": [
2077
+ 377
2078
+ ]
2079
+ }
2080
+ ],
2081
+ "properties": {
2082
+ "aux_id": "GACLove/ComfyUI-VFI",
2083
+ "ver": "6176a430f12cd16003f4664c1e3c6af8e96cc3c6",
2084
+ "Node name for S&R": "RIFEInterpolation",
2085
+ "ue_properties": {
2086
+ "widget_ue_connectable": {},
2087
+ "input_ue_unconnectable": {},
2088
+ "version": "7.5.1"
2089
+ }
2090
+ },
2091
+ "widgets_values": [
2092
+ 24,
2093
+ 60,
2094
+ 1,
2095
+ "flownet.pkl",
2096
+ 8,
2097
+ true
2098
+ ],
2099
+ "widgets_values_named": {
2100
+ "source_fps": 24,
2101
+ "target_fps": 60,
2102
+ "scale": 1,
2103
+ "model_name": "flownet.pkl",
2104
+ "batch_size": 8,
2105
+ "use_fp16": true
2106
+ },
2107
+ "ndSuperSelectorEnabled": false,
2108
+ "ndPowerEnabled": false
2109
+ },
2110
+ {
2111
+ "id": 207,
2112
+ "type": "SetNode",
2113
+ "pos": [
2114
+ 596.3791007131739,
2115
+ 4439.082344867778
2116
+ ],
2117
+ "size": [
2118
+ 210,
2119
+ 60
2120
+ ],
2121
+ "flags": {},
2122
+ "order": 35,
2123
+ "mode": 0,
2124
+ "inputs": [
2125
+ {
2126
+ "name": "MODEL",
2127
+ "type": "MODEL",
2128
+ "link": 379
2129
+ }
2130
+ ],
2131
+ "outputs": [
2132
+ {
2133
+ "name": "MODEL",
2134
+ "type": "MODEL",
2135
+ "links": null
2136
+ }
2137
+ ],
2138
+ "title": "Set_model_VDN",
2139
+ "properties": {
2140
+ "Node name for S&R": "SetNode",
2141
+ "aux_id": "kijai/ComfyUI-KJNodes",
2142
+ "previousName": "model_VDN",
2143
+ "ue_properties": {
2144
+ "widget_ue_connectable": {},
2145
+ "version": "7.5.1",
2146
+ "input_ue_unconnectable": {}
2147
+ }
2148
+ },
2149
+ "widgets_values": [
2150
+ "model_VDN"
2151
+ ],
2152
+ "widgets_values_named": {
2153
+ "Constant": "model_VDN"
2154
+ },
2155
+ "color": "#1f1f48",
2156
+ "bgcolor": "rgba(24,24,27,.9)"
2157
+ },
2158
+ {
2159
+ "id": 208,
2160
+ "type": "SetNode",
2161
+ "pos": [
2162
+ 1308.9444211807354,
2163
+ 5370.09917893309
2164
+ ],
2165
+ "size": [
2166
+ 223.53515625,
2167
+ 60
2168
+ ],
2169
+ "flags": {},
2170
+ "order": 31,
2171
+ "mode": 0,
2172
+ "inputs": [
2173
+ {
2174
+ "name": "CONDITIONING",
2175
+ "type": "CONDITIONING",
2176
+ "link": 380
2177
+ }
2178
+ ],
2179
+ "outputs": [
2180
+ {
2181
+ "name": "CONDITIONING",
2182
+ "type": "CONDITIONING",
2183
+ "links": null
2184
+ }
2185
+ ],
2186
+ "title": "Set_conditionning",
2187
+ "properties": {
2188
+ "Node name for S&R": "SetNode",
2189
+ "aux_id": "kijai/ComfyUI-KJNodes",
2190
+ "previousName": "conditionning",
2191
+ "ue_properties": {
2192
+ "widget_ue_connectable": {},
2193
+ "version": "7.5.1",
2194
+ "input_ue_unconnectable": {}
2195
+ }
2196
+ },
2197
+ "widgets_values": [
2198
+ "conditionning"
2199
+ ],
2200
+ "widgets_values_named": {
2201
+ "Constant": "conditionning"
2202
+ },
2203
+ "color": "#38291f",
2204
+ "bgcolor": "rgba(24,24,27,.9)"
2205
+ },
2206
+ {
2207
+ "id": 209,
2208
+ "type": "Fast Groups Bypasser (rgthree)",
2209
+ "pos": [
2210
+ 2524.1583410749927,
2211
+ 5017.789720985363
2212
+ ],
2213
+ "size": [
2214
+ 247.2955078125,
2215
+ 178
2216
+ ],
2217
+ "flags": {},
2218
+ "order": 17,
2219
+ "mode": 0,
2220
+ "inputs": [],
2221
+ "outputs": [
2222
+ {
2223
+ "name": "OPT_CONNECTION",
2224
+ "type": "*",
2225
+ "links": null
2226
+ }
2227
+ ],
2228
+ "properties": {
2229
+ "matchColors": "",
2230
+ "matchTitle": "",
2231
+ "showNav": true,
2232
+ "showAllGraphs": true,
2233
+ "sort": "position",
2234
+ "customSortAlphabet": "",
2235
+ "toggleRestriction": "default",
2236
+ "ue_properties": {
2237
+ "widget_ue_connectable": {},
2238
+ "input_ue_unconnectable": {},
2239
+ "version": "7.5.1"
2240
+ }
2241
+ }
2242
+ },
2243
+ {
2244
+ "id": 210,
2245
+ "type": "SaveH3Bundle",
2246
+ "pos": [
2247
+ 1961.8501333519866,
2248
+ 5241.902352667398
2249
+ ],
2250
+ "size": [
2251
+ 400,
2252
+ 456
2253
+ ],
2254
+ "flags": {},
2255
+ "order": 44,
2256
+ "mode": 0,
2257
+ "inputs": [
2258
+ {
2259
+ "name": "latent",
2260
+ "type": "LATENT",
2261
+ "link": 391
2262
+ },
2263
+ {
2264
+ "name": "conditioning",
2265
+ "shape": 7,
2266
+ "type": "CONDITIONING",
2267
+ "link": 381
2268
+ },
2269
+ {
2270
+ "name": "video",
2271
+ "shape": 7,
2272
+ "type": "VIDEO",
2273
+ "link": 392
2274
+ },
2275
+ {
2276
+ "name": "images",
2277
+ "shape": 7,
2278
+ "type": "IMAGE",
2279
+ "link": null
2280
+ },
2281
+ {
2282
+ "name": "audio",
2283
+ "shape": 7,
2284
+ "type": "AUDIO",
2285
+ "link": null
2286
+ },
2287
+ {
2288
+ "name": "width",
2289
+ "shape": 7,
2290
+ "type": "INT",
2291
+ "widget": {
2292
+ "name": "width"
2293
+ },
2294
+ "link": 385
2295
+ },
2296
+ {
2297
+ "name": "height",
2298
+ "shape": 7,
2299
+ "type": "INT",
2300
+ "widget": {
2301
+ "name": "height"
2302
+ },
2303
+ "link": 384
2304
+ },
2305
+ {
2306
+ "name": "seed",
2307
+ "shape": 7,
2308
+ "type": "INT",
2309
+ "widget": {
2310
+ "name": "seed"
2311
+ },
2312
+ "link": 388
2313
+ }
2314
+ ],
2315
+ "outputs": [
2316
+ {
2317
+ "name": "bundle_path",
2318
+ "type": "STRING",
2319
+ "links": [
2320
+ 390
2321
+ ]
2322
+ }
2323
+ ],
2324
+ "properties": {
2325
+ "Node name for S&R": "SaveH3Bundle",
2326
+ "ue_properties": {
2327
+ "widget_ue_connectable": {},
2328
+ "input_ue_unconnectable": {},
2329
+ "version": "7.5.1"
2330
+ }
2331
+ },
2332
+ "widgets_values": [
2333
+ "H3/Save_latent_cond/run_",
2334
+ "save",
2335
+ 0,
2336
+ 0,
2337
+ "randomize",
2338
+ 24,
2339
+ 5,
2340
+ "",
2341
+ 0,
2342
+ "randomize",
2343
+ 24,
2344
+ 5,
2345
+ ""
2346
+ ],
2347
+ "widgets_values_named": {
2348
+ "bundle_name": "H3/Save_latent_cond/run_",
2349
+ "mode": "save",
2350
+ "video_path": 0,
2351
+ "preview_frames": 0,
2352
+ "preview_mp4": "randomize",
2353
+ "keep_last_n": 24,
2354
+ "width": 5,
2355
+ "height": "",
2356
+ "seed": 0,
2357
+ "control_after_generate": "randomize",
2358
+ "fps": 24,
2359
+ "generation_seconds": 5,
2360
+ "notes": ""
2361
+ }
2362
+ },
2363
+ {
2364
+ "id": 211,
2365
+ "type": "GetNode",
2366
+ "pos": [
2367
+ 1620.3068074605058,
2368
+ 5455.36235488306
2369
+ ],
2370
+ "size": [
2371
+ 210,
2372
+ 60
2373
+ ],
2374
+ "flags": {},
2375
+ "order": 14,
2376
+ "mode": 0,
2377
+ "inputs": [],
2378
+ "outputs": [
2379
+ {
2380
+ "name": "INT",
2381
+ "type": "INT",
2382
+ "links": [
2383
+ 384
2384
+ ]
2385
+ }
2386
+ ],
2387
+ "title": "Get_height",
2388
+ "properties": {
2389
+ "Node name for S&R": "GetNode",
2390
+ "aux_id": "kijai/ComfyUI-KJNodes",
2391
+ "ue_properties": {
2392
+ "widget_ue_connectable": {},
2393
+ "version": "7.5.1",
2394
+ "input_ue_unconnectable": {}
2395
+ }
2396
+ },
2397
+ "widgets_values": [
2398
+ "height"
2399
+ ],
2400
+ "widgets_values_named": {
2401
+ "Constant": "height"
2402
+ },
2403
+ "color": "#1b4669",
2404
+ "bgcolor": "#29699c"
2405
+ },
2406
+ {
2407
+ "id": 212,
2408
+ "type": "GetNode",
2409
+ "pos": [
2410
+ 1619.4751745121116,
2411
+ 5333.651186770866
2412
+ ],
2413
+ "size": [
2414
+ 210,
2415
+ 58
2416
+ ],
2417
+ "flags": {},
2418
+ "order": 15,
2419
+ "mode": 0,
2420
+ "inputs": [],
2421
+ "outputs": [
2422
+ {
2423
+ "name": "INT",
2424
+ "type": "INT",
2425
+ "links": [
2426
+ 385
2427
+ ]
2428
+ }
2429
+ ],
2430
+ "title": "Get_width",
2431
+ "properties": {
2432
+ "Node name for S&R": "GetNode",
2433
+ "aux_id": "kijai/ComfyUI-KJNodes",
2434
+ "ue_properties": {
2435
+ "widget_ue_connectable": {},
2436
+ "version": "7.5.1",
2437
+ "input_ue_unconnectable": {}
2438
+ }
2439
+ },
2440
+ "widgets_values": [
2441
+ "width"
2442
+ ],
2443
+ "widgets_values_named": {
2444
+ "Constant": "width"
2445
+ },
2446
+ "color": "#1b4669",
2447
+ "bgcolor": "#29699c"
2448
+ },
2449
+ {
2450
+ "id": 213,
2451
+ "type": "SetNode",
2452
+ "pos": [
2453
+ -738.3667157504831,
2454
+ 5830.672682838942
2455
+ ],
2456
+ "size": [
2457
+ 210,
2458
+ 60
2459
+ ],
2460
+ "flags": {
2461
+ "collapsed": true
2462
+ },
2463
+ "order": 27,
2464
+ "mode": 0,
2465
+ "inputs": [
2466
+ {
2467
+ "name": "INT",
2468
+ "type": "INT",
2469
+ "link": 383
2470
+ }
2471
+ ],
2472
+ "outputs": [
2473
+ {
2474
+ "name": "INT",
2475
+ "type": "INT",
2476
+ "links": null
2477
+ }
2478
+ ],
2479
+ "title": "Set_height",
2480
+ "properties": {
2481
+ "Node name for S&R": "SetNode",
2482
+ "aux_id": "kijai/ComfyUI-KJNodes",
2483
+ "previousName": "height",
2484
+ "ue_properties": {
2485
+ "widget_ue_connectable": {},
2486
+ "version": "7.5.1",
2487
+ "input_ue_unconnectable": {}
2488
+ }
2489
+ },
2490
+ "widgets_values": [
2491
+ "height"
2492
+ ],
2493
+ "widgets_values_named": {
2494
+ "Constant": "height"
2495
+ },
2496
+ "color": "#1b4669",
2497
+ "bgcolor": "#29699c"
2498
+ },
2499
+ {
2500
+ "id": 214,
2501
+ "type": "SetNode",
2502
+ "pos": [
2503
+ -542.2339207115867,
2504
+ 5608.02949441485
2505
+ ],
2506
+ "size": [
2507
+ 210,
2508
+ 58
2509
+ ],
2510
+ "flags": {
2511
+ "collapsed": true
2512
+ },
2513
+ "order": 24,
2514
+ "mode": 0,
2515
+ "inputs": [
2516
+ {
2517
+ "name": "INT",
2518
+ "type": "INT",
2519
+ "link": 382
2520
+ }
2521
+ ],
2522
+ "outputs": [
2523
+ {
2524
+ "name": "INT",
2525
+ "type": "INT",
2526
+ "links": null
2527
+ }
2528
+ ],
2529
+ "title": "Set_width",
2530
+ "properties": {
2531
+ "Node name for S&R": "SetNode",
2532
+ "aux_id": "kijai/ComfyUI-KJNodes",
2533
+ "previousName": "width",
2534
+ "ue_properties": {
2535
+ "widget_ue_connectable": {},
2536
+ "version": "7.5.1",
2537
+ "input_ue_unconnectable": {}
2538
+ }
2539
+ },
2540
+ "widgets_values": [
2541
+ "width"
2542
+ ],
2543
+ "widgets_values_named": {
2544
+ "Constant": "width"
2545
+ },
2546
+ "color": "#1b4669",
2547
+ "bgcolor": "#29699c"
2548
+ },
2549
+ {
2550
+ "id": 216,
2551
+ "type": "PrimitiveInt",
2552
+ "pos": [
2553
+ 1589.11306583775,
2554
+ 5076.806327532248
2555
+ ],
2556
+ "size": [
2557
+ 270,
2558
+ 82
2559
+ ],
2560
+ "flags": {},
2561
+ "order": 16,
2562
+ "mode": 0,
2563
+ "inputs": [],
2564
+ "outputs": [
2565
+ {
2566
+ "name": "INT",
2567
+ "type": "INT",
2568
+ "links": [
2569
+ 388,
2570
+ 389
2571
+ ]
2572
+ }
2573
+ ],
2574
+ "properties": {
2575
+ "cnr_id": "comfy-core",
2576
+ "ver": "0.34.5",
2577
+ "Node name for S&R": "PrimitiveInt",
2578
+ "ue_properties": {
2579
+ "widget_ue_connectable": {},
2580
+ "input_ue_unconnectable": {},
2581
+ "version": "7.5.1"
2582
+ }
2583
+ },
2584
+ "widgets_values": [
2585
+ 4224,
2586
+ "fixed"
2587
+ ],
2588
+ "widgets_values_named": {
2589
+ "value": 4224,
2590
+ "fixed": "fixed"
2591
+ }
2592
+ },
2593
+ {
2594
+ "id": 217,
2595
+ "type": "ShowText|pysssss",
2596
+ "pos": [
2597
+ 2379.8169537945423,
2598
+ 5268.9087051319975
2599
+ ],
2600
+ "size": [
2601
+ 247.7914780029946,
2602
+ 162.23318240239496
2603
+ ],
2604
+ "flags": {},
2605
+ "order": 46,
2606
+ "mode": 0,
2607
+ "inputs": [
2608
+ {
2609
+ "name": "text",
2610
+ "type": "STRING",
2611
+ "link": 390
2612
+ }
2613
+ ],
2614
+ "outputs": [
2615
+ {
2616
+ "name": "STRING",
2617
+ "shape": 6,
2618
+ "type": "STRING",
2619
+ "links": null
2620
+ }
2621
+ ],
2622
+ "properties": {
2623
+ "cnr_id": "comfyui-custom-scripts",
2624
+ "ver": "1.2.5",
2625
+ "Node name for S&R": "ShowText|pysssss",
2626
+ "ue_properties": {
2627
+ "widget_ue_connectable": {},
2628
+ "input_ue_unconnectable": {},
2629
+ "version": "7.5.1"
2630
+ }
2631
+ },
2632
+ "widgets_values": [
2633
+ "/home/bryan/Documents/ComfyUI/ComfyUI/output/h3_bundles/H3Save_latent_condrun__20260907_152858"
2634
+ ],
2635
+ "widgets_values_named": {
2636
+ "text_0": "/home/bryan/Documents/ComfyUI/ComfyUI/output/h3_bundles/H3Save_latent_condrun__20260907_152858"
2637
+ }
2638
+ }
2639
+ ],
2640
+ "links": [
2641
+ [
2642
+ 250,
2643
+ 120,
2644
+ 0,
2645
+ 121,
2646
+ 1,
2647
+ "VAE"
2648
+ ],
2649
+ [
2650
+ 251,
2651
+ 119,
2652
+ 0,
2653
+ 122,
2654
+ 1,
2655
+ "VAE"
2656
+ ],
2657
+ [
2658
+ 253,
2659
+ 129,
2660
+ 0,
2661
+ 125,
2662
+ 0,
2663
+ "NOISE"
2664
+ ],
2665
+ [
2666
+ 254,
2667
+ 126,
2668
+ 0,
2669
+ 125,
2670
+ 1,
2671
+ "GUIDER"
2672
+ ],
2673
+ [
2674
+ 256,
2675
+ 124,
2676
+ 0,
2677
+ 125,
2678
+ 3,
2679
+ "SIGMAS"
2680
+ ],
2681
+ [
2682
+ 258,
2683
+ 122,
2684
+ 0,
2685
+ 130,
2686
+ 0,
2687
+ "IMAGE"
2688
+ ],
2689
+ [
2690
+ 260,
2691
+ 130,
2692
+ 0,
2693
+ 92,
2694
+ 0,
2695
+ "VIDEO"
2696
+ ],
2697
+ [
2698
+ 280,
2699
+ 125,
2700
+ 0,
2701
+ 122,
2702
+ 0,
2703
+ "LATENT"
2704
+ ],
2705
+ [
2706
+ 281,
2707
+ 125,
2708
+ 0,
2709
+ 121,
2710
+ 0,
2711
+ "LATENT"
2712
+ ],
2713
+ [
2714
+ 285,
2715
+ 115,
2716
+ 0,
2717
+ 144,
2718
+ 0,
2719
+ "INT"
2720
+ ],
2721
+ [
2722
+ 286,
2723
+ 115,
2724
+ 1,
2725
+ 145,
2726
+ 0,
2727
+ "INT"
2728
+ ],
2729
+ [
2730
+ 328,
2731
+ 121,
2732
+ 0,
2733
+ 130,
2734
+ 1,
2735
+ "AUDIO"
2736
+ ],
2737
+ [
2738
+ 332,
2739
+ 127,
2740
+ 0,
2741
+ 177,
2742
+ 0,
2743
+ "MODEL"
2744
+ ],
2745
+ [
2746
+ 341,
2747
+ 179,
2748
+ 0,
2749
+ 125,
2750
+ 2,
2751
+ "SAMPLER"
2752
+ ],
2753
+ [
2754
+ 344,
2755
+ 185,
2756
+ 0,
2757
+ 126,
2758
+ 1,
2759
+ "CONDITIONING"
2760
+ ],
2761
+ [
2762
+ 345,
2763
+ 185,
2764
+ 1,
2765
+ 125,
2766
+ 4,
2767
+ "LATENT"
2768
+ ],
2769
+ [
2770
+ 346,
2771
+ 128,
2772
+ 0,
2773
+ 185,
2774
+ 0,
2775
+ "CLIP"
2776
+ ],
2777
+ [
2778
+ 347,
2779
+ 119,
2780
+ 0,
2781
+ 185,
2782
+ 1,
2783
+ "VAE"
2784
+ ],
2785
+ [
2786
+ 348,
2787
+ 120,
2788
+ 0,
2789
+ 185,
2790
+ 2,
2791
+ "VAE"
2792
+ ],
2793
+ [
2794
+ 349,
2795
+ 115,
2796
+ 0,
2797
+ 184,
2798
+ 1,
2799
+ "INT"
2800
+ ],
2801
+ [
2802
+ 350,
2803
+ 115,
2804
+ 1,
2805
+ 184,
2806
+ 2,
2807
+ "INT"
2808
+ ],
2809
+ [
2810
+ 353,
2811
+ 184,
2812
+ 0,
2813
+ 185,
2814
+ 3,
2815
+ "MINIMAX_H3_TIMELINE_PLAN"
2816
+ ],
2817
+ [
2818
+ 354,
2819
+ 187,
2820
+ 0,
2821
+ 186,
2822
+ 0,
2823
+ "MODEL"
2824
+ ],
2825
+ [
2826
+ 355,
2827
+ 188,
2828
+ 0,
2829
+ 187,
2830
+ 0,
2831
+ "MODEL"
2832
+ ],
2833
+ [
2834
+ 356,
2835
+ 177,
2836
+ 0,
2837
+ 188,
2838
+ 0,
2839
+ "MODEL"
2840
+ ],
2841
+ [
2842
+ 357,
2843
+ 186,
2844
+ 0,
2845
+ 126,
2846
+ 0,
2847
+ "MODEL"
2848
+ ],
2849
+ [
2850
+ 358,
2851
+ 186,
2852
+ 0,
2853
+ 124,
2854
+ 0,
2855
+ "MODEL"
2856
+ ],
2857
+ [
2858
+ 359,
2859
+ 190,
2860
+ 0,
2861
+ 195,
2862
+ 0,
2863
+ "MODEL"
2864
+ ],
2865
+ [
2866
+ 360,
2867
+ 191,
2868
+ 0,
2869
+ 195,
2870
+ 1,
2871
+ "CONDITIONING"
2872
+ ],
2873
+ [
2874
+ 361,
2875
+ 190,
2876
+ 0,
2877
+ 197,
2878
+ 0,
2879
+ "MODEL"
2880
+ ],
2881
+ [
2882
+ 362,
2883
+ 196,
2884
+ 0,
2885
+ 198,
2886
+ 0,
2887
+ "NOISE"
2888
+ ],
2889
+ [
2890
+ 363,
2891
+ 195,
2892
+ 0,
2893
+ 198,
2894
+ 1,
2895
+ "GUIDER"
2896
+ ],
2897
+ [
2898
+ 364,
2899
+ 194,
2900
+ 0,
2901
+ 198,
2902
+ 2,
2903
+ "SAMPLER"
2904
+ ],
2905
+ [
2906
+ 365,
2907
+ 197,
2908
+ 0,
2909
+ 198,
2910
+ 3,
2911
+ "SIGMAS"
2912
+ ],
2913
+ [
2914
+ 367,
2915
+ 198,
2916
+ 0,
2917
+ 200,
2918
+ 0,
2919
+ "LATENT"
2920
+ ],
2921
+ [
2922
+ 368,
2923
+ 199,
2924
+ 0,
2925
+ 200,
2926
+ 1,
2927
+ "VAE"
2928
+ ],
2929
+ [
2930
+ 370,
2931
+ 193,
2932
+ 0,
2933
+ 202,
2934
+ 1,
2935
+ "AUDIO"
2936
+ ],
2937
+ [
2938
+ 372,
2939
+ 192,
2940
+ 0,
2941
+ 198,
2942
+ 4,
2943
+ "LATENT"
2944
+ ],
2945
+ [
2946
+ 373,
2947
+ 121,
2948
+ 0,
2949
+ 203,
2950
+ 0,
2951
+ "AUDIO"
2952
+ ],
2953
+ [
2954
+ 375,
2955
+ 204,
2956
+ 1,
2957
+ 202,
2958
+ 4,
2959
+ "FLOAT"
2960
+ ],
2961
+ [
2962
+ 376,
2963
+ 200,
2964
+ 0,
2965
+ 206,
2966
+ 0,
2967
+ "IMAGE"
2968
+ ],
2969
+ [
2970
+ 377,
2971
+ 206,
2972
+ 0,
2973
+ 202,
2974
+ 0,
2975
+ "IMAGE"
2976
+ ],
2977
+ [
2978
+ 378,
2979
+ 125,
2980
+ 0,
2981
+ 192,
2982
+ 0,
2983
+ "LATENT"
2984
+ ],
2985
+ [
2986
+ 379,
2987
+ 186,
2988
+ 0,
2989
+ 207,
2990
+ 0,
2991
+ "MODEL"
2992
+ ],
2993
+ [
2994
+ 380,
2995
+ 185,
2996
+ 0,
2997
+ 208,
2998
+ 0,
2999
+ "CONDITIONING"
3000
+ ],
3001
+ [
3002
+ 381,
3003
+ 185,
3004
+ 0,
3005
+ 210,
3006
+ 1,
3007
+ "CONDITIONING"
3008
+ ],
3009
+ [
3010
+ 382,
3011
+ 115,
3012
+ 0,
3013
+ 214,
3014
+ 0,
3015
+ "INT"
3016
+ ],
3017
+ [
3018
+ 383,
3019
+ 115,
3020
+ 1,
3021
+ 213,
3022
+ 0,
3023
+ "INT"
3024
+ ],
3025
+ [
3026
+ 384,
3027
+ 211,
3028
+ 0,
3029
+ 210,
3030
+ 6,
3031
+ "INT"
3032
+ ],
3033
+ [
3034
+ 385,
3035
+ 212,
3036
+ 0,
3037
+ 210,
3038
+ 5,
3039
+ "INT"
3040
+ ],
3041
+ [
3042
+ 388,
3043
+ 216,
3044
+ 0,
3045
+ 210,
3046
+ 7,
3047
+ "INT"
3048
+ ],
3049
+ [
3050
+ 389,
3051
+ 216,
3052
+ 0,
3053
+ 129,
3054
+ 0,
3055
+ "INT"
3056
+ ],
3057
+ [
3058
+ 390,
3059
+ 210,
3060
+ 0,
3061
+ 217,
3062
+ 0,
3063
+ "STRING"
3064
+ ],
3065
+ [
3066
+ 391,
3067
+ 125,
3068
+ 0,
3069
+ 210,
3070
+ 0,
3071
+ "LATENT"
3072
+ ],
3073
+ [
3074
+ 392,
3075
+ 130,
3076
+ 0,
3077
+ 210,
3078
+ 2,
3079
+ "VIDEO"
3080
+ ]
3081
+ ],
3082
+ "groups": [
3083
+ {
3084
+ "id": 1,
3085
+ "title": "Models",
3086
+ "bounding": [
3087
+ -1520,
3088
+ 4840,
3089
+ 700,
3090
+ 670
3091
+ ],
3092
+ "color": "#3f789e",
3093
+ "flags": {}
3094
+ },
3095
+ {
3096
+ "id": 2,
3097
+ "title": "Sampling",
3098
+ "bounding": [
3099
+ 136.29100926618636,
3100
+ 4834.271224643126,
3101
+ 690,
3102
+ 670
3103
+ ],
3104
+ "color": "#3f789e",
3105
+ "flags": {}
3106
+ },
3107
+ {
3108
+ "id": 3,
3109
+ "title": "Conditioning",
3110
+ "bounding": [
3111
+ -790,
3112
+ 4840,
3113
+ 480,
3114
+ 670
3115
+ ],
3116
+ "color": "#3f789e",
3117
+ "flags": {}
3118
+ },
3119
+ {
3120
+ "id": 4,
3121
+ "title": "Decoding and create video",
3122
+ "bounding": [
3123
+ 888.501561617095,
3124
+ 4839.100440233215,
3125
+ 670,
3126
+ 670
3127
+ ],
3128
+ "color": "#3f789e",
3129
+ "flags": {}
3130
+ },
3131
+ {
3132
+ "id": 5,
3133
+ "title": "User Inputs",
3134
+ "bounding": [
3135
+ -1520,
3136
+ 5540,
3137
+ 1210,
3138
+ 880
3139
+ ],
3140
+ "color": "#3f789e",
3141
+ "flags": {}
3142
+ },
3143
+ {
3144
+ "id": 6,
3145
+ "title": "Upscaling",
3146
+ "bounding": [
3147
+ 2558.029612735003,
3148
+ 5351.991034540429,
3149
+ 2454.80502,
3150
+ 1275.2606874999992
3151
+ ],
3152
+ "color": "#3f789e",
3153
+ "flags": {}
3154
+ }
3155
+ ],
3156
+ "config": {},
3157
+ "extra": {
3158
+ "ds": {
3159
+ "scale": 0.9277171243279717,
3160
+ "offset": [
3161
+ 1500.7939306240755,
3162
+ -3948.661739430455
3163
+ ]
3164
+ },
3165
+ "frontendVersion": "1.49.6",
3166
+ "VHS_latentpreview": false,
3167
+ "VHS_latentpreviewrate": 0,
3168
+ "VHS_MetadataImage": true,
3169
+ "VHS_KeepIntermediate": true,
3170
+ "anomalous_hashes": {
3171
+ "127_minimax_h3_ref2va_int8_convrot.safetensors": {
3172
+ "hash": "",
3173
+ "size": 34038894550
3174
+ },
3175
+ "119_minimax_h3_video_vae_fp16.safetensors": {
3176
+ "hash": "",
3177
+ "size": 5207808496
3178
+ },
3179
+ "120_minimax_h3_audio_vae_fp32.safetensors": {
3180
+ "hash": "",
3181
+ "size": 605254808
3182
+ },
3183
+ "177_minimax_h3_fl2v_lightx2v_turbo_4step_v1.0_768p_resized_avg_rank_31_bf16.safetensors": {
3184
+ "hash": "",
3185
+ "size": 440873704
3186
+ }
3187
+ },
3188
+ "ue_links": [],
3189
+ "links_added_by_ue": []
3190
+ },
3191
+ "version": 0.4
3192
+ }