Google: Nano Banana Pro (Gemini 3 Pro Image)
Nano Banana Pro(Gemini 3 Pro Image)は、複雑なデザイン、商品モックアップ、事実に基づく可視化に向けた、Googleの推論駆動の画像モデルです。テキストと参照画像を入力して、テキストを伴う画像を生成し、1K~4Kの出力と詳細な創作上の制御に対応します。
- Ailoot · 画像
POST /v1/images/generationsgemini-3-pro-image - Ailoot · 画像
POST /v1/images/generationsgemini-3-pro-image-preview - Ailoot · 画像
POST /v1/images/generationsnano-banana-pro - Ailoot Ultra · OpenAI チャット
POST /v1/chat/completionsgoogle/gemini-3-pro-image - Ailoot Ultra · 画像
POST /v1/images/generationsgoogle/gemini-3-pro-image - Ailoot Ultra · Anthropic メッセージ
POST /v1/messagesgoogle/gemini-3-pro-image
モデルについて
この説明はモデルの機能を紹介するものです。Ailootで利用できる入力、出力、オプションは、選択したメソッドごとに以下に記載されています。
Nano Banana Proは、推論を使って画像を生成・編集するGoogleのGemini 3 Pro Imageモデルです。開発元は、複雑なグラフィックデザイン、忠実度の高い商品モックアップ、事実に基づくデータ可視化を想定用途の中心に置いています。テキストと画像を入力し、画像とテキストを生成します。この名称のあるPro画像版はGemini 3 Proを基にしつつ、画像課題専用の入力と機能仕様を持っています。
モデルは1K、2K、4K画像に対応します。公開されている比率は1:1、2:3、3:2、3:4、4:3、4:5、5:4、9:16、16:9、21:9です。正方形の4K画像は4096 × 4096、16:9の4K画像は5504 × 3072です。縦長ポスター、商品シーン、横長の説明グラフィックなど、必要な成果物に合わせて解像度とアスペクト比を選びます。Gemini 3.1 Flash Imageの0.5Kや、追加の極端な比率は、このPro仕様表には含まれません。
文字描画は、ポスター、図、その他のデザイン素材で明瞭な文字を表現するために使えます。複雑なインフォグラフィックでは、基礎となる事実、正確な文言、読む順序、ラベルと視覚要素の関係を提供してください。伝える情報と、望む芸術的なスタイルを分けます。Googleは、先にテキストを準備し、それを含む画像を生成することを勧めています。見出し、図、複数の短いキャプションを組み合わせる構図で、特に役立ちます。
複数画像入力は、最大14枚の参照に対応します。Googleの機能表は、忠実度のために最大6枚の物体参照、一貫性のために最大5枚のキャラクター参照、最大3枚のスタイル参照を説明しています。これらの役割は、合成ビジュアルの準備に役立ちます。商品写真が外見を定め、別の写真が設定を、スタイル画像が表現方法を示します。見えている特徴を無差別にすべて組み合わせるよう求めず、どの詳細を正とし、どの参照は着想を与えるものかを伝えてください。
Google Searchグラウンディングは、事実に基づく可視化や現在の状況を反映した場面に、現実の情報を提供できます。Proの画像生成手順ではウェブグラウンディングが公開されています。Image Search拡張は、Nano Banana 2.1とGemini 3.1 Flash Image向けの機能としてドキュメントに記載されています。データグラフィックでは、表示する値を渡すか、開発元の手順で根拠付き情報を求めてから、関係、ラベル、レイアウトを明示します。検索を踏まえた生成でも、得られるのは確認が必要な画像であり、描かれた事実の検証の代わりにはなりません。
推論は、最終描画の前に複雑なプロンプトの構図を組み立てるのを支えます。画像ガイドは、構図と論理を試す中間画像を説明し、最終成果物と区別しています。Nano Banana 2のminimal/high制御表や、Nano Banana 2.1のデフォルトmediumの仕様表を、このPro版に当てはめないでください。難しいデザインでは、視覚的な階層、必要な物体間の関係、後の編集でも残すべき要素を含む完全な指示を渡します。
モデルカードは、なお残る実質的な制約を説明しています。非常に小さい文字や長い文章の描画が不十分になること、参照と結果の間でキャラクターの外見が変わること、マスクや落書きによる編集が部分的にしか指示に従わなかったり跡を残したりすることがあります。左右を混同したり、元の要素を新しい構図へコピーしたりする場合もあります。商品の修正では、保持する形状とラベルを明示して編集領域を検査し、図では矢印の方向と物体の相対位置を照合してください。
現在のAPI仕様表には、入力上限65,536トークン、出力上限32,768トークンと記載されています。画像生成、思考、検索グラウンディング、バッチ処理に対応し、音声生成、関数呼び出し、コード実行、キャッシュ、構造化出力、ファイル検索、URLコンテキスト、Live APIは非対応です。この仕様の画像課題は、音声も動画も入力として受け付けません。生成画像にはSynthIDが含まれ、要求した出力画像枚数が正確に守られるとは限りません。
実用的な商品指示では、商品画像、照明の参照、正確な見出しを組み合わせ、「商品の比率と文字を維持し、柔らかい側光の下で淡い石の面に置いて、指定の見出しのために上部3分の1を空けてください」と依頼できます。事実に基づく図では、各対象とつながりを特定し、承認済みのラベルを提供します。会話では1つの変更と保持する特徴を指定して結果を洗練し、選んだ画像とその説明文をデザイン成果物として一緒に保存してください。
実用タスク
実用タスク
英語の技術例
Visualize a supplied packaging cycle
Create one landscape explanatory graphic showing this packaging return cycle: customer returns an empty jar, store inspects it, accepted jars are washed, clean jars are refilled. Use four large illustrated stages connected clockwise. Add only these exact labels: 'RETURN', 'INSPECT', 'WASH', 'REFILL'. Make the arrow direction and stage order unmistakable.期待される結果
One landscape image with four labeled stages and arrows matching the supplied cycle.結果の確認
Inspect that arrows connect RETURN to INSPECT to WASH to REFILL in that order, with exact labels.Ailoot · 画像 POST /v1/images/generations gemini-3-pro-image
gemini-3-pro-imagegemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
はじめに
Nano Banana Pro(Gemini 3 Pro Image)は、複雑なデザイン、商品モックアップ、事実に基づく可視化に向けた、Googleの推論駆動の画像モデルです。テキストと参照画像を入力して、テキストを伴う画像を生成し、1K~4Kの出力と詳細な創作上の制御に対応します。
- 対応する入力
- テキスト
- 結果
- 画像
Ailootで利用可能 · 入力とメソッド
Ailoot · 画像 POST /v1/images/generations
- 入力の種類
text- 出力の種類
image- コンテキスト
- 65,536 tokens
- 最大出力
- 32,768 tokens
- 出力形式
- 画像ファイル
| フィールド | 種類 | 要件 | 値と制限 | デフォルト |
|---|---|---|---|---|
フィールドmodel | 種類string | 要件必須 | 値と制限 gemini-3-pro-image | デフォルト— |
フィールドprompt | 種類string | 要件必須 | 値と制限 最小の長さ: 1 | デフォルト— |
フィールドn | 種類integer | 要件任意 | 値と制限 最小値: 1 | デフォルト1 |
フィールドresponse_format | 種類string | 要件任意 | 値と制限 url, b64_json | デフォルト— |
フィールドstream | 種類boolean | 要件任意 | 値と制限 | デフォルトfalse |
フィールドsize | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドquality | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドbackground | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドoutput_format | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドoutput_compression | 種類integer | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドmoderation | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドinput_fidelity | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドstyle | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドpartial_images | 種類integer | 要件任意 | 値と制限 モデルによる | デフォルト— |
入力素材の組み合わせ
テキストから画像へ · 必須: prompt
メソッドのパラメータとライフサイクル
| パラメータ | 仕様 |
|---|---|
パラメータmaterial_types | 仕様text |
パラメータrequired | 仕様model, prompt |
パラメータoptional_controls | 仕様null |
パラメータcontent_type | 仕様application/json |
ライフサイクル: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · 実際に返された task_id またはメディアライブラリのレコード
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
メソッドの形式とIDは正確に記載しています。供給元の対応能力とリクエストの受け入れは別です。
料金
Ailootのメソッド料金
POST /v1/images/generations- 入力
- $0.002 / 1K 画像トークン
- 出力
- $0.134 1K画像あたり
- 出力
- $0.134 2K画像あたり
- 出力
- $0.24 4K画像あたり
Ailootはリクエスト前に見積額を確保します。結果の取得後、実測使用量に基づいて最終料金を精算します。ストリーミング時の精算には最終の使用量記録を使用します。金額の確保と精算の仕組み →
参考料金の詳細
モデル単位の参照料金表は、メソッド選択、見積もり、課金を変更しません。実際の課金には、選択したAilootメソッドの料金を適用します。
モデルの参照料金表
設定別の価格
| 設定 | 料金表 | 料金 |
|---|---|---|
| 設定Ultra | 料金表基本料金 | 料金 入力 · 入力トークン $0.004000 / 1K トークン 出力 · 出力トークン $0.024000 / 1K トークン 入力 · 画像 $0.004000 / 1K トークン 出力 · 画像出力 $0.24000 / 1K トークン 入力 · 音声 $0.004000 / 1K トークン 入力 · 入力音声キャッシュ $0.0004000 / 1K トークン 出力 · ウェブ検索 $0.028 ウェブ検索あたり 出力 · 内部推論 $0.024000 / 1K トークン 入力 · キャッシュ読み取り $0.0004000 / 1K トークン 入力 · キャッシュ書き込み $0.000750000 / 1K トークン |
リクエスト例
Ailoot · 画像
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3-pro-image", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'gemini-3-pro-image', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "gemini-3-pro-image", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
if(!encoded && uri.startsWith("data:image/")) {
const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
encoded=uri.slice(comma+1);
}
if(encoded) {
if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
raw=Buffer.from(encoded,"base64");
} else if(uri) {
const u=new URL(uri,"https://api.ailoot.ai");
if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
if(!response.ok) throw new Error("Image content download failed: "+response.status);
raw=Buffer.from(await response.arrayBuffer());
} else throw new Error("Image has neither bytes nor URL");
if(!raw.length) throw new Error("Empty image result");
const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
結果を受け取って保存
Ailoot · 画像
返された画像をすべてダウンロードするか、Base64の内容を保存
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
完了した結果をすべて保存
完了した画像をすべて保存してください。返された各URLから取得するか、Base64の内容をデコードしてください。
すべてのデータ項目を保存してください。各 b64_json をデコードするか、返された署名付き URL すべてから取得してください。実際の MIME タイプ/バイト列に応じてファイル名の拡張子を選んでください。
元のレスポンスを確認する場合
画像の生成または編集の結果に確認が必要な場合は、元の operation_id/X-Client-Request-ID と、返された結果情報を保存してください。実際の task_id または asset_id の値を使い、メディアライブラリから自分が所有する既存の結果を取得してください。生成/編集リクエストを再送したり、operation_id からポーリング URL を組み立てたりしないでください。
レスポンスのフィールド
| フィールド | 種類 |
|---|---|
フィールドcreated | 種類integer |
フィールドdata[].url | 種類string |
フィールドdata[].b64_json | 種類base64 string |
フィールドusage | 種類object |
エラーと次の手順
| レスポンス | 条件 | 次の手順 |
|---|---|---|
レスポンス400 · invalid_request_error | 条件必須フィールド、素材の表現形式、またはパラメーター値が不正です | 次の手順新しい生成リクエストを送る前に、指定されたフィールドを修正してください。 |
レスポンスserver_error | 条件返されたレスポンスは、操作または結果の確認が必要であることを示しています | 次の手順最初に返された操作/タスク ID、リクエストヘッダー、レスポンスを保存し、その元の操作に対してサポートされている読み取りを継続してください。作成リクエストを再送しないでください。 |
エイリアス
モデルのエイリアス
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
メソッドパスのエイリアス
/v1/images
関連する呼び出し用ID
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot · 画像 POST /v1/images/generations gemini-3-pro-image-preview
gemini-3-pro-image-previewgemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
はじめに
Nano Banana Pro(Gemini 3 Pro Image)は、複雑なデザイン、商品モックアップ、事実に基づく可視化に向けた、Googleの推論駆動の画像モデルです。テキストと参照画像を入力して、テキストを伴う画像を生成し、1K~4Kの出力と詳細な創作上の制御に対応します。
- 対応する入力
- テキスト
- 結果
- 画像
Ailootで利用可能 · 入力とメソッド
Ailoot · 画像 POST /v1/images/generations
- 入力の種類
text- 出力の種類
image- コンテキスト
- 65,536 tokens
- 最大出力
- 32,768 tokens
- 出力形式
- 画像ファイル
| フィールド | 種類 | 要件 | 値と制限 | デフォルト |
|---|---|---|---|---|
フィールドmodel | 種類string | 要件必須 | 値と制限 gemini-3-pro-image-preview | デフォルト— |
フィールドprompt | 種類string | 要件必須 | 値と制限 最小の長さ: 1 | デフォルト— |
フィールドn | 種類integer | 要件任意 | 値と制限 最小値: 1 | デフォルト1 |
フィールドresponse_format | 種類string | 要件任意 | 値と制限 url, b64_json | デフォルト— |
フィールドstream | 種類boolean | 要件任意 | 値と制限 | デフォルトfalse |
フィールドsize | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドquality | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドbackground | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドoutput_format | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドoutput_compression | 種類integer | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドmoderation | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドinput_fidelity | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドstyle | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドpartial_images | 種類integer | 要件任意 | 値と制限 モデルによる | デフォルト— |
入力素材の組み合わせ
テキストから画像へ · 必須: prompt
メソッドのパラメータとライフサイクル
| パラメータ | 仕様 |
|---|---|
パラメータmaterial_types | 仕様text |
パラメータrequired | 仕様model, prompt |
パラメータoptional_controls | 仕様null |
パラメータcontent_type | 仕様application/json |
ライフサイクル: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · 実際に返された task_id またはメディアライブラリのレコード
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
メソッドの形式とIDは正確に記載しています。供給元の対応能力とリクエストの受け入れは別です。
料金
Ailootのメソッド料金
POST /v1/images/generations- 入力
- $0.002 / 1K 画像トークン
- 出力
- $0.134 1K画像あたり
- 出力
- $0.134 2K画像あたり
- 出力
- $0.24 4K画像あたり
Ailootはリクエスト前に見積額を確保します。結果の取得後、実測使用量に基づいて最終料金を精算します。ストリーミング時の精算には最終の使用量記録を使用します。金額の確保と精算の仕組み →
参考料金の詳細
モデル単位の参照料金表は、メソッド選択、見積もり、課金を変更しません。実際の課金には、選択したAilootメソッドの料金を適用します。
モデルの参照料金表
設定別の価格
| 設定 | 料金表 | 料金 |
|---|---|---|
| 設定Ultra | 料金表基本料金 | 料金 入力 · 入力トークン $0.004000 / 1K トークン 出力 · 出力トークン $0.024000 / 1K トークン 入力 · 画像 $0.004000 / 1K トークン 出力 · 画像出力 $0.24000 / 1K トークン 入力 · 音声 $0.004000 / 1K トークン 入力 · 入力音声キャッシュ $0.0004000 / 1K トークン 出力 · ウェブ検索 $0.028 ウェブ検索あたり 出力 · 内部推論 $0.024000 / 1K トークン 入力 · キャッシュ読み取り $0.0004000 / 1K トークン 入力 · キャッシュ書き込み $0.000750000 / 1K トークン |
リクエスト例
Ailoot · 画像
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3-pro-image-preview", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'gemini-3-pro-image-preview', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "gemini-3-pro-image-preview", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
if(!encoded && uri.startsWith("data:image/")) {
const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
encoded=uri.slice(comma+1);
}
if(encoded) {
if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
raw=Buffer.from(encoded,"base64");
} else if(uri) {
const u=new URL(uri,"https://api.ailoot.ai");
if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
if(!response.ok) throw new Error("Image content download failed: "+response.status);
raw=Buffer.from(await response.arrayBuffer());
} else throw new Error("Image has neither bytes nor URL");
if(!raw.length) throw new Error("Empty image result");
const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
結果を受け取って保存
Ailoot · 画像
返された画像をすべてダウンロードするか、Base64の内容を保存
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
完了した結果をすべて保存
完了した画像をすべて保存してください。返された各URLから取得するか、Base64の内容をデコードしてください。
すべてのデータ項目を保存してください。各 b64_json をデコードするか、返された署名付き URL すべてから取得してください。実際の MIME タイプ/バイト列に応じてファイル名の拡張子を選んでください。
元のレスポンスを確認する場合
画像の生成または編集の結果に確認が必要な場合は、元の operation_id/X-Client-Request-ID と、返された結果情報を保存してください。実際の task_id または asset_id の値を使い、メディアライブラリから自分が所有する既存の結果を取得してください。生成/編集リクエストを再送したり、operation_id からポーリング URL を組み立てたりしないでください。
レスポンスのフィールド
| フィールド | 種類 |
|---|---|
フィールドcreated | 種類integer |
フィールドdata[].url | 種類string |
フィールドdata[].b64_json | 種類base64 string |
フィールドusage | 種類object |
エラーと次の手順
| レスポンス | 条件 | 次の手順 |
|---|---|---|
レスポンス400 · invalid_request_error | 条件必須フィールド、素材の表現形式、またはパラメーター値が不正です | 次の手順新しい生成リクエストを送る前に、指定されたフィールドを修正してください。 |
レスポンスserver_error | 条件返されたレスポンスは、操作または結果の確認が必要であることを示しています | 次の手順最初に返された操作/タスク ID、リクエストヘッダー、レスポンスを保存し、その元の操作に対してサポートされている読み取りを継続してください。作成リクエストを再送しないでください。 |
エイリアス
モデルのエイリアス
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
メソッドパスのエイリアス
/v1/images
関連する呼び出し用ID
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot · 画像 POST /v1/images/generations nano-banana-pro
nano-banana-progemini-3-pro-imagegemini-3-pro-image-previewnano-banana-pro
はじめに
Nano Banana Pro(Gemini 3 Pro Image)は、複雑なデザイン、商品モックアップ、事実に基づく可視化に向けた、Googleの推論駆動の画像モデルです。テキストと参照画像を入力して、テキストを伴う画像を生成し、1K~4Kの出力と詳細な創作上の制御に対応します。
- 対応する入力
- テキスト
- 結果
- 画像
Ailootで利用可能 · 入力とメソッド
Ailoot · 画像 POST /v1/images/generations
- 入力の種類
text- 出力の種類
image- コンテキスト
- 65,536 tokens
- 最大出力
- 32,768 tokens
- 出力形式
- 画像ファイル
| フィールド | 種類 | 要件 | 値と制限 | デフォルト |
|---|---|---|---|---|
フィールドmodel | 種類string | 要件必須 | 値と制限 nano-banana-pro | デフォルト— |
フィールドprompt | 種類string | 要件必須 | 値と制限 最小の長さ: 1 | デフォルト— |
フィールドn | 種類integer | 要件任意 | 値と制限 最小値: 1 | デフォルト1 |
フィールドresponse_format | 種類string | 要件任意 | 値と制限 url, b64_json | デフォルト— |
フィールドstream | 種類boolean | 要件任意 | 値と制限 | デフォルトfalse |
フィールドsize | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドquality | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドbackground | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドoutput_format | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドoutput_compression | 種類integer | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドmoderation | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドinput_fidelity | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドstyle | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドpartial_images | 種類integer | 要件任意 | 値と制限 モデルによる | デフォルト— |
入力素材の組み合わせ
テキストから画像へ · 必須: prompt
メソッドのパラメータとライフサイクル
| パラメータ | 仕様 |
|---|---|
パラメータmaterial_types | 仕様text |
パラメータrequired | 仕様model, prompt |
パラメータoptional_controls | 仕様null |
パラメータcontent_type | 仕様application/json |
ライフサイクル: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · 実際に返された task_id またはメディアライブラリのレコード
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
メソッドの形式とIDは正確に記載しています。供給元の対応能力とリクエストの受け入れは別です。
料金
Ailootのメソッド料金
POST /v1/images/generations- 入力
- $0.002 / 1K 画像トークン
- 出力
- $0.134 1K画像あたり
- 出力
- $0.134 2K画像あたり
- 出力
- $0.24 4K画像あたり
Ailootはリクエスト前に見積額を確保します。結果の取得後、実測使用量に基づいて最終料金を精算します。ストリーミング時の精算には最終の使用量記録を使用します。金額の確保と精算の仕組み →
参考料金の詳細
モデル単位の参照料金表は、メソッド選択、見積もり、課金を変更しません。実際の課金には、選択したAilootメソッドの料金を適用します。
モデルの参照料金表
設定別の価格
| 設定 | 料金表 | 料金 |
|---|---|---|
| 設定Ultra | 料金表基本料金 | 料金 入力 · 入力トークン $0.004000 / 1K トークン 出力 · 出力トークン $0.024000 / 1K トークン 入力 · 画像 $0.004000 / 1K トークン 出力 · 画像出力 $0.24000 / 1K トークン 入力 · 音声 $0.004000 / 1K トークン 入力 · 入力音声キャッシュ $0.0004000 / 1K トークン 出力 · ウェブ検索 $0.028 ウェブ検索あたり 出力 · 内部推論 $0.024000 / 1K トークン 入力 · キャッシュ読み取り $0.0004000 / 1K トークン 入力 · キャッシュ書き込み $0.000750000 / 1K トークン |
リクエスト例
Ailoot · 画像
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "nano-banana-pro", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'nano-banana-pro', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "nano-banana-pro", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
if(!encoded && uri.startsWith("data:image/")) {
const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
encoded=uri.slice(comma+1);
}
if(encoded) {
if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
raw=Buffer.from(encoded,"base64");
} else if(uri) {
const u=new URL(uri,"https://api.ailoot.ai");
if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
if(!response.ok) throw new Error("Image content download failed: "+response.status);
raw=Buffer.from(await response.arrayBuffer());
} else throw new Error("Image has neither bytes nor URL");
if(!raw.length) throw new Error("Empty image result");
const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
結果を受け取って保存
Ailoot · 画像
返された画像をすべてダウンロードするか、Base64の内容を保存
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
完了した結果をすべて保存
完了した画像をすべて保存してください。返された各URLから取得するか、Base64の内容をデコードしてください。
すべてのデータ項目を保存してください。各 b64_json をデコードするか、返された署名付き URL すべてから取得してください。実際の MIME タイプ/バイト列に応じてファイル名の拡張子を選んでください。
元のレスポンスを確認する場合
画像の生成または編集の結果に確認が必要な場合は、元の operation_id/X-Client-Request-ID と、返された結果情報を保存してください。実際の task_id または asset_id の値を使い、メディアライブラリから自分が所有する既存の結果を取得してください。生成/編集リクエストを再送したり、operation_id からポーリング URL を組み立てたりしないでください。
レスポンスのフィールド
| フィールド | 種類 |
|---|---|
フィールドcreated | 種類integer |
フィールドdata[].url | 種類string |
フィールドdata[].b64_json | 種類base64 string |
フィールドusage | 種類object |
エラーと次の手順
| レスポンス | 条件 | 次の手順 |
|---|---|---|
レスポンス400 · invalid_request_error | 条件必須フィールド、素材の表現形式、またはパラメーター値が不正です | 次の手順新しい生成リクエストを送る前に、指定されたフィールドを修正してください。 |
レスポンスserver_error | 条件返されたレスポンスは、操作または結果の確認が必要であることを示しています | 次の手順最初に返された操作/タスク ID、リクエストヘッダー、レスポンスを保存し、その元の操作に対してサポートされている読み取りを継続してください。作成リクエストを再送しないでください。 |
エイリアス
モデルのエイリアス
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
メソッドパスのエイリアス
/v1/images
関連する呼び出し用ID
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot Ultra · OpenAI チャット POST /v1/chat/completions google/gemini-3-pro-image
google/gemini-3-pro-imageはじめに
Nano Banana Pro(Gemini 3 Pro Image)は、複雑なデザイン、商品モックアップ、事実に基づく可視化に向けた、Googleの推論駆動の画像モデルです。テキストと参照画像を入力して、テキストを伴う画像を生成し、1K~4Kの出力と詳細な創作上の制御に対応します。
- 対応する入力
- テキスト
- 結果
- テキスト
Ailootで利用可能 · 入力とメソッド
Ailoot Ultra · OpenAI チャット POST /v1/chat/completions
- 入力の種類
text- 出力の種類
text- 出力形式
- jsonまたはSSE
| フィールド | 種類 | 要件 | 値と制限 | デフォルト |
|---|---|---|---|---|
フィールドmodel | 種類string | 要件必須 | 値と制限 google/gemini-3-pro-image | デフォルト— |
フィールドmessages | 種類message[] | 要件必須 | 値と制限 最小項目数: 1 | デフォルト— |
フィールドmessages[].role | 種類string | 要件必須 | 値と制限 例:system, user, assistant, tool, function 条件: これらのロールはソースコードの互換型で明示されています。正確なロールの集合はモデルごとに異なります。 モデルによる | デフォルト— |
フィールドmessages[].content | 種類string|content_part[]|null | 要件任意 | 値と制限 | デフォルト— |
フィールドmessages[].tool_calls | 種類tool_call[] | 要件任意 | 値と制限 | デフォルト— |
フィールドmessages[].tool_call_id | 種類string | 要件任意 | 値と制限 適用条件: role=tool。実際に返されたIDを使ってください | デフォルト— |
フィールドmessages[].name | 種類string | 要件任意 | 値と制限 | デフォルト— |
フィールドmessages[].reasoning_content | 種類string | 要件任意 | 値と制限 適用条件: このモデルが使用する場合は、実際に返された推論をそのまま次のリクエストへ戻してください | デフォルト— |
フィールドmessages[].reasoning_details | 種類object|array | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドmax_tokens | 種類integer | 要件任意 | 値と制限 最小値: 1 モデルによる | デフォルト— |
フィールドmax_completion_tokens | 種類integer | 要件任意 | 値と制限 最小値: 1 モデルによる | デフォルト— |
フィールドstream | 種類boolean | 要件任意 | 値と制限 | デフォルトfalse |
フィールドstream_options.include_usage | 種類boolean | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドtemperature | 種類number | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドtop_p | 種類number | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドstop | 種類string|string[] | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドtools | 種類function_tool[] | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドtools[].type | 種類string | 要件任意 | 値と制限 function モデルによる | デフォルト— |
フィールドtools[].function.name | 種類string | 要件必須 | 値と制限 適用条件: 関数ツールの指定あり | デフォルト— |
フィールドtools[].function.description | 種類string | 要件任意 | 値と制限 | デフォルト— |
フィールドtools[].function.parameters | 種類JSON_schema | 要件任意 | 値と制限 | デフォルト— |
フィールドtool_choice | 種類string|object | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドparallel_tool_calls | 種類boolean | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドresponse_format | 種類object | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドreasoning_effort | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドreasoning | 種類object | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドservice_tier | 種類string | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドinstructions | 種類string | 要件任意 | 値と制限 互換性用のフィールド | デフォルト— |
フィールドfunctions | 種類function[] | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドfunction_call | 種類string|object | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドprompt_cache_options | 種類object | 要件任意 | 値と制限 モデルによる | デフォルト— |
フィールドmodalities | 種類string[] | 要件任意 | 値と制限 text | デフォルト— |
フィールドprovider | 種類object | 要件任意 | 値と制限 条件: このUltraテキストルートではprovider.optionsは拒否されます | デフォルト— |
フィールドcache_control.ttl | 種類string | 要件任意 | 値と制限 条件: 実際のプロンプトキャッシュの指定箇所では1hは拒否されます | デフォルト— |
入力素材の組み合わせ
テキスト · UTF8テキスト
messages[].content
メソッドのパラメータとライフサイクル
| パラメータ | 仕様 |
|---|---|
パラメータcontent_type | 仕様application/json |
パラメータrequired | 仕様model, messages |
パラメータmaterial_types | 仕様text |
パラメータmessages | 仕様role/content形式のメッセージ配列 |
パラメータfile_material | 仕様実際のUTF-8文書をテキストとしてそのまま挿入します。ファイルIDは推定しません |
パラメータoptional_controls | 仕様stream, temperature, top_p, stop, max_tokens, max_completion_tokens, reasoning, response_format, tools, tool_choice |
パラメータcontrol_scope | 仕様モデル固有。ユーザーの関数ツールとホスト側のツールは異なります |
パラメータoutput_modalities | 仕様text |
パラメータhosted_operations | 仕様false |
パラメータmultimodal_input_binding | 仕様null |
ライフサイクル: synchronous_or_streamed
正確なモデルIDをmessagesとともに送ってください。
コンテキスト長は出力上限ではありません。
テキストファイルはテキストをそのまま提供できます。画像/音声/ファイルオブジェクトの入力には正確なバインディングが必要です。
料金
料金情報はリクエストの機能を追加しません。対応するパラメーターは選択したメソッドに記載されています。
- 高速モード
- 標準料金 高速モードが選択されている場合
- Flex モード
- 標準料金 flex モードが選択されている場合
- 最大推論量
- 標準料金 推論量が最大で、調整に既定値(default)を使用する場合
- 明示的キャッシュの料金
- 無効 明示的キャッシュを要求した場合
Ailootの料金
設定別の価格
各料金を表示された条件と照合してください。選択肢となる設定の各組には、いずれか1つの料金を適用します。
| 設定 | 料金表 | コンテキストトークン数が次の値を超える場合 | コンテキストトークン数が次の値以下の場合 | 料金 |
|---|---|---|---|---|
| 設定トークンの基本単価 | 料金表基本料金 | コンテキストトークン数が次の値を超える場合— | コンテキストトークン数が次の値以下の場合上限なし | 料金 入力 · 入力トークン $0.004 / 1K トークン 出力 · 出力トークン $0.024 / 1K トークン 入力 · キャッシュ読み取り $0.0004 / 1K トークン 入力 · キャッシュ書き込み $0.00075 / 1K トークン 入力 · キャッシュ書き込み、1時間 — / 1K トークン 出力 · 出力画像トークン $0.24 / 1K 画像トークン |
| 設定リクエスト長に応じた料金区分 1 | 料金表— | コンテキストトークン数が次の値を超える場合0 | コンテキストトークン数が次の値以下の場合上限なし | 料金 入力 · 入力トークン $0.004 / 1K トークン 出力 · 出力トークン $0.024 / 1K トークン 入力 · キャッシュ読み取り $0.0004 / 1K トークン 入力 · キャッシュ書き込み $0.00075 / 1K トークン 入力 · キャッシュ書き込み、1時間 — / 1K トークン |
参考料金の詳細
モデル単位の参照料金表は、メソッド選択、見積もり、課金を変更しません。実際の課金には、選択したAilootメソッドの料金を適用します。
Google: Nano Banana Pro (Gemini 3 Pro Image)
設定別の価格
| 設定 | 課金条件 | 料金 |
|---|---|---|
| 設定Google: Nano Banana Pro (Gemini 3 Pro Image) · 標準設定 | 課金条件デフォルト設定 | 料金 入力 · 入力トークン $0.004 / 1K トークン 出力 · 出力トークン $0.024 / 1K トークン 入力 · 入力画像 $0.004 / 1K トークン 出力 · 出力画像 $0.24 / 1K トークン 入力 · 音声入力 $0.004 / 1K トークン 入力 · 音声キャッシュ読み取り $0.0004 / 1K トークン 出力 · ウェブ検索 $0.028 検索ごと 出力 · 推論トークン $0.024 / 1K トークン 入力 · キャッシュ読み取り $0.0004 / 1K トークン 入力 · キャッシュ書き込み · 5分 $0.00075 / 1K トークン |
Ailootはリクエスト前に見積額を確保します。結果の取得後、実測使用量に基づいて最終料金を精算します。ストリーミング時の精算には最終の使用量記録を使用します。金額の確保と精算の仕組み →
リクエスト例
Ailoot Ultra · OpenAI チャット
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "google/gemini-3-pro-image", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
from openai import OpenAI
import os
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='google/gemini-3-pro-image',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
save_result(result.to_dict(mode="json"))
from openai import OpenAI
import os
from pathlib import Path
if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path
def save_result(data, stem="result"):
# Keep every field, including usage, IDs, reasoning and tool requests.
Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(data, ensure_ascii=False, indent=2))
def save_blob(encoded, suffix, label):
raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
file = Path(stem + "-" + label + "." + ext)
file.write_bytes(raw)
print("Saved", file)
for index, block in enumerate(data.get("content") or []):
print("Content", index, json.dumps(block, ensure_ascii=False))
for choice in data.get("choices") or []:
print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
for index, item in enumerate(data.get("output") or []):
print("Output", index, json.dumps(item, ensure_ascii=False))
if item.get("type") == "image_generation_call" and item.get("result"):
save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
for ci, candidate in enumerate(data.get("candidates") or []):
for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
blob = part.get("inlineData") or part.get("inline_data")
if blob and blob.get("data"):
mime = blob.get("mimeType") or blob.get("mime_type")
suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))
with client.chat.completions.stream(model='google/gemini-3-pro-image',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
for event in stream:
payload=event.to_dict(mode="json")
log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
print(json.dumps(payload,ensure_ascii=False))
final=stream.get_final_completion()
save_result(final.to_dict(mode="json"),"stream-result")
結果を受け取って保存
Ailoot Ultra · OpenAI チャット
jsonまたはSSE
完了した結果をすべて保存
返された完全なレスポンス、ファイル、コンテンツ部分をすべて保存してください。
すべての選択肢と、その内容・ツール呼び出し・推論を保持してください。SSEでは選択肢/ツールのインデックスごとに差分を組み立て、最終的な終了理由と使用量を残します。
元のレスポンスを確認する場合
リクエスト/応答IDとヘッダーを保持してください。テキストジョブを取得する汎用URLは提供されません。
レスポンスのフィールド
| フィールド | 種類 |
|---|---|
フィールドchoices[].index | 種類integer |
フィールドchoices[].message.content | 種類string|null |
フィールドchoices[].message.tool_calls | 種類tool_call[] |
フィールドchoices[].message.reasoning_content | 種類string |
フィールドchoices[].message.reasoning_details | 種類object|array |
フィールドchoices[].finish_reason | 種類string|null |
フィールドusage | 種類object |
エラーと次の手順
| レスポンス | 条件 | 次の手順 |
|---|---|---|
レスポンス400 · invalid_request_error | 条件必須フィールド、素材の表現形式、またはパラメーター値が不正です | 次の手順新しい生成リクエストを送る前に、指定されたフィールドを修正してください。 |
エイリアス
モデルのエイリアス
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
メソッドパスのエイリアス
/v1/images
関連する呼び出し用ID
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot Ultra · 画像 POST /v1/images/generations google/gemini-3-pro-image
google/gemini-3-pro-imageはじめに
Nano Banana Pro(Gemini 3 Pro Image)は、複雑なデザイン、商品モックアップ、事実に基づく可視化に向けた、Googleの推論駆動の画像モデルです。テキストと参照画像を入力して、テキストを伴う画像を生成し、1K~4Kの出力と詳細な創作上の制御に対応します。
- 対応する入力
- テキスト · 画像
- 結果
- 画像
Ailootで利用可能 · 入力とメソッド
Ailoot Ultra · 画像 POST /v1/images/generations
- 入力の種類
text,image- 出力の種類
image
| フィールド | 種類 | 要件 | 値と制限 | デフォルト |
|---|---|---|---|---|
フィールドmodel | 種類string | 要件必須 | 値と制限 google/gemini-3-pro-image | デフォルト— |
フィールドprompt | 種類string | 要件必須 | 値と制限 最小の長さ: 1 | デフォルト— |
フィールドresolution | 種類string | 要件任意 | 値と制限 1K, 2K, 4K | デフォルト— |
フィールドaspect_ratio | 種類string | 要件任意 | 値と制限 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 | デフォルト— |
フィールドn | 種類integer | 要件任意 | 値と制限 最小値: 1 最大値: 1 | デフォルト— |
フィールドinput_references | 種類array | 要件任意 | 値と制限 最小項目数: 0 最大項目数: 14 | デフォルト— |
フィールドprovider | 種類object | 要件任意 | 値と制限 | デフォルト— |
メソッドのパラメータとライフサイクル
| パラメータ | 仕様 |
|---|---|
パラメータcontent_type | 仕様application/json |
パラメータrequired | 仕様model, prompt |
パラメータmaterial_types | 仕様text, image |
ライフサイクル: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · 実際に返された task_id またはメディアライブラリのレコード
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
料金
最終料金の計算方法
表示料金は生成前の費用の見積もりです。最終請求額は、元の生成処理に記録された費用から計算されます。実測された出力時間や予測数量が、そのまま最終的な課金数量になるわけではありません。
料金情報はリクエストの機能を追加しません。対応するパラメーターは選択したメソッドに記載されています。
- 高速モード
- 未指定 高速モードが選択されている場合
- Flex モード
- 未指定 flex モードが選択されている場合
- 最大推論量
- 未指定 推論量が最大で、調整に既定値(default)を使用する場合
比較用の推定料金
設定別の価格
各料金を表示された条件と照合してください。選択肢となる設定の各組には、いずれか1つの料金を適用します。
| 設定 | 料金表 | 予測数量 | 料金 |
|---|---|---|---|
| 設定基本トークン料金 | 料金表基本料金 | 予測数量— | 料金 入力 · 入力トークン · 比較専用の見積もり — / 1K トークン 出力 · 出力トークン · 比較専用の見積もり — / 1K トークン 入力 · キャッシュ読み取り · 比較専用の見積もり — / 1K トークン 入力 · キャッシュ書き込み · 比較専用の見積もり — / 1K トークン 入力 · キャッシュ書き込み、1時間 · 比較専用の見積もり — / 1K トークン |
| 設定生成費用の見積もり | 料金表— | 予測数量生成1回分の概算 | 料金 出力 · 推定生成コスト · 比較専用の見積もり $0.98304 生成前の見積もり この見積もりは追加料金ではなく、完了した生成処理に対する固定料金でもありません。 |
Ailootはリクエスト前に見積額を確保します。結果の取得後、実測使用量に基づいて最終料金を精算します。ストリーミング時の精算には最終の使用量記録を使用します。金額の確保と精算の仕組み →
リクエスト例
Ailoot Ultra · 画像
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p={'model': 'google/gemini-3-pro-image', 'prompt': 'a red panda astronaut floating in space, studio lighting'}
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
結果を受け取って保存
Ailoot Ultra · 画像
返された画像をすべてダウンロードするか、Base64の内容を保存
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
その他のコンテンツ取得
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \
-H "Authorization: Bearer $AILOOT_API_KEY" -o owned-assets.json
# Preserve every returned asset and follow its exact signed content URL. Do not construct a signed token.
完了した結果をすべて保存
完了した画像をすべて保存してください。返された各URLから取得するか、Base64の内容をデコードしてください。
レスポンスとヘッダーの全体、実際の出力すべて、最初に返された識別子、使用量フィールドすべてを保存してください。作成リクエストを再送せずに、元の操作を復旧してください。
元のレスポンスを確認する場合
照合のため、返された X-Client-Request-ID を保存してください。実際に返された task_id/asset_id の値、または自分が所有するメディアライブラリだけを使って読み取ってください。操作 ID からタスクの URL を組み立てたり、作成リクエストを再送したりしないでください。
レスポンスのフィールド
| フィールド | 種類 |
|---|---|
フィールドcreated | 種類 |
フィールドdata[].url | 種類 |
フィールドdata[].b64_json | 種類 |
フィールドusage | 種類 |
エイリアス
モデルのエイリアス
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
メソッドパスのエイリアス
/v1/images
関連する呼び出し用ID
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
Ailoot Ultra · Anthropic メッセージ POST /v1/messages google/gemini-3-pro-image
google/gemini-3-pro-imageはじめに
Nano Banana Pro(Gemini 3 Pro Image)は、複雑なデザイン、商品モックアップ、事実に基づく可視化に向けた、Googleの推論駆動の画像モデルです。テキストと参照画像を入力して、テキストを伴う画像を生成し、1K~4Kの出力と詳細な創作上の制御に対応します。
- 対応する入力
- テキスト
- 結果
- json · sse
Ailootで利用可能 · 入力とメソッド
Ailoot Ultra · Anthropic メッセージ POST /v1/messages
- 入力の種類
text- 出力の種類
json,sse- 出力形式
- JSONまたはSSE
| フィールド | 種類 | 要件 | 値と制限 | デフォルト |
|---|---|---|---|---|
フィールドmodel | 種類string | 要件必須 | 値と制限 google/gemini-3-pro-image | デフォルト— |
フィールドmessages | 種類message[] | 要件必須 | 値と制限 | デフォルト— |
フィールドmessages[].role | 種類string | 要件必須 | 値と制限 user, assistant | デフォルト— |
フィールドmessages[].content | 種類string | 要件必須 | 値と制限 | デフォルト— |
フィールドmax_tokens | 種類integer | 要件必須 | 値と制限 | デフォルト— |
フィールドstream | 種類boolean | 要件任意 | 値と制限 | デフォルトfalse |
入力素材の組み合わせ
テキスト · UTF-8テキスト
messages[].contentの文字列
メソッドのパラメータとライフサイクル
| パラメータ | 仕様 |
|---|---|
パラメータcontent_type | 仕様application/json |
パラメータrequired | 仕様model, messages, max_tokens |
パラメータoptional_controls | 仕様stream |
パラメータmaterial_types | 仕様text |
パラメータtext_file_material | 仕様実際のUTF-8文書を読み、その本文を指定された入力またはメッセージ内容の文字列に入れてください。 |
ライフサイクル: synchronous_or_streamed
料金
料金情報はリクエストの機能を追加しません。対応するパラメーターは選択したメソッドに記載されています。
- 高速モード
- 標準料金 高速モードが選択されている場合
- Flex モード
- 標準料金 flex モードが選択されている場合
- 最大推論量
- 標準料金 推論量が最大で、調整に既定値(default)を使用する場合
- 明示的キャッシュの料金
- 無効 明示的キャッシュを要求した場合
Ailootの料金
設定別の価格
各料金を表示された条件と照合してください。選択肢となる設定の各組には、いずれか1つの料金を適用します。
| 設定 | 料金表 | コンテキストトークン数が次の値を超える場合 | コンテキストトークン数が次の値以下の場合 | 料金 |
|---|---|---|---|---|
| 設定トークンの基本単価 | 料金表基本料金 | コンテキストトークン数が次の値を超える場合— | コンテキストトークン数が次の値以下の場合上限なし | 料金 入力 · 入力トークン $0.004 / 1K トークン 出力 · 出力トークン $0.024 / 1K トークン 入力 · キャッシュ読み取り $0.0004 / 1K トークン 入力 · キャッシュ書き込み $0.00075 / 1K トークン 入力 · キャッシュ書き込み、1時間 — / 1K トークン 出力 · 出力画像トークン $0.24 / 1K 画像トークン |
| 設定リクエスト長に応じた料金区分 1 | 料金表— | コンテキストトークン数が次の値を超える場合0 | コンテキストトークン数が次の値以下の場合上限なし | 料金 入力 · 入力トークン $0.004 / 1K トークン 出力 · 出力トークン $0.024 / 1K トークン 入力 · キャッシュ読み取り $0.0004 / 1K トークン 入力 · キャッシュ書き込み $0.00075 / 1K トークン 入力 · キャッシュ書き込み、1時間 — / 1K トークン |
Ailootはリクエスト前に見積額を確保します。結果の取得後、実測使用量に基づいて最終料金を精算します。ストリーミング時の精算には最終の使用量記録を使用します。金額の確保と精算の仕組み →
リクエスト例
Ailoot Ultra · Anthropic メッセージ
{
"model": "google/gemini-3-pro-image",
"max_tokens": 128,
"messages": [
{
"role": "user",
"content": "Summarize the incident report."
}
],
"stream": false
}set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path
source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3-pro-image', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
-H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
import json, os
from pathlib import Path
source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3-pro-image', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError
api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
with urlopen(request, timeout=120) as response:
raw = response.read()
Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
Path('result.json').write_bytes(error.read())
Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path
result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
結果を受け取って保存
Ailoot Ultra · Anthropic メッセージ
JSONまたはSSE
完了した結果をすべて保存
返された完全なレスポンス、ファイル、コンテンツ部分をすべて保存してください。
すべてのコンテンツブロック、思考署名、実際のツール利用IDを保持してください。SSEのすべてのブロック差分を組み立てます。最初のテキストブロックだけでは完全な出力になりません。
元のレスポンスを確認する場合
リクエスト/応答IDとヘッダーを保持してください。テキストジョブを取得する汎用URLは提供されません。
レスポンスのフィールド
| フィールド | 種類 |
|---|---|
フィールドid | 種類string |
フィールドmodel | 種類string |
フィールドcontent[] | 種類text|thinking|tool_use|other content block |
フィールドstop_reason | 種類string|null |
フィールドusage | 種類object |
エラーと次の手順
| レスポンス | 条件 | 次の手順 |
|---|---|---|
レスポンス400 · invalid_request_error | 条件必須フィールド、素材の表現形式、またはパラメーター値が不正です | 次の手順新しい生成リクエストを送る前に、指定されたフィールドを修正してください。 |
エイリアス
モデルのエイリアス
Ailoot gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro
Ailoot Ultra google/gemini-3-pro-image
メソッドパスのエイリアス
/v1/images
関連する呼び出し用ID
google/gemini-3-pro-image, gemini-3-pro-image-preview, nano-banana-pro, gemini-3-pro-image
FAQ · Google: Nano Banana Pro (Gemini 3 Pro Image)
- 利用できる入力と結果は何ですか?
POST /v1/images/generations·gemini-3-pro-image:text→imagePOST /v1/images/generations·gemini-3-pro-image-preview:text→imagePOST /v1/images/generations·nano-banana-pro:text→imagePOST /v1/chat/completions·google/gemini-3-pro-image:text→textPOST /v1/images/generations·google/gemini-3-pro-image:text,image→imagePOST /v1/messages·google/gemini-3-pro-image:text→json,sse- リクエストはどの項目を使用しますか?
POST /v1/images/generations·gemini-3-pro-image:model,prompt,n,response_format,streamPOST /v1/images/generations·gemini-3-pro-image-preview:model,prompt,n,response_format,streamPOST /v1/images/generations·nano-banana-pro:model,prompt,n,response_format,streamPOST /v1/chat/completions·google/gemini-3-pro-image:model,messages,stream,modalities,providerPOST /v1/images/generations·google/gemini-3-pro-image:model,prompt,resolution,aspect_ratio,n,input_references,providerPOST /v1/messages·google/gemini-3-pro-image:model,messages,max_tokens,stream- どの制限が適用されますか?
POST /v1/images/generations·gemini-3-pro-image:ctx:65536;max_out:32768;n.minimum:1POST /v1/images/generations·gemini-3-pro-image-preview:ctx:65536;max_out:32768;n.minimum:1POST /v1/images/generations·nano-banana-pro:ctx:65536;max_out:32768;n.minimum:1POST /v1/chat/completions·google/gemini-3-pro-image:messages.min_items:1POST /v1/images/generations·google/gemini-3-pro-image:n.minimum:1;n.maximum:1