Echo-WM T8 · Action
Steering a generated video with WASD keys
- action
- action_metadata
Text-to-video gives you a prompt and a prayer that the camera does something interesting. Echo-WM is a different beast: it's a world model that takes a first frame and then lets you steer, in discrete game-key chunks. "Echo-WM T8 · Action" is the small node that turns your keypresses into the action string the model understands - and it's where you'll spend most of your time once Echo-WM is actually running, because this is your camera control.
The action DSL is exactly what it looks like: comma-separated keys-frames segments. Forward for six frames, turn while moving for six, and so on:
w-6,wl-6,wj-6,w-6
The letters are WASD/IJKL and they map to camera intent: w/s forward/backward, a/d strafe, i/k pitch up/down, j/l yaw. Keys combine into one segment (wj-60 is "forward while turning"), none holds the camera still, and each segment lasts 1–2400 frames. The built-in presets are just two canned routes:
smoke_1s_forward_turn_jump- 24 frames of motion (w-6,wl-6,wj-6,w-6), for the 25-frame smoke test.low_10s_forward_turn_jump- the same route stretched to 240 frames (w-60,wl-60,wj-60,w-60), for the ~10-second low-res preset.
The frame math will bite you once
Here's the gotcha that trips up everyone on their first custom action: the action and the output length are linked. Your action runs for N frames, and the generated video is N+1 frames - the reference image plus the rollout. So an action that totals 24 frames pairs with a 25-frame generate request, 240 pairs with 241, and so on. The Generate node refuses to run on a mismatch with an error like action schedule has 24 frames; this output needs 48, and Generate's num_frames only accepts 1 + 24n values (25, 49, 73…). If you're in custom mode on both nodes, update the action and num_frames together - that pairing is on you.
Inputs and outputs
preset-smoke_1s_forward_turn_jump,low_10s_forward_turn_jump, orcustom. The two presets are hard-coded to exactly match the smoke/10-second generation presets on the Generate node, so if you pick a preset here, leave Generate on its matching preset.custom_action- only read whenpresetiscustom. Syntax per the tooltip:keys-frames,keys-frames.
The node doesn't just pass your string through - it validates and canonicalizes. It normalizes unicode, strips whitespace, sorts the keys in each segment into a fixed order, rejects any key outside wsadikjl, rejects duplicate or empty key segments, and caps the whole schedule at 2400 frames. Feed it garbage like q-12 or a stray space and you get a precise error instead of a silent mid-generation failure 40 minutes in. That's a real kindness for a model where a bad action wastes a whole rollout.
Outputs: action (typed ECHO_WM_ACTION) goes straight into Causal Flash Generate's action input, and action_metadata is a JSON string of the canonicalized action with its total frame count - handy for checking your math before you commit.
Install is just the pack (Manager or git clone https://github.com/T8mars/Comfyui-Echo-WM-T8.git into custom_nodes) plus the separate Echo-WM environment the Runtime node points at - nothing here installs extra Python packages into ComfyUI. Think of this node as the fun part: it's where "make the camera glide left around that statue" becomes a concrete spec the world model can actually follow.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| preset | COMBO | smoke_1s_forward_turn_jump | 3 options: smoke_1s_forward_turn_jump, low_10s_forward_turn_jump, custom |
| custom_action | STRING | w-6,wl-6,wj-6,w-6 | Used only when preset is custom. Syntax: keys-frames,keys-frames. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| action | ECHO_WM_ACTION | — |
| action_metadata | STRING | — |