HY-Motion Runner v5
Text-to-motion that lands as an FBX file — no keyframing, no API
- status
- fbx_path
- output_folder
- log
Type a sentence, get a .fbx file that moves. That's the whole pitch of HYMotionRunner (displayed as "HY-Motion Runner v5"), and it sits at the end of Tencent's HY-Motion-1.0 - the billion-parameter DiT/flow-matching text-to-motion model that shipped open in late 2025. The name is honest: this node doesn't run diffusion itself. It's a bridge that shells out to Tencent's local_infer.py CLI, waits for it to finish, then picks the FBX out of the temp folder, renames it, and files it away with a .meta.json next to it. If your goal is "feed a game studio or an Unreal pipeline predictable animation files," that bookkeeping is half the value.
Most people meeting HY-Motion for the first time use jtydhr88's in-repo ComfyUI port, which is cleaner for one-off experiments. This one is aimed at the other end of the spectrum: deterministic names, category folders, overwrite rules, per-shot logs. It's a plumbing node in the truest sense - check comfyui-node-plumbing.md for the pattern - and it's very new, with effectively zero community footprint yet. Treat it as production tooling from a single author (JRCaisy, crediting Caisy & Aki), not a polished mainline node.
How it works
Under the hood it's a subprocess.run at the ComfyUI level. It writes your prompt into a JSON at hy_root/examples/example_prompts/, then invokes:
venv/bin/python local_infer.py --model_path ckpts/tencent/<variant> \
--input_text_dir <prompt dir> --output_dir <temp> --num_seeds N \
[--disable_rewrite] [--disable_duration_est]
It finds the first .fbx in the output, copies it to your clean name, writes a .log.txt plus .meta.json (prompt, effective prompt, exact command, return code), and - if you want - wipes the temp folder. One honest caveat grounded in the code: seed_mode = fixed only sets PYTHONHASHSEED and Python's random.seed before the subprocess. That's not a real inference seed, so don't expect bit-identical motion from it; treat "fixed" as "more stable ordering," not reproducibility.
The inputs that matter
Everything is required widgets, and the ones you'll actually touch are few:
- prompt - plain English motion description, e.g. the default
"fast athletic style jump ahead with strong landing". - preset - 16 canned motions (idle, run, jump, attack_heavy, death…) loaded from
preset_library.json; pick one and it's prepended to your prompt.reload_preset_libraryre-reads that JSON so you can edit it live. - model_variant -
HY-Motion-1.0-Lite(default) or the fullHY-Motion-1.0. - duration_frames - 30–600; 100 is roughly a few seconds.
- category / base_name / prefix / suffix - the naming system. Put
#or###in prefix/suffix and it increments (so_v###gives_v001,_v002…).overwrite_mode= next / overwrite / skip.
Outputs: status, fbx_path, output_folder, log. Wire fbx_path anywhere you want to record where the file went - it's a string output, so it's mostly for downstream logging, not further processing.
Installing it
The node itself is trivial: ComfyUI Manager → search "HY-Motion Runner", or
cd ComfyUI/custom_nodes && git clone https://github.com/JRCaisy/HYM-Runner
then restart ComfyUI. There's no requirements.txt in the pack - the node has zero Python deps because it doesn't import the model. The heavy lift is HY-Motion itself: clone Tencent-Hunyuan/HY-Motion-1.0, git lfs pull, create a venv, pip install -r requirements.txt, and grab the checkpoints (HY-Motion-1.0 or -Lite, clip-vit-large-patch14, and Qwen3-8B for the text encoder). Realistic VRAM: the Lite model wants ~4GB and the full ~8GB, plus the Qwen3-8B encoder (int4 quant ~4GB, unquantized ~16GB).
The trap: hy_root and final_output_root are hardcoded Windows paths in hy_motion_node.py - E:\AI\HY-Motion-1.0 and E:\GRapHiC\Animations\HYM - and it looks for venv\Scripts\python.exe. On Linux you must edit both to your layout (venv/bin/python, and your real output dir) before it will run.
Gotchas
The node returns clean ERROR: status strings for each path it can't find (HY-Motion root, its python, local_infer.py, or the model dir) - read status and log first when something dies. The community's classic post-install crash is No module named 'torchdiffeq'; pip install torchdiffeq into the HY-Motion venv fixes it. And when you see No SMPL data found... during inference, ignore it - the README says it plainly and it doesn't stop FBX export.
One thing to know going in: this generates a built-in SMPL humanoid skeleton, not a rigged character. You'll retarget onto your own skeleton in whatever engine you use. Generated motion is a starting point, exactly like the 3D assets in 3d-generation.md - usable, but the last 10% of polish is still on you.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | fast athletic style jump ahead with strong landing | — |
| preset | COMBO | none | 17 options: none, attack_heavy, attack_light, crouch_idle, crouch_walk, death, +11 |
| reload_preset_library | BOOLEAN | false | — |
| model_variant | COMBO | HY-Motion-1.0-Lite | 2 options: HY-Motion-1.0-Lite, HY-Motion-1.0 |
| category | STRING | Locomotion | — |
| base_name | STRING | Jump | — |
| prefix | STRING | — | |
| suffix | STRING | _### | — |
| start_index | INT | 11–999999 | — |
| padding | INT | 31–8 | — |
| duration_frames | INT | 10030–600 | — |
| seed_mode | COMBO | random | 2 options: random, fixed |
| num_seeds | INT | 11–8 | — |
| fixed_seed | INT | 1230–999999999 | — |
| overwrite_mode | COMBO | next | 3 options: next, overwrite, skip |
| flatten_fbx | BOOLEAN | true | — |
| cleanup_temp | BOOLEAN | true | — |
| open_output_folder | BOOLEAN | false | — |
| disable_rewrite | BOOLEAN | true | — |
| disable_duration_est | BOOLEAN | true | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| fbx_path | STRING | — |
| output_folder | STRING | — |
| log | STRING | — |