Nodes/Bjornulf_custom_nodes/๐Ÿ”ฅ๐Ÿ“ Image Text Generator ๐Ÿ“๐Ÿ”ฅ
ComfyUI Node

๐Ÿ”ฅ๐Ÿ“ Image Text Generator ๐Ÿ“๐Ÿ”ฅ

The hub node that assembles a full character prompt

By justUmenยทCreated 2 years agoยทUpdated about a year agoยท 545
๐Ÿ”ฅ๐Ÿ“ Image Text Generator ๐Ÿ“๐Ÿ”ฅ
  • GEN_STYLE
  • GEN_CHARACTER
  • GEN_SCENE
  • STRING
โ—„seed0โ–บ
โ—„camera_angleโ–พโ–บ
โ—„shot_typeโ–พโ–บ
โ—„multi_char_actionโ–พโ–บ
โ—„CUSTOM_actionโ–บ
โ—„CUSTOM_PROMPTโ–บ

Bjornulf's pack has a whole subsystem of dropdown-driven "Text Generator" nodes - styles, scenes, characters, poses, outfits, creatures - each of which builds one piece of a prompt. This node is where they all converge. By itself it doesn't write much: a camera angle, a shot type, maybe a multi-character action. Connect the other generator nodes into its optional inputs, and it stitches everything together into one final prompt string.

Worth knowing going in, straight from the author: this whole subsystem was built with Flux in mind. It's writing structured English descriptions, not tags, and it assumes a model that reads instructions carefully. Don't expect SD1.5 or SDXL checkpoints to honor every clause the same way - the author's own testing found SDXL failing to place a character where the prompt asked, while Flux handled it correctly.

How it works

Camera framing and character interaction are native to this node - camera_angle (front view, bird's eye view, dutch angle, and more) and shot_type (close-up, wide shot, establishing shot) are widgets right here, no extra node needed. multi_char_action covers what several characters are doing together (posing, fighting, dancing), with a CUSTOM option that lets you type your own via CUSTOM_action if the preset list doesn't cover it.

Everything else routes in through three optional sockets: GEN_STYLE, GEN_CHARACTER, and GEN_SCENE. Each accepts either its matching dedicated generator node (Style, Character, or Scene) or a raw string forced through with the pack's Text-to-Anything converter - so you're not locked into using the dropdown generators if you'd rather hand-write a piece. Chain multiple Character nodes together (the author's own example: two dragons and a zombie in one scene) and they all funnel into this single GEN_CHARACTER input. There's also a free-text CUSTOM_PROMPT field for anything you want appended outside the structured system entirely.

The inputs and outputs that matter

  • seed - drives any RANDOM picks across this node and whatever's chained into it.
  • camera_angle / shot_type - framing, set directly or left NONE/RANDOM.
  • multi_char_action - what's happening in the scene; use CUSTOM plus CUSTOM_action for anything not on the list.
  • GEN_STYLE / GEN_CHARACTER / GEN_SCENE (optional) - where you plug in the pack's other generator nodes to build the full prompt.
  • CUSTOM_PROMPT - freeform text for whatever the structured system doesn't cover.
  • Output is a single STRING - the assembled prompt, ready for your CLIP Text Encode.

How to install it

ComfyUI Manager โ†’ search Bjornulf_custom_nodes โ†’ install โ†’ restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/justUmen/Bjornulf_custom_nodes
pip install -r Bjornulf_custom_nodes/requirements.txt

Pure text assembly, no special dependency of its own - install the full shared requirements.txt since it ships as part of the whole pack.

Common issues & troubleshooting

The output is nearly empty. This node writes almost nothing by itself - camera angle, shot type, and multi-character action are all it contributes directly. If you haven't wired in a Character, Style, or Scene node, that's expected; connect at least one of the optional generator inputs to get an actual prompt.

A feature I set (position, action, outfit) isn't showing up in the render. Check your checkpoint before assuming the node is broken. The author is explicit that Flux follows this system's instructions reliably; SD1.5 and SDXL are hit-or-miss on specific spatial or compositional requests, even when the generated prompt text is correct.

Two character nodes are fighting each other in the output. Chained Character nodes are meant to describe different characters in the same scene, not compete to describe the same one - if the descriptions conflict, that's a chaining mistake, not the node misbehaving. Give each chained Character node a distinct role and location.

I want to skip the dropdowns entirely for one piece. Use CUSTOM_PROMPT for a free-text addition, or force a raw string into GEN_STYLE/GEN_CHARACTER/GEN_SCENE with the pack's Text-to-Anything node if you specifically need to bypass a socket's expected type.

CategoryBjornulf

Inputs (9)

NameTypeDefaultDescription
seedINT00โ€“18446744073709550000โ€”
camera_angleCOMBO15 options: NONE, RANDOM, front view, side view, three-quarter view, back view, +9
shot_typeCOMBO12 options: NONE, RANDOM, close-up shot, medium shot, full body shot, wide shot, +6
multi_char_actionCOMBO50 options: NONE, CUSTOM, RANDOM, posing for the camera, looking at the camera, walking arm in arm, +44
CUSTOM_actionSTRINGโ€”
CUSTOM_PROMPTSTRINGโ€”
GEN_STYLEoptGEN_STYLE,STRINGโ€”
GEN_CHARACTERoptGEN_CHARACTER,STRINGโ€”
GEN_SCENEoptGEN_SCENE,STRINGโ€”

Outputs (1)

NameTypeDescription
STRINGSTRINGโ€”