---
name: character-sheet
description: Make the character sheet of the person's AI character from their photo(s) — face close-up and full body in one image, a turnaround, a back view, pose and expression sheets from reference charts — with GPT Image 2.5 edit at quality low, short role-only prompts and panel-by-panel checks.
---
# Character sheet from photos

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: {photo} — their photo(s) of {character} (best: one front face close-up and one front full body, the whole outfit to the shoes). The output is the {character sheet} that goes into every later prompt.

## The model

GPT Image 2.5 edit (`gpt-image-25-flare` or `gpt-image-25-sunburst` in `generate_image`), `quality: "low"` set explicitly, one image, the size set to the layout with `width` and `height` (multiples of 16). Short prompts that name picture roles and the layout, nothing about the looks.

| Job (same inputs) | Nano Banana 2 Lite | GPT Image 2.5 |
|---|---|---|
| Turnaround, 4 views | all views, in its own order; softer | front, back, left, right in prompt order |
| Pose sheet, 10 poses from a chart | 5–8 of 10 — the reference models survive | 10 of 10, every run |
| Expression sheet, 9 faces from a chart | 0–7 of 9 | 9 of 9, every run |
| Character in a film frame | the actor comes back in about 1 run of 6 | 10 of 10 frames |
| Seen from behind | front-only sheet: a new back every run | sheet with a back panel: the same back every time |

## Steps

The photos come in as upload receipts (`show_media_upload_picker`, then `referenceImageReceipts`, in order) or as the person's own image results (`referenceGenerationIds`).

1. **Check the photo.** One face photo gives no trousers, shoes or back. Ask for a front full-body photo; if there is none, generate the full body from the face photo first and let the person approve it before the sheet.
2. **The base sheet** (face close-up + full body, the picture used everywhere later): pictures 1–2 = {photo}, `width: 2048, height: 1152` (or 1536 × 1152).
   ```
   Character sheet of {character} from pictures 1–2: two views side by side on a plain white background — an extreme close-up of the face and a full-body front view. Same person and same clothes in both views, no text.
   ```
   With one photo: "from picture 1". Plain white: only the person travels on.
3. **Turnaround** (optional; it also gives the back): the same inputs, `width: 2016, height: 864`.
   ```
   Character turnaround of {character} from pictures 1–2: four full-body views in one row on a plain white background — front, back, left profile, right profile. Same person and same clothes in every view, no text.
   ```
4. **Give the sheet a back** — needed whenever the character is seen from behind or small in a wide shot. Picture 1 = the base sheet, picture 2 = the turnaround; `width: 1792, height: 1024`:
   ```
   Character sheet of {character} from pictures 1–2 on a plain white background, three panels in one row: an extreme close-up of the face, the full body from the front, the full body from exactly behind. Same person and same clothes in every panel; the face is exactly as in picture 1; the back view shows exactly the back of the hair and clothes as in picture 2. No text.
   ```
   Run it twice and keep the cleaner one (seamless white, no lines between panels).
5. **Pose or expression sheet from references.** Poses and faces are easier to show than to describe. Glue the reference photos into one chart with `arrange_images`: 10 poses as `columns: 5` with cells of 320 × 600 (a 1600 × 1200 chart), 9 expressions as `columns: 3` with cells of 512 × 512. Then picture 1 = the chart, picture 2 = {character sheet}, the size = the chart's size.
   ```
   Picture 1 is a chart of {N} poses in a {C}-column × {R}-row grid. Redraw it as a new photo session of {character} from picture 2 — their face, hair, clothes and shoes in every panel — each panel keeping exactly its pose, body angle and camera angle. The same {C} × {R} grid, one plain mid-grey studio backdrop and soft even light in every panel, no text.
   ```
   Expressions: "a chart of {N} facial expressions in a {C} × {R} grid … their face, hair and clothes in every panel — each panel keeping exactly its facial expression, head angle, gaze and framing". At most 10 panels: more panels means less resolution each and a broken grid more often.
6. **Check panel by panel.** `crop_image` each panel (fractions of the sheet), then `describe_media` on each crop with a question: "Is it the same face as the sheet (marks, eyes, hairline)? Is the outfit complete to the shoes? Anything of another person (hair, jewellery, clothes)?" Also check the order of the views, one backdrop and no text. Score it as "N of N panels" and rerun only the failures.
7. **Keep** the chosen sheet: it is picture 1 of `character-consistent`, `character-replace` and the `animate` guides.

## Using the sheet later

- Into a film frame: the sheet first, the frame second, "shoot it again exactly the same… but the person in it is {character} from picture 1… Change nothing else" → `character-replace`. A sheet with a back panel pins the back of a small figure seen from behind.
- Video from the sheet (`animate`): the sheet on a 16:9 canvas as the start frame (`pad_image`) with the scene in words, or replace the actor in a film's first and last frame and animate between them (`animate-scene-pairs`).
- Where it goes wrong: the frame comes back in the sheet's proportions (set `width`/`height` to the frame's aspect); the head turns the wrong way (give every turn as a side of the frame); the sheet flashes in a video (say in the first line that the video opens on shot one and the reference never appears).

## Never

- Describe the person's face, hair or clothes in the prompt — the photo carries them.
- Give a reference chart to Nano Banana, or trust it with reference people in the frame.
- Use a demo character's photos, sheet, charts or prompts for a person.

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

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