Prompting

Multi-shot prompting and visual continuity

Generate four shots of one barista with gpt-image-1.5 four ways and let a strict judge check every cut. Prompts written one at a time matched 16 of 42 checks; a shared continuity sheet, the approved first frame as a reference and a state line per shot took it to 54 of 54, because the model carries nothing from one shot to the next.

Prompt run
Shot
Loading 3D view

Each shot aloneEvery shot in a sequence is generated alone: the model never sees the shot before it, so nothing carries over unless your prompt carries it.

Narrated with James Phoenix's AI voice.

Sheet + reference + state
Run
54 of 54
Cut checks matched
0 of 3later shots
Sign on the counter
4 of 4
Cardigan samples mustard
gpt-image-1.52026-09-11
Recorded with

The finished storyboard: four ways of prompting the same four shots, from no sheet at the bottom to sheet, reference and state line at the top. Press play for the story, or pick a run and a shot.

Multi-shot prompting means generating a sequence, a storyboard or the shots of a clip, one image at a time, and hoping the pieces cut together. They will not by default, because each generation is a separate call to a stateless model. It never sees the shot before. Whatever should stay the same from shot to shot, the face, the clothes, the props and where they are, reaches the model only if the prompt for that shot carries it.

The film shows one sequence made four ways. In front is the shared set: a small cafe with a camera rig that travels to each shot's position, a wide shot at the door, a medium shot at the grinder, a close-up on the mug and an over-the-shoulder shot from the customer. Behind it is the storyboard wall, one row per way of prompting, each row a timeline with the judge's verdict on every cut. On the right is the continuity sheet, and a glowing thread runs from it into every row whose prompts carry it.

Everything on the wall is real. On 11 September 2026, gpt-image-1.5 made every frame at 1536 by 1024 and quality high, one generation per shot, 43 to 68 seconds each. Gemini 3.8 Flash judged every cut twice with strict JSON output, against ten attributes. Pause the film, then pick a run and a shot to see the frame close up. The readout gives the judge's verdict on the cut into that frame, where the sign is, what is in the mug and the sampled colour of the top.

Written one at a time, the four prompts cast a woman in a beanie, a man in a cap, a stranger's hands and a woman the judge took for the first one: 16 of 42 checks matched. That last match is not continuity. It is the model's default barista, denim shirt and brown apron, turning up twice by chance. Pasting one continuity sheet under every prompt fixed the person at once, and the cardigan sampled mustard in every frame. The judge still broke three cuts: the hanging sign became an easel, the sign moved across the counter, and the latte became black coffee in a different mug. Adding the approved first frame as a reference image, sent through the edit endpoint, matched 59 of 60 checks.

The failure mode is the one that passes review. The sheet named the OPEN sign but never said where it was, so in every later shot of the reference run the model set it on the counter, twice in shot 4, and the judge called the sign continuous in five of its six checks, because it looked the same. A continuity check that compares appearance misses position. The fix was one state line per shot, written from what the previous shot did: the sign now hangs on the door, the latte is poured. That run kept the sign off the counter, carried the latte into shot 4, and matched all 54 checks.

The practical rule: treat continuity as data you keep outside the model. Write one sheet of what exists and paste it into every prompt, verbatim. Approve one frame and send it as the reference with every later shot. Keep a state record of where things are and what has happened, update it after each shot, and put it in the next prompt. Then check every cut against the one before, for position and state as well as looks. It costs about 600 input tokens a shot.

The caveats. Each condition was generated once, so the rows show what happened, not a rate; a second sample of the sheet run might keep its sign or lose its apron colour. The judge is a model too: its per-frame check missed the chipped mug rim that is visible in several frames, so the film uses only its cut-by-cut verdicts, checked by eye. Colour patches were placed by hand on the fabric. Video models that generate several shots in one call share state inside that call, but across calls, clips and sessions the same rule holds: nothing carries over unless you carry it.

The maths

The continuity score
score  =  rk=13a[vr,k,a=match]rk=13a[vr,k,an/a]\text{score} \;=\; \frac{\sum_{r}\sum_{k=1}^{3}\sum_{a} [\,v_{r,k,a} = \text{match}\,]}{\sum_{r}\sum_{k=1}^{3}\sum_{a} [\,v_{r,k,a} \neq \text{n/a}\,]}

For each cut k between consecutive shots, the judge (Gemini 3.8 Flash, strict JSON, temperature 0, two runs r) gives each of ten attributes a (person, hair, glasses, top, apron, mug, machine, sign, room, light) a verdict v: match, mismatch, or n/a when it is out of frame in either shot. The score under each row is matches over comparable checks: 16 of 42, 40 of 48, 59 of 60 and 54 of 54.

What each shot prompt carries
pk  =  shotk    sheet    img(f1)    statekp_k \;=\; \text{shot}_k \;\oplus\; \text{sheet} \;\oplus\; \text{img}(f_1) \;\oplus\; \text{state}_k

The four rows add one term at a time, from the bottom. The shot line alone averaged 41 input tokens; with the sheet, 191; with the reference frame f₁ sent through the edit endpoint, 591, of which 323 are the image; with the state line, 631. Carrying continuity costs about 600 input tokens a shot, against about 6,600 output tokens for the image itself.

The sheet is constant, the state is not
statek+1  =  update(statek,  actionk)\text{state}_{k+1} \;=\; \text{update}(\text{state}_k,\; \text{action}_k)

The sheet says what exists: the woman, the cardigan, the sign. It never changes, so it cannot say that shot 1 hung the sign on the door or that shot 3 poured the latte. That is state, and it changes with every shot. Without it, the reference run set the sign on the counter in all three later shots.

Measuring the cardigan without the light
h  =  atan2(b,a),C  =  a2+b2h \;=\; \operatorname{atan2}(b^{*}, a^{*}), \qquad C^{*} \;=\; \sqrt{a^{*2} + b^{*2}}

Each top colour is the median of a 40 by 40 pixel patch on the fabric, converted to CIELAB. Lightness L* swings with shade and framing, so the full colour distance mostly measures the light; hue h and chroma C* do not. Every sheet frame sampled h between 66 and 76 degrees at C* of 38 or more, which is mustard. The no-sheet tops sampled C* of 3 to 12: grey-blue denim. The swatch on each frame shows the sample.

Related terms

More visualisations

Building with language models?

These explainers come out of the work. If you want the same thinking applied to your own system, that is what I do.

See how I can help