MiniMax H3-World Action Timeline / 动作时间线 (T8)
Scripting H3-World's 37-step action timeline
- action_plan
- action_script_json
- report_json
This is the node that makes MiniMax H3 feel less like a slot machine and more like a scene you directed. H3-World is a community control LoRA for H3 (T8mars ships a byte-identical port pinned to the original), and its whole trick is that it fixes the output to one format - first-frame I2VA at 832×480, 124 frames, 24fps, roughly 5.17 seconds - so it can give you per-frame control over what happens. "Action Timeline" is the steering wheel: the thing that turns "the man walks forward, camera pans right" from a hope into an instruction.
What it actually builds
The clip runs through 37 latent time points, and this node writes one action row per latent. Every latent gets a short sentence, like "the man walks forward, camera pans right slowly." Those 37 sentences are what downstream nodes bind to the video latents one-to-one, so frame 3 can be walking while frame 20 is a pan - without the actions bleeding into each other.
Pick a preset and you're done: forward, back, strafe-left, strafe-right move the character; tilt-up/tilt-down and pan-left/pan-right move the camera; pan-left-fast/pan-right-fast are the F-key versions; still holds everything. The keys map the way the tooltip says: WASD drives the character, IJKL drives the camera, F makes a pan fast.
The custom preset is where it gets interesting. You write a JSON list of segments that tile latent indices 0 through 37 with no gaps - note the ranges are end-exclusive, which trips people up at first:
[
{"start_latent": 0, "end_latent": 12, "keys": ["W"]},
{"start_latent": 12, "end_latent": 25, "keys": ["L"]},
{"start_latent": 25, "end_latent": 37, "keys": []}
]
That's 12 latents of walking, 13 of slow right pan, then 12 holding steady. The node validates hard: segments must start exactly where the last one ended, end at 37, and only use the known keys. Opposing keys (W/S, A/D, J/L, I/K) cancel each other out, and F is only legal alongside J or L - you can't fast-pan and slow-pan at once.
Inputs and outputs
Only two inputs, and honestly action_preset is 90% of what you'll touch. custom_timeline_json only matters when preset is custom.
Out the other side you get three things:
action_plan(typeT8_H3_WORLD_ACTION_PLAN) - this is the one you wire onward intoMiniMaxH3WorldI2VAConditioningT8Advanced. It's a signed payload; the conditioning node checks its hash, so don't hand-edit it downstream.action_script_json- the 37 resolved sentences, handy for eyeballing what a preset actually said.report_json- diagnostics.
Wiring it up
The full chain lives in examples/workflows/26-h3-world in the pack: Action Timeline → MiniMaxH3WorldModelComposerT8Advanced (the LoRA loader) → MiniMaxH3WorldI2VAConditioningT8Advanced → a native H3 sampler (50 Euler/native-flow steps, CFG 1.0, video/audio shift 12/3) → MiniMaxH3WorldSafeVideoSaveT8Advanced. Just swap the included first frame for your own.
Installing and the honest caveats
Install the pack via ComfyUI Manager (search "MiniMax H3 Audio T8") or git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8 into custom_nodes, then fully restart. These World nodes add no extra pip dependencies. You do need a recent ComfyUI with native MiniMax H3 support, plus the H3 base model, Qwen3-VL text encoder and video/audio VAEs in the usual models folders - and the H3-World LoRA, which lives at models/loras/minimax/H3-World/step-10000.safetensors (see the Model Composer article for the download command).
Three gotchas. First, the 832×480×124 contract is fixed for now - don't "helpfully" change resolution or frame count downstream, because the action positions and attention mask are bound to it. Second, this is a standalone chain: don't stack OpenVDN, SLA, VSA or attention-takeover nodes on top. Third, H3 is a heavy 33B model and the weight license geofences out the US, EU, UK and Korea - check that before you build a workflow around it. On a 16GB card, run one job at a time.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| action_preset | COMBO | forward | WASD controls the character; IJKL controls the camera; F makes pan fast. |
| custom_timeline_json | STRING | [ {"start_latent":0,"end_latent":12,"keys":["W"]}, {"start_latent":12,"end_latent":25,"keys":["L"]}, {"start_latent":25,"end_latent":37,"keys":[]} ] | Only used when preset=custom. Segments must tile 0..37 without gaps. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| action_plan | T8_H3_WORLD_ACTION_PLAN | — |
| action_script_json | STRING | — |
| report_json | STRING | — |