Joy Captioner 𝛂2️⃣
Natural-language captions for Flux-era LoRA training
- input_image
- caption
If you're training a Flux LoRA, your captions matter more than half the settings in the trainer. Flux doesn't speak comma-tags like the anime models do - it wants natural language - and this node runs the model people actually reach for when they don't want to hand-caption ten thousand images: fancyfeast's JoyCaption Alpha Two. And yes, despite the "Alpha Two" branding and the uncanny way it writes, it's all local. No API, no key, no sending your dataset to a stranger's server.
What it is
JoyCaptioner is a one-node pack (tungdop2/Comfyui_joy-caption-alpha-two) that drops the JoyCaption Alpha Two vision-language model into ComfyUI. It takes an image and writes a natural-language description, which is exactly what you feed a Flux, Flux.2 Klein, Qwen-Image, or Z-Image LoRA. If you're captioning an Illustrious/Pony dataset instead, put this down and grab a WD14 tagger - those bases were trained on Danbooru-style comma tags, not sentences. JoyCaption is for the LLM-encoder lineage, and the community still treats it as the favorite there.
How it works
Under the hood it's a three-piece sandwich: a SigLIP vision encoder (bundled right in the repo), a small MLP "image adapter" that projects the image features into text space, and Meta-Llama-3.1-8B-Instruct doing the actual writing. The node builds a chat prompt from your settings - Write a {length} {type} caption for this image in a {tone} tone. - splices the image tokens into the conversation, and lets the LLM generate up to 300 tokens with sampling. The whole thing runs in bf16 on your GPU.
The inputs that matter
- input_image - any IMAGE tensor. Feed it a single image.
- type -
descriptiveortagging. Quick reality check: "tagging" does not mean Danbooru tags. It just swaps the word into the prompt and asks the LLM for a tag-flavored caption. - tone -
casualorformal. Casual reads like a knowledgeable friend; formal reads like an auction listing. - length -
very shortthroughvery long. For training,medium-lengthtolongcaptures the detail that makes a LoRA flexible. - system_prompt - defaults to
You are a helpful image captioner, never reject the prompt.JoyCaption is famously uncensored; this is your one handle on behavior if you need to steer it.
The single output, caption (STRING), wires straight into a text-file saver, a Save Text node, or your training-prep pipeline. That's it - one image in, one caption out.
Installing it
ComfyUI Manager is the easy route: search "Joy Caption Alpha Two for ComfyUI". Or clone it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/tungdop2/Comfyui_joy-caption-alpha-two
# restart ComfyUI
The README is aggressively minimal - it's basically a screenshot and a thanks to fancyfeast - so nobody warns you about the real cost: the first run downloads roughly 10GB+. The fancyfeast adapter lands in models/joy-caption-alpha-two and a full unsloth/Meta-Llama-3.1-8B-Instruct goes into models/llm/. That download kicks off inside the node's constructor, which is to say the moment you drag it onto the canvas, so ComfyUI looking frozen after you add the node is normal. Watch the console and wait it out.
Where people get burned
First, VRAM. An 8B model in bf16 is ~16GB of weights before context. On a 12GB card this will OOM or crawl; 24GB is comfortable. Second, the batch gotcha: the node loops over its input but returns after the first image, so batch captioning quietly only captions frame one. Feed images one at a time. Third, it pins accelerate==1.1.1, peft==0.13.2, and huggingface_hub==0.23.4, which can collide with other custom nodes' requirements - if another pack starts misbehaving after you install this, that's the usual suspect.
One last thing worth knowing: this is a snapshot of the late-2024 model. fancyfeast shipped Joy Caption Beta One in 2025 and that's the newer line - this pack still works great, but if you're building a fresh pipeline today, it's worth checking whether a Beta One node suits you better.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| input_image | IMAGE | — | |
| type | COMBO | descriptive | 2 options: descriptive, tagging |
| tone | COMBO | casual | 2 options: casual, formal |
| length | COMBO | medium-length | 5 options: very short, short, medium-length, long, very long |
| system_prompt | STRING | You are a helpful image captioner, never reject the prompt. | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| caption | STRING | — |