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ネイティブのContentのpartsとgenerationConfigの設定を使用し、Geminiで画像を生成・編集します。
POST https://api.mixroute.ai/v1/models/{model}:generateContent
モデル
| モデル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検索によるグラウンディングには非対応。 |
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 URIの接頭辞を含めないでください。 |
contents[].parts[].inlineData.mimeType | string | 条件付き | image/png、image/jpeg、image/webpなどの画像のMIMEタイプ。 |
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です。Nano Banana 2.1とPro:1K/2K/4K。Nano Banana 2(3.1 Flash Image):512/1K/2K/4K。Lite:1Kのみ。2.5 Flash Imageでは省略してください。 |
generationConfig.thinkingConfig.thinkingLevel | string | いいえ | Nano Banana 2.1:MINIMAL、MEDIUM(デフォルト)、HIGH。3.1 Flash ImageとLite:MINIMAL(デフォルト)またはHIGH。あるモデルのレベルを別のモデルに適用しないでください。 |
generationConfig.thinkingConfig.includeThoughts | boolean | いいえ | 対応する思考の要約またはパートをレスポンスに含めるかどうか。最終画像の処理では、thought=trueとマークされたパートをスキップしてください。 |
generationConfig.maxOutputTokens | integer | いいえ | テキスト出力と画像出力で共有する出力トークン数の上限。上限が小さすぎると、完全な画像レスポンスを返せない場合があります。モデルの上限を守ってください。 |
tools | object[] | いいえ | ネイティブツール。Nano Banana 2.1、3.1 Flash Image、およびProは、ルートで有効になっている場合にGoogle検索によるグラウンディングをサポートします。Liteと2.5 Flash Imageはこのワークフローをサポートしていません。 |
safetySettings | object[] | いいえ | categoryとthresholdを含むネイティブの安全性設定。モデルとアカウントのポリシーが適用されます。同じcategoryを重複して指定しないでください。 |
モデルの制約
Nano Banana 2.1は、同じネイティブのContent/Partリクエスト構造を使用します。metadataやassetのラッパーを使わず、generationConfig.imageConfigの下で画像出力を設定してください。対応する出力解像度の区分は1K、2K、4Kであり、512には対応していません。非対応のtemperature、topP、topK、seed、logprobsフィールドは省略してください。モデル固有の制限については、Nano Banana 2.1を参照してください。
1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9
Nano Banana 2.1とGemini 3.1 Flash Imageは、さらに1:4、4:1、1:8、8:1にも対応しています。選択したモデルが対応するサイズとアスペクト比のみを使用してください。Gemini 3の画像モデルは最大14枚の参照画像に対応し、被写体数の上限はモデルごとに異なります。Liteは軽量なワークフロー向けに最適化されています。画像APIはOpenAIのnやsizeフィールドでは制御されません。
例
環境変数MIXROUTE_API_KEYにMixRouteのキーを設定してください。リクエストはAuthorization: Bearer ...を使用します。編集前に、元画像のプレースホルダーをアクセス可能な画像またはローカルファイルに置き換えてください。
curl --request POST "https://api.mixroute.ai/v1/models/gemini-nano-banana-2.1: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-nano-banana-2.1: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"
}
}
}