File Stream Upload
The one KIE node you probably shouldn't wire up
- raw_json
- first_url
- task_id
Here's a node with a file in its name and no file input. That's not a bug in your install - it's what happens when a node is generated automatically from a documentation page that only shows a curl example.
The pack builds one ComfyUI node per page in KIE's API catalog. Most pages publish a request schema, so the node gets real widgets and real sockets. The file-upload page publishes a curl snippet and nothing else, so the generated node falls back to a skeleton: no file field, no path field, just a timeout and an expert override. As shipped, it's a stub you can ignore.
What the underlying API actually is
KIE's upload endpoint is https://kieai.redpandaai.co/api/file-stream-upload, and the documented call is multipart - a file part plus uploadPath and optional fileName form fields:
curl -X POST https://kieai.redpandaai.co/api/file-stream-upload \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@/path/to/your-file.jpg" \
-F "uploadPath=images/user-uploads" \
-F "fileName=custom-name.jpg"
That call is real, and the pack does make it - just not from this node. The working entry points are the utility nodes sitting under the same menu, which handle the multipart upload properly and return the hosted URL.
The inputs it actually has
- expert_override_json - a raw JSON blob merged into the request payload. The author's tooltip is candid: it's an escape hatch for "APIs whose documentation has no request schema yet." You can absolutely hand-craft a body here. The endpoint wants multipart form data with a file, and this node's transport is a JSON POST, so hand-crafting gets you a well-formed request to the wrong shape of endpoint.
- timeout_seconds - 30 to 7200, default 1200. Same field every generation node in the pack carries.
That's the whole node. No required inputs at all, which is why it lands in the menu with nothing to connect.
The outputs
raw_json is the provider's response, first_url is the first URL the response parser can find, and task_id is there for API parity with the generation nodes. first_url is the only one with any use here, and only if the request ever succeeds.
Use these instead
For anything you'd want this node for, the pack already ships the real thing:
- Upload Image / Upload Video / Upload Audio - take a native Comfy socket (
IMAGE,VIDEO,AUDIO) and return a hosted URL, converting tensors to PNG, videos through Comfy's own video export, and audio to 16-bit WAV on the way up. - Upload File - takes a local path plus an
uploadPath, which is this node's job done right. Point it at a file on disk and you get a URL back. - URL File Upload / Base64 File Upload - the sibling pages, for pulling a remote file in or posting bytes you already have.
And the blunt truth about why you can usually skip all of them: when you wire an IMAGE, VIDEO, or AUDIO socket into a KIE model node, the pack uploads it for you and swaps the hosted URL into the request. Manual upload nodes only matter when you need a URL you can reuse across several calls, or you're feeding an API whose docs want a URL string rather than media socket.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
Or search "KIE.ai Nodes Next" in ComfyUI Manager, then restart. Requirements are requests, Pillow, numpy, PyYAML. Set your key once under Settings → KIE.ai Nodes Next → Connection - uploads use the same credential as generation, and the key is validated against KIE before the pack will save it.
If you're debugging uploads
Two things worth knowing, both from the shipped code rather than the README. Uploads go to KIE's upload host, not the generation host, so a working API key plus a proxy that only allows api.kie.ai will fail here. And authenticated raw requests from the pack are deliberately restricted to KIE-owned hosts - a custom URL is refused rather than sent with your bearer token attached, which is the right default for a node category that has already been weaponized once.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| timeout_secondsopt | INT | 120030–7200 | — |
| expert_override_jsonopt | STRING | {} | Expert-only payload overrides for APIs whose documentation has no request schema yet. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| raw_json | STRING | — |
| first_url | STRING | — |
| task_id | STRING | — |