gpt-image-1 returns 404 model_not_found on Sume: which id to send
gpt-image-1, gpt-image-1.5 or gemini-2.5-flash-image sent to Sume /v1/images return 404 model_not_found. Ids to send instead, plus a lookup.

Sume does not list gpt-image-1, gpt-image-1-mini, gpt-image-1.5 or gemini-2.5-flash-image, so POST /v1/images returns 404 model_not_found for them. Send openai/gpt-image-2.5-sunburst or openai/gpt-image-2.5 for the OpenAI ones, which are the replacements OpenAI names on its deprecations page. For the Gemini id, Google names gemini-3.1-flash-image-preview, which is not a Sume id either; Sume's Google-family image ids are google/nano-banana-2 and google/nano-banana-pro.
The 404 is a fix-the-id signal. Retrying the same id never works.
Ids that return model_not_found and what to send
| Id you sent | Vendor date | Try on Sume |
|---|---|---|
| gpt-image-1 | 2026-10-23 | openai/gpt-image-2.5-sunburst |
| gpt-image-1-mini | 2026-12-01 | openai/gpt-image-2.5-sunburst |
| gpt-image-1.5 | 2026-12-01 | openai/gpt-image-2.5-sunburst |
| chatgpt-image-latest | 2026-12-01 | openai/gpt-image-2.5-sunburst |
| gemini-2.5-flash-image | 2026-10-02 | google/nano-banana-2 |
Catch it and name the replacement
Handle the 404 in one place and print the suggestion, so the first failed render in staging tells the developer what to change:
import json, urllib.error
SUGGEST = {
"gpt-image-1": "openai/gpt-image-2.5-sunburst",
"gpt-image-1-mini": "openai/gpt-image-2.5-sunburst",
"gpt-image-1.5": "openai/gpt-image-2.5-sunburst",
"chatgpt-image-latest": "openai/gpt-image-2.5-sunburst",
"gemini-2.5-flash-image": "google/nano-banana-2",
}
def explain(err: urllib.error.HTTPError, model: str) -> str:
detail = err.read().decode("utf-8", "replace")[:200]
if err.code == 404 and model in SUGGEST:
return f"{model} is not a Sume id; try {SUGGEST[model]} ({detail})"
return f"HTTP {err.code}: {detail}"
if __name__ == "__main__":
e = urllib.error.HTTPError("u", 404, "nf", {}, None)
e.read = lambda: json.dumps({"error": "model_not_found"}).encode()
print(explain(e, "gpt-image-1"))List what Sume does serve
GET /v1/images/models returns every id with its parameters. Check an id there before you store it, as in the catalog diff post. The longer date story is in the shutdown calendar.
Sources
Related posts
More in Developers
- Heroku H12 at 30 seconds: call Sume async, not sync
Heroku's router ends a request at 30 s (H12). Sume sync mode waits up to 30 s too. Submit async, return 202 to the browser, then poll or take a webhook.
- How Sume TTS splits a script into sentence ids (. ! ? only)
Sume's script source cuts sentences at periods, exclamation and question marks only, keeps every character, and numbers them sent_000000. Examples and traps.
- Huey task that polls an AI video job with schedule(delay=...)
A Huey task reads Sume's job status once and reschedules itself with task.schedule(delay=...) from next_poll_after_seconds, so no worker thread sleeps.
- Idempotency key for transcription: hash the request, avoid 409
Derive the Sume STT Idempotency-Key from a hash of audio_url, language and duration. A retry returns the same job. A changed body under that key is a 409.
Written by Sume