FL Runway Act2
FL_RunwayAct2 — drive a character's performance with Runway Act-Two from ComfyUI
- character_video
- character_image
- reference_video
- video_frames
- status_text
This node wraps Runway's Act-Two API - their character-performance model. You give it a character (a still image or a video) and a reference performance video of someone acting, and Runway animates your character to match that performance: the body movement, the facial expression, the timing. Think of it as motion-and-expression transfer, run in Runway's cloud and pulled back into your ComfyUI graph as frames.
It's the same job the local Wan ecosystem does with Wan Animate and SCAIL-2 (throw a reference and a driving video at the model, get your character performing the motion), except this one is a hosted, paid API. Runway is a closed commercial video company now, so Act-Two is a product you rent, not weights you download. If you don't have the GPU for local motion transfer, or you want Runway's specific quality on faces, this is the bridge.
How it works
You wire up your character on the input side, wire up the driving performance as reference_video, and hit run. The node uploads to Runway, kicks off the Act-Two job, and then polls for completion - video generation isn't instant, so it checks back on an interval until the result is ready or it gives up. When it's done, it downloads the video and hands you the frames.
The inputs and outputs
api_key- your Runway API key.character_type-imageorvideo. This tells the node which character input you're using; match it to what you actually wired.character_image/character_video- your character (use the one matchingcharacter_type).reference_video- the driving performance to transfer.body_control(default on) - transfer body movement, not just the face.expression_intensity(1–5) - how strongly to push the facial performance.ratio- output aspect ratio (1280:720, 720:1280, and so on).- The polling and timeout knobs (
polling_interval,max_polling_attempts,timeout_download) control how patient the node is.
Outputs: video_frames (the result as an image batch) and status_text (job status and errors - check it when things go sideways).
How to install it
Part of filliptm's Fill-Nodes pack. ComfyUI Manager → search ComfyUI_Fill-Nodes → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI_Fill-Nodes
pip install -r ComfyUI_Fill-Nodes/requirements.txt
No local weights. You need a Runway account with API access and credits.
Common issues & troubleshooting
The job times out before finishing. Longer or higher-res performances take a while, and the defaults may not wait long enough. Bump max_polling_attempts and timeout_download so the node keeps checking instead of bailing on a job that's still cooking.
character_type doesn't match your wiring. If you set it to video but only connected character_image (or vice versa), the node has nothing to work with. The type switch and the input you populate have to agree.
Content gating. Runway's public_figure_threshold is a moderation control. If a job comes back rejected, status_text will usually say why - recognizable public figures and certain content are gated on Runway's side, and there's nothing the node can do about that.
It costs credits per run, and polling isn't free time. Each generation bills to your Runway account. Get your character and reference right before spending a full-res run - iterate on the idea cheaply, then commit.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| character_type | COMBO | video | 2 options: video, image |
| ratio | COMBO | 1280:720 | 6 options: 1280:720, 720:1280, 960:960, 1104:832, 832:1104, 1584:672 |
| runway_api_version | STRING | 2024-11-06 | — |
| character_videoopt | IMAGE | — | |
| character_imageopt | IMAGE | — | |
| reference_videoopt | IMAGE | — | |
| body_controlopt | BOOLEAN | true | — |
| expression_intensityopt | INT | 31–5 | — |
| seedopt | INT | 00–4294967295 | — |
| public_figure_thresholdopt | COMBO | NOT_GIVEN | 3 options: auto, low, NOT_GIVEN |
| polling_intervalopt | INT | 51–60 | — |
| max_polling_attemptsopt | INT | 601–120 | — |
| timeout_sdkopt | FLOAT | 605–300 | — |
| timeout_downloadopt | FLOAT | 1205–600 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video_frames | IMAGE | — |
| status_text | STRING | — |