Move OpenAI GPT Image 2.5 calls to Sume: field-by-field mapping
Which OpenAI gpt-image-2.5 parameters carry over to Sume's POST /v1/images, which change name, and which return 400 unsupported_parameter.

To move a GPT Image 2.5 call from OpenAI's Image API to Sume, send POST /v1/images with model: "openai/gpt-image-2.5" (Flare) or "openai/gpt-image-2.5-sunburst", keep prompt, quality, output_format and background, turn size into image_size or aspect_ratio, and replace uploaded files with public HTTPS URLs. Three OpenAI features have no Sume equivalent yet: output_compression, streaming partial images, and a moderation setting.
The OpenAI column comes from its image generation guide, read on 2026-10-03; the Sume column from the Image API docs.
Which fields carry over unchanged?
prompt is required on both. quality takes low, medium, high, xhigh and max on both, plus auto. output_format takes png, jpeg and webp on both. background takes auto, transparent or opaque on both, and OpenAI notes that transparency needs PNG or WebP output, so keep png when you request it. n exists on both, with the Sume schema allowing 1 to 10 and per-model ceilings lower, so read the n range from the catalog row.
Which fields change name or meaning?
The default quality difference is the one that surprises people. OpenAI's guide lists auto as its default, while the Sume docs say that an omitted quality defaults to high.
| OpenAI | Sume | Notes |
|---|---|---|
| size (1024x1024, 1536x1024, 1024x1536, custom WIDTHxHEIGHT) | image_size or aspect_ratio | Custom pixels: both edges multiples of 16, max edge 3840, ratio up to 3:1, 655,360 to 8,294,400 pixels |
| quality default auto | quality default high when omitted | Set it explicitly; auto reserves the cost of max on Sume |
| Edits with uploaded image and mask files | input_references (public HTTPS URLs) and mask_url | Up to 16 references; the mask applies to the first image |
| Response with image data | 200 with data[].url, or 202 with a job envelope | Sume-hosted signed URLs, not inline image data |
| Model gpt-image-2.5-flare or -sunburst | openai/gpt-image-2.5 (Flare) or openai/gpt-image-2.5-sunburst | Bare legacy Image Router ids are accepted as aliases |
Which OpenAI features does Sume not serve?
Three, per the docs. First, output_compression (0 to 100 for JPEG and WebP): it is in the schema but advertised by no model, so sending it returns 400 unsupported_parameter. Second, streaming: OpenAI documents partial_images from 0 to 3; Sume reports supports_streaming: false for every catalog row and stream: true returns 400 streaming_not_supported. Third, moderation is not listed in the Sume request parameters, and the docs say a parameter the selected model does not list is rejected rather than dropped.
Multi-turn editing through a previous response id is a Responses API feature. On Sume each Image API call is stateless, so a follow-up edit sends the earlier output's URL as a reference together with a fresh prompt.
How do you send the same edit?
Instead of uploading an image and a mask as files, host both at public HTTPS addresses. Localhost, private-network and non-HTTPS URLs are rejected before submission. A mask must match the image's format and size and carry an alpha channel, per OpenAI's rules, and it remains guidance, not an exact boundary.
curl -X POST https://api.sume.com/v1/images \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: edit-0001" \
-d '{
"model": "openai/gpt-image-2.5-sunburst",
"prompt": "Change only the masked area to a wooden shelf. Keep everything else identical.",
"input_references": [{"type": "image_url", "image_url": {"url": "https://example.com/room.png"}}],
"mask_url": "https://example.com/room-mask.png",
"quality": "high"
}'How should you handle the response?
Check the status code, not the body shape. 200 is the image response with data[].url entries; 202 is the standard job envelope, after which you poll GET /v1/jobs/{id}/status and read GET /v1/jobs/{id}/result. Slow configurations, such as 4K, high quality or a large n, are the likeliest to degrade to 202, and OpenAI warns complex prompts can take up to 2 minutes.
Billing is also different in shape. Sume bills a completed generation in full at the endpoint's pricing line and does not bill a failed or cancelled one. The usage object reports cost in USD and token counts of 0, so do not compute spend from tokens.
A short migration checklist helps. Change the base URL and authorization header, map the model id, delete output_compression, moderation and streaming options, replace file uploads with public HTTPS URLs, set quality explicitly, and add an Idempotency-Key per operation so a retry after a client timeout cannot bill twice. Then run five prompts that you already have OpenAI outputs for and compare them side by side before you switch real traffic.
Sources
Related posts
More in Developers
- OpenAI retires gpt-5.3-codex in April 2027: retired ids on Sume runs
Pin model ids you control. On a Sume Format run, omitting model uses gpt-6-sol, a retired gpt-5.6-sol runs on gpt-6-sol, and the receipt echoes the id that ran.
- OpenAI transcription 25 MB limit: how many minutes of wav fit?
OpenAI caps transcription uploads at 25 MB. A 16 kHz mono wav fills that in about 13 minutes, so detach long videos to mp3 or ranges first.
- openapi-typescript on the Sume OpenAPI JSON: types only, one command
npx openapi-typescript takes a URL or file and writes a .d.ts. Generate Sume job and error types from the 3.0.3 spec with no runtime code in your bundle.
- Orval react-query client from the Sume OpenAPI JSON, tags-split
Point Orval at api.sume.com/reference/json with client react-query and mode tags-split for typed hooks per Sume tag. Config, caveats and polling tips.
Written by Sume