Multi-shot video editors split a clip into separate shot prompts, which is great for storytelling and slightly annoying for planning: each shot has its own character limit, the whole sequence has another, and continuity details have to be repeated in every shot. One way to manage this is to keep the storyboard in a small JSON file and run a check script before pasting anything. This post shares such a script, using the limits shown in the Multi-shot Video Creator on GPT Image 2.5.

Summary of the linked page: gptimage2-5.org/multi-shot (read 2026-10-31)
The constraints, as shown on the page
- The editor shows a per-shot counter (
Shot 0/500) and a total counter (Total 0/1200). - Each
@elementtoken counts as 37 characters. - Every shot must have a prompt.
- Continuity tip: repeat important visual details across shot descriptions. The page is explicit that this helps guide continuity but consistent faces, objects and transitions are not guaranteed.
That last point is why the script below also checks that continuity phrases appear in every shot.
The storyboard
The page gives an illustrative three-shot prompt: a wide view of a rainy city, a close-up of a red umbrella, and the same person walking toward a warmly lit café. Here it is expanded into a storyboard.

Self-made diagram: the three shots and their camera directions
{
"continuity": ["red umbrella", "grey coat"],
"shots": [
"Wide shot of a rainy city street at dusk, wet asphalt reflecting shop signs, a woman in a grey coat with a red umbrella in the distance. Slow pan.",
"Close-up: the red umbrella opens above the woman in a grey coat, raindrops bouncing off the fabric.",
"Tracking shot from behind: the woman in a grey coat with the red umbrella walks toward a warmly lit café."
]
}
The check script
import json, re, sys
SHOT_MAX, TOTAL_MAX, ELEMENT_COST = 500, 1200, 37
def cost(text: str) -> int:
# each @element token counts as a fixed number of characters
elements = re.findall(r"@\w+", text)
plain = re.sub(r"@\w+", "", text)
return len(plain) + ELEMENT_COST * len(elements)
def check(path):
board = json.load(open(path, encoding="utf-8"))
problems, total = [], 0
for i, shot in enumerate(board["shots"], 1):
if not shot.strip():
problems.append(f"shot {i}: empty prompt")
c = cost(shot)
total += c
if c > SHOT_MAX:
problems.append(f"shot {i}: {c}/{SHOT_MAX} characters")
for phrase in board.get("continuity", []):
if phrase.lower() not in shot.lower():
problems.append(f"shot {i}: missing continuity detail '{phrase}'")
if total > TOTAL_MAX:
problems.append(f"total: {total}/{TOTAL_MAX} characters")
return total, problems
if __name__ == "__main__":
total, problems = check(sys.argv[1])
print(f"total cost: {total}")
print("\n".join(problems) if problems else "OK to paste")
Run it with python check.py storyboard.json. For the storyboard above the output is OK to paste. Delete "grey coat" from shot 2 and the script reports the missing continuity detail, which is exactly the kind of slip that produces a different-looking character halfway through.

Self-made diagram: storyboard file, check, paste, review
Why keep the plan outside the editor
The page notes that drafts are saved locally in the browser, that clearing browser data can remove them, and that they do not sync to another device. A JSON file in your project folder (or a repo) survives all of that, can be diffed between versions, and can be shared with whoever reviews the storyboard.
What still needs a human

Self-made diagram: checks that need eyes on the result
The script only guarantees that the text fits and that continuity phrases are present. Whether the result actually keeps the same face and the same red umbrella has to be reviewed scene by scene, as the page recommends. The page also reminds you to check the terms for the selected model before commercial use and to have permission for any reference material.
Wrap-up
Treating a multi-shot prompt as structured data turns two annoying failure modes, hitting a character limit and forgetting a continuity detail, into a ten-millisecond check. The rest of the work is still creative: deciding what each shot shows and reviewing the result.
Top comments (0)