📍AGSoft Add Guide for MiniMax H3
AGSoft Add Guide
- positive
- latent
- vae
- audio_vae
- image_1
- audio_1
- image_2
- audio_2
- image_3
- audio_3
- image_4
- audio_4
- image_5
- audio_5
- image_6
- audio_6
- image_7
- audio_7
- image_8
- audio_8
- image_9
- audio_9
- image_10
- audio_10
- image_11
- audio_11
- image_12
- audio_12
- image_13
- audio_13
- image_14
- audio_14
- image_15
- audio_15
- image_16
- audio_16
- positive
- guides_info
MiniMax H3 generates video with sound baked into the same pass, and it lets you pin an image - or a short clip, or a snatch of audio - to a specific frame of the output. That pinning is the whole trick behind "start here, land there" video. ComfyUI core ships a node for it, MiniMaxH3AddGuide, and that node anchors exactly one guide per node. Want an opening frame, a mid-way beat and a final frame? You chain three nodes and count frames by hand.
AGSoft's node is the same idea with the bookkeeping done for you: up to sixteen guide slots on one node, positions in seconds or frames, and a JSON readout of where everything actually landed.
How it works
Guides don't go in as a separate sampler input. They get written into the conditioning itself, under a key called minimax_keyframes, as a list of {"resolved_frame_index": n, "latent": ..., "audio_latent": ...} entries. H3's sampler reads that list and anchors those latents at those frames. This node does the same thing core does - it reads whatever minimax_keyframes list is already on the positive conditioning and appends to it - which means the two interoperate. You can chain the core node into this one, or two of these into each other, and the guides stack instead of overwriting.
Two details explain most of the weird errors. First, the node derives pixel size from the AV latent (grid times 16) and encodes your guides with the video VAE at that resolution, center-cropped - a 16:9 guide dropped onto a 9:16 latent loses its sides. Second, guide images aren't always one frame: a batch of 5+ frames is treated as a clip and trimmed down to H3's valid clip lengths, 5, 22, 39 and onward in steps of 17 (17k+5). Batches under 5 frames use the first image only.
The inputs that actually matter
positive and latent are what you'd expect: the conditioning you're already feeding the sampler, and the AV latent from EmptyMiniMaxH3LatentAV or one of the H3 conditioning nodes. vae is the video VAE for encoding the guides.
number_of_guides (1–16) is the slot count. It does not hide the slots - it decides how many the node looks at. If you set it to 1, slots 2 through 16 are ignored even if you've wired them up. Bump it before you start wiring, not after.
position_mode flips between Seconds and Frames, and fps (default 24, which is H3's native rate) is what converts one to the other. Both seconds_N and frames_N widgets exist on every slot regardless of the mode; only the matching one is read. Either accepts -1 for the last frame, which is the sane way to nail a closing frame without computing the length yourself.
Each slot then takes image_N, optionally audio_N, and its position. Audio inputs only show up once you've wired audio_vae - that's a frontend trick from the pack's JS, not a version limit.
Two outputs. positive goes straight into your sampler where you'd otherwise be plugging the conditioning. guides_info is a JSON string listing each guide's slot, mode, value, resolved frame_idx and clip length - wire it into a Show Text or Show Any node and read it when a guide lands somewhere you didn't expect.
Install
ComfyUI Manager, search comfyui-AGSoft and install, then restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Art-xmaster/comfyui-AGSoft
# restart ComfyUI
The pack's requirements.txt pulls numpy, opencv-python and translators. You don't need translators for this node - it's for the Translate nodes - but it installs anyway. The node lives under Add Node → AGSoft/MiniMaxH3.
Troubleshooting
"AGSoft Add Guide needs core MiniMaxH3AddGuide (ComfyUI >= 0.34.0)". This node is a wrapper, not a reimplementation: it locates the core MiniMaxH3AddGuide at import and borrows its internals. On older ComfyUI that lookup fails and the node can't run. Update ComfyUI. The flip side is that it reaches into core's private helpers, so a future core refactor can break it in a way an ordinary node wouldn't.
"latent must be a MiniMax H3 AV latent". You're feeding a plain image or video latent. H3's is a nested pair of tensors with a 24-channel video half, and only the H3 conditioning nodes produce one.
"guide #N: frame X + Y frames outside Z". Deliberately loud. Out-of-range guides error out rather than being quietly clamped to the last frame, so a guide that looks like it did nothing usually means the node threw and the graph stopped. Check the resolved index against guides_info.
Nothing happened, no error. If a slot has neither image nor audio connected, it's skipped silently - and if no slot has anything connected, the node just logs a warning and passes your conditioning through unchanged. Guides that don't appear are almost always unwired slots or a number_of_guides set lower than the slot you filled.
Inputs (71)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | Input positive conditioning. --- Входной позитивный conditioning. | |
| latent | LATENT | MiniMax H3 AV latent: defines size and frame count. --- AV-латент MiniMax H3: задаёт размер и число кадров. | |
| vae | VAE | Video VAE for encoding guide images. --- Видео VAE для кодирования направляющих изображений. | |
| number_of_guides | INT | 11–16 | How many guide slots are active. --- Сколько направляющих слотов активно. |
| position_mode | COMBO | Seconds | How guides are positioned: Seconds uses fps to convert to frame index; Frames takes the index directly. --- Как позиционируются гайды: Seconds конвертирует через fps в индекс кадра; Frames берёт индекс напрямую. |
| fps | FLOAT | 24.01–120 | FPS for seconds-to-frame conversion (MiniMax H3 native is 24). --- FPS для перевода секунд в кадры (родной для MiniMax H3 — 24). |
| audio_vaeopt | VAE | Audio VAE: linking it reveals optional audio inputs. --- Audio VAE: подключение открывает опциональные аудио-входы. | |
| image_1opt | IMAGE | Guide image/clip #1; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #1; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_1opt | AUDIO | Guide audio #1 (optional, needs audio_vae). --- Направляющее аудио #1 (опционально, нужен audio_vae). | |
| seconds_1opt | FLOAT | 0.00-1–3600 | Position of guide #1 in seconds, -1 = last frame. --- Позиция направляющей #1 в секундах, -1 = последний кадр. |
| frames_1opt | INT | 0-1–9999 | Position of guide #1 in frames, -1 = last frame. --- Позиция направляющей #1 в кадрах, -1 = последний кадр. |
| image_2opt | IMAGE | Guide image/clip #2; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #2; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_2opt | AUDIO | Guide audio #2 (optional, needs audio_vae). --- Направляющее аудио #2 (опционально, нужен audio_vae). | |
| seconds_2opt | FLOAT | 0.00-1–3600 | Position of guide #2 in seconds, -1 = last frame. --- Позиция направляющей #2 в секундах, -1 = последний кадр. |
| frames_2opt | INT | 0-1–9999 | Position of guide #2 in frames, -1 = last frame. --- Позиция направляющей #2 в кадрах, -1 = последний кадр. |
| image_3opt | IMAGE | Guide image/clip #3; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #3; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_3opt | AUDIO | Guide audio #3 (optional, needs audio_vae). --- Направляющее аудио #3 (опционально, нужен audio_vae). | |
| seconds_3opt | FLOAT | 0.00-1–3600 | Position of guide #3 in seconds, -1 = last frame. --- Позиция направляющей #3 в секундах, -1 = последний кадр. |
| frames_3opt | INT | 0-1–9999 | Position of guide #3 in frames, -1 = last frame. --- Позиция направляющей #3 в кадрах, -1 = последний кадр. |
| image_4opt | IMAGE | Guide image/clip #4; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #4; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_4opt | AUDIO | Guide audio #4 (optional, needs audio_vae). --- Направляющее аудио #4 (опционально, нужен audio_vae). | |
| seconds_4opt | FLOAT | 0.00-1–3600 | Position of guide #4 in seconds, -1 = last frame. --- Позиция направляющей #4 в секундах, -1 = последний кадр. |
| frames_4opt | INT | 0-1–9999 | Position of guide #4 in frames, -1 = last frame. --- Позиция направляющей #4 в кадрах, -1 = последний кадр. |
| image_5opt | IMAGE | Guide image/clip #5; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #5; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_5opt | AUDIO | Guide audio #5 (optional, needs audio_vae). --- Направляющее аудио #5 (опционально, нужен audio_vae). | |
| seconds_5opt | FLOAT | 0.00-1–3600 | Position of guide #5 in seconds, -1 = last frame. --- Позиция направляющей #5 в секундах, -1 = последний кадр. |
| frames_5opt | INT | 0-1–9999 | Position of guide #5 in frames, -1 = last frame. --- Позиция направляющей #5 в кадрах, -1 = последний кадр. |
| image_6opt | IMAGE | Guide image/clip #6; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #6; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_6opt | AUDIO | Guide audio #6 (optional, needs audio_vae). --- Направляющее аудио #6 (опционально, нужен audio_vae). | |
| seconds_6opt | FLOAT | 0.00-1–3600 | Position of guide #6 in seconds, -1 = last frame. --- Позиция направляющей #6 в секундах, -1 = последний кадр. |
| frames_6opt | INT | 0-1–9999 | Position of guide #6 in frames, -1 = last frame. --- Позиция направляющей #6 в кадрах, -1 = последний кадр. |
| image_7opt | IMAGE | Guide image/clip #7; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #7; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_7opt | AUDIO | Guide audio #7 (optional, needs audio_vae). --- Направляющее аудио #7 (опционально, нужен audio_vae). | |
| seconds_7opt | FLOAT | 0.00-1–3600 | Position of guide #7 in seconds, -1 = last frame. --- Позиция направляющей #7 в секундах, -1 = последний кадр. |
| frames_7opt | INT | 0-1–9999 | Position of guide #7 in frames, -1 = last frame. --- Позиция направляющей #7 в кадрах, -1 = последний кадр. |
| image_8opt | IMAGE | Guide image/clip #8; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #8; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_8opt | AUDIO | Guide audio #8 (optional, needs audio_vae). --- Направляющее аудио #8 (опционально, нужен audio_vae). | |
| seconds_8opt | FLOAT | 0.00-1–3600 | Position of guide #8 in seconds, -1 = last frame. --- Позиция направляющей #8 в секундах, -1 = последний кадр. |
| frames_8opt | INT | 0-1–9999 | Position of guide #8 in frames, -1 = last frame. --- Позиция направляющей #8 в кадрах, -1 = последний кадр. |
| image_9opt | IMAGE | Guide image/clip #9; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #9; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_9opt | AUDIO | Guide audio #9 (optional, needs audio_vae). --- Направляющее аудио #9 (опционально, нужен audio_vae). | |
| seconds_9opt | FLOAT | 0.00-1–3600 | Position of guide #9 in seconds, -1 = last frame. --- Позиция направляющей #9 в секундах, -1 = последний кадр. |
| frames_9opt | INT | 0-1–9999 | Position of guide #9 in frames, -1 = last frame. --- Позиция направляющей #9 в кадрах, -1 = последний кадр. |
| image_10opt | IMAGE | Guide image/clip #10; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #10; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_10opt | AUDIO | Guide audio #10 (optional, needs audio_vae). --- Направляющее аудио #10 (опционально, нужен audio_vae). | |
| seconds_10opt | FLOAT | 0.00-1–3600 | Position of guide #10 in seconds, -1 = last frame. --- Позиция направляющей #10 в секундах, -1 = последний кадр. |
| frames_10opt | INT | 0-1–9999 | Position of guide #10 in frames, -1 = last frame. --- Позиция направляющей #10 в кадрах, -1 = последний кадр. |
| image_11opt | IMAGE | Guide image/clip #11; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #11; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_11opt | AUDIO | Guide audio #11 (optional, needs audio_vae). --- Направляющее аудио #11 (опционально, нужен audio_vae). | |
| seconds_11opt | FLOAT | 0.00-1–3600 | Position of guide #11 in seconds, -1 = last frame. --- Позиция направляющей #11 в секундах, -1 = последний кадр. |
| frames_11opt | INT | 0-1–9999 | Position of guide #11 in frames, -1 = last frame. --- Позиция направляющей #11 в кадрах, -1 = последний кадр. |
| image_12opt | IMAGE | Guide image/clip #12; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #12; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_12opt | AUDIO | Guide audio #12 (optional, needs audio_vae). --- Направляющее аудио #12 (опционально, нужен audio_vae). | |
| seconds_12opt | FLOAT | 0.00-1–3600 | Position of guide #12 in seconds, -1 = last frame. --- Позиция направляющей #12 в секундах, -1 = последний кадр. |
| frames_12opt | INT | 0-1–9999 | Position of guide #12 in frames, -1 = last frame. --- Позиция направляющей #12 в кадрах, -1 = последний кадр. |
| image_13opt | IMAGE | Guide image/clip #13; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #13; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_13opt | AUDIO | Guide audio #13 (optional, needs audio_vae). --- Направляющее аудио #13 (опционально, нужен audio_vae). | |
| seconds_13opt | FLOAT | 0.00-1–3600 | Position of guide #13 in seconds, -1 = last frame. --- Позиция направляющей #13 в секундах, -1 = последний кадр. |
| frames_13opt | INT | 0-1–9999 | Position of guide #13 in frames, -1 = last frame. --- Позиция направляющей #13 в кадрах, -1 = последний кадр. |
| image_14opt | IMAGE | Guide image/clip #14; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #14; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_14opt | AUDIO | Guide audio #14 (optional, needs audio_vae). --- Направляющее аудио #14 (опционально, нужен audio_vae). | |
| seconds_14opt | FLOAT | 0.00-1–3600 | Position of guide #14 in seconds, -1 = last frame. --- Позиция направляющей #14 в секундах, -1 = последний кадр. |
| frames_14opt | INT | 0-1–9999 | Position of guide #14 in frames, -1 = last frame. --- Позиция направляющей #14 в кадрах, -1 = последний кадр. |
| image_15opt | IMAGE | Guide image/clip #15; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #15; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_15opt | AUDIO | Guide audio #15 (optional, needs audio_vae). --- Направляющее аудио #15 (опционально, нужен audio_vae). | |
| seconds_15opt | FLOAT | 0.00-1–3600 | Position of guide #15 in seconds, -1 = last frame. --- Позиция направляющей #15 в секундах, -1 = последний кадр. |
| frames_15opt | INT | 0-1–9999 | Position of guide #15 in frames, -1 = last frame. --- Позиция направляющей #15 в кадрах, -1 = последний кадр. |
| image_16opt | IMAGE | Guide image/clip #16; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #16; батчи >=5 кадров становятся клипами 17k+5. | |
| audio_16opt | AUDIO | Guide audio #16 (optional, needs audio_vae). --- Направляющее аудио #16 (опционально, нужен audio_vae). | |
| seconds_16opt | FLOAT | 0.00-1–3600 | Position of guide #16 in seconds, -1 = last frame. --- Позиция направляющей #16 в секундах, -1 = последний кадр. |
| frames_16opt | INT | 0-1–9999 | Position of guide #16 in frames, -1 = last frame. --- Позиция направляющей #16 в кадрах, -1 = последний кадр. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | Conditioning with native minimax_keyframes guides. --- Conditioning с нативными гайдами minimax_keyframes. |
| guides_info | STRING | JSON summary of guides (seconds, resolved frame_idx). --- JSON-сводка направляющих (секунды, разрешённый frame_idx). |