Nodes/arkennemasis - ChatGPT / Codex / fal AI nodes/arkennemasis fal · MiniMax H3 Image to Video · $0.05-0.16/s
ComfyUI Node

arkennemasis fal · MiniMax H3 Image to Video · $0.05-0.16/s

2K with sound, and the resolution box that decides your bill

By Hishamahmer·Created 3 months ago·Updated 9 days ago· 11
arkennemasis fal · MiniMax H3 Image to Video · $0.05-0.16/s
  • target_audio
  • image
  • end_image
  • video
  • video_path
  • expanded_prompt
  • info
◄prompt►
◄duration5►
◄resolution2K►
◄seed-1►
◄enable_safety_checkertrue►
◄prompt_expansion_modebalanced►
◄max_cost_usd20.0►
◄reuse_identical_runtrue►
◄extra_json►
◄max_concurrent1►

What H3 is, and why the API version exists

MiniMax H3 is the 33B omni-modal video model MiniMax opened in August 2026 - the first open-weights video model that generates picture and sound in one pass, with dialogue, effects and room tone coming out of the same generation rather than a separate audio pass bolted on top. Locally that's a big deal, because native audio was the last thing only closed models (Veo in particular) could do.

There's one wrinkle worth knowing before you choose a path: the H3 Community License excludes the US, the EU, the UK and South Korea from its Applicable Territory. If you're in one of those places, the open weights are not yours to run, and the hosted endpoint is the clean route. If you do run H3 locally, this pack has the other end of that same road - its own local Hailuo Scene node and a Story Creation workflow that renders scenes on your own card.

Either way, this node animates a still: your image becomes the first frame. The practical version of that in a workflow is the hybrid everyone runs - generate the frame (locally, or with a closed image model like Nano Banana), then let H3 breathe motion and audio into it.

How it works

The node uploads your image and any audio to fal's CDN (free), submits one billed call to minimax/h3/image-to-video, waits on the node with a status and estimate readout, then downloads the clip into output/fal/minimax_h3_image-to-video/. Cancel in ComfyUI cancels on fal. The pre-run estimate measures your actual connected media, so the number it shows before submitting is the honest one.

Inputs that actually matter

image is the job. Whatever you connect becomes the first frame and, importantly, sets the output canvas - so the aspect ratio of your still is the aspect ratio of your clip. end_image is the other half of that: give it a last frame and H3 animates the transition between the two, which is the neatest way to land a shot on a specific composition.

Then the three that change what comes back:

  • resolution - default 2K. Read the tooltip: 480P and 768P are native generation modes; 2K and 4K are upscales of a 768P base result. At $0.13/s and $0.16/s respectively, versus $0.06/s at 768P, the default box is the difference between a 5-second clip costing about $0.30 and about $0.65. If you're iterating on motion, drop to 768P and upscale the keeper.
  • duration - seconds, default 5.
  • prompt_expansion_mode - disabled, fast, balanced (default), quality. This decides how much effort the model spends rewriting your prompt before generating. quality can spend up to ~30 seconds making your prompt richer, which is often worth it and occasionally completely undermines a carefully written prompt. If you mean exactly what you wrote, use disabled.

Also present: target_audio, which pins an audio clip you supply onto the soundtrack instead of the generated one (minimum 2 seconds, max 15 MB; longer clips are trimmed to the video length and short ones are padded with silence, so the voice doesn't get sped up); seed (-1 = model's choice) and enable_safety_checker (on by default).

Guards on every fal node here: max_cost_usd ($20 default, checked before anything is uploaded, 0 disables), reuse_identical_run (returns the paid result for identical inputs), extra_json, max_concurrent (default 1, one paid fal call at a time across the run).

Outputs

video (wire it to SaveVideo, PreviewVideo, or the pack's Video Assemble), video_path, expanded_prompt (the prompt that was actually used - check this when the result surprises you) and info (request id, estimate, saved files, fal's raw answer).

Install

cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install -r comfyui-arkennemasis/requirements.txt

Restart, then look under arkennemasis/fal/Video/MiniMax. Add the key once to the .env next to run_nvidia_gpu.bat:

FAL_KEY=your-key-from-fal.ai/dashboard/keys

No model files, no extra weights, no GPU load - everything happens on fal's side.

Where people get burned

You paid for a 2K upscale and compared it to someone's 768P run. The resolution ladder here is real: 768P is what the model actually generated, and 2K/4K are post-processing. If a clip looks soft at 2K, that's the base showing through.

The canvas follows your image, not your intent. There's no aspect-ratio box on this node for a reason - it comes from the first frame. Feed it a portrait still and you get a portrait clip, and every downstream node (caption style, vertical social export) has to live with that.

Re-upscaling in the graph is usually wasted money. If you already pay for a 2K or 4K tier and then run a local upscaler, ask which one is doing the work.

Long clips are where the bill hides. Ten seconds at 4K is about $1.60 for one shot. A ten-shot sequence is not a cheap experiment, which is exactly what max_cost_usd, reuse_identical_run and per-run output folders exist to keep in check.

A restart doesn't waste the run. If ComfyUI dies mid-wait, the job continues on fal; pull the request id from output/fal/_requests.jsonl into fal Recover Result and it downloads without a second charge.

Categoryarkennemasis/fal/Video/MiniMax

Inputs (13)

NameTypeDefaultDescription
promptSTRINGText prompt for video generation
durationINT55–15The duration of the video in seconds.
resolutionCOMBO2KThe resolution of the generated video. 480P and 768P are native generation modes; 2K and 4K upscale a 768P base result.
seedINT-1-1–2147483647Random seed. A random seed is selected when omitted. -1 leaves it to the model.
enable_safety_checkerBOOLEANtrueIf set to true, the safety checker will be enabled.
prompt_expansion_modeSTRINGbalancedHow much effort to spend rewriting the prompt before generation. 'disabled' skips prompt expansion. 'fast' returns in about a second. 'balanced' picks per request. 'quality' spends up to ~30s on a richer prompt. Empty leaves it out.
target_audiooptAUDIOOptional URL of an audio clip at least 2 seconds long (maximum 15 MB) to pin to the generated soundtrack. Longer clips are trimmed to the requested video duration, keeping the beginning. The original audio replaces the output soundtrack, padded with silence if shorter than the video, without changing playback speed. Exceptionally high sample rates may be resampled to 96 kHz. Accepts an HTTP(S) URL or a base64 data UR
imageoptIMAGEOptional URL of the image to use as the first frame. When provided, the output canvas follows this image. If only end_image_url is provided, the canvas follows that last frame instead. If both images are omitted, the request is handled as text-to-video (16:9 by default).
end_imageoptIMAGEOptional URL of the image to use as the last frame. It may be provided alone for end-only keyframe generation; in that case the output canvas follows this image.
max_cost_usdoptFLOAT20.00–100000Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap.
reuse_identical_runoptBOOLEANtrueIf these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings.
extra_jsonoptSTRINGAdvanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally.
max_concurrentoptINT11–32How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed.

Outputs (4)

NameTypeDescription
videoVIDEO—
video_pathSTRING—
expanded_promptSTRING—
infoSTRINGJSON: request id, cost estimate, saved files and fal's full answer.