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 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.
- Per-customer spend caps on Sume: what Sume caps, what you log
A Sume key belongs to a workspace, not your end customer. Cap each run with generation_spend_cap_usd and keep a per-customer ledger yourself.
- Perplexity Decisions API as a publish gate for Sume output
Check a finished Sume Format image with Perplexity's Decisions API before it ships: base64 data URL, one yes/no question, a threshold, and a human-review lane.
- Pocket TTS API: run it yourself or call a hosted TTS API
Kyutai's Pocket TTS installs with pip and serves from localhost. If you want a hosted API with job URLs instead, here is the Sume request and what changes.
Written by Sume