How to Write Character Consistency Prompts for AI Image Generators
Character bible templates, locked descriptor blocks, and platform workflows for Midjourney v7 (--oref), FLUX Kontext, DALL·E Gen_ID, and SDXL — same face across scenes without drift.
Turn any photo into an AI prompt — free
No sign-up required. Works with Midjourney, FLUX, DALL-E.
Try Image to Prompt →Every AI image generator invents a new face unless you tell it not to. "A woman with red hair in Paris" produces a different woman on every click — different bone structure, eye spacing, nose, age read.
Character consistency is not one feature. It is a stack: a locked text block you never paraphrase, a reference image the model can read, and parameters that weight identity over scene novelty. Prompts alone cap out around 60–70% likeness. References push you to 85–95%. LoRA training hits 95%+ for long projects.
This guide is prompt-first — how to write the text side for Midjourney v7, FLUX Kontext, DALL·E 3, and SDXL — with reference workflows where prompts stop being enough. For Midjourney --cref v6 deep dive, see our legacy cref guide; v7 shifted to Omni Reference (--oref).
Why "same character" prompts fail
Models treat each generation as independent. Re-describing "sharp jaw, green eyes, freckles" with synonyms — "angular face, emerald eyes, light spots" — activates different token clusters. Face drift is guaranteed.
Other failure modes (HoneyChat / Prompting.systems 2026 benchmarks):
- Seed pinning — identical seed helps within one batch, not across sessions or batch sizes
- Prompt saturation — past ~15 face tags, extra detail gets averaged away
- Scene words overpower identity — "dramatic cyberpunk rain neon" steals weight from face tokens
- Style jumps — photoreal reference → anime output breaks facial geometry
Fix: separate identity block (frozen) from scene block (changes every image).
The character bible (text foundation)
Before any reference URL, write a Character Bible — 8–12 precise tokens you paste verbatim into every prompt. Order matters: identity tokens first carry the most weight (OpenAI community + FLUX character guides agree).
Template:
`
[NAME/ROLE], [age read], [gender presentation]
Face: [face shape], [eye color + shape], [nose], [lips], [skin tone]
Hair: [length, texture, color, style — exact words every time]
Build: [height read, body type]
Marks: [scars, freckles, moles — specific placement]
Default outfit (optional lock): [garment colors + key items]
`
Example — locked block (never rephrase):
Mira Okonkwo, woman early 30s. Oval face, deep brown almond eyes, straight medium nose, full lips, warm dark brown skin. Shoulder-length tight coiled black hair, side part. Athletic slim build. Small crescent scar above left eyebrow. Default: olive field jacket, white tee.
Scene block (changes per image):
standing on wet London pavement at night, neon reflections, cinematic documentary photography
Bad: alternating "coiled black hair" / "curly dark hair" / "short afro" — three different people.
Good: identical hair string in all 20 prompts.
What to lock vs what to vary
| Lock (character bible) | Vary (scene prompt) |
| Face structure, eyes, hair, skin, scars | Location, action, pose, expression |
| Optional: default outfit for series | Lighting, time of day, weather |
| Reference image URL / Gen_ID | Camera angle, composition, aspect ratio |
| Style via --sref if brand series | Props, background characters |
Rule: change one scene dimension per generation when debugging drift. If face breaks when you add "wide shot," the camera term stole weight — shorten scene text or raise reference weight.
Prompt structure (all platforms)
Formula: [IDENTITY BLOCK] + [ACTION/POSE] + [ENVIRONMENT] + [LIGHTING] + [STYLE/MEDIUM]
Identity always leads. Never bury face tokens after 30 words of scene description.
Anchor phrase when chaining generations:
The same character as before, maintaining [paste 3–4 key traits from bible]
Works in DALL·E chat and FLUX Kontext; Midjourney prefers --oref over prose repetition.
Midjourney v7: Omni Reference (--oref)
As of 2026, --cref is a v6 / Niji v6 parameter. v7 uses `--oref` (Omni Reference) — same syntax family, wider subject support (people, props, creatures), finer weight control via --ow (1–1000, default 100).
Syntax:
[scene prompt with identity block] --oref [image URL] --ow [weight] --v 7
--ow guide (CometAPI / AI Wiki / KINTO Tech 2026):
- 25–50 — style transfer, loose resemblance
- 100–300 — balanced; scene changes, face mostly holds
- 400–600 — character sheets, strong identity lock (baseline for recurring cast)
- 700–1000 — maximum fidelity; risk of stiff poses
Pro tip: high --stylize (250+) needs higher --ow (200–400) or character drifts toward MJ house aesthetic.
Step 1 — hero reference prompt:
Mira Okonkwo, woman early 30s, oval face, deep brown almond eyes, shoulder-length tight coiled black hair side part, warm dark brown skin, small crescent scar above left eyebrow, neutral expression, front-facing portrait, soft even studio light, plain grey background --ar 4:5 --style raw --v 7
Step 2 — new scene (identity block unchanged):
Mira Okonkwo, woman early 30s, oval face, deep brown almond eyes, shoulder-length tight coiled black hair, warm dark brown skin, crescent scar above left eyebrow, walking through rainy Tokyo alley, neon reflections, cinematic --oref [HERO_URL] --ow 450 --ar 2:3 --style raw --v 7
Step 3 — character sheet:
Character reference sheet, Mira Okonkwo same face throughout, 4 panels: front view, three-quarter, profile, full body standing, consistent olive field jacket, neutral studio lighting, labeled turnaround --oref [HERO_URL] --ow 500 --ar 16:9 --v 7
Reference image rules (same as cref best practices): front or three-quarter face, even lighting, no sunglasses/masks, single subject, uncluttered background.
Combine with style lock:
--oref [character] --ow 450 --sref [style_url] --sw 80
See our Midjourney 2026 guide for full parameter context.
Midjourney v6: --cref fallback
Need strict v6 --cref / --cw (0–100)? Roll back: --v 6 --cref [url] --cw 80.
--cw 100— face + hair + clothing from reference--cw 0— face only; outfit follows prompt
Our dedicated --cref guide covers v6 workflows, multi-scene examples, and sref pairing.
FLUX.1 Kontext & FLUX 2 multi-reference
FLUX rewards literal prose and reference conditioning. Two 2026 tiers:
Kontext (single reference): upload hero image + prompt. Lead with preservation instruction:
Use the provided image as the exact character reference. Preserve face shape, eye color, hair style, skin tone, and body proportions. [Same identity block]. [New scene description]. Photorealistic, consistent lighting direction.
Reference strength 0.75–0.85 for new scenes; 0.65–0.75 when changing outfit heavily (Selfielab Kontext tutorial).
FLUX 2 multi-reference (2–5 images): front, three-quarter, profile refs. Apatero 2026 workflow:
- Front-facing ref → highest weight (1.0–1.2)
- Three-quarter + profile → 0.9 each
- Prompt names sources:
character from image 1 wearing outfit from image 2, posed like image 3
Cap at 5 refs — beyond that, identity dilutes.
FLUX prompt discipline: repeat bible strings verbatim. FLUX interprets "auburn hair" and "reddish-brown hair" as different people.
Chained generation: use best output as next reference. Gen2: "Same character from previous image, now in medieval armor, forest background."
Best for: photoreal campaigns, product ambassadors, game key art. Pair with our cinematic lighting keywords for consistent light direction across scenes.
DALL·E 3: Gen_ID and conversation threading
DALL·E 3 (ChatGPT image generation) offers Gen_ID — an internal character handle after you establish a face in-concept check thread.
Workflow:
- Generate hero portrait with full identity block
- Reply: "Remember this character as [Name]. Use Gen_ID for all following images."
- Next: "Using the same character (Gen_ID), show her [new scene]. Maintain exact hair and facial features."
- Character sheet request: "Same character, 4-panel reference sheet: front, side, three-quarter, full body. Identical face and hair."
2026 limitation (TheRightGPT / user reports): Gen_ID persists within the same chat only. Close the thread → lose the character. For multi-week projects, export hero images and switch to Midjourney --oref or FLUX Kontext.
Prompt tip: DALL·E handles conversational revision — "keep the face identical, change only the background to a café" outperforms rewriting from scratch.
SDXL & open weights: prompts + references + LoRA
Self-hosted SDXL has the richest consistency toolkit. Prompt-only tier:
Identity in positive prompt — paste bible + `(character_name:1.1)` weight sparingly
Negative prompt: different person, face change, inconsistent features, multiple faces
IP-Adapter Face — reference image + prompt; watch for outfit/lighting bleed from ref
InstantID / PuLID — stronger face lock without full LoRA training
Character LoRA (gold standard for 20+ images): train on 15–30 varied photos (poses/lighting differ, face constant). Caption scenes, not character names ("woman in garden" not "Anna in garden"). Inference:
photo of [trigger_word], [identity traits from bible], [scene], <lora:character_v1:0.75>
LoRA strength 0.6–0.8 — higher = more likeness, lower prompt obedience. See our SDXL weights guide for (token:1.2) syntax.
When prompts plateau (~70% consistency), LoRA beats adding more face adjectives.
Character sheet prompts (copy-paste)
Generate once, use as --oref / Kontext ref forever.
Turnaround sheet:
Character model sheet, [identity block], 4 views: front, three-quarter left, profile, full body back, neutral standing pose, consistent outfit, white background, studio lighting, concept art turnaround, evenly spaced panels
Expression sheet:
Same character [identity block], expression sheet 6 faces: neutral, smile, anger, surprise, sadness, laugh, identical features throughout, head and shoulders, grid layout
Outfit variants (face locked):
[Identity block], same person throughout, 3 full-body outfits: [outfit A], [outfit B], [outfit C], runway pose, consistent face and hair, studio white background
After generation: pick clearest panel as hero --oref source.
Multi-character scenes
Hard mode. Rules:
- Separate reference per character — MJ: multiple
--orefURLs (check current v7 multi-oref support in docs); FLUX: image 1 = char A, image 2 = char B - Short identity blocks — two full bibles in one prompt fight for tokens
- Spatial prompt — "Character A (left, red jacket) and Character B (right, blue coat)"
- Generate singles first — composite in post if model merges faces
SDXL: ControlNet OpenPose + separate LoRAs per character for comics/storyboards.
Consistency checklist before you generate
- [ ] Character bible written; no synonym drift
- [ ] Identity block is first 40% of prompt
- [ ] Hero reference: front/three-quarter, clean background, even light
- [ ] Reference weight tuned (
--ow 400+MJ, 0.75+ FLUX Kontext) - [ ] Scene changes one major variable at a time
- [ ] Style locked via
--srefif series aesthetic matters - [ ] Platform match: don't use v6
--crefsyntax on v7 jobs
Common mistakes
Re-describing the face every time — use bible + reference, not creative rewriting
Weak reference photo — profile-only ref fails on front-facing prompts
Scene prompt longer than identity block — lighting paragraph drowns face tokens
Conflicting style — "anime style" + photoreal reference = new face
Ignoring weight knobs — default `--ow 100` too loose for character sheets
DALL·E cross-chat — assuming Gen_ID survives new conversations
Too many refs (FLUX) — 8+ images average faces into generic model
PromptMake workflow
/image → upload hero portrait → Recreate or Change Style to extract a reusable identity block from an existing image.
/image → paste bible + scene → target Midjourney v7 or FLUX → iterate with Improve mode to tighten descriptor precision.
3 free /image generations per day (guest); use them to nail the hero reference before burning paid credits on Midjourney/FLUX.
Build a project folder: hero.png, character-bible.txt, scene-prompts/ — text and reference stay paired.
Platform pick (quick reference)
| Need | Best tool | Why |
| Recurring cast, any scene, persistent URL | Midjourney v7 --oref | Strongest cross-scene identity via URL |
| Photoreal brand ambassador | FLUX Kontext / FLUX 2 multi-ref | Literal face preservation |
| Rapid chat iteration, same session | DALL·E Gen_ID | Conversational "same face" edits |
| 50+ images, comics, game asset | SDXL + character LoRA | Weight-level identity encoding |
| Strict v6 cref pipeline | MJ --v 6 --cref | Legacy workflows still valid |
Frequently asked questions
Can prompts alone keep a character consistent?
For 3–5 images, a rigid bible + anchor phrases get you partway. For production, add --oref, Kontext, or LoRA.
--cref or --oref in 2026?
v7 → --oref. v6 → --cref. Mixing them returns errors or ignored params.
Best --ow for graphic novel panels?
Start 450; drop to 350 if poses feel frozen; raise to 550 if face drifts.
Does outfit stay consistent?
Only if you lock it in the bible or use --ow 600+ / --cw 100. Otherwise reference carries face, prompt carries clothes.
How many reference images for FLUX?
3–5 angles optimal. Front + three-quarter minimum.
Same character in video?
Image consistency ≠ video. Lock hero frame first; see video model guides for Gen-4 / Veo character persistence.
Related articles
Midjourney prompts 2026 — --oref, --sref, Draft Mode overview
Legacy --cref guide — v6 character reference deep dive
7 elements of visual prompts — where subject/identity fits
Cinematic lighting keywords — consistent light across scenes
DALL·E vs Midjourney vs Flux — which model needs better prompts
Reverse-engineer prompt from photo — build bible from reference
SDXL weights guide — (token:1.2) for SD character tags
Bottom line
Character consistency prompts are frozen identity blocks plus changing scene blocks — never paraphrase the face.
Write the bible once. Generate a hero reference. Attach --oref, Kontext, or Gen_ID. Tune weight until the face holds, then vary only scene, pose, and light.
Prompts set the contract; references enforce it. For long-running projects, plan the LoRA path early — text has a ceiling, weights don't.
Ready to generate your own prompts?
Free. No sign-up required. Works with all major AI models.