Gemini 画像生成

概要

AIone は Gemini 系列の画像生成モデルに対応しており、2 つのエンドポイントから呼び出せます:

エンドポイント 用途 できること
POST /v1/chat/completions 既存の OpenAI SDK でそのまま素早く接続 画像生成、画像から画像、ストリーミング。Nano 2.1 はサイズ指定にも対応
POST /v1beta/models/{model}:generateContent 解像度やアスペクト比を指定したい場合 上記すべて + 解像度 / アスペクト比の制御

Nano Banana 2.1 は両方のエンドポイントで解像度とアスペクト比を指定できます。Chat では image_size / aspect_ratio、ネイティブでは generationConfig.imageConfig を使用します。

利用可能なモデル

モデル 特徴
gemini-nano-banana-2.1 Nano Banana 2.1。1K / 2K / 4K に対応
gemini-3.1-flash-image 主力モデル。速度と品質のバランスが良い
gemini-3-pro-image 出力が安定しており、完成品向け
gemini-2.5-flash-image 前世代 Flash。既定サイズのみ

モデルの一覧は GET /v1/models と Portal のモデル一覧ページをご確認ください。


一、すぐに画像を出す: /v1/chat/completions

最小リクエスト:

curl https://api.aiin1.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-nex-your-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.1-flash-image",
    "messages": [
      {"role": "user", "content": "かわいい猫を描いて"}
    ]
  }'

レスポンス構造

画像は message.content に Markdown 埋め込みの data URI として返ります:

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "model": "gemini-3.1-flash-image",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "![image](data:image/png;base64,iVBORw0KGgoAAA...)"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 6,
    "completion_tokens": 1120,
    "total_tokens": 1126
  }
}

画像の取り出し: message.content は文字列なので、正規表現で data URI を抜き出します。

import re, base64
content = response.choices[0].message.content
images = re.findall(r"data:(image/[\w.+-]+);base64,([A-Za-z0-9+/=]+)", content)
extensions = {"image/png": "png", "image/jpeg": "jpg", "image/webp": "webp"}
for index, (mime_type, encoded) in enumerate(images):
    image_bytes = base64.b64decode(encoded)
    extension = extensions.get(mime_type, "img")
    open(f"out-{index}.{extension}", "wb").write(image_bytes)

画像は PNG、JPEG などで返されます。保存時は返された MIME タイプに合わせて拡張子を選択してください。

Python SDK

from openai import OpenAI
 
client = OpenAI(
    api_key="sk-nex-your-key-here",
    base_url="https://api.aiin1.ai/v1",
)
 
resp = client.chat.completions.create(
    model="gemini-3.1-flash-image",
    messages=[{"role": "user", "content": "かわいい猫を描いて"}],
)
print(resp.choices[0].message.content[:80])

Nano Banana 2.1:解像度の指定

推奨モデル ID は gemini-nano-banana-2.1、互換 alias は nano-banana-2.1 です。解像度はパラメータで指定し、モデル名に -2k や -4k を追加しないでください。

curl --max-time 600 https://api.aiin1.ai/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemini-nano-banana-2.1",
  "messages": [
    {
      "role": "user",
      "content": "かわいい猫を描いて"
    }
  ],
  "image_size": "2K",
  "aspect_ratio": "1:1"
}'

OpenAI Python SDK では画像パラメータを extra_body で渡します:

resp = client.chat.completions.create(
    model="gemini-nano-banana-2.1",
    messages=[{"role": "user", "content": "かわいい猫を描いて"}],
    extra_body={"image_size": "2K", "aspect_ratio": "1:1"},
    timeout=600,
)

Gemini ネイティブでは同じモデル ID を使用し、generationConfig.imageConfig にサイズを指定します:

curl --max-time 600 https://api.aiin1.ai/v1beta/models/gemini-nano-banana-2.1:generateContent \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "かわいい猫を描いて"
        }
      ]
    }
  ],
  "generationConfig": {
    "responseModalities": [
      "IMAGE"
    ],
    "imageConfig": {
      "imageSize": "2K",
      "aspectRatio": "1:1"
    }
  }
}'

プレビューと原画像が両方返る場合があります。すべての画像を抽出してピクセル数を確認してください。最初の data URI だけを保存すると低解像度のプレビューになる場合があります。高解像度や待機中のリクエストには 600 秒以上のタイムアウトを推奨します。ゲートウェイが結果を待つため、クライアント側で別途ポーリングする必要はありません。

画像から画像

OpenAI 標準のマルチモーダル content 配列で参照画像を渡します:

{
  "model": "gemini-3.1-flash-image",
  "messages": [
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "この画像のりんごをオレンジに置き換えて"},
        {
          "type": "image_url",
          "image_url": {"url": "data:image/png;base64,iVBORw0KGgoAAA..."}
        }
      ]
    }
  ]
}

参照画像は data: URI(base64)と公開 https:// URL の両方に対応します。base64 を推奨: 一部の CDN はホットリンク制限や形式変換を行うため、直リンクでは取得できない場合があります。

ストリーミング

"stream": true に対応しています。これは疑似ストリーミングで、生成完了後に画像が 1 つの SSE イベントでまとめて届きます(トークン単位の逐次配信ではありません)。接続上にデータが流れ続けるため、中間のネットワーク機器にアイドルとして切断されにくくなるのが利点です。

curl https://api.aiin1.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-nex-your-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.1-flash-image",
    "messages": [{"role": "user", "content": "かわいい猫を描いて"}],
    "stream": true
  }'

このエンドポイントのサイズ

Nano Banana 2.1 ではトップレベルの image_size に 1K(既定)、2K、4K を指定し、aspect_ratio に 1:1 などの比率を指定します。他の画像モデルのサイズ制御は各モデルの対応状況をご確認ください。ネイティブのパラメータは以下で説明します。実際のピクセル数は返された画像でご確認ください。


二、解像度とアスペクト比の制御: /v1beta ネイティブエンドポイント

POST https://api.aiin1.ai/v1beta/models/{model}:generateContent

モデル名は URL パスに、サイズ関連のパラメータは generationConfig.imageConfig に置きます:

curl https://api.aiin1.ai/v1beta/models/gemini-3.1-flash-image:generateContent \
  -H "Authorization: Bearer sk-nex-your-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {"role": "user", "parts": [{"text": "かわいい猫を描いて"}]}
    ],
    "generationConfig": {
      "responseModalities": ["IMAGE"],
      "imageConfig": {
        "imageSize": "4K",
        "aspectRatio": "16:9"
      }
    }
  }'

imageSize — 解像度ティア

Nano Banana 2.1 は 1K / 2K / 4K のみに対応し、512 は非対応です。以下のピクセル例は Gemini 3.1 Flash Image のものです。Nano 2.1 の実際のサイズは返された画像でご確認ください。

取りうる値は 512 / 1K(既定)/ 2K / 4K。16:9 の場合の実際のピクセル:

imageSize 実ピクセル(16:9) 画素数
省略(既定 1K) 1376×768 1.06 MP
"2K" 2752×1536 4.23 MP
"4K" 5504×3072 16.9 MP
"512" 688×384 0.26 MP

gemini-2.5-flash-image は既定サイズ(1024×1024)のみを出力し、imageSize には反応しません。

aspectRatio — アスペクト比

14 種類に対応しています。既定ティア(1K)での実ピクセル:

比率 ピクセル 比率 ピクセル
1:1 1024×1024 9:16 768×1376
3:2 1264×848 16:9 1376×768
2:3 848×1264 21:9 1584×672
4:3 1200×896 1:4 512×2064
3:4 896×1200 4:1 2064×512
5:4 1152×928 1:8 352×2928
4:5 928×1152 8:1 2928×352

imageSize と aspectRatio は自由に組み合わせられます。例えば 4K + 21:9 で超ワイドの高解像度画像になります。

モデルは選択したティアと比率のネイティブ解像度で描画します。実際のピクセルサイズは返された画像でご確認ください。

レスポンス構造

画像は candidates[0].content.parts[] の inlineData にあり、data は接頭辞なしの純粋な base64 です:

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "inlineData": {
              "mimeType": "image/png",
              "data": "iVBORw0KGgoAAA..."
            }
          }
        ]
      },
      "finishReason": "STOP"
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 6,
    "candidatesTokenCount": 1120,
    "totalTokenCount": 1126,
    "candidatesTokensDetails": [{"modality": "IMAGE", "tokenCount": 1120}]
  }
}
import base64, json, requests
 
resp = requests.post(
    "https://api.aiin1.ai/v1beta/models/gemini-3.1-flash-image:generateContent",
    headers={"Authorization": "Bearer sk-nex-your-key-here"},
    json={
        "contents": [{"role": "user", "parts": [{"text": "かわいい猫を描いて"}]}],
        "generationConfig": {
            "responseModalities": ["IMAGE"],
            "imageConfig": {"imageSize": "2K", "aspectRatio": "16:9"},
        },
    },
    timeout=600,
)
for index, part in enumerate(resp.json()["candidates"][0]["content"]["parts"]):
    if "inlineData" in part:
        inline = part["inlineData"]
        extension = {"image/png": "png", "image/jpeg": "jpg", "image/webp": "webp"}.get(
            inline.get("mimeType"), "img"
        )
        open(f"out-{index}.{extension}", "wb").write(base64.b64decode(inline["data"]))

parts には thoughtSignature など画像以外の要素が含まれることがあります。走査時は inlineData の有無で判定してください。

ネイティブのストリーミング生成と編集

同じリクエスト本文で /v1beta/models/{model}:streamGenerateContent?alt=sse を使用します。レスポンスは SSE で、各 JSON イベントの画像は candidates[].content.parts[].inlineData にあります。

4K の生成には数分かかる場合があります。クライアントのタイムアウトは 600 秒を推奨します。ネイティブ SSE または前述の Chat ストリーミングで待機中も接続を維持できます。

画像から画像(ネイティブエンドポイント)

参照画像を inlineData として parts に入れ、テキストと並べます。data は data:image/png;base64, 接頭辞なしの純粋な base64 です:

{
  "contents": [
    {
      "role": "user",
      "parts": [
        {"inlineData": {"mimeType": "image/png", "data": "iVBORw0KGgoAAA..."}},
        {"text": "この画像のりんごをオレンジに置き換えて"}
      ]
    }
  ],
  "generationConfig": {
    "responseModalities": ["IMAGE"],
    "imageConfig": {"aspectRatio": "1:1"}
  }
}

inlineData を複数入れると複数画像の合成ができます。


課金について

画像出力は画像出力トークン単位で課金されます。トークン数は解像度ティアで決まり、プロンプトの長さには依存しません:

ティア gemini-3.1-flash-image gemini-3-pro-image gemini-nano-banana-2.1
512 747 — —
既定 / 1K 1,120 1,120 1,120
2K 1,680 1,120 1,680
4K 2,520 2,000 3,780

gemini-2.5-flash-image は 1 枚あたり 1,290 トークンです。

画像部分のトークン数は上表のとおりです。レスポンス中の usage.completion_tokens(chat エンドポイント)および usageMetadata.candidatesTokenCount(ネイティブエンドポイント)は今回の出力トークンの合計で、画像のほかに少量のテキストトークンを含む場合があり、それぞれの単価で計算されます。単価は「料金説明」をご覧ください。

Nano 2.1 の画像出力には上表の専用ティアを使用します。テキストと思考トークンはテキスト出力単価で計算します。プレビューと原画像が返る場合、画像要素の数だけで画像トークンを重複計算しないでください。正確な金額は請求明細をご確認ください。

リクエストパラメータ

/v1/chat/completions

パラメータ 型 必須 説明
model string はい 画像モデル ID
messages array はい OpenAI Chat 標準のメッセージ配列。参照画像は image_url パートで渡す
stream boolean いいえ 疑似ストリーミング。生成完了後に 1 つの SSE イベントで配信
image_size string いいえ Nano 2.1:1K(既定)/ 2K / 4K
aspect_ratio string いいえ Nano 2.1 のアスペクト比。例:1:1
temperature number いいえ 生成温度

/v1beta/models/{model}:generateContent

パラメータ 型 必須 説明
contents array はい 会話内容。parts に text と inlineData を置く
generationConfig.responseModalities array いいえ ["IMAGE"] を推奨
generationConfig.imageConfig.imageSize string いいえ 512 / 1K / 2K / 4K
generationConfig.imageConfig.aspectRatio string いいえ 上記 14 種のいずれか

注意事項

  1. タイムアウト: 高解像度の生成は時間がかかります。クライアントの HTTP タイムアウトは 600 秒以上を推奨します。
  2. 画像の取り出し方はエンドポイントで異なります: chat エンドポイントでは message.content の Markdown data URI から、ネイティブエンドポイントでは parts[].inlineData.data(接頭辞なしの純粋な base64)から取り出します。
  3. 参照画像の形式: chat エンドポイントは data: 接頭辞付きの完全な data URI、ネイティブエンドポイントは接頭辞なしの純粋な base64。ルールが逆なので混同しないでください。
  4. Anthropic 形式には非対応: Gemini 画像モデルは /v1/messages では利用できません。
  5. モデルの権限: API Key が対象の画像モデルにアクセスできることをご確認ください。