Gemini 原生(圖片)
curl --request POST \
--url https://api.mixroute.ai/v1/models/{model}:generateContentimport requests
url = "https://api.mixroute.ai/v1/models/{model}:generateContent"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.mixroute.ai/v1/models/{model}:generateContent', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mixroute.ai/v1/models/{model}:generateContent",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.mixroute.ai/v1/models/{model}:generateContent"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mixroute.ai/v1/models/{model}:generateContent")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixroute.ai/v1/models/{model}:generateContent")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body圖像系列
Gemini 原生(圖片)
Gemini 原生圖片生成、編輯欄位與模型限制。
Gemini 原生(圖片)
curl --request POST \
--url https://api.mixroute.ai/v1/models/{model}:generateContentimport requests
url = "https://api.mixroute.ai/v1/models/{model}:generateContent"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.mixroute.ai/v1/models/{model}:generateContent', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mixroute.ai/v1/models/{model}:generateContent",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.mixroute.ai/v1/models/{model}:generateContent"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mixroute.ai/v1/models/{model}:generateContent")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixroute.ai/v1/models/{model}:generateContent")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body使用 Gemini 原生 Content 片段和 generationConfig 設定生成、編輯圖片。
POST https://api.mixroute.ai/v1/models/{model}:generateContent
支援模型
| 模型 ID | 能力與限制 |
|---|---|
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。 |
請求參數
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
model (URL path) | string | 是 | 端點路徑中的模型 ID,不額外放進 JSON 請求體。 |
contents | object[] | 是 | 包含文本和可選圖片輸入的對話輪次。 |
contents[].role | string | 否 | user 或 model,保留上一輪模型輸出時使用 model 角色。 |
contents[].parts | object[] | 是 | 內容片段陣列,編輯時可組合文本指令和圖片片段。 |
contents[].parts[].text | string | 按場景 | 文本提示詞或編輯指令。 |
contents[].parts[].inlineData | object | 按場景 | 內聯圖片資料,包含 mimeType 和原始 Base64 data;data 不包含 data-URI 字首。 |
contents[].parts[].inlineData.mimeType | string | 按場景 | 圖片 MIME 型別,例如 image/png、image/jpeg 或 image/webp。 |
contents[].parts[].inlineData.data | string | 按場景 | 圖片二進位制內容的 Base64 編碼。 |
contents[].parts[].fileData | object | 否 | 包含 fileUri 和 mimeType 的原生檔案引用,須能被當前路由的上游賬號訪問。 |
contents[].parts[].thoughtSignature | string | 否 | 模型返回的不透明簽名;多輪對話回傳模型內容時須原樣保留,不要自行生成或修改。 |
systemInstruction | object | 否 | 原生系統指令 Content 物件,通常使用 parts[].text。 |
generationConfig | object | 否 | 原生生成設定。 |
generationConfig.responseModalities | string[] | 否 | 請求圖片輸出時包含 IMAGE,可同時包含 TEXT,例如 [“TEXT”, “IMAGE”]。 |
generationConfig.imageConfig.aspectRatio | string | 否 | 輸出寬高比;省略時通常跟隨參考圖比例或選擇正方形,具體取值見下方模型限制。 |
generationConfig.imageConfig.imageSize | string | 否 | 支援此設定的模型預設 1K。3.1 Flash Image 使用 512/1K/2K/4K,Pro 使用 1K/2K/4K,Lite 僅使用 1K;2.5 Flash Image 不傳此欄位。 |
generationConfig.thinkingConfig.thinkingLevel | string | 否 | 3.1 Flash Image 與 Lite 支援 MINIMAL 或 HIGH,預設 MINIMAL,不套用到不支援這些等級的模型。 |
generationConfig.thinkingConfig.includeThoughts | boolean | 否 | 是否在響應中包含模型可提供的思考摘要或片段;讀取最終圖片時跳過 thought=true 的片段。 |
generationConfig.maxOutputTokens | integer | 否 | 文本和影像共用的輸出預算,過低可能無法返回完整圖片,須遵守模型上限。 |
tools | object[] | 否 | 原生工具。3.1 Flash Image 和 Pro 可使用 googleSearch 搜尋增強,Lite 和 2.5 Flash Image 不支援這種圖片搜尋增強流程。 |
safetySettings | object[] | 否 | 包含 category 和 threshold 的原生安全設定,受模型及賬號策略約束,同一類別不要重複配置。 |
模型限制
1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9
Gemini 3.1 Flash Image 另支援 1:4、4:1、1:8、8:1。僅使用當前模型支援的尺寸與比例。Gemini 3 影像模型最多支援 14 張參考圖,主體數量限制因模型而異,Lite 面向輕量流程。此介面不通過 OpenAI 的 n 或 size 欄位控制圖片。
呼叫示例
將 MixRoute Key 設定到環境變數MIXROUTE_API_KEY,通過 Authorization: Bearer ... 認證。編輯圖片前,將素材佔位值替換為可訪問的圖片或本地檔案。
curl --request POST "https://api.mixroute.ai/v1/models/gemini-3.1-flash-image:generateContent" \
--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
import json
import os
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"
}
}
}
''')
response = requests.post(
"https://api.mixroute.ai/v1/models/gemini-3.1-flash-image:generateContent",
headers={"Authorization": "Bearer " + os.environ["MIXROUTE_API_KEY"]},
json=payload,
timeout=180,
)
response.raise_for_status()
result = response.json()
import base64
from pathlib import Path
image_index = 0
for candidate in result.get("candidates", []):
for part in candidate.get("content", {}).get("parts", []):
if part.get("thought"):
continue
inline = part.get("inlineData")
if inline and 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"]))
image_index += 1
elif "text" in part:
print(part["text"])
圖片編輯與多輪對話
編輯時,在使用者輪次中同時提供 inlineData 圖片片段與文本指令。繼續編輯時,將上一輪完整的 candidate.content 物件追加到 contents,再追加新使用者輪次,以保留原生圖片資料和思考簽名,不要只保留模型的文本。{
"contents": [
{
"role": "user",
"parts": [
{
"text": "Make the mug blue while preserving its shape, lighting, and background."
},
{
"inlineData": {
"mimeType": "image/png",
"data": "BASE64_IMAGE_DATA"
}
}
]
}
],
"generationConfig": {
"responseModalities": [
"TEXT",
"IMAGE"
],
"imageConfig": {
"aspectRatio": "1:1",
"imageSize": "1K"
}
}
}