Nodes/ComfyUI-Janus-Pro/Janus Image Understanding
ComfyUI Node

Janus Image Understanding

The Image-to-Prompt Node That's Better Than BLIP and Needs No API Key

By CY-CHENYUE·Created 2 years ago·Updated 2 years ago· 645
Janus Image Understanding
  • model
  • processor
  • image
  • text
questionDescribe this image in detail.
seed666666666666666
temperature0.10
top_p0.95
max_new_tokens512

This is the half of the ComfyUI-Janus-Pro pack that's actually useful in 2026, and it's also the half almost nobody is looking at. JanusImageUnderstanding takes any image, asks it a question, and returns a STRING answer. In a ComfyUI where every node speaks tensors, a node that speaks sentences is worth more than it looks - because captions are what LoRA training lives on, and the captioning tools most people have are either weak (BLIP is widely considered unusable for training data) or closed APIs that need keys. This one is neither.

It runs entirely on DeepSeek's Janus-Pro model you loaded with JanusModelLoader. No API, no account, no cost beyond your VRAM. The name isn't lying about anything.

How it works

The node builds a chat conversation in Janus's format - a <|User|> turn containing the image placeholder plus your question, and an empty <|Assistant|> turn - runs it through the processor to get inputs, calls prepare_inputs_embeds, then drives language_model.generate with do_sample=True, your temperature, top_p, and max_new_tokens. The reply is decoded with special tokens stripped, so what you get out is clean prose, not markup.

The inputs that matter

Three of these are the ones you'll actually touch:

  • question - a multiline STRING, default "Describe this image in detail.". This is the whole game: ask for a dense caption, a training tag list, a "reverse-engineer this prompt" description, or a yes/no check.
  • temperature - default 0.1, which is low on purpose. At 0.1 the model describes steadily and repeatably; crank it up toward 1.0 if you want more varied wording per run.
  • max_new_tokens - default 512, hard cap 2048. Bump it if your captions keep getting cut off mid-sentence.

The rest are boilerplate you can leave alone: image is any IMAGE tensor from a Load Image node, seed exists so you can vary output, and top_p sits at 0.95.

Output: text (STRING). Wire it into a Show Text / Save Text node to see it, or straight into anything downstream that eats strings - like a caption-saver feeding your LoRA dataset.

Why you'd reach for it

Three genuinely useful jobs, in order of how often I've seen them:

  1. Captioning training images. Point it at a folder of reference images and pipe the text into a caption-save node. For natural-language captions (the Flux style) it beats BLIP-class tools by a mile, and the community noticed: Janus's 1B understanding was called out as "really good in making prompt" back when the model launched.
  2. Image-to-prompt. Ask it "Write a detailed Stable Diffusion prompt for this image" and you get a passable starting prompt to feed into your real generator.
  3. Visual QA inside a workflow. It's a small vision-language model living inside your graph; gate a branch on whether an image contains something, or have it describe what the previous node just produced.

Gotchas

The node's IS_CHANGED is tied to seed, so changing the seed re-runs it even if the image is cached - useful when you want variation, mildly annoying if you only changed an unrelated widget. And remember the answer quality tracks the model you loaded: the 1B is honestly good at this, the 7B better, but the 7B needs the VRAM to sit there while ComfyUI does everything else. For captioning duty, the 1B is the one I'd reach for.

CategoryJanus-Pro

Inputs (8)

NameTypeDefaultDescription
modelJANUS_MODEL
processorJANUS_PROCESSOR
imageIMAGE
questionSTRINGDescribe this image in detail.
seedINT6666666666666660–18446744073709550000
temperatureFLOAT0.100–1
top_pFLOAT0.950–1
max_new_tokensINT5121–2048

Outputs (1)

NameTypeDescription
textSTRING