---
name: character-consistent
description: Keep the person's AI character the same across many images — the character sheet as picture 1, every other reference with one job named by role and its opposite, the camera reference as the base frame, the light formula as a condition, in one GPT Image 2.5 pass; check with crops.
---
# Consistent character across stills

FlashBoards user skill, version 1.2.3 (2026-10-13).

On the board, read these guides with `list_skills` and `get_skill` when the assistant exposes them; otherwise use the hosted index through an available read-only retrieval tool. Use that runtime’s actual model discovery, current page context and guarded board actions for execution. Keep native readiness, approval and cost gates; do not claim a guide was read when retrieval is unavailable.

Read related guides with `get_skill({skillId:"<id>"})` or the [hosted index](https://pub-78da82d51ed14147ac554d38094b0c0b.r2.dev/user-skills/1.2.3/index.html). Reading a guide does not start or authorize a paid generation.

Read `character` for the shared rules. Inputs are the person's own: the {character sheet} of {character} (no sheet yet → `character-sheet` first) and references, each with one job.

## The canon

- **Model**: GPT Image 2.5 edit (`gpt-image-25-flare` or `gpt-image-25-sunburst`), `quality: "low"` set explicitly, the size = the target aspect (`width`/`height`). Nano Banana loses the character to the reference people: it is the losing option.
- **One pass**: the whole frame in one request, not frame → look → light. If a reference is dropped, cut the number of roles (keep the most important six at most) rather than adding passes.
- **Picture roles only**: the identity comes from the picture; the prompt never describes the face, hair or clothes, and never what is in a reference — only what to take from picture N and where it goes.

References arrive in this order: all owned results in `referenceGenerationIds`, then FlashBoards gallery picks and film frames in `referencePreviewHandles` (from `search_references` or `search_movie_frames`), then uploads in `referenceImageReceipts`. Order within each list is preserved. Number every picture role from that combined order: with an owned sheet, a gallery lighting frame and an uploaded pose, picture 1 is identity, picture 2 is light and picture 3 is pose. The numbered examples below must be adapted to the actual sources; separate arrays cannot be interleaved. Up to 16 pictures in one request; past about six roles they crowd each other out.

## The method

1. **Identity = picture 1**: the {character sheet}. For the camera role, use the actual source order in step 4; picture 2 applies only when the camera source can be placed before the sheet.
2. **One job per reference, with its opposite.** Write the "take" line and the "do not take" line:

   | Role | The line ("picture N" = the reference) | Do not take |
   |---|---|---|
   | Location | Place {character} inside the place from picture N: the same space, architecture, surfaces, objects, time of day and atmosphere; at true scale and physically in contact with it. | any people in it; the camera may move inside the place |
   | Emotion | {character}'s face shows the expression from picture N on their own face: the same tension of brows, eyes and mouth, the same gaze, just as strong — not softened. | the face, age, hair, make-up, skin, clothes, background, light and colour |
   | Pose | {character} takes the exact pose from picture N: the same body angle, weight, arms, hands, legs and head position. | the person, face, body type, clothes, hair, background and light |
   | Haircut | {character}'s own hair is cut and styled exactly like in picture N; the hair colour stays their own. | the face, the hair colour, make-up and clothes |
   | Make-up | {character} wears the make-up from picture N on their own face as a physical layer: the same placement, colours, intensity and finish. | the face shape, skin tone, eyes, hair and clothes |
   | Prop | {character} holds or uses the object from picture N: the same shape, material, colour and wear, correct scale, grip and contact shadows. | the hands, person and background |
   | Palette | Grade the whole frame into the palette of picture N: the same dominant and accent colours in the same proportions; skin keeps a natural tone. | the content, subject and composition |
   | Light | the light formula, step 5 | the subject, face, clothes, pose and the content of the scene |
   | Camera | the base frame, step 4 | the person, clothes and colours |

   Where precision matters, state a **condition**, not a description ("if the camera looks down, look down just as steeply", "if the frame is flooded with one colour, flood this one too"). A condition works on any reference.
3. **The prompt, one pass** (fill the slots; keep the order):
   ```
   {character} — {what the image is: pose / location / a scene}.
   Picture 1 is only the look of {character}: their face, hair, build and clothes exactly as in picture 1 — the same person, not a lookalike.
   Picture {N} ({role}) — take {take}. Do not take {do not take}.      ← one line per reference
   {scene / action / performance in words — only what no reference gives}; {character} does not look into the lens.
   Face, hair, hands, clothes, props and surroundings are photographed together in one frame: the same light direction, colour temperature, perspective, focus and grain. No pasted face.
   One person in the frame. No readable text, logos, watermark, split panels or collage.
   ```
4. **Camera: the reference becomes the base frame.** "Shoot it with exactly the camera of picture N" lost the steep angle. What held, 3 runs of 3: when both camera and identity are owned results, put the camera first within `referenceGenerationIds` — "Recreate picture 1 frame-for-frame and put {character} in place of the person in it. Keep from picture 1 the camera position and height, the angle of view, the lens and distance, the crop and composition, everything the camera looks through or past in the foreground and how blurred it is, where the person stands, how large the person is and how the body is turned. Picture 1 gives no face and no clothes." + "Keep what the camera of picture 1 sees around the person — the same ground plane, depth and empty space — and restyle its surfaces into {the world}." In that owned-result ordering, identity is picture 2. If the camera is a gallery handle and identity is owned, identity stays first; substitute the actual camera and identity indices throughout the prompt. The size = the reference's aspect.
5. **Light: stop the scene fighting the reference.** "Light the whole frame exactly like picture N: the same colour of the light, direction and hardness, the same parts of face, body and background in light and in shadow. Match the saturation and strength one to one: if picture N is flooded with a single colour, flood this whole frame with that same colour — skin, hair, clothes, background and even the shadows take it. This light replaces every other light of the place." Switch the place's own lamps off in the scene line and name picture N as the only source of light and colour.
6. **Emotion needs a big face.** In a wide frame the face is too small to act: put emotions into close-ups.
7. **Takes.** For camera and light run 2–3 takes and pick.
8. **Check with crops**: `crop_image` the face and the outfit, then `describe_media` on each crop with a question — the face against the sheet (marks, eyes, hairline), every reference's job done, nothing of the reference person (hair, jewellery, clothes, a stranger's face in a reflection).
9. **Story states**: keep a change of look (a haircut in act II, a bandage, a younger self) as a new sheet that inherits everything else; use it as picture 1 for that part of the story.

## Where it goes wrong

- The face drifts → the prompt still describes the face; delete it, the sheet carries it.
- A reference brings its person along → the "do not take" half is missing.
- The emotion does not transfer → something else owns the frame (busy hands, a wide shot).
- The camera flattens to eye level → make the camera reference the base frame in the prompt; put it first only when the actual source ordering supports that.
- The light only tints the frame → other light sources and neutral grading words are still in the text; state the flood as a condition.
- Too many references → past about six roles they crowd each other out.

## Execute through MCP or on the board

Use the person's FlashBoards account; never ask for a personal provider key or run the source's local scripts. Discover `get_account`, `list_generation_models` and the tools of this client first: a published guide does not prove a feature is deployed.

**Headless, no open board.** Quote with `estimate_generation_cost` (skill models: `estimate_skill_model`), then run `generate_image`, `generate_video`, `generate_audio` or `run_skill_model` with one stable `generationAttemptId` per logical attempt. Pass `maxCostUsd` only when the current operation and selected model support it; otherwise use the quoted cost and the person's explicit approval with the supported controls. Never silently ignore an unsupported spending cap; make one `get_generation` check after `retryAfterSeconds`. Pass the person's own results by `generationId`: images in `referenceGenerationIds`, `firstFrameUrl` and `endFrameUrl`, audio in `referenceAudioUrls` or `targetAudioUrl`, videos in `referenceVideoGenerationIds`. They are read on the server; signed result links do not work as public URLs. Every `generationId` a tool returns stays valid: a later read of the same result gives a different string, and both work. Film frames and gallery pictures go in by `previewHandle`: `referencePreviewHandles` of the generation tools, a `{previewHandle}` source of `arrange_images`, `crop_image` and `pad_image`, and `describe_media`. New files come from `show_media_upload_picker` as receipts. The person's character comes in as its sheet, by `generationId` or as an upload; there is no search by name. If the person names a character without the sheet, ask for it or make one with `character-sheet`; do not scan recent results for it. Free server steps: `trim_video`, `concat_videos`, `conform_video`, `replace_video_audio`, `extract_video_frame`, `extract_video_audio`, `detect_video_cuts`, `crop_image`, `pad_image`, `arrange_images`, `cut_audio_span`, `concat_audio_tracks`, `mix_audio_tracks`, `fit_audio_duration`, `add_audio_reverb`. Check every result with `describe_media` (a question about an image; `model`, `mode` and `sourceRange` only for a video) and `transcribe_media` for speech. Both checks are paid: `describe_media` costs a fraction of a cent for an image and about 2–4 ¢ for a short video (more for a long one), `transcribe_media` under 1 ¢ a minute — count the checks you plan in the price you name before the first paid step. `describe_media` is not reliable about sound: it misses effects mixed under music and can hear voices or instruments that are not there. Check speech with `transcribe_media` and ask the person to listen for effects and music. Never repay an uncertain submission; reuse an attempt ID only for the identical request. Make each new `requestId` or `generationAttemptId` unique, for example the task, the date and a short random suffix: an ID used before, even in another chat, replays that earlier request or answers `REQUEST_ID_CONFLICT`.

**On the board.** Inspect with `list_board_sessions` and `get_board_snapshot` and carry the same `sessionId` and a fresh `activeBoardId` as `expectedBoardId`. Native cards: `execute_board_action` (`listNativeModels`, `setModel`), `prepare_board_generation` with ordered board items or owned outputs, then one `generate_on_board` within the authorized budget. Board media tools: `list_media_tools` → `start_media_tool` → `get_media_tool_run`. Put headless results on a board with `add_media_to_board`.

Keep mandatory safety settings and the live limits of each model. Prices, timings, endpoints and "free retry" claims in the sources are historical, not FlashBoards contracts. If a step this guide needs is not available or is refused (a tool error, `audio_not_configured`, a missing model or input), keep the finished assets, tell the person which step is blocked and why, and ask how to go on. A single generation that ends `failed` is not a blocked step: submit it once more with a new `generationAttemptId` (reworded if it may have hit the content checker), and stop to ask only if it fails again. A failed attempt is not always refunded, so the retry may be paid again and `maxCostUsd` caps each request on its own: count both against the budget the person approved. Never swap in another route on your own: no image model redrawing a layout or a frame, no `describe_media` in place of the frames it should check, no clip generated only to take its sound, no picture drawn where the guide takes a film frame.

## Source and related guides

- [Original Learn guide](https://flashboards-h01.vercel.app/learn/acting/consistent-ai-character/skills/character-consistent.md)
- Updated from the owner's skill sources of 2026-10-11.

Read: `character`, `character-sheet`, `character-replace`. Source experiments and demo materials are historical; use the person's own approved media.
