Model Cards
Sample Results
Both images below were generated with Nano Banana 2 Lite (gemini-3.1-flash-lite-image), showing text-to-image and image-editing results. They represent this model and these prompts only, not a performance guarantee for the other models in the series.
Text-to-image · 16:9 street scene (prompt only: a rainy old-town alley after the rain, warm street lamps reflected in the wet flagstones, someone walking by with an umbrella, 16:9 framing): 8.3 s, aspectRatio: 16:9 takes effect, and the signs reading 老茶馆, 客栈 and 酒肆 are all legible.


Size Control
- Follow the source image ratio: simply omit
aspectRatio; in multi-image editing scenarios, the size of the last image takes precedence - Resolution
imageSize: supports1K/2K/4K- Nano Banana (Gen 1) supports 1K only
- Nano Banana 2 adds 512px
- Nano Banana 2 Lite supports 1K only (no 2K/4K/512px)
How to Integrate
Official Documentation
- Google official docs:
ai.google.dev/gemini-api/docs/image-generation - To integrate with APIYI, just replace the request URL + KEY with APIYI’s; all other parameters are identical to the official ones
Checking Official Status (diagnosing upstream issues)
The Nano Banana series runs on top of Google’s AIStudio / Gemini API. In rare cases, blurry or failing 2K / 4K output can be a problem on Google’s side rather than the integration layer — you can check Google’s official status page (copy and visit it yourself):aistudio.google.com/status.
For example, on Jun 19, 2026 that page reported “Issues with Nano Banana”: Nano Banana 2 / Pro on the Gemini API and AI Studio had problems at 2K or 4K resolution. When you see similar symptoms, compare against the official status page first to quickly tell whether it’s an upstream outage.
Endpoint Support
- Recommended endpoint (Gemini native):
https://api.apiyi.com/v1beta/models/gemini-3-pro-image:generateContent - Supports calls via OpenAI-compatible mode (
/v1/chat/completions; pass Base64 or a public link throughimage_url) - Does not support
/v1/image/generations
Development Format (Default Recommendation)
- [Recommended] Use the Google native endpoint format
- Images: upload as Base64, download and re-host
- Call method: synchronous multi-threaded calls; asynchronous calls are not yet supported
Input Image Requirements
- A single image cannot exceed 7MB (Google’s rule); if imported via Google Cloud Storage, the per-file limit is 30MB
- Up to 14 images per prompt
- Supported MIME types:
image/png,image/jpeg,image/webp,image/heic,image/heif(thejpgformat is already supported by APIYI) - Base64 size inflation: converting an image to Base64 increases its size by about 33.3% (a 7MB image becomes about 9.3MB)
- APIYI limit: the total volume of images uploaded in a single request must be under 100MB — all calls are synchronous, and oversized payloads can cause memory blowup

Google official technical specs: inline / console upload per-file limit is 7MB, supporting png/jpeg/webp/heic/heif

Base64 encoding increases size by about 33.3%: a 7MB image is roughly equal to 9.3MB
docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image
URL Image Input
In addition to Base64, the Gemini native endpoint accepts an image URL directly throughfileData.fileUri. This keeps the request body small and saves you from downloading and encoding the image yourself.
With URL input, Google’s servers download the image, not APIYI. Whether it works, and how fast, depends on how easily Google can reach your image host, not on whether the link opens in your own browser. The requirements and troubleshooting steps below come from real support tickets and our own tests (2026-10-16, NB2 / Pro, three routes).
What Makes a Usable Link
http:// and https:// links worked in our tests. gs:// (Google Cloud Storage) can only be read by some routes, so we don’t recommend it through APIYI.Request Format
- Multiple images: one
fileDataper image, in order insideparts. You can also mix them withinlineData; in our tests, two URL images plus one Base64 image in a single request generated normally mimeType: set it to the image’s real format. In our tests, current routes still read the image when it was wrong or missing, but don’t rely on that- Field names: use camelCase
fileData/fileUri/mimeType, matching Google’s official docs. The snake_case formsfile_data/file_uriare currently accepted as well
Confirm the Reference Image Was Actually Read
Some routes don’t return an error when the fetch fails: they return 200, generate an image and bill as usual, but the result ignores your image entirely. So don’t rely on the status code alone. CheckusageMetadata.promptTokensDetails in the response:
IMAGE entry means the image was read (with default settings we measured about 1120 tokens per image on Nano Banana 2 and about 560 on Pro). If there is only TEXT, Google did not get the image, and the result will not reference it. The Python example below includes this check.
How Fetch Failures Show Up
Curl Example (fileUri)
Python Example (fileUri)
Can the OpenAI-Compatible Endpoint Take a URL?
Yes. Pass a public link asimage_url on /v1/chat/completions; in our tests both Nano Banana 2 and Pro read the image and generated normally. The same link requirements apply. For multi-turn editing or precise resolution control, the native endpoint is still recommended.
Billing Basics (Important)
- Synchronous call duration: Pro / 2 at 4K take a reasonable generation time of approx. 30–150s
- Disconnecting on timeout still incurs charges: for example, if generation takes 120s but the client sets the timeout to 100s and disconnects, you are still charged
- 429 / 503 are not charged: failed requests are not billed (we try not to keep customers waiting or stuck without an image)
- Content-safety refusals still incur charges: when a customer’s input has content-safety issues and Google refuses to generate the image, a status code 200 is still charged — see error handling and the guarantee plan below
Google Search grounding is charged on top of the per-call price
Pro supports thegoogleSearch tool (grounding triggered in 3/3 test runs, returning full groundingMetadata), useful for weather cards, stock charts, and anything else that needs live information.
But the search call fee is added on top of the $0.09 per-call price, not included in it:
searchTypes.imageSearch) does not work on Pro — 0/2 runs triggered it, and imageSearchQueries never appeared in groundingMetadata. It is exclusive to Nano Banana 2 (gemini-3.1-flash-image); see Nano Banana 2 · Three parameters that affect billing.thinkingLevel has no effect on Pro — don’t copy it over from NB2
generationConfig.thinkingConfig.thinkingLevel is exclusive to the Nano Banana 2 series. Passing high to Pro:
- Does not error — the request returns 200 normally
- But has no effect: measured
thoughtsTokenCountranged 108–156, fully overlapping the 130–159 range seen without the parameter - Pro’s thinking is always on and cannot be tuned, as Google’s own documentation states
Timeout Settings (Important)
4K image generation takes longer overall, involving stages such as image upload, API processing, and Base64 image download (our backend bills by API processing time). Under normal conditions, 4K takes about 50s (excluding polling), but if the client sets the timeout too short, it will disconnect prematurely before generation completes and report an error:
Call logs: time-to-first-byte for 4K generation is about 43–61s, so the default 120s timeout is too tight
Multi-turn conversational editing (native supports it; reverse models don’t)
The Nano Banana series uses the Gemini native format and supports true conversational multi-turn editing: append each turn’s generated image back intocontents as a role: "model" inlineData, then send the next user instruction. The model edits based on the full conversation history and accumulates changes (e.g. recolor the sofa first, then add an accessory — the earlier change is preserved).
This differs fundamentally from “reverse” image models — be clear on it before integrating:
model-role turn lets Nano Banana 2 (gemini-3.1-flash-image) correctly keep editing and accumulate changes; a reverse model only reads the reference image from the last user message, so keeping conversation history does not work for multi-turn there.contents):
Always Iterate parts to Get the Image — Never Index Into It
parts is a heterogeneous array: it may hold only an image segment, or interleave text and image segments, and neither the length nor the order is guaranteed. Hardcoded access like parts[0] / parts[1] is therefore certain to fail intermittently.
Three layouts have been observed in testing:
TEXT in responseModalities, or a prompt that asks the model to explain itself, both make the model return text alongside the image — and whether that text lands before or after the image is not fixed either. So the index the image sits at is not a constant, and the same code can receive different structures across requests.
The correct approach is to select by field shape rather than by position. Note that you take the last inlineData, not the first — complex tasks return multiple images, and the last one is the final version (see the next section):
Why Do Responses Occasionally Contain Multiple Images
When callinggemini-3-pro-image, you may occasionally see multiple image parts in a single response (2–10 observed in testing), matching sporadic 6000+ (even five-digit) output-token entries in your logs. This is not an anomaly: Google’s official docs state that Gemini 3 image models have “Thinking” enabled by default (it cannot be disabled in the API), the model generates interim images to test composition and logic, these drafts appear in parts alongside the final version, and “the last image within Thinking is also the final rendered image” (official docs: ai.google.dev/gemini-api/docs/image-generation). Based on our testing in July 2026 (Google native generateContent format):
thoughtSignature field, without a thought: true flag); Google’s docs say Thinking generates at most two interim images, but we observed up to 10 on complex tasks.
Billing impact: each image is billed at a fixed token count (1120 tokens per image at 1K/2K resolution, 2000 at 4K), so output tokens grow strictly linearly with the number of images. A sporadic 6000+ (up to ~13.5k in extreme cases) output-token entry in your logs is simply a 4–10 image response, not a billing anomaly.
Recommended downstream code:
- Always iterate over parts — do not assume one image per response; any per-image counting or saving logic must go by the actual number of parts
- Take the last image when you only need one: the earlier drafts have unfinished details and slightly lower quality, so avoid taking the first
- Controlling the image count via the prompt is largely ineffective (in testing, “output only one image” instructions were ignored) — handle it in code
- Multi-image responses take 35–142s (at 1K resolution, longer with more images), noticeably longer than single-image ones — keep the timeout recommendations above (≥ 5 minutes)
FAQs
Error Handling Guide
Must-Read Common Dev Questions
Failed Generation Guarantee Plan
Why do I get connection reset by peer / write_response_body_failed (500)?
Why do I get connection reset by peer / write_response_body_failed (500)?
- Limit the image count: stay within the official rules (max 14 images per prompt — see the official spec above).
- Limit per-image size: keep each image under 5MB — the official per-image cap is 7MB, and base64 encoding inflates size by roughly 1/3, so leave headroom.
- Compress on the frontend before uploading: compress images on the frontend (or a server-side relay) before sending them to the API — common practice is capping the longest edge, converting to JPEG/WebP, and tuning the quality parameter.
- Switch to URL input: the Gemini native format supports passing an image URL via
fileData.fileUri, sidestepping oversized base64 request bodies entirely — see URL Image Input above.
Use Cases
- AI chat clients: clients such as Cherry Studio can be configured to generate images directly via APIYI
- Generation testing: quickly verify model performance in a chat client or the console
Advanced Needs
- Want to upload images via URL? Use
fileData.fileUrion the Gemini native endpoint orimage_urlon the OpenAI-compatible endpoint. Google’s servers download the image, so the host matters. See the link requirements, how to detect fetch failures, and code examples in URL Image Input above. - Want to get a download URL directly (instead of Base64)? Use the NB-OSS group — see Nano Banana OSS Group.