---
name: filmscene-setups
description: Make one replaced picture per camera setup of the scene — the person's characters in the main roles, every other face invented, no text or watermark — with GPT Image 2.5 edit and blind role-only prompts; check every face with crops.
---
# One picture per camera setup

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 `filmscene` for the shared rules.

- Cast from the person: {character A} replaces <film role 1>, {character B} replaces <film role 2>; picture 1 / picture 2 are the person's own {character sheet}s. Ask who plays each role if unclear — never cast demo characters.
- A dialogue in one place shot from two angles needs **two pictures** — the setup A frame and the setup B frame. The rest is the prompt.
- Take each setup frame from the clip (`extract_video_frame`) and **crop the letterbox** with `crop_image` (for example, a 1920 × 800 picture). Keep that composition for replacement; prepare the resulting image on a supported reference canvas before H3.
- `generate_image` with `gpt-image-25-flare`, `quality: "low"`, `width`/`height` = the frame's size. Blind prompt — the roles of the pictures, nothing about the frame and no looks in words:
  - one character faces the camera, the other is a blurred shoulder: *"Picture 1 is only the look of {character A}: their face, hair and their whole outfit. Picture 2 is a frame from a film. Shoot picture 2 again exactly the same: the same camera, framing, focus, set, light and composition. The one person who faces the camera is {character A} from picture 1, in their outfit from picture 1, in the same pose, head turn, gaze and expression — take them from picture 2. Everything out of focus in the foreground stays exactly as it is. Every other person keeps their place, pose and clothes but gets a completely different, invented face. There is no text, logo or watermark anywhere in the picture. Change nothing else."* Replacing both people here broke the over-the-shoulder geometry.
  - both people placed: *"Picture 1 is only the look of {character A}: take only their face and hair from it, never their clothes. Picture 2 is only the look of {character B}: take only their face and hair from it, never their clothes. Picture 3 is a frame from a film. Shoot picture 3 again exactly the same: the same camera, framing, focus, set, light, poses, clothes, head turns, gazes and expressions; but the two main people in it, from left to right, are {character A} (picture 1) and {character B} (picture 2), even where one of them is seen from behind or out of focus. Every other person in the frame keeps their place, pose and clothes but gets a completely different, invented face that belongs to nobody from any film or real life. There is no text, logo or watermark anywhere in the picture. Change nothing else."*
- Check every face side by side: `crop_image` the same face from the original frame and from the replaced picture, `arrange_images` the two crops (`columns: 2`, original left) and `describe_media` the pair ("Is the person on the right the same person as on the left? Answer yes or no, then why."); for the person's character put a crop of their sheet on the left. Do not ask "Is this a well-known actor?": on generated faces describe_media named a random celebrity almost every time (2026-10-14). GPT Image keeps famous faces — if one survives, run the pass again on the replaced picture or take another frame of the setup.
- **Before H3:** bring every reference whose shape is unsupported to an accepted one, including untouched frames and character sheets. Accepted image ratios are 1:1, 4:3, 3:4, 16:9, 9:16, 5:2 and 2:5; the output aspect is separate. A wide film frame reaches 5:2 by a small `crop_image` of its height, keeping the whole width: 1920 × 800 → `y: 0.02`, `height: 0.96`; 1920 × 816 → `y: 0.0294`, `height: 0.9412` (both 1920 × 768). Do not pad it with black: in a 21:9 take (2026-10-14) H3 copied the bars into the video. Pad (`pad_image`, `scale: "none"`) only when a crop would cut into the person, and say the bars may show. `crop_image` and `pad_image` take an untouched corpus frame directly as `{previewHandle}`. Poll the returned image `generationId` with `get_generation` and quote H3 using those results; never relax validation or invent a paid preparation step.

## 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/formats-and-exhibition/ai-film-scene/skills/filmscene-setups.md)
- Updated from the owner's skill sources of 2026-10-11.

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