Semantic Kernel .NET defaults to gpt-image-1: it fails Oct 23
The .NET OpenAI connector in Semantic Kernel defaults to gpt-image-1, which OpenAI removes Oct 23, 2026. What breaks, and a C# call to Sume that does not.

If your .NET app uses the Semantic Kernel OpenAI text-to-image service without naming a model, it asks for gpt-image-1, and OpenAI removes that model on October 23, 2026. Pass an explicit model id before that date. If you would rather not depend on one vendor's id, the Sume Image API takes the same prompt as a JSON POST and returns a hosted image URL.
The facts below come from a public issue on the Semantic Kernel repository and from OpenAI's deprecations page, both read on 2026-10-07.
What the issue reports
The issue (number 14526, filed October 2, 2026) says gpt-image-1 is the default image model in the .NET OpenAI connector. It points at two places: OpenAITextToImageService.cs at line 39 and ClientCore.TextToImage.cs at line 44. It also says OpenAI's replacement is gpt-image-2, and that apps relying on the default will see errors after the shutdown.
OpenAI's deprecations page gives the dates. The gpt-image-1 entry was announced April 22, 2026 and the model is removed October 23, 2026. OpenAI lists gpt-image-2.5-sunburst and gpt-image-2.5-flare as the replacements.
| Item | Value |
|---|---|
| Default model in the connector | gpt-image-1 |
| Files named in the issue | OpenAITextToImageService.cs:39, ClientCore.TextToImage.cs:44 |
| OpenAI announcement | April 22, 2026 |
| OpenAI removal date | October 23, 2026 |
| OpenAI replacements | gpt-image-2.5-sunburst, gpt-image-2.5-flare |
Three ways to stop depending on the default
The safe change is the same in every case: name the model in your own code, so a library default can never decide it for you.
- Set the model id explicitly where you build the text-to-image service, and keep it in configuration, not in a constant inside a library.
- Search the solution for the string gpt-image-1, including appsettings files, tests and sample code, before October 23.
- Add one test that creates an image through your real configuration, so a retired id fails in CI and not in production.
The same call to Sume from C#
Sume's Image API is a plain JSON POST to /v1/images. ChatGPT Image 2.5 is the id openai/gpt-image-2.5 (Flare), with openai/gpt-image-2.5-sunburst as the second variant; both take quality, up to 16 reference images, an optional mask_url and a background setting, per the Image API docs.
The program below needs only the framework. It reads the key from SUME_API_KEY, sends the request, and prints the image URL on a 200. The route waits up to 30 seconds; a slower job returns 202 with a job envelope, so the code branches on the status.
using System.Net.Http.Json;
using System.Text.Json;
var key = Environment.GetEnvironmentVariable("SUME_API_KEY");
if (string.IsNullOrEmpty(key)) throw new InvalidOperationException("SUME_API_KEY is not set");
using var http = new HttpClient { BaseAddress = new Uri("https://api.sume.com") };
http.DefaultRequestHeaders.Authorization = new("Bearer", key);
var body = new
{
model = "openai/gpt-image-2.5",
prompt = "A flat illustration of a lighthouse at dawn",
quality = "medium",
image_size = new { width = 1024, height = 1024 }
};
using var res = await http.PostAsJsonAsync("/v1/images", body);
var text = await res.Content.ReadAsStringAsync();
Console.WriteLine((int)res.StatusCode);
if ((int)res.StatusCode == 200)
{
using var doc = JsonDocument.Parse(text);
Console.WriteLine(doc.RootElement.GetProperty("data")[0].GetProperty("url").GetString());
}
else
{
Console.WriteLine(text); // 202: poll status_url, then read result_url
}What changes besides the id
Sume returns data[].url, a hosted address, not base64 bytes, so code that decodes b64_json needs a download step instead. Reference images must be public HTTPS URLs, and an edit is JSON, not multipart.
If you leave quality out, Sume treats it as high. State it: medium costs far less than high on this model, and the choice belongs in your configuration next to the model id.
Before October 23
Treat the default as a bug report you can file against yourself. Set the model, add the CI check, and decide whether the id is OpenAI's or Sume's. The issue was found by a deprecation-watching tool, which is a reminder that library defaults age silently.
A practical order of work: first grep for the string, then pin the id in configuration, then run one real generation in a staging environment. If the call goes through OpenAI directly, remember that gpt-image-1-mini and gpt-image-1.5 follow on December 1, 2026, so choosing either as a stopgap only moves the problem by about five weeks.
Sources
Related posts
More in Developers
- SHA-256 the batch body into the Sume idempotency key for bulk chunks
Derive each bulk chunk's Idempotency-Key from a hash of its items so replays reuse the queue and edited rows get a new key instead of a 409 conflict.
- Turn a shot list into Gemini Omni requests: Python on Sume
Submit every line of a shot list as its own Omni job with stable Idempotency-Keys, then poll them in one pass. Runnable Python and the cost of a 3-shot list.
- Should my backend call Sume over hosted MCP or the REST API?
REST from a backend, hosted MCP from an agent client. Where they differ: auth, wait limits, REST-only Image 1.0 and Video 1.0, and write budgets.
- Retiring a webhook endpoint: Sume runs already carrying it still POST
Any run created with a webhook_url can POST when it ends, even after you decommission the endpoint. Retries run 10 times, and the receipt holds the real result.
Written by Sume