External Image Batch (ComfyUI Deploy)
Send a whole batch of images to a deployed workflow — from one JSON array
- default_value
- image
The plain External Image node takes one image per call. Real deployed workflows are greedier than that - multi-reference img2img, ControlNet that wants several conditioning frames, video pipelines that need a sequence of input frames. "External Image Batch" is the input node for those: it accepts a JSON array of image URLs (or base64 data URIs, or even URLs to zips of images), loads them all, and returns a single batched IMAGE tensor.
The caller's payload is a JSON string like ["https://…/a.png", "data:image/png;base64,…"], and the node turns that list into one tensor with everything stacked along the batch dimension. It's the multi-image version of the External family's core promise: callers feed your API images without ever touching your disk.
How it works
The images field is a JSON array, decoded with json.loads. Each entry is handled by type: an http URL ending in .zip gets fetched and unpacked (every PNG/JPG inside becomes a batch item); a plain http URL is fetched as one image; a base64 data URI is decoded. Every loaded image is resized - with a lanczos upscale - to match the first image's dimensions, then everything is concatenated into a single batched tensor. If the array is empty and a default_value is wired in, that's used instead.
Inputs and output
input_id- defaultinput_images. The key callers use to address this input.images- the JSON array of URLs/base64/zip-URLs. Default"[]".default_value- optional IMAGE fallback when the array is empty.- Optional:
display_name,description.
Output: image (IMAGE), one batch tensor ready for a batch-capable node downstream.
Installing it
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/BennyKok/comfyui-deploy.git
Restart ComfyUI, or install "ComfyUI Deploy" via ComfyUI Manager. No models, no key.
Where people get burned
The resize-to-first-image behavior is the thing to internalize: batch order isn't just order, it's the definition of the canvas size. Whatever image is first sets the dimensions everything else gets warped to, so a portrait first followed by a landscape gives you a landscape-stretched portrait. If your workflow expects a specific aspect ratio, make the caller's first image the reference - or sort deliberately - instead of discovering the mismatch in the output.
Second gotcha: the images field is a raw JSON string, and callers will absolutely send you malformed JSON. A parse error lands you in the catch-all, the list silently becomes empty, and you fall back to the default - again the pack's lenient failure mode. Validate the payload on your side before it reaches this node. And note the zip support is a genuinely nice touch for "give me 50 frames" calls: one zip URL beats 50 URLs in your API docs every time.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| input_id | STRING | input_images | — |
| images | STRING | [] | — |
| default_valueopt | IMAGE | — | |
| display_nameopt | STRING | — | |
| descriptionopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |