mulmo images and mulmo movie break on gpt-image-1: set a model now
mulmocast-cli issue 1605: the gpt-image-1 default breaks mulmo images and movie after Oct 23, 2026. Which files to change, and a Python call to Sume instead.

The mulmocast-cli tool defaults to gpt-image-1, so mulmo images and mulmo movie stop working once OpenAI removes that model on October 23, 2026. The issue filed on October 6 says the fix is a new default plus two new names in the list of allowed image models. Until a release lands, set the image model explicitly in your script file.
Where the default lives
The issue (number 1605) points at src/types/provider2agent.ts, lines 49 and 87, and at src/agents/image_openai_agent.ts, lines 77 to 88. It proposes making gpt-image-2.5-sunburst the default and adding both gpt-image-2.5-sunburst and gpt-image-2.5-flare to the gptImages array, so that a user can select either.
It also notes that gpt-image-1.5 and the mini model face the same deprecation on December 1, 2026. OpenAI's deprecations page, read 2026-10-07, confirms those dates and lists the same two replacements.
For a command-line tool the failure mode is blunt. The command exits with an error from the image provider, and a half-built movie directory may be left behind. If you run mulmo from a scheduled job, add a check that the images step succeeded before the movie step starts, so a model problem is caught at the earlier, cheaper step.
| Model | Shutdown | Replacement named by OpenAI |
|---|---|---|
| gpt-image-1 | October 23, 2026 | gpt-image-2.5-sunburst or gpt-image-2.5-flare |
| gpt-image-1-mini | December 1, 2026 | gpt-image-2.5-sunburst or gpt-image-2.5-flare |
| gpt-image-1.5 | December 1, 2026 | gpt-image-2.5-sunburst or gpt-image-2.5-flare |
| chatgpt-image-latest | December 1, 2026 | gpt-image-2.5-sunburst or gpt-image-2.5-flare |
What a movie pipeline needs from the image step
A mulmo movie is built from beats, each of which needs a still. If the image step fails, the whole movie fails, so a retired id is not a cosmetic problem. The three things to settle are the model id, the size and the quality.
On the OpenAI side the current models take any WIDTHxHEIGHT whose edges are multiples of 16, within a ratio of 3:1 and 655,360 to 8,294,400 pixels. For video stills, 16:9 sizes such as 1536x864 are valid under those rules, since both edges divide by 16 and the pixel total is 1,327,104.
Generating the stills through Sume
If you want your stills from Sume instead of OpenAI, one call to /v1/images produces each. The Python below reads SUME_API_KEY, loops over three beat prompts and prints each URL. It uses only the standard library, and checks the status code, since a slow job returns 202.
import json, os, urllib.request
key = os.environ.get("SUME_API_KEY")
if not key:
raise SystemExit("SUME_API_KEY is not set")
beats = ["A sunrise over a harbor", "A fishing boat leaving port", "Nets drying on a pier"]
for prompt in beats:
body = json.dumps({
"model": "openai/gpt-image-2.5",
"prompt": prompt,
"quality": "low",
"image_size": {"width": 1536, "height": 864},
}).encode()
req = urllib.request.Request(
"https://api.sume.com/v1/images",
data=body,
headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as res:
data = json.load(res)
if res.status == 200:
print(data["data"][0]["url"])
else:
print(res.status, data)What those stills cost
Sume bills the provider list price times 1.25 before cent rounding. For a text-only prompt at 1536x864, I computed the list-times-1.25 figure as about $0.0045 at low and $0.0105 at medium. Treat those as estimates; the usage.cost field in each response is the amount actually billed, and GET /v1/images/models/{id}/endpoints shows the pricing rows.
Do this today
Pin the model in your own mulmo script or configuration, run one beat end to end, and watch the repository for the release that changes the default. Remember that the same files will need another change before December 1 if you chose the 1.5 or mini model as a stopgap.
Check cost against your own beat count: a movie with 12 beats needs 12 stills, and the per-still price multiplies directly. At the estimated $0.0045 low-quality figure that is 12 x $0.0045 = $0.054 before rounding, which is small enough that quality is the better thing to tune.
Sources
Related posts
More in Developers
- Music 1.0 is retiring: keep old calls, move new code to the router
Sume Music 1.0 routes still work and keep job.model sume/music-1.0, but every request now resolves through the Music Router. What to change and when.
- Music job metadata: stored on the Sume job, not sent to Lyria
The metadata object on a Sume music request is stored on the job and never sent to the provider. Tag takes by scene and brief with it.
- Show the product name the moment the voice says it: STT word times
Find when a voiceover says a word with Sume STT words[], then use that second as the next timeline video[].start. Offline Python script included.
- Nano Banana 2.1 cost calculator in Python: tokens per image, 2 tiers
A 23-line Python calculator for Nano Banana 2.1 cost from Google's token counts (1,120, 1,680, 3,780) and rates, with standard and batch tiers and input tokens.
Written by Sume