Retired AI model id to Sume id: GPT Image, Gemini and Sora lookup
One lookup table that maps retired gpt-image-1, gemini-2.5-flash-image and sora-2 ids to Sume ids, with dates, so a failing call tells you what to switch to.

Keep a single lookup from retired vendor ids to Sume ids, with the shutdown date next to each. As of 2026-10-06: OpenAI ends gpt-image-1 on 2026-10-23 and gpt-image-1-mini, gpt-image-1.5 and chatgpt-image-latest on 2026-12-01. Google ended gemini-2.5-flash-image on 2026-10-02. OpenAI ended Sora 2 and the Videos API on 2026-09-24.
Only the OpenAI image rows have a vendor-named replacement that exists on Sume. The Gemini and Sora rows are choices, so they are marked as such.
The lookup table
| Retired id | Date | Vendor-named replacement | Sume id to try |
|---|---|---|---|
| gpt-image-1 | 2026-10-23 | gpt-image-2.5-sunburst or -flare | openai/gpt-image-2.5-sunburst |
| gpt-image-1-mini | 2026-12-01 | gpt-image-2.5-sunburst or -flare | openai/gpt-image-2.5-sunburst |
| gpt-image-1.5 | 2026-12-01 | gpt-image-2.5-sunburst or -flare | openai/gpt-image-2.5-sunburst |
| gemini-2.5-flash-image | 2026-10-02 | gemini-3.1-flash-image-preview | google/nano-banana-2 (a choice, test it) |
| sora-2, sora-2-pro | 2026-09-24 | none listed | seedance-2.5 or kling-3 (a choice, test it) |
The lookup in code
explain returns a message, so it can sit in an exception handler or a startup check.
RETIRED = {
"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"),
"sora-2": ("2026-09-24", "seedance-2.5"),
"sora-2-pro": ("2026-09-24", "seedance-2.5"),
}
def explain(model_id):
hit = RETIRED.get(model_id)
if not hit:
return f"{model_id}: not in the retired list"
date, sume_id = hit
return f"{model_id} retired {date}; try {sume_id} on Sume"
if __name__ == "__main__":
for m in ("gpt-image-1", "sora-2", "nano-banana-2"):
print(explain(m))Pin, then re-read the vendor pages
The video row names seedance-2.5 and kling-3 only as starting points; the video ids and limits are in the Sora port guide. For image ids the longer notes are in the gpt-image-1 shutdown post and the Gemini post. Dates can move, so refresh the table when you re-read the vendor pages.
Sources
Related posts
More in Models
- Seedance 2.5 API: Seed blog says soon, BytePlus says live
Two ByteDance pages disagree on Seedance 2.5 API access. Here is what each says, and the seedance-2.5 id that runs on Sume's video router today.
- Seedance 2.5 reference-to-video: what Sume accepts per pass
ByteDance lists up to 30 images, 10 videos and 10 audio clips per pass for Seedance 2.5. Here is how that maps to Sume's seedance-2.5 reference types.
- seedream-v4 or bytedance-seed/seedream-4: which Sume id to store
Sume accepts legacy bare ids like seedream-v4 and seedream-4-5-edit, but the catalog lists org/slug ids. Store the canonical id; Python normalizer inside.
- Sonic 3.6, 3.5 and 3 cost the same on Sume TTS Router: pick by ear
All five Sume TTS Router ids share one per-character price, so model choice is a listening test, not a budget one. Here is how to run it for a few cents.
Written by Sume