Short answer
- “Can see images” and “can make images” are two different capabilities. Almost every modern chat model can read images (that is what “multimodal” usually means), but they cannot generate images — that is a separate class of dedicated image models.
- Only the Gemini image family truly returns text and an image from one endpoint —
gemini-3-pro-image(Nano Banana Pro),gemini-3.1-flash-image(Nano Banana 2) and friends interleave text parts and image parts in the same response. - Everything else is orchestration: a chat model plus a standalone image endpoint working together, or
gpt-5.5with the Responses nativeimage_generationtool so the model decides when to draw.
First separate images going in from images coming out
Most of the confusion comes from the word “multimodal” — in an API context it defaults to the input side, meaning “you can feed the model an image”, not “the model can produce an image for you”. These two things use different model pools, different endpoints, and different billing:Four routes to getting an image
A. Standalone image endpoint — pick this for almost everything
A. Standalone image endpoint — pick this for almost everything
data[0].url; the GPT-Image family returns data[0].b64_json.
This route returns no conversational text at all — it is not a chat endpoint.Full model table: Image and video generation models.
Per-model endpoint, timeout and output-format differences:
Image API notes and best practices.B. Gemini image family — the only one that natively returns text and image together
B. Gemini image family — the only one that natively returns text and image together
gemini-3-pro-image, gemini-3.1-flash-image and so on) uses the native Gemini endpoint,
and candidates[0].content.parts is a heterogeneous array: it may contain only an image part, or it may
interleave text parts with image parts. This is the family that genuinely gives you both in one call.One trap to know up front: neither the number of parts nor their order is guaranteed. Three arrangements
have been observed in testing:parts[0] or parts[1] will fail intermittently. The correct approach is to filter by field
presence and take the last inlineData (for complex prompts the model returns several images, and the last
one is the final version):C. Responses native image_generation tool — let the agent decide whether to draw
C. Responses native image_generation tool — let the agent decide whether to draw
POST /v1/responses with gpt-5.5 and attach the native image tool:image_generation_call item in the response output array, alongside normal text output.
This is the closest thing to a “chat model that draws” on the OpenAI side.See Native tool image generation.D. Chat endpoint on an image model — looks conversational, still an image model
D. Chat endpoint on an image model — looks conversational, still an image model
gpt-image-2-all and gpt-image-2-vip can be called through /v1/chat/completions, with the image embedded
as a Markdown link inside choices[0].message.content.It looks like “one chat endpoint that both talks and draws”, but it is not a chat model that can draw —
underneath it is still an image model wrapped in a chat schema, with no general conversational ability.
It also only reads the image_url in the last user message as the base image; images in assistant
history are ignored.This route is no longer recommended — new integrations should use route A.Building a “chat and draw” product: the recommended shape
What most agents and products actually need is not one magic endpoint but a clear orchestration chain:Let the chat model classify intent
gpt-5.5, claude-opus-5, gemini-3-pro and so on) to process user
input and decide whether this turn is conversation or an image request. Have it return a structured flag
if that helps.Have the chat model write the image prompt
Call the image endpoint
/v1/images/generations. Take the returned url or b64_json and store it in your own
object storage.Feed the image back into the conversation
How to confirm whether a model accepts images
1. Check the model detail page
/models/<model-name> and look at the Input modalities row in the spec table at the top — if it
lists “image”, the model supports vision. This is the fastest check.2. When in doubt, test it
3. Recognize the error string
Model do not support image input
(the grammar is theirs, not a typo). When you see that line, the model does not accept images — switch models.Five common misconceptions
1. A multimodal model can generate images
1. A multimodal model can generate images
gpt-5.5 can read the design
mockup you send it, but it cannot emit an image on its own — to get one you need a tool call (route C) or a
separate call to an image endpoint (route A).2. An image model can be used as a chat model
2. An image model can be used as a chat model
gpt-image-2 behind a support
chatbot. Even the -all / -vip variants that accept the chat endpoint (route D) are still image models
underneath.3. Including TEXT in responseModalities guarantees a text part
3. Including TEXT in responseModalities guarantees a text part
responseModalities: ["TEXT", "IMAGE"] does not guarantee a text
part in the response; the model may return only an image. The other direction is useful though: declaring
["IMAGE"] explicitly reduces stray text parts.4. Switching between parts[0] and parts[1] fixes broken image extraction
4. Switching between parts[0] and parts[1] fixes broken image extraction
[0]
or [1], so whichever you pick, some requests will miss it. Changing the index only swaps which requests
fail. Only filtering by field presence is stable.5. Passing a reference image to /v1/images/generations performs an edit
5. Passing a reference image to /v1/images/generations performs an edit
image / image_url /
images to the generation endpoint returns 200 with a normal image, but the reference image is silently
discarded and you are billed as usual — what you get back is a plain text-to-image result.Image editing must go through /v1/images/edits (and Grok Imagine additionally requires
multipart/form-data there — sending JSON returns a hard 400).