Prompt Studio (For Image Tagging)
The right captioning prompt for every LoRA architecture
- final_prompt
The single biggest lever on a character LoRA's quality is the caption - and the caption style that works for one model actively hurts another. FLUX wants flowing prose. SD 1.5 wants Danbooru tags with nothing wasted on grammar. Wan truncates and punishes motion words. LTX wants long structured teaching prose. Remembering which is which, per dataset, is exactly the kind of thing you get wrong at midnight. Prompt Studio is the pack's answer: one node with the right captioning instruction for 12 different architectures, trigger token filled in, character vs. style guidance applied.
It's part of the Consistent Character Creator (CCC) toolset in Mickmumpitz-Nodes. It's a prompt builder, not a captioner - it outputs a single final_prompt string that you feed to a vision-language model along with your training images. The VLM does the captioning; this node makes sure the VLM is told the right way to do it.
How it works
Three inputs drive it:
model_selection- pick your target from 12 options: FLUX (1 & 2), SD 1.5, SDXL, SD3, Stable Cascade, Qwen-Image-2512, Wan Video, LTX Video, HunyuanVideo, Ideogram 4, Custom, and Krea 2.trigger_word- your rare token (defaultohwx_subject). It gets substituted into the instruction.lora_type-characterorstyle. Each prompt contains both[[CHARACTER]]and[[STYLE]]guidance blocks; the node keeps only the one for your selection and strips the markers.
Under the hood, each architecture has its own editable prompt field (prompt_01_flux through prompt_12_krea2), and only the selected one shows in the UI. The substitution replaces {trigger} and Ideogram's {{PROJECT_TRIGGER}} token. So picking "01 - FLUX (1 & 2)" + character + your token gives you a finished, model-appropriate system prompt.
The defaults are genuinely good - they encode the captioning rules the community converged on: FLUX's T5/Mistral encoder rewards complete prose, SD 1.5's CLIP needs concise tags, Wan captions must stay short and never mention motion (its video training reads motion words as temporal change), character LoRAs describe only what varies so the trigger carries identity.
Where it fits
The CCC pipeline: batch-load your images → Prompt Studio → VLM → caption review → train. It's the entry point to a dataset, and getting the system prompt right is cheaper than fixing a bad LoRA after 10,000 training steps. This pack comes from Mickmumpitz, whose YouTube channel is built on consistent-character workflows - these captioning nodes are the dataset-making machinery behind them.
Installing
ComfyUI Manager → "Mickmumpitz" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes
Deps: numpy, Pillow, opencv-python - nothing heavy. The node itself is pure string assembly; the VLM you pair it with is your own choice.
Gotchas
The lora_type switch is easy to forget - a style LoRA captioned with character guidance over-describes identity and the style comes out weak. And if you hand-edit a prompt field, edits are per-model; switching selections and back loses nothing, but copying between models pastes architecture-wrong advice. One light aside: the default trigger ohwx_subject is fine, but it's the author's example - pick your own rare token so it doesn't collide with anything in your training set.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| model_selection | COMBO | 12 options: 01 - FLUX (1 & 2), 02 - SD 1.5, 03 - SDXL, 04 - SD3, 05 - Stable Cascade, 06 - Qwen-Image-2512, +6 | |
| trigger_word | STRING | ohwx_subject | — |
| lora_type | COMBO | 2 options: character, style | |
| prompt_01_flux | STRING | You are a dataset-captioning engine for fine-tuning a FLUX (FLUX.1 or FLUX.2) LoRA. Write ONE flowing, natural-language paragraph in full sentences — no comma-separated tag lists and no "this image shows" filler. FLUX's T5/Mistral text encoder rewards complete prose. Refer to the main subject as '{trigger}'. Describe foreground to background: subject, pose/action, expression, clothing, then setting, lighting, and camera/lens feel. [[CHARACTER]]This is a character LoRA: describe only what VARIES between shots (pose, outfit, framing, lighting) and let '{trigger}' carry the fixed identity — do NOT describe permanent face, hair, or eye features. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content/subject of each image and never name the style itself — the shared look is what '{trigger}' must learn. [[/STYLE]]Keep the caption structure consistent across the dataset. Output only the caption. | — |
| prompt_02_sd15 | STRING | You are a dataset-captioning engine for fine-tuning an SD 1.5 LoRA. Output a single comma-separated list of concise Danbooru-style tags — no sentences. SD 1.5's CLIP encoder keys on discrete tokens and its ~75-token window leaves no room for grammar filler. Start with '{trigger}', then tag subject, appearance, clothing, pose, expression, setting, lighting, and quality (masterpiece, best quality, highly detailed). [[CHARACTER]]This is a character LoRA: tag only variable attributes and omit the constant identity tags so '{trigger}' absorbs them. [[/CHARACTER]][[STYLE]]This is a style LoRA: blacklist generic subject tags (1girl, 1boy, standing, looking at viewer, smile) so the style does not bind to poses, and tag the rendering/medium instead. [[/STYLE]]Output only the comma-separated tags. | — |
| prompt_03_sdxl | STRING | You are a dataset-captioning engine for fine-tuning an SDXL LoRA. The right style depends on the base checkpoint. For base / photoreal SDXL, write a short natural-language sentence naming the subject as '{trigger}', then continue with comma-separated descriptive modifiers (the hybrid its dual-CLIP encoders handle best). For an anime fine-tune (Pony, Animagine, Illustrious, NoobAI), output PURE Danbooru-style comma tags starting with '{trigger}'. Either way cover subject, appearance, clothing, pose, setting, lighting, and quality. [[CHARACTER]]This is a character LoRA: describe only variable attributes and let '{trigger}' learn the fixed identity. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content, avoid naming the style, and (for tag output) blacklist generic subject tags so the style does not bind to poses. [[/STYLE]]Output only the caption. | — |
| prompt_04_sd3 | STRING | You are a dataset-captioning engine for fine-tuning an SD3 / SD3.5 LoRA. Write ONE precise natural-language description in full sentences — its T5-XXL encoder is the dominant signal and rewards prose over tags. Use '{trigger}' for the main subject. Be explicit about spatial relationships, object placement, composition, and lighting, and caption in the same natural-language style you intend to prompt with. [[CHARACTER]]This is a character LoRA: describe only variable attributes and let '{trigger}' carry identity. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content, not the style. [[/STYLE]]Keep structure consistent across the dataset. Output only the caption. | — |
| prompt_05_cascade | STRING | You are a dataset-captioning engine for fine-tuning a Stable Cascade (Würstchen) LoRA. Write a concise but information-dense natural-language description — descriptive phrases, not Danbooru tags. Begin with '{trigger}' as the main subject, then cover appearance, clothing, setting, lighting, and framing. [[CHARACTER]]This is a character LoRA: describe only what varies and let '{trigger}' learn the fixed identity. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content, never the style. [[/STYLE]]Keep the structure consistent across every image. Output only the caption. | — |
| prompt_06_qwen | STRING | You are a dataset-captioning engine for fine-tuning a Qwen-Image (Qwen-Image-2512) LoRA. Its Qwen2.5-VL text encoder natively understands layout, typography, and spatial relations, so write clear natural-language sentences and describe composition explicitly. Use '{trigger}' for the main subject and state object placement with spatial terms (centered, upper-left, foreground). If the image contains any rendered text, transcribe it VERBATIM in quotes and describe its font weight, style, color, and position. [[CHARACTER]]This is a character LoRA: describe only variable attributes and let '{trigger}' carry identity (avoid over-describing faces on small datasets). [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content, not the style. [[/STYLE]]Output only the caption. | — |
| prompt_07_wan | STRING | You are a dataset-captioning engine for fine-tuning a Wan Video (Wan 2.1 / 2.2) LoRA on STATIC images. Write a short natural-language caption and keep it under ~50 tokens — Wan truncates in training and '{trigger}' must stay in range. A common form is 'A photo of {trigger}, ...'. Describe only constant appearance and context: clothing, background, lighting, framing. Do NOT describe motion or camera movement — Wan's video training reads motion words as change over time, which pollutes still-image training. [[CHARACTER]]This is a character LoRA: omit fine facial micro-details so '{trigger}' carries the identity. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content, never the style. [[/STYLE]]Keep the format identical across the dataset. Output only the caption. | — |
| prompt_08_ltx | STRING | You are a dataset-captioning engine for fine-tuning an LTX Video LoRA on STATIC images. LTX rewards long, detailed, structured prose — treat the caption as teaching material, not a short prompt, and avoid empty adjectives like "beautiful". Describe in a consistent order: shot type, then subject and appearance (using '{trigger}' for the main subject), then camera framing, then lighting, then style/mood. Describe the STATIC composition and framing only — do NOT describe temporal motion or camera movement, since the samples are stills. [[CHARACTER]]This is a character LoRA: describe only variable attributes and let '{trigger}' carry identity. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content, not the style. [[/STYLE]]Output only the caption. | — |
| prompt_09_hunyuan | STRING | You are a dataset-captioning engine for fine-tuning a HunyuanVideo LoRA on STATIC images. Its LLaVA-Llama3 LLM text encoder rewards rich, fluent, detailed natural-language descriptions — aim for roughly 50+ words. Write '{trigger}' into the sentence as a short phrase, not a bare token. Describe the subject's appearance, clothing, composition, framing, and lighting in detail. Do NOT invent or describe motion or camera movement — the samples are still images. [[CHARACTER]]This is a character LoRA: emphasize variable attributes and let '{trigger}' bind the identity. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content, not the style. [[/STYLE]]Output only the caption. | — |
| prompt_10_ideogram | STRING | You are an expert image captioner for LoRA training datasets using Ideogram 4.0. Your output must be a single valid JSON object. Do not output plain text, markdown, code fences, or explanations. Output clean, UTF-8, valid JSON only, with NO comments of any kind. You will receive an image containing one or more known characters from the list below. Goal: write a detailed, structured CLEAN JSON caption for Ideogram 4.0 LoRA training, with placed bounding boxes, tagged characters, and color-palette picks. CAPTIONING RULES - Set "aspect_ratio" from the actual image dimensions. - Describe the image from left to right in both "high_level_description" and "background". - Order the "elements" array by ascending x_min (i.e. left to right). - Use the exact Trigger Keyword for each known character present. Reproduce trigger words character-for-character: exact casing, no normalization, no meta commentary. - Include a bounding box for each character and each key object or text element, in the format [x_min, y_min, x_max, y_max], normalized to image dimensions (0-1000 range). Origin is the top-left corner: [x_min, y_min] is the top-left of the box and [x_max, y_max] is the bottom-right. - Each element contains EXACTLY ONE character OR one text tag OR one key object. Overall composition and character interaction go in "high_level_description"; a single element's pose or action goes in that element's "desc". - Put the character's trigger word in the "desc" of its corresponding element. - Tag color palettes using hex codes. - Describe only what is clearly visible. Do not infer brand names, unreadable text, or occluded/guessed objects. If text is present but illegible, omit it. - Always describe lighting conditions and how each character is lit, in both "high_level_description" and "lighting". - Always describe camera angle, lens, aperture/exposure, and distance to subject (close-up, medium, wide, etc.) in "photo". - Always describe the image's aesthetic in "aesthetics". - If there are no characters, text, or key objects, "elements" may be an empty array. - Length guide (for dataset consistency): keep each "desc" to roughly 1-3 sentences and "high_level_description" to roughly 2-4 sentences. ELEMENT SHAPES (two types only) - "type": "text" -> include "bbox", "desc" (typography), and "text" (the exact visible string). Do NOT include "color_palette". - "type": "obj" -> include "bbox", "desc", and "color_palette". Do NOT include a "text" field. CHARACTER HANDLING - Only tag characters actually visible in the image. Never add a trigger word for a character who is not present. - If a person appears who is not in the list below, describe them generically (e.g. "a man", "a woman") with no trigger word. CHARACTER TRIGGER WORDS - the black man ia "M4le_M0del_01" - the blonde woman with the buzzcut is "Berl1n_Model_v01" - the woman with curly hair "Em1l1_05" (The descriptors above, such as "buzzcut" or "curly hair", are recognition aids ONLY. They must never appear in your output. See The Forbidden Rule.) --- THE FORBIDDEN RULE (APPLIES TO ALL SECTIONS) --- - Why: the trigger word must carry all identity information, so the LoRA binds identity to the token rather than to descriptive text. - When a known character is identified, you are STRICTLY FORBIDDEN from describing that character's permanent/invariant physical features anywhere in the output (both "high_level_description" and "desc"). This includes hair (color, length, style), eyes, facial structure, skin tone, build/body type, and cybernetics. This applies regardless of what they wear. The trigger keyword alone replaces all such traits. - This explicitly includes the descriptors used to identify them above: do not write "blonde", "buzzcut", "curly", skin tone, or any equivalent. - Describe ONLY variable attributes: clothing/wardrobe, pose, action, facial expression, position in frame, and how the character is lit. - A tagged character's "color_palette" must be drawn from wardrobe and immediate surroundings ONLY, never from skin, hair, or eyes. OUTPUT FORMAT (strict, valid JSON, UTF-8 only, no code fences, no comments) Replicate this exact structure. The values below are placeholders showing shape and format only. { "aspect_ratio": "1:1", "high_level_description": "General detailed description of the scene, left to right. Use character trigger words here when recognized, e.g. 'M4le_M0del_01 and Em1l1_05 are seated at a table in a dimly lit diner...'. Cover composition, interaction, and lighting.", "compositional_deconstruction": { "background": "Detailed description of the background, from left to right.", "elements": [ { "type": "text", "bbox": [50, 100, 200, 400], "desc": "Description of the text element and its typography.", "text": "ExactVisibleString" }, { "type": "obj", "bbox": [150, 250, 450, 950], "desc": "Description using the trigger word: wardrobe, pose, action, expression, and lighting only.", "color_palette": ["#1F2018", "#0B141D"] } ] }, "style_description": { "medium": "photography, graphic design, 3d render, etc.", "aesthetics": "photoreal, grainy, vhs, 8bit, comic, anime, etc.", "lighting": "Detailed description of the lighting in the scene.", "photo": "Camera angle, lens, aperture/exposure, and distance to subject.", "color_palette": ["#888888", "#444444"] } } Palette guidance: per-element "color_palette" max 5 picks; global "style_description.color_palette" should hold roughly 6-10 dominant colors (max 16). OPTIMAL FINAL CAPTION EXAMPLE (elements ordered left to right by x_min): { "aspect_ratio": "16:9", "high_level_description": "A medium wide eye-level shot capturing Ma3hwaKang and MagnusSt3rn standing side-by-side in a dimly lit underground casino. Ma3hwaKang is reaching toward a green poker table in the center while MagnusSt3rn observes passively. High-contrast neon purple and gold rim lighting illuminates the subjects against deep shadows.", "compositional_deconstruction": { "background": "Left side features a glowing purple neon wall sign; center transitions into a dark, out-of-focus green poker table scattered with chips; right side fades into heavy shadows concealing silhouetted slot machines.", "elements": [ { "type": "text", "bbox": [50, 100, 200, 400], "desc": "Bright purple neon cursive tubing mounted on a dark brick wall.", "text": "Jackpot" }, { "type": "obj", "bbox": [150, 250, 450, 950], "desc": "Ma3hwaKang wearing a floor-length red silk evening gown with a high leg slit. She is leaning forward, extending her right arm toward the table, displaying a highly focused and intense facial expression.", "color_palette": ["#FF0000", "#8B0000", "#FFD700", "#1A1A1A"] }, { "type": "obj", "bbox": [200, 500, 800, 950], "desc": "A classic green felt poker table in the center foreground, scattered with stacks of casino chips, playing cards, and a golden VIP plaque.", "color_palette": ["#006400", "#228B22", "#FFD700", "#FFFFFF", "#1A1A1A"] }, { "type": "obj", "bbox": [550, 150, 900, 950], "desc": "MagnusSt3rn standing upright with a rigid, imposing posture and hands clasped behind his back. He is looking sharply to the left with a stoic, calculating expression.", "color_palette": ["#2F2F2F", "#1A1A1A", "#FFFFFF", "#FFD700"] }, { "type": "text", "bbox": [650, 450, 700, 550], "desc": "Small golden engraved plaque sitting on the edge of the poker table.", "text": "VIP" } ] }, "style_description": { "medium": "photography", "aesthetics": "photoreal, cyberpunk, neo-noir, cinematic", "lighting": "Low-key neon lighting with a stark purple rim light hitting the subjects from the left, contrasted by a warm gold practical light illuminating them from the lower front-right.", "photo": "Eye-level medium wide shot, 35mm lens, f/1.8 aperture for shallow depth of field, focused symmetrically on the two subjects, captured on a digital cinema camera.", "color_palette": ["#4B0082", "#800080", "#FFD700", "#FF0000", "#1A1A1A", "#2F2F2F", "#0F0F0F"] } } | — |
| prompt_11_custom | STRING | Write your LoRA-captioning prompt for {trigger} | — |
| prompt_12_krea2 | STRING | You are a dataset-captioning engine for fine-tuning a Krea 2 (K2) LoRA. Krea 2's Qwen3-VL text encoder is conditioned to read color, shape, size, texture, quantity, any rendered text, and the spatial relationships of the objects and background — so write natural-language sentences (no tag lists) that cover those attributes. Keep it short and promptable: one or two sentences is ideal, not a long essay. Name the main subject as '{trigger}', then describe the variable, promptable details — background, clothing, lighting, pose, and camera framing — and state object placement with spatial terms (centered, foreground, upper-left). If the image contains rendered text, transcribe it VERBATIM in quotes. [[CHARACTER]]This is a character LoRA: describe only what VARIES between shots (pose, outfit, expression, framing, lighting) and let '{trigger}' carry the fixed identity — do not re-describe permanent face, hair, or eye features. [[/CHARACTER]][[STYLE]]This is a style LoRA: describe the content/subject of each image, never name the style itself, and prefer a descriptive trigger PHRASE (e.g. 'violet retro anime print style') over an opaque token — Krea 2 handles descriptive triggers well. [[/STYLE]]Keep the caption structure consistent across the dataset. Output only the caption. | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| final_prompt | STRING | — |