Runware (custom)
The escape hatch for models the pack hasn't met yet
- result_json
Every Runware model as a node is the pack's promise - but "every" is a moving target. New models land on Runware all the time, and the day a shiny AIR appears on their catalog before the pack updates is exactly when you need this node. Runware (custom) is the untyped escape hatch: you give it any model AIR and any taskType, and it fires the raw request and hands back the raw JSON response. Nothing typed, nothing assumed, nothing prettied up.
It's the most powerful and least comfortable node in the pack. You're on your own for knowing what the model expects - that's why the widgets you type into are plain text and the output is a JSON blob, not a friendly IMAGE socket. The payoff is that you're never blocked: whatever Runware supports, this node can call it today.
What you set
model(required) - the model AIR, e.g.runware:100@1. This is the exactprovider:model@versionidentifier Runware uses.taskType(required) - what kind of inference, e.g.imageInference,videoInference,audioInference,textInference,3dInference. Defaults toimageInference.request_json- the rest of the request body as JSON, merged over the model/taskType. This is where your media goes: any image, audio, or video inputs as UUIDs or URLs (the Runware Upload Image node gets you a UUID for an image).
Output is result_json, a STRING containing the full API response. Feed it to Runware Get to pull a single field out - 0.imageURL is the classic first thing to grab.
How it works
Under the hood it's the same REST path as every node in the pack: the SDK opens a client, runs the request, and returns the results. The difference is that this node skips the entire schema layer. request_json is json.loads'd and merged into the request, with the JSON winning on conflict, so it doubles as an override for anything the typed nodes can't express. It also sets includeCost by default, so the title bar still shows you the price of your experiment.
The workflow shape you want is: Runware (custom) → Runware Get → a loader (Runware Load Image for URLs) or a Save node. It's raw, but it's a complete pipeline.
Installing
ComfyUI Manager → search Runware → install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
No model downloads; dependencies are runware-sdk, pillow, soundfile. You need a Runware API key (Settings → Runware API key, RUNWARE_API_KEY, or runware auth login) - this is a paid, usage-based cloud API, not a local node.
Troubleshooting
If you get an empty string out, your dot-path in Runware Get is wrong or the response key doesn't exist - inspect the full result_json first with a Show Text node before you start guessing paths. Bad JSON in request_json is silently ignored, so a typo means your extra fields just don't ship; validate locally before you paste. And if the model errors, the node surfaces a cleaned-up one-liner with the offending parameter, which is genuinely more useful than the usual SDK stack trace. Set RUNWARE_DEBUG if you ever want the full traceback anyway.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | STRING | runware:100@1 | Model AIR |
| taskType | STRING | imageInference | — |
| request_jsonopt | STRING | {} | The full request body as JSON, merged over model/taskType. Put any media inputs here as UUIDs/URLs (see Runware Upload Image). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| result_json | STRING | — |