---
name: character
description: Route the person's recurring AI character in stills — the character sheet from their photos, the same character across images and scenes, the character in a film frame — with GPT Image 2.5 edit at quality low, picture roles only, one pass.
---
# Recurring AI character

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.

Work for the person's own character: their photo or the sheet made from it. Slots used by every character guide: {character} (the person's character, by name) · {photo} (their own photo(s)) · {character sheet} (face close-up + full body in one image) · {frame} (a film frame or any picture to put the character into) · {film}.

## Entry level — the quick route first

Make pictures first on GPT Image 2.5 Flare 2K (`gpt-image-25-flare`) at `quality: "low"` (`generate_image`, 2048 px on the long side). Spend more only on the picture the person likes: a Magnific upscale (`upscale`). Blind prompts ("the face and hair of picture 1"). With two or more results, ask which ones before an upscale.

## References first — offer them in the first reply

Before any work, offer to look at references together ("Show me references" / "I have my own" / "Skip"; skip it if the person already sent references or a clear look). The FlashBoards gallery (`show_reference_gallery` or `search_references`; Fashion / Editorial and Photography) for looks, places and light. The pick sets wardrobe, place and light — never the face. Show at most three picks, one line each.

## FlashBoards choice — one model, one pass

GPT Image 2.5 edit (`gpt-image-25-flare` or `gpt-image-25-sunburst`), `quality: "low"`, one image per request, one pass:

1. **{character sheet} from {photo}**: pictures 1–2 = the person's photos, a two-sentence prompt → `character-sheet`.
2. **Every later image**: picture 1 = {character sheet}, every other reference with one job named by role, in one pass → `character-consistent`.
3. **Into a film frame**: picture 1 = {character sheet}, picture 2 = {frame}: "Shoot it again exactly the same… but [the mode]… Change nothing else." → `character-replace`.

Why not Nano Banana: it is faster, but it keeps losing the character — the people from the references survive in pose and expression sheets, and the actor comes back in about one film frame in six; GPT Image 2.5 kept the character every time.

## Classify

| The job | Go to |
|---|---|
| No sheet yet: make it from the photo(s); turnaround, pose sheet, expression sheet, back view | `character-sheet` |
| The same character in new images: pose, emotion, place, haircut, make-up, prop, palette, light, camera; mixing references | `character-consistent` |
| The character in a film frame: the whole character, the head, the face, the face keeping paint or make-up | `character-replace` |
| Animate the result | `animate` |
| A music video with every face replaced | `musicvideo-replace` |
| Upscale a sheet | `upscale-sheet` |

Pipeline: {photo} → `character-sheet` → (`character-consistent` for stills · `character-replace` for film frames) → `animate`.

## Rules (break none)

1. **The character comes in as a picture, never as words.** "{character} from picture 1: their face, hair and clothes exactly as in picture 1". Never describe the face, hair or clothes of the character or the content of a reference — the model sees them; text pulls it toward someone else. The expression of a frame (gaze, brows, mouth) may be named.
2. **The person's own material only.** A photo of a real person needs that person's consent. Never use a demo character's sheet, prompt, faces or frames for a person.
3. **`quality: "low"`, set explicitly.** Higher quality bought nothing for frames.
4. **Size = the target's aspect**, width about 1920 (`1920 × 1088` for 16:9, `1920 × 816` for 2.35:1). Left to itself the size follows the first input — a sheet first gives a frame in the sheet's proportions.
5. **One pass.** If a reference is lost, cut roles; do not add passes.
6. **Check every output with crops** (`crop_image`, then `describe_media` with a question): the face, the clothes, the back, leftovers of the reference person or the actor.
7. A content-policy refusal is not charged: resubmit or reword; a famous look kept on another face may never pass.

## 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/ai-character-sheet/skills/character.md)
- [Original Learn guide](https://flashboards-h01.vercel.app/learn/acting/consistent-ai-character/skills/character.md)
- [Original Learn guide](https://flashboards-h01.vercel.app/learn/acting/replace-character-in-film/skills/character.md)
- Updated from the owner's skill sources of 2026-10-11.

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