Nodes/comfyui-AGSoft/📍AGSoft Add Guide for MiniMax H3
ComfyUI Node

📍AGSoft Add Guide for MiniMax H3

AGSoft Add Guide

By Art-xmaster·Created about a year ago·Updated a day ago· 30
📍AGSoft Add Guide for MiniMax H3
  • 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
number_of_guides1
position_modeSeconds
fps24.0
seconds_10.00
frames_10
seconds_20.00
frames_20
seconds_30.00
frames_30
seconds_40.00
frames_40
seconds_50.00
frames_50
seconds_60.00
frames_60
seconds_70.00
frames_70
seconds_80.00
frames_80
seconds_90.00
frames_90
seconds_100.00
frames_100
seconds_110.00
frames_110
seconds_120.00
frames_120
seconds_130.00
frames_130
seconds_140.00
frames_140
seconds_150.00
frames_150
seconds_160.00
frames_160

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.

CategoryAGSoft/MiniMaxH3

Inputs (71)

NameTypeDefaultDescription
positiveCONDITIONINGInput positive conditioning. --- Входной позитивный conditioning.
latentLATENTMiniMax H3 AV latent: defines size and frame count. --- AV-латент MiniMax H3: задаёт размер и число кадров.
vaeVAEVideo VAE for encoding guide images. --- Видео VAE для кодирования направляющих изображений.
number_of_guidesINT11–16How many guide slots are active. --- Сколько направляющих слотов активно.
position_modeCOMBOSecondsHow guides are positioned: Seconds uses fps to convert to frame index; Frames takes the index directly. --- Как позиционируются гайды: Seconds конвертирует через fps в индекс кадра; Frames берёт индекс напрямую.
fpsFLOAT24.01–120FPS for seconds-to-frame conversion (MiniMax H3 native is 24). --- FPS для перевода секунд в кадры (родной для MiniMax H3 — 24).
audio_vaeoptVAEAudio VAE: linking it reveals optional audio inputs. --- Audio VAE: подключение открывает опциональные аудио-входы.
image_1optIMAGEGuide image/clip #1; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #1; батчи >=5 кадров становятся клипами 17k+5.
audio_1optAUDIOGuide audio #1 (optional, needs audio_vae). --- Направляющее аудио #1 (опционально, нужен audio_vae).
seconds_1optFLOAT0.00-1–3600Position of guide #1 in seconds, -1 = last frame. --- Позиция направляющей #1 в секундах, -1 = последний кадр.
frames_1optINT0-1–9999Position of guide #1 in frames, -1 = last frame. --- Позиция направляющей #1 в кадрах, -1 = последний кадр.
image_2optIMAGEGuide image/clip #2; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #2; батчи >=5 кадров становятся клипами 17k+5.
audio_2optAUDIOGuide audio #2 (optional, needs audio_vae). --- Направляющее аудио #2 (опционально, нужен audio_vae).
seconds_2optFLOAT0.00-1–3600Position of guide #2 in seconds, -1 = last frame. --- Позиция направляющей #2 в секундах, -1 = последний кадр.
frames_2optINT0-1–9999Position of guide #2 in frames, -1 = last frame. --- Позиция направляющей #2 в кадрах, -1 = последний кадр.
image_3optIMAGEGuide image/clip #3; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #3; батчи >=5 кадров становятся клипами 17k+5.
audio_3optAUDIOGuide audio #3 (optional, needs audio_vae). --- Направляющее аудио #3 (опционально, нужен audio_vae).
seconds_3optFLOAT0.00-1–3600Position of guide #3 in seconds, -1 = last frame. --- Позиция направляющей #3 в секундах, -1 = последний кадр.
frames_3optINT0-1–9999Position of guide #3 in frames, -1 = last frame. --- Позиция направляющей #3 в кадрах, -1 = последний кадр.
image_4optIMAGEGuide image/clip #4; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #4; батчи >=5 кадров становятся клипами 17k+5.
audio_4optAUDIOGuide audio #4 (optional, needs audio_vae). --- Направляющее аудио #4 (опционально, нужен audio_vae).
seconds_4optFLOAT0.00-1–3600Position of guide #4 in seconds, -1 = last frame. --- Позиция направляющей #4 в секундах, -1 = последний кадр.
frames_4optINT0-1–9999Position of guide #4 in frames, -1 = last frame. --- Позиция направляющей #4 в кадрах, -1 = последний кадр.
image_5optIMAGEGuide image/clip #5; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #5; батчи >=5 кадров становятся клипами 17k+5.
audio_5optAUDIOGuide audio #5 (optional, needs audio_vae). --- Направляющее аудио #5 (опционально, нужен audio_vae).
seconds_5optFLOAT0.00-1–3600Position of guide #5 in seconds, -1 = last frame. --- Позиция направляющей #5 в секундах, -1 = последний кадр.
frames_5optINT0-1–9999Position of guide #5 in frames, -1 = last frame. --- Позиция направляющей #5 в кадрах, -1 = последний кадр.
image_6optIMAGEGuide image/clip #6; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #6; батчи >=5 кадров становятся клипами 17k+5.
audio_6optAUDIOGuide audio #6 (optional, needs audio_vae). --- Направляющее аудио #6 (опционально, нужен audio_vae).
seconds_6optFLOAT0.00-1–3600Position of guide #6 in seconds, -1 = last frame. --- Позиция направляющей #6 в секундах, -1 = последний кадр.
frames_6optINT0-1–9999Position of guide #6 in frames, -1 = last frame. --- Позиция направляющей #6 в кадрах, -1 = последний кадр.
image_7optIMAGEGuide image/clip #7; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #7; батчи >=5 кадров становятся клипами 17k+5.
audio_7optAUDIOGuide audio #7 (optional, needs audio_vae). --- Направляющее аудио #7 (опционально, нужен audio_vae).
seconds_7optFLOAT0.00-1–3600Position of guide #7 in seconds, -1 = last frame. --- Позиция направляющей #7 в секундах, -1 = последний кадр.
frames_7optINT0-1–9999Position of guide #7 in frames, -1 = last frame. --- Позиция направляющей #7 в кадрах, -1 = последний кадр.
image_8optIMAGEGuide image/clip #8; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #8; батчи >=5 кадров становятся клипами 17k+5.
audio_8optAUDIOGuide audio #8 (optional, needs audio_vae). --- Направляющее аудио #8 (опционально, нужен audio_vae).
seconds_8optFLOAT0.00-1–3600Position of guide #8 in seconds, -1 = last frame. --- Позиция направляющей #8 в секундах, -1 = последний кадр.
frames_8optINT0-1–9999Position of guide #8 in frames, -1 = last frame. --- Позиция направляющей #8 в кадрах, -1 = последний кадр.
image_9optIMAGEGuide image/clip #9; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #9; батчи >=5 кадров становятся клипами 17k+5.
audio_9optAUDIOGuide audio #9 (optional, needs audio_vae). --- Направляющее аудио #9 (опционально, нужен audio_vae).
seconds_9optFLOAT0.00-1–3600Position of guide #9 in seconds, -1 = last frame. --- Позиция направляющей #9 в секундах, -1 = последний кадр.
frames_9optINT0-1–9999Position of guide #9 in frames, -1 = last frame. --- Позиция направляющей #9 в кадрах, -1 = последний кадр.
image_10optIMAGEGuide image/clip #10; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #10; батчи >=5 кадров становятся клипами 17k+5.
audio_10optAUDIOGuide audio #10 (optional, needs audio_vae). --- Направляющее аудио #10 (опционально, нужен audio_vae).
seconds_10optFLOAT0.00-1–3600Position of guide #10 in seconds, -1 = last frame. --- Позиция направляющей #10 в секундах, -1 = последний кадр.
frames_10optINT0-1–9999Position of guide #10 in frames, -1 = last frame. --- Позиция направляющей #10 в кадрах, -1 = последний кадр.
image_11optIMAGEGuide image/clip #11; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #11; батчи >=5 кадров становятся клипами 17k+5.
audio_11optAUDIOGuide audio #11 (optional, needs audio_vae). --- Направляющее аудио #11 (опционально, нужен audio_vae).
seconds_11optFLOAT0.00-1–3600Position of guide #11 in seconds, -1 = last frame. --- Позиция направляющей #11 в секундах, -1 = последний кадр.
frames_11optINT0-1–9999Position of guide #11 in frames, -1 = last frame. --- Позиция направляющей #11 в кадрах, -1 = последний кадр.
image_12optIMAGEGuide image/clip #12; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #12; батчи >=5 кадров становятся клипами 17k+5.
audio_12optAUDIOGuide audio #12 (optional, needs audio_vae). --- Направляющее аудио #12 (опционально, нужен audio_vae).
seconds_12optFLOAT0.00-1–3600Position of guide #12 in seconds, -1 = last frame. --- Позиция направляющей #12 в секундах, -1 = последний кадр.
frames_12optINT0-1–9999Position of guide #12 in frames, -1 = last frame. --- Позиция направляющей #12 в кадрах, -1 = последний кадр.
image_13optIMAGEGuide image/clip #13; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #13; батчи >=5 кадров становятся клипами 17k+5.
audio_13optAUDIOGuide audio #13 (optional, needs audio_vae). --- Направляющее аудио #13 (опционально, нужен audio_vae).
seconds_13optFLOAT0.00-1–3600Position of guide #13 in seconds, -1 = last frame. --- Позиция направляющей #13 в секундах, -1 = последний кадр.
frames_13optINT0-1–9999Position of guide #13 in frames, -1 = last frame. --- Позиция направляющей #13 в кадрах, -1 = последний кадр.
image_14optIMAGEGuide image/clip #14; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #14; батчи >=5 кадров становятся клипами 17k+5.
audio_14optAUDIOGuide audio #14 (optional, needs audio_vae). --- Направляющее аудио #14 (опционально, нужен audio_vae).
seconds_14optFLOAT0.00-1–3600Position of guide #14 in seconds, -1 = last frame. --- Позиция направляющей #14 в секундах, -1 = последний кадр.
frames_14optINT0-1–9999Position of guide #14 in frames, -1 = last frame. --- Позиция направляющей #14 в кадрах, -1 = последний кадр.
image_15optIMAGEGuide image/clip #15; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #15; батчи >=5 кадров становятся клипами 17k+5.
audio_15optAUDIOGuide audio #15 (optional, needs audio_vae). --- Направляющее аудио #15 (опционально, нужен audio_vae).
seconds_15optFLOAT0.00-1–3600Position of guide #15 in seconds, -1 = last frame. --- Позиция направляющей #15 в секундах, -1 = последний кадр.
frames_15optINT0-1–9999Position of guide #15 in frames, -1 = last frame. --- Позиция направляющей #15 в кадрах, -1 = последний кадр.
image_16optIMAGEGuide image/clip #16; batches >=5 frames become 17k+5 clips. --- Направляющее изображение/клип #16; батчи >=5 кадров становятся клипами 17k+5.
audio_16optAUDIOGuide audio #16 (optional, needs audio_vae). --- Направляющее аудио #16 (опционально, нужен audio_vae).
seconds_16optFLOAT0.00-1–3600Position of guide #16 in seconds, -1 = last frame. --- Позиция направляющей #16 в секундах, -1 = последний кадр.
frames_16optINT0-1–9999Position of guide #16 in frames, -1 = last frame. --- Позиция направляющей #16 в кадрах, -1 = последний кадр.

Outputs (2)

NameTypeDescription
positiveCONDITIONINGConditioning with native minimax_keyframes guides. --- Conditioning с нативными гайдами minimax_keyframes.
guides_infoSTRINGJSON summary of guides (seconds, resolved frame_idx). --- JSON-сводка направляющих (секунды, разрешённый frame_idx).