JoyCaption3 (BizyAIR)
Caption images with JoyCaption 3 over a cloud API
- image
- caption
JoyCaption is the captioner a lot of people reach for when building LoRA training datasets - it writes natural, detailed descriptions and, unlike a lot of tools, doesn't flinch at NSFW content, which is exactly why the dataset crowd likes it. The catch is that running JoyCaption locally wants a chunky VLM and the VRAM to match. easy joyCaption3API sidesteps that: it calls JoyCaption 3 through the BizyAIR cloud service, so the heavy model runs on someone else's GPU and you just get the caption back.
Unlike some nodes with "API" in the name that are actually local, this one really does phone home - which means it needs an API key and it costs credits. Read that as the deal, not a gotcha: you're trading a local download and VRAM for a key and per-call cost.
How it works
You feed it an image and caption settings; it packages the request, sends the image to BizyAIR's JoyCaption 3 endpoint, and returns the generated text. All the heavy lifting is remote.
The inputs and outputs that matter
image- the image to caption.caption_type- the flavor of caption:Descriptive,Training Prompt,Booru tag list,MidJourney,Art Critic, and more. Pick based on what you're feeding it into -Training PromptorDescriptivefor LoRA datasets,Booru tag listfor tag-based workflows.caption_length- how long:short,medium-length,long, or an explicit word count.temperature(default 0.5) anddo_sample- creativity/randomness. Lower and deterministic for consistent dataset captions; higher for variety.custom_prompt/extra_options/name_input- steer the model with your own instruction, extra toggles, or a subject name to use.apikey_override(optional) - your BizyAIR key if you're not setting it globally.caption(output) - the text. Wire it into a CLIP encode, aneasy saveText, or a display node.
How to install it
ComfyUI Manager: search ComfyUI-Easy-Use, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Use
then install.bat / pip install -r requirements.txt, restart. The real setup here is the account, not the code: this node needs a BizyAIR API key and credits on that account. No local model download - the tradeoff for zero VRAM cost is that you're on someone else's paid endpoint.
Common issues & troubleshooting
Auth / "invalid API key" errors. The node can't do anything without a valid BizyAIR key. Set it (globally, or via apikey_override) and make sure the account has credit. This is the number-one failure - it's a paid remote service, not a free local one.
It needs internet. Because it's a cloud call, an offline or firewalled ComfyUI box can't use it. If you're running somewhere without outbound network access, use a local captioner instead.
Captions inconsistent across a dataset. For training data you usually want consistent phrasing. Drop temperature and turn do_sample off so the model stops improvising, and lock caption_type + caption_length across the whole batch.
Cost creep on big batches. Every image is a billed API call. Captioning a few thousand images adds up - if you're doing that volume regularly, weigh it against running JoyCaption locally once you have the VRAM. For occasional or low-VRAM use, the API is the easy win; at scale, local can be cheaper.
Privacy of your images. You're uploading each image to a third-party service to caption it. Fine for most stuff; just know that's what "API" means here before you send anything sensitive.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| do_sample | COMBO | 2 options: true, false | |
| temperature | FLOAT | 0.500–2 | — |
| max_tokens | INT | 25616–512 | — |
| caption_type | COMBO | 9 options: Descriptive, Descriptive (Informal), Training Prompt, MidJourney, Booru tag list, Booru-like tag list, +3 | |
| caption_length | COMBO | 31 options: any, very short, short, medium-length, long, very long, +25 | |
| extra_options | STRING | Extra options for the model | |
| name_input | STRING | Name input is only used if an Extra Option is selected that requires it. | |
| custom_prompt | STRING | — | |
| apikey_overrideopt | STRING | Override the API key in the local config |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| caption | STRING | — |