☁️BizyAir Joy Caption2
The community's favorite captioner, with the full preset menu
- image
- STRING
JoyCaption is the community's go-to for LoRA dataset captioning - an uncensored vision-language model (credited in BizyAir's own README to fancyfeast's joy-caption-pre-alpha project) that doesn't refuse to describe the images most LoRA trainers actually work with, which is exactly where captioners like BLIP fall over. This node runs a later JoyCaption revision through BizyAir's cloud, and it's the fuller-featured of the two JoyCaption nodes in this pack - the plain BizyAir Joy Caption node elsewhere here only exposes sampling settings, while this one adds a real preset menu on top.
What it does
image in, a caption STRING out. The interesting controls are caption_type and caption_length, which weren't there in the plain node. caption_type gives you nine presets: Descriptive, Descriptive (Informal), Training Prompt, MidJourney, Booru tag list, Booru-like tag list, Art Critic, Product Listing, and Social Media Post. For LoRA training data, Training Prompt or plain Descriptive are the ones you actually want most of the time; Booru tag list matters specifically if you're captioning for an Illustrious/Pony-lineage model that expects Danbooru-style tags rather than natural language.
caption_length runs from qualitative options (any, very short, short, medium-length, long, very long) through a long list of exact word-count targets. If you need consistent caption length across a dataset - useful for keeping training config predictable - pick a specific number instead of a qualitative bucket.
extra_options and name_input work together and matter more than they look: the default extra option instructs the model to refer to any person or character in the image as {name}, with name_input (default "Jack") supplying that placeholder. This is genuinely the right move for LoRA training data - the standing captioning rule is to describe what should stay changeable and leave what's meant to be permanent (the subject's identity) undescribed, so it gets learned from the images rather than fought against by the caption. Using {name} as a stand-in name does exactly that.
custom_prompt overrides the whole instruction if you need something the presets don't cover. do_sample (true/false) and temperature (0–2, default 0.5) control how much variation you get between captioning runs on the same image; max_tokens (16–512, step 16, default 256) caps length in tokens, separate from the caption_length preset.
Installing it
ComfyUI Manager: search BizyAir, install, restart. Or:
cd ComfyUI/custom_nodes && git clone https://github.com/siliconflow/BizyAir.git
Restart after. No local model download - this runs cloud-side. A BizyAir account with an API key set is required before it captions anything.
Where people get burned
Using Descriptive when you meant Booru tag list, or vice versa. These produce fundamentally different caption formats - natural-language sentences versus comma-separated tags - and feeding the wrong style to a training run that expects the other degrades results in ways that look like a bad dataset rather than a captioning mismatch.
Skipping the {name}/name_input trick and letting the model describe your subject generically. You'll caption away exactly the details you wanted the LoRA to learn on its own.
Running it at scale without spot-checking output. VL captioners drift and occasionally hallucinate details that aren't in the image - worth a manual pass over a sample before batch-captioning an entire dataset.
Inputs (9)
| 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 | If there is a person/character in the image you must refer to them as {name}. | Extra options for the model |
| name_input | STRING | Jack | Name input is only used if an Extra Option is selected that requires it. |
| custom_prompt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |