JoyCaption Ollama Extra Options
Steering your Ollama captioner without leaving ComfyUI
- extra_options_ollama
JoyCaption Beta One is the community's favorite image captioner - the thing people reach for when they're building a LoRA dataset and want natural-language captions instead of tags. The catch has always been the plumbing: judian17's original node ran the model through llama-cpp-python, and building that with GPU support is a genuinely miserable afternoon. So the author's fix was to push the GGUF onto Ollama and split the prompt-building half out into this pack. The JoyCaption Ollama Extra Options node is that half's front panel: twenty-eight toggles, one name field, and no inference at all. It's a config bundle, nothing more.
What it actually does
Flip a switch, and the node tacks one instruction sentence onto an internal list. Flip include_lighting and the bundle carries "Include information about lighting." Flip include_camera_shot_type and the model gets told to say whether the image is an extreme close-up or a cowboy shot. Every toggle is the same trick - these are the exact instruction strings from fancyfeast's original JoyCaption prompt, preserved verbatim. The bundle leaves the node as a JJC_OLLAMA_EXTRA_OPTION output called extra_options_ollama, and the only thing that knows how to read it is the sibling JoyCaptionOllamaPrompter node in this same pack.
That means the node does literally nothing on its own. Wire it to nothing and it silently builds a bundle nobody consumes. It's a steering wheel, not a car.
The switches that actually matter
All 28 default to off, so don't panic at the wall of booleans. The ones you'll realistically flip:
- include_lighting and include_camera_angle - the two I'd turn on first for photography or realism LoRAs. Together they push captions toward the details a trained model can actually learn.
- exclude_sexual - keeps the output PG. Worth knowing the model describes what's in the image; if your dataset has any spicy frames, flip this.
- avoid_meta_descriptive_phrases - this is the anti-"This image shows…" switch, and it matters more than it sounds. Captions that start with meta commentary are worse training material for natural-language models.
- refer_character_name + character_name - for character datasets. Turn on the toggle and type the name (placeholder example is
Skywalker), and the model is instructed to call the character by name instead of describing generic "person." - identify_image_orientation, include_character_age, include_camera_vantage_height - niche but handy once you've run a few batches and realize the model keeps skipping exactly those details.
Everything else - EXIF, JPEG artifacts, aesthetic quality, "use vulgar slang and profanity" (yes, that's a real toggle, no I won't use it) - is there because the original JoyCaption prompt had it. Flip one at a time to see what each actually changes in the output.
Wiring it in
The output plugs into the extra_options_input port on JoyCaptionOllamaPrompter, which then folds your instructions into the user prompt it sends downstream to OllamaGenerateV2. The pack ships a complete workflow file (ollama-joycaption-beta.json) showing the whole chain: LoadImage → OllamaConnectivityV2 → OllamaOptionsV2 → Extra Options → Prompter → OllamaGenerateV2. Load that and you can't get the wiring wrong.
Install and gotchas
Install via ComfyUI Manager (search "JoyCaption-beta-one-hf-llava-Prompt_node") or:
cd ComfyUI/custom_nodes
git clone https://github.com/judian17/ComfyUI-JoyCaption-beta-one-hf-llava-Prompt_node
Then restart ComfyUI. Good news: this pack is pure Python, no dependencies, no model downloads of its own. The heavy lifting lives elsewhere - you still need Ollama running, the aha2025/llama-joycaption-beta-one-hf-llava model pulled, and stavsap's ComfyUI-Ollama nodes installed for the actual generation. This node just decides what the model gets told.
The one trap: character_name only takes effect when refer_character_name is switched on. Type a name, forget the toggle, and you'll wonder why the captioner never uses it.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| refer_character_name | BOOLEAN | false | — |
| exclude_people_info | BOOLEAN | false | — |
| include_lighting | BOOLEAN | false | — |
| include_camera_angle | BOOLEAN | false | — |
| include_watermark_info | BOOLEAN | false | — |
| include_JPEG_artifacts | BOOLEAN | false | — |
| include_exif | BOOLEAN | false | — |
| exclude_sexual | BOOLEAN | false | — |
| exclude_image_resolution | BOOLEAN | false | — |
| include_aesthetic_quality | BOOLEAN | false | — |
| include_composition_style | BOOLEAN | false | — |
| exclude_text | BOOLEAN | false | — |
| specify_depth_field | BOOLEAN | false | — |
| specify_lighting_sources | BOOLEAN | false | — |
| do_not_use_ambiguous_language | BOOLEAN | false | — |
| include_nsfw_rating | BOOLEAN | false | — |
| only_describe_most_important_elements | BOOLEAN | false | — |
| do_not_include_artist_name_or_title | BOOLEAN | false | — |
| identify_image_orientation | BOOLEAN | false | — |
| use_vulgar_slang_and_profanity | BOOLEAN | false | — |
| do_not_use_polite_euphemisms | BOOLEAN | false | — |
| include_character_age | BOOLEAN | false | — |
| include_camera_shot_type | BOOLEAN | false | — |
| exclude_mood_feeling | BOOLEAN | false | — |
| include_camera_vantage_height | BOOLEAN | false | — |
| mention_watermark_explicitly | BOOLEAN | false | — |
| avoid_meta_descriptive_phrases | BOOLEAN | false | — |
| character_name | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| extra_options_ollama | JJC_OLLAMA_EXTRA_OPTION | — |