RH Execute Workflow
RH Execute Workflow runs a whole RunningHub job and drags the results home
- api_config
- node_info_list
- images
- video_frames
- text
- audio
- output_url1
- output_url2
- output_url3
- output_url4
- output_url5
- task_id
This is the workhorse - the node the whole pack exists for. RH Execute Workflow takes a workflow that lives on RunningHub's cloud (identified by the workflow ID you set in RH Settings), submits it as a task, waits for the GPUs to finish, downloads the results, and converts them back into native ComfyUI types. From the canvas it looks like a generator node. Underneath it's an HTTP client doing a full cloud run - submit, poll, download. If you've ever wished you could run a heavy workflow without touching your own GPU, this is the button.
How it works
It only needs one input: api_config, the STRUCT output of RH Settings (key + base URL + workflow ID bundled). You can add an optional node_info_list from chained RH Node Info nodes to override parameters in the cloud workflow - prompt, seed, image. Then:
- The node POSTs to
/task/openapi/createand gets back ataskIdplus, often, a WebSocket URL. - If a WSS URL came back, it opens a live connection and shows real-time progress in ComfyUI's progress bar. If WebSocket fails, it falls back to plain HTTP polling - which is why this still works in environments where WebSockets are blocked.
- It polls
/task/openapi/outputseverypoll_intervalseconds until the task finishes, fails, times out, or returns nothing. - Results get downloaded and converted: images become IMAGE tensors, audio is loaded into ComfyUI's AUDIO dict via torchaudio, and everything else lands as text.
The knobs that matter
run_timeout(600s default) - how long it will wait before giving up. Long video jobs can exceed this; raise it.poll_interval(3s default) - seconds between status polls. Leave it alone unless you're rate-limit-frugal.use_rtx4090(false default) - request the 4090 GPU tier. The tooltip says it plainly: higher cost. Only flip it when you actually need the faster card.node_info_list- your chained parameter overrides.
The outputs, and one honest trap
Ten outputs: images, video_frames, text, audio, output_url1–output_url5, and task_id.
Here's the trap nobody warns you about: videos do not come back as video_frames. Read the source - the node deliberately skips downloading videos and leaves the video_frames output as a placeholder black 64×64 tensor. The video comes back as one of the output_url strings instead, which you then feed to RH Download Video. So wire videos via the URL outputs, not video_frames, or you'll be staring at a tiny black square and wondering what went wrong. Same story when nothing is produced: failure paths return a black 64×64 tensor with the error message stuffed into text. So text is worth checking when results look empty.
Install
cd ComfyUI/custom_nodes/
git clone https://github.com/liangzheng1128/ComfyUI-RunningHub
cd ComfyUI-RunningHub
pip install -r requirements.txt
or ComfyUI Manager → search "RunningHub". Restart. Requirements are light - requests, websocket-client, Pillow, numpy. Remember this is a paid cloud platform: every run costs credits, your images and prompts leave the machine, and on shared GPU pools the "20–30 second" job sometimes takes over a minute. Budget accordingly and it's a genuinely great way to keep heavy workflows off your rig.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| api_config | STRUCT | Connect RH_Settings output here | |
| node_info_listopt | ARRAY | Connect RH_NodeInfo output(s) here | |
| run_timeoutopt | INT | 6001–9999999 | Maximum execution time in seconds |
| poll_intervalopt | INT | 31–60 | Seconds between status polls |
| use_rtx4090opt | BOOLEAN | false | Use RTX 4090 GPU (higher cost) |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| video_frames | IMAGE | — |
| text | STRING | — |
| audio | AUDIO | — |
| output_url1 | STRING | — |
| output_url2 | STRING | — |
| output_url3 | STRING | — |
| output_url4 | STRING | — |
| output_url5 | STRING | — |
| task_id | STRING | — |