> ## Documentation Index
> Fetch the complete documentation index at: https://mixroute.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Gemini 原生（圖片，串流）

> Gemini 原生圖片流式請求與響應處理。

<link rel="alternate" hrefLang="en" href="https://mixroute.ai/docs/api-reference/endpoint/nano-banana-stream" />

<link rel="alternate" hrefLang="zh-Hans" href="https://mixroute.ai/docs/zh-hans/api-reference/endpoint/nano-banana-stream" />

<link rel="alternate" hrefLang="zh-Hant" href="https://mixroute.ai/docs/zh-hant/api-reference/endpoint/nano-banana-stream" />

<link rel="alternate" hrefLang="ja" href="https://mixroute.ai/docs/ja/api-reference/endpoint/nano-banana-stream" />

<link rel="alternate" hrefLang="x-default" href="https://mixroute.ai/docs/api-reference/endpoint/nano-banana-stream" />

使用 Gemini 原生 streamGenerateContent 端點流式獲取圖片響應，請求欄位與 generateContent 相同。

`POST https://api.mixroute.ai/v1/models/{model}:streamGenerateContent?alt=sse`

## 支援模型

| 模型 ID | 能力與限制 |
| - | - |
| `gemini-nano-banana-2.1` | Nano Banana 2.1；1K/2K/4K 輸出；MINIMAL/MEDIUM/HIGH 思考，預設 MEDIUM。 |
| `gemini-3.1-flash-image` | Nano Banana 2，支援 512、1K、2K、4K 輸出及 MINIMAL/HIGH 思考等級。 |
| `gemini-3.1-flash-image-preview` | Nano Banana 2，支援 512、1K、2K、4K 輸出及 MINIMAL/HIGH 思考等級。 |
| `gemini-3-pro-image` | Nano Banana Pro，支援 1K、2K、4K 輸出及圖文推理。 |
| `gemini-3-pro-image-preview` | Nano Banana Pro，支援 1K、2K、4K 輸出及圖文推理。 |
| `gemini-3.1-flash-lite-image` | Nano Banana 2 Lite，僅 1K 輸出，不支援 Google Search 搜尋增強。 |
| `gemini-2.5-flash-image` | 初代 Nano Banana，約 1K 輸出，不傳 imageSize。 |

請求體欄位與模型限制參見 [Gemini 圖片生成](/docs/zh-hant/api-reference/endpoint/nano-banana)。在查詢字串中使用 `alt=sse`，不新增請求體 stream 參數。

## 呼叫示例

將 MixRoute Key 設定到環境變數 `MIXROUTE_API_KEY`，通過 `Authorization: Bearer ...` 認證。編輯圖片前，將素材佔位值替換為可訪問的圖片或本地檔案。

```bash theme={null}
curl --no-buffer --request POST "https://api.mixroute.ai/v1/models/gemini-nano-banana-2.1:streamGenerateContent?alt=sse" \
  --header "Authorization: Bearer $MIXROUTE_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "A clean product photograph of a red ceramic mug on a white background."
        }
      ]
    }
  ],
  "generationConfig": {
    "responseModalities": [
      "TEXT",
      "IMAGE"
    ],
    "imageConfig": {
      "aspectRatio": "1:1",
      "imageSize": "1K"
    }
  }
}'
```

### Python

```python theme={null}
import base64
import json
import os
from pathlib import Path
import requests

payload = json.loads(r'''
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "A clean product photograph of a red ceramic mug on a white background."
        }
      ]
    }
  ],
  "generationConfig": {
    "responseModalities": [
      "TEXT",
      "IMAGE"
    ],
    "imageConfig": {
      "aspectRatio": "1:1",
      "imageSize": "1K"
    }
  }
}
''')

def events(lines):
    data = []
    for line in lines:
        if line == "":
            if data:
                yield "\n".join(data)
                data.clear()
        elif line.startswith("data:"):
            value = line[5:]
            data.append(value[1:] if value.startswith(" ") else value)
    if data:
        yield "\n".join(data)

url = "https://api.mixroute.ai/v1/models/gemini-nano-banana-2.1:streamGenerateContent?alt=sse"
image_index = 0
with requests.post(url, headers={"Authorization": "Bearer " + os.environ["MIXROUTE_API_KEY"]}, json=payload, stream=True, timeout=(30, 180)) as response:
    response.raise_for_status()
    response.encoding = "utf-8"
    for data in events(response.iter_lines(decode_unicode=True)):
        if not data.strip():
            continue
        if data.strip() == "[DONE]":
            break
        chunk = json.loads(data)
        if "error" in chunk:
            raise RuntimeError(chunk["error"])
        for candidate in chunk.get("candidates", []):
            for part in candidate.get("content", {}).get("parts", []):
                if part.get("thought"):
                    continue
                if "inlineData" in part:
                    inline = part["inlineData"]
                    if inline.get("data"):
                        extension = {"image/png": "png", "image/jpeg": "jpg", "image/webp": "webp"}.get(inline.get("mimeType"), "bin")
                        Path(f"image_{image_index}.{extension}").write_bytes(base64.b64decode(inline["data"], validate=True))
                        image_index += 1
                elif "text" in part:
                    print(part["text"], end="")
```

## 響應

從 candidates\[].content.parts\[] 讀取文本和圖片。圖片通常使用 inlineData 中的 mimeType 與 Base64 data，多輪複用模型內容時保留 thoughtSignature。沒有圖片時檢查 promptFeedback 與 finishReason；usageMetadata 是用量統計，不是圖片生成參數。

[Gemini 同步圖片請求](/docs/zh-hant/api-reference/endpoint/nano-banana)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.