A calendar file for AI model shutdown dates: .ics from Python
Generate an .ics file with all-day events and 14-day reminders for the gpt-image-1 and gpt-image-1.5 shutdown dates, then import it into any calendar app.

Put the shutdown dates in a calendar your team already opens. A 20-line Python script can write an .ics file with one all-day event per vendor date and a reminder 14 days ahead. As of 2026-10-06, OpenAI lists gpt-image-1 for October 23, 2026, and gpt-image-1-mini, gpt-image-1.5 and chatgpt-image-latest for December 1, 2026. Google's page shows gemini-2.5-flash-image shut down on October 2, 2026, and OpenAI's page shows the Sora Videos API ended September 24, 2026.
Past dates are in the table so the file is a record, not only a reminder.
Dates to put in the file
| Model | Date | Source page |
|---|---|---|
| Sora 2 and the Videos API | 2026-09-24 | OpenAI deprecations |
| gemini-2.5-flash-image | 2026-10-02 | Gemini API deprecations |
| gpt-image-1 | 2026-10-23 | OpenAI deprecations |
| gpt-image-1-mini, gpt-image-1.5, chatgpt-image-latest | 2026-12-01 | OpenAI deprecations |
The generator
The script writes the three upcoming-or-recent events. All-day events use VALUE=DATE, and the DTEND is the next day. The TRIGGER:-P14D alarm fires two weeks before.
from datetime import date, timedelta
EVENTS = [
("gpt-image-1 shuts down", date(2026, 10, 23)),
("gpt-image-1-mini, gpt-image-1.5, chatgpt-image-latest shut down", date(2026, 12, 1)),
]
def build(events):
out = ["BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//model-shutdowns//EN"]
for i, (name, day) in enumerate(events):
out += ["BEGIN:VEVENT", f"UID:shutdown-{i}@example.invalid",
"DTSTAMP:20261006T000000Z",
f"DTSTART;VALUE=DATE:{day:%Y%m%d}",
f"DTEND;VALUE=DATE:{day + timedelta(days=1):%Y%m%d}",
f"SUMMARY:{name}", "BEGIN:VALARM", "ACTION:DISPLAY",
"DESCRIPTION:Point code at a Sume image model id",
"TRIGGER:-P14D", "END:VALARM", "END:VEVENT"]
out.append("END:VCALENDAR")
return "\r\n".join(out) + "\r\n"
if __name__ == "__main__":
with open("shutdowns.ics", "w", newline="") as f:
f.write(build(EVENTS))What the reminder should say
Make the event description a task, not a date: which repo holds the id, and which Sume id replaces it. For the image side that is openai/gpt-image-2.5-sunburst or openai/gpt-image-2.5, per the full cutover calendar. Re-read the vendor pages when you refresh the file, because dates can move.
Sources
Related posts
More in Developers
- Cancel a queued transcription job: what the 409 means
POST /v1/jobs/{id}/cancel works only before work starts. After that it returns 409 job_generation_already_started and the job finishes and bills normally.
- Celery task for an AI video API: submit, poll, retry on Wan 3.0
Two Celery tasks for Sume's /v1/videos: one submits a Wan 3.0 job with an Idempotency-Key, one polls with self.retry(countdown) and stops on a terminal status.
- Check a Shorts timeline body offline: a Python mirror of the rules
Catch Timeline 1.0 refusals you can see in the body (start at 0, 0.5 s coverage, transitions, even sizes) in 28 lines of Python before the plan call.
- Check an image request against the Sume catalog before you send it
Fetch GET /v1/images/models once, then reject a bad ratio, quality or reference count in Python before it reaches POST /v1/images and returns a 400.
Written by Sume