Triple API Generate (NanoBanana + Doubao + HiDream)
The Triple API node's parallel gamble
- nanobanana_image
- doubao_image
- hidream_image
- nanobanana_task_id
- nanobanana_response
- doubao_response
- hidream_response
- hidream_task_id
- status_info
- nanobanana_image_urls
- doubao_image_urls
- hidream_image_urls
Type one prompt, get three images back from three different hosted services at once. That's the pitch of Triple API Generate, the flagship node of the AlexXia007/AIYang_TripleAPI pack - it fires NanoBanana, Doubao, and the 即梦 (Jimeng) visual API in parallel and hands you each result as a separate image. It's a quality-comparison rig, a hedge against one flaky API, and a fast way to spend credits on all three platforms simultaneously. No local model, no GPU: you supply the API keys and the services do the work.
The naming is worth a moment
Before you trust the labels, know what you're actually calling. "HiDream" in this node is not the Beijing HiDream.ai that ships MIT open weights - it's 即梦, ByteDance's image API on Volcano Engine (the default server is visual.volcengineapi.com, the Seedream family). And "NanoBanana" is the third-party hosted API at api.nanobananaapi.ai, not Google's Nano Banana. So "three platforms" is really two ByteDance/Volcano properties plus one outside service. ByteDance keeps Seedream API-only by design, which is exactly why this node exists: it's the cloud path for models you can't run locally.
How it works
Under the hood it's a ThreadPoolExecutor with three workers, so the calls genuinely run in parallel - each with its own retry loop (max_retries, retry_interval) and its own polling for the async generation jobs. Fault isolation is the whole point: if Doubao errors, NanoBanana and Jimeng still come back. A failed or disabled platform doesn't kill the run; it returns a white placeholder tensor (or your fallback_image_url if you set one) and records what happened in status_info. The *_image_urls outputs follow the README's convention: a real URL list on success, ["api_error"] on failure, ["api_disabled"] when you left the key empty or the toggle off.
The inputs and outputs that matter
Setup is really just three things:
- prompt - the one input all three platforms share.
- The key/server pairs -
nanobanana_api_key,doubao_api_key,hidream_req_key, each with a*_server_urldefault that you can usually leave alone. Fill only the keys you own, and use theenable_nanobanana/enable_doubao/enable_hidreamtoggles to switch off the rest - otherwise a keyless platform just burns a slot on a white image. - seed - shared across all three for reproducible comparisons.
The optional bank is where the per-platform tuning lives: image_urls_input for the img2img modes (Doubao's img2img uses the first URL, multi_img_fusion uses them all, Jimeng takes up to 10), doubao_model (default doubao-seedream-4-0-250828), doubao_size (1K/2K/4K), hidream_type (including shopImg2img and vton), and hidream_scale for edit strength. Leave them until you know you need them.
Outputs: nanobanana_image, doubao_image, and hidream_image (all IMAGE) - wire each into a Preview Image or Save Image node. The *_task_id, *_response, and status_info strings go to ShowText nodes when you're diagnosing a failure, and *_image_urls are handy if you want to hand the result off to another system without re-downloading.
Install
Same as any node from this pack - no models, no heavy deps (Pillow/numpy/torch, all already in ComfyUI):
cd ComfyUI/custom_nodes
git clone https://github.com/AlexXia007/AIYang_TripleAPI.git
cd AIYang_TripleAPI
pip install -r requirements.txt
Restart ComfyUI and it appears as Triple API Generate (NanoBanana + Doubao + HiDream) under the AIYang_TripleAPI category. (The README tells you to cd AIYang_comfyui_tripapi after cloning - that directory doesn't exist; it's AIYang_TripleAPI.)
Common issues
- Three keys is the real setup cost. You need accounts at nanobananaapi.ai, the Volcano Engine console for Doubao, and 即梦's developer portal. There's no way around it; the node is only as useful as the keys you paste in.
- White images on a slot. That's a disabled platform or an empty key. Disable what you don't use, or you'll spend a while wondering why one output is a blank square.
- Slow runs. Everything is async and polls on your timers; bump
poll_timeout(default 240s) if generations time out. - It's real money per image on every platform, run in parallel by design. A failed comparison costs you three API calls, not one. The README is also Chinese-only and rot-prone - it documents an img2img sibling node that isn't registered in the shipped code.
Inputs (29)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| nanobanana_server_url | STRING | https://api.nanobananaapi.ai | — |
| nanobanana_api_key | STRING | — | |
| doubao_server_url | STRING | https://ark.cn-beijing.volces.com/api/v3/images/generations | — |
| doubao_api_key | STRING | — | |
| hidream_server_url | STRING | https://visual.volcengineapi.com | — |
| hidream_req_key | STRING | — | |
| enable_nanobanana | BOOLEAN | true | — |
| enable_doubao | BOOLEAN | true | — |
| enable_hidream | BOOLEAN | true | — |
| seed | INT | -1-1–99999999 | — |
| image_urls_inputopt | STRING | — | |
| poll_intervalopt | INT | 31–60 | — |
| poll_timeoutopt | INT | 2405–3600 | — |
| fallback_image_urlopt | STRING | — | |
| nanobanana_typeopt | COMBO | TEXTTOIAMGE | 2 options: TEXTTOIAMGE, IMAGETOIAMGE |
| nanobanana_num_imagesopt | INT | 11–4 | — |
| nanobanana_image_size_modeopt | COMBO | auto | 11 options: auto, 1:1, 9:16, 16:9, 3:4, 4:3, +5 |
| nanobanana_watermarkopt | STRING | — | |
| doubao_modelopt | STRING | doubao-seedream-4-0-250828 | — |
| doubao_sizeopt | COMBO | 1K | 3 options: 1K, 2K, 4K |
| doubao_watermarkopt | BOOLEAN | true | — |
| doubao_typeopt | COMBO | txt2img | 3 options: txt2img, img2img, multi_img_fusion |
| doubao_sequential_generationopt | COMBO | disabled | 2 options: disabled, auto |
| doubao_num_imagesopt | INT | 11–15 | — |
| hidream_typeopt | COMBO | txt2img | 4 options: txt2img, img2img, shopImg2img, vton |
| hidream_scaleopt | FLOAT | 0.50.1–2 | — |
| max_retriesopt | INT | 31–5 | — |
| retry_intervalopt | INT | 21–60 | — |
Outputs (12)
| Name | Type | Description |
|---|---|---|
| nanobanana_image | IMAGE | — |
| doubao_image | IMAGE | — |
| hidream_image | IMAGE | — |
| nanobanana_task_id | STRING | — |
| nanobanana_response | STRING | — |
| doubao_response | STRING | — |
| hidream_response | STRING | — |
| hidream_task_id | STRING | — |
| status_info | STRING | — |
| nanobanana_image_urls | STRING | — |
| doubao_image_urls | STRING | — |
| hidream_image_urls | STRING | — |