Nano Banana 2 Lite vs 2.1 vs Pro: so sánh các model tạo ảnh của Google Flow
7 phút đọc • 2 tháng 7 năm 2026 (6 tháng 11 năm 2026)
useapi.net là API của bên thứ ba, không liên kết với Google và không được Google bảo trợ.
Mục lục
- Giới thiệu
- Ba model Nano Banana là gì?
- Giá
- Prompt dùng để so sánh
- Tạo ảnh với cả ba model
- Ví dụ
- Nên dùng model Nano Banana nào?
- Tự chạy thử
- Câu hỏi thường gặp
- Kết luận
Giới thiệu
Google Flow có ba model tạo ảnh Nano Banana là nano-banana-2-lite, nano-banana-2 và nano-banana-pro, và Google Flow API của useapi.net chạy cả ba từ cùng một prompt bằng tài khoản Google Flow của bạn. Việc tạo ảnh có sẵn trong mọi gói Google AI, kể cả tài khoản miễn phí, trong khi Gemini API chính thức tính từ $0,034 đến $0,134 mỗi ảnh (tính đến tháng 11/2026). Không cần dự án Google Cloud, không cần API key.
Hướng dẫn này chạy đúng cùng một prompt trên Lite, 2.1 và Pro để bạn thấy chúng khác nhau thế nào, rồi đưa bạn một script Node.js tạo toàn bộ bộ ảnh chỉ bằng một lệnh. Muốn bắt đầu từ đầu trước? Xem hướng dẫn tạo ảnh, bài cùng loạt với bài này.
Ba model Nano Banana là gì?
Chọn model cho từng request bằng trường model. Nếu bỏ trống, Google Flow dùng nano-banana-2-lite, model mặc định của nó từ tháng 7/2026. Cả ba đều chạy trên mọi gói Google AI, kể cả tài khoản miễn phí.
| ID model | Tên thương mại | Phù hợp nhất cho | Ảnh tham chiếu (I2I) | Tốc độ |
|---|---|---|---|---|
nano-banana-2-lite (mặc định) | Nano Banana 2 Lite / Gemini 3.1 Flash-Lite Image | tạo ảnh nhanh, số lượng lớn, trên mọi gói | tối đa 10 | nhanh nhất |
nano-banana-2 | Nano Banana 2.1 | cân bằng chất lượng và tốc độ | tối đa 10 | nhanh |
nano-banana-pro | Nano Banana Pro / Gemini 3 Pro Image | độ trung thực và bám sát chỉ dẫn cao nhất | tối đa 10 | chậm hơn |
Cả ba nhận cùng các tỷ lệ khung hình (16:9, 4:3, 1:1, 3:4, 9:16, thêm auto ở chế độ ảnh sang ảnh), count (1–4), seed để tái tạo kết quả, tối đa 10 ảnh tham chiếu, @-mention ngay trong prompt và upscale lên 2K/4K. Các alias đã ngừng dùng imagen-4 (Google đã gỡ Imagen khỏi Google Flow vào tháng 7/2026) và nano-banana vẫn được chấp nhận, lần lượt tương ứng với nano-banana-2-lite và nano-banana-2. Chi tiết đầy đủ của từng model có trong tài liệu POST /images.
Upscale lên 2K/4K
Ảnh nào đã tạo cũng upscale được bằng POST /images/upscale: truyền mediaGenerationId của ảnh và resolution là 2k (mặc định) hoặc 4k. Phản hồi là base64 trong encodedImage. 2k dùng được trên mọi gói, còn 4k cần Google AI Ultra.
Giá
Ảnh không tốn credit Flow trên bất kỳ gói Google AI nào, kể cả tài khoản miễn phí, và useapi.net không thu phí theo ảnh. Giá của mọi model trên mọi gói, so với API chính thức, có trong bảng giá Google Flow. Xem hướng dẫn thiết lập để kết nối tài khoản.
Prompt dùng để so sánh
So sánh model chỉ có ích khi prompt đủ khó. Prompt này cố tình là một cảnh phi lý trong một khung hình duy nhất, thử nhiều thứ cùng lúc: một phong cách nhiếp ảnh có tên (David LaChapelle), bố cục không gian nhiều chủ thể (một đàn ong xếp thành mũi tên ở góc trên bên trái, một con ong phối cảnh cưỡng bức ở góc dưới bên phải), độ chính xác của đạo cụ (khung sáp ong nhỏ giọt mật), một biểu cảm hài cụ thể (mắt hoạt hình o_O) và một tông màu trái ngược, tất cả trong một bức ảnh liền mạch.
A visually breathtaking, beautifully absurd, single-frame photograph in the hyper-saturated,
glossy, surreal-comedy editorial style of David LaChapelle, shot at a sun-dappled backyard
apiary at golden hour on an 85mm f/1.4 lens with creamy shallow depth of field. In the center
midground, a gorgeous, radiant young woman beekeeper with an elegant figure, flawless glowing
sun-kissed skin and a warm playful smile, incongruously wearing a tiny mini bikini and a
beekeeper's veil hat pushed back off her face, stands among the wooden hive boxes on the grass and lifts a single
open beehive frame heavy with golden honeycomb, thick honey oozing and stringing down in glossy
ribbons and catching the light. She looks directly into the camera, delighted and completely
unbothered by the bees swirling around her. In the top-left of the frame, a dense swarm of bees
bunches together and organizes into a bold, unmistakable arrow / pointer shape aimed straight at
her, as if frantically calling everyone's attention. In the extreme bottom-right foreground of
the exact same scene, photobombing the lens, is a huge forced-perspective close-up of a single
frazzled worker bee, staring directly into the camera with bulging, mind-blown "o_O" cartoon
googly eyes, completely frozen in comical disbelief. Single cohesive image, seamless depth of
field, no cut-ins, warm dynamic backlighting, glistening honey highlights, crazy situational
comedy, hyper-detailed, masterpiece.
Tạo ảnh với cả ba model
Bạn cần một API token của useapi.net và một tài khoản Google Flow đã kết nối. POST /images là đồng bộ: một lệnh gọi sẽ chờ đến khi ảnh xong (thường 20–60 giây, model Pro có thể mất khoảng 2 phút khi tải cao) và trả về mảng media[] với mỗi ảnh một phần tử, nên không có jobid nào phải poll.
Một lệnh gọi duy nhất, đổi model để so sánh:
curl -X POST "https://api.useapi.net/v1/google-flow/images" \
-H "Authorization: Bearer $USEAPI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-pro",
"aspectRatio": "9:16",
"count": 4,
"prompt": "A beekeeper at golden hour lifting a dripping honeycomb frame, a swarm forming an arrow in the sky, a forced-perspective bee with o_O googly eyes in the foreground"
}' > result.json
# mỗi ảnh nằm ở .media[N].image.generatedImage.fifeUrl
curl -o pro_1.jpg "$(jq -r '.media[0].image.generatedImage.fifeUrl' result.json)"
Để chạy toàn bộ phần so sánh bằng một lệnh, script Node.js bên dưới đọc prompts.json (mỗi model một mục, tất cả cùng một prompt), gửi từng mục và lưu mọi ảnh trả về với tên file có tên model, tải từ fifeUrl hoặc giải mã encodedImage có sẵn trong phản hồi khi thiếu URL. Ảnh nào lỗi sẽ được ghi log và script chạy tiếp. Bạn cần Node.js v21 trở lên. Đặt cả hai file vào một thư mục và chạy node ./google-flow-nano-banana-compare.mjs API_TOKEN EMAIL, trong đó API_TOKEN là API token useapi.net của bạn và EMAIL là tài khoản Google Flow đã kết nối. Script tìm tài khoản theo email, kiểm tra health của nó trước khi gửi, và không gửi captchaToken: worker của useapi.net tự động giải reCAPTCHA.
Muốn clone về chạy? Script đầy đủ, bản Python và prompts.json có trên GitHub tại useapi/google-flow-api.
Mở prompts.json
[
{
"model": "nano-banana-2-lite",
"aspectRatio": "9:16",
"count": 4,
"prompt": "A beekeeper at golden hour lifting a dripping honeycomb frame in the surreal editorial style of David LaChapelle, a dense bee swarm forming a bold arrow in the top-left, a forced-perspective bee with o_O cartoon googly eyes photobombing the bottom-right. Single cohesive image, masterpiece."
},
{
"model": "nano-banana-2",
"aspectRatio": "9:16",
"count": 4,
"prompt": "A beekeeper at golden hour lifting a dripping honeycomb frame in the surreal editorial style of David LaChapelle, a dense bee swarm forming a bold arrow in the top-left, a forced-perspective bee with o_O cartoon googly eyes photobombing the bottom-right. Single cohesive image, masterpiece."
},
{
"model": "nano-banana-pro",
"aspectRatio": "9:16",
"count": 4,
"prompt": "A beekeeper at golden hour lifting a dripping honeycomb frame in the surreal editorial style of David LaChapelle, a dense bee swarm forming a bold arrow in the top-left, a forced-perspective bee with o_O cartoon googly eyes photobombing the bottom-right. Single cohesive image, masterpiece."
}
]
Mở script google-flow-nano-banana-compare.mjs
/*
Script version 1.1, September 11, 2026
Batch-compare Google Flow's Nano Banana image models (2 Lite, 2.1, Pro) with the useapi.net API 🚀
Reads prompts.json (one entry per model), submits each to the synchronous POST /images endpoint,
and downloads every returned image with a model-labeled filename.
For more details visit https://useapi.net/docs/api-google-flow-v1/post-google-flow-images
Companion tutorial:
https://useapi.net/docs/articles/google-flow-nano-banana-compare
Installation Instructions:
==========================
You need Node.js v21 or newer installed to run this script. Download and install Node.js from:
- Windows, macOS, Linux: https://nodejs.org/
After installation, verify by running the following command in a terminal:
node -v
Running the Script:
===================
Usage: node google-flow-nano-banana-compare.mjs <API_TOKEN> <EMAIL> [PROMPTS_FILE]
Replace API_TOKEN with your actual useapi.net API token, see https://useapi.net/docs/start-here/setup-useapi
Replace EMAIL with configured Google Flow email account, see https://useapi.net/docs/start-here/setup-google-flow
If optional PROMPTS_FILE not provided prompts.json will be used.
Example:
--------
node google-flow-nano-banana-compare.mjs user:1234-abcdefhijklmnopqrstuv [email protected]
Changelog:
==========
- July 2, 2026: Initial release.
- September 11, 2026: Saves encodedImage when fifeUrl is absent, and writes a downloaded image only once it has been fully received, so a failed download leaves no partial file for the next run to skip as "already exists".
*/
import fs from 'fs/promises';
import { writeFile } from 'node:fs/promises';
// Constants
const DEFAULT_PROMPTS_FILE = 'prompts.json';
const DEFAULT_MODEL = 'nano-banana-2-lite';
const SLEEP_RETRY = 30 * 1000; // in milliseconds
const urlAccounts = 'https://api.useapi.net/v1/google-flow/accounts';
const urlImages = 'https://api.useapi.net/v1/google-flow/images';
// Utility to sleep for given milliseconds
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const elapsedTimeSec = (start) => (Date.now() - start) / 1000;
// Function to fetch configured Google Flow API accounts
async function fetchAccounts(apiToken) {
const response = await fetch(urlAccounts, {
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${apiToken}`
}
});
if (!response.ok) {
console.error(`⛔ Error fetching accounts (HTTP ${response.status}): ${response.statusText}`);
process.exit(1);
}
return response.json();
}
// Save a single image from its signed fifeUrl. fifeUrl is normally present; when it is absent
// the image arrived inline as base64 in encodedImage. A failure is reported and skipped.
async function downloadImage(img, filename) {
try {
await fs.access(filename);
console.log(`⚠️ ${filename} already exists. Skipping download.`);
return;
} catch {
// File does not exist, proceed with downloading
}
const url = img?.fifeUrl;
if (!url && img?.encodedImage) {
console.log(`✅ Saving ${filename} from encodedImage`);
try {
await writeFile(filename, Buffer.from(img.encodedImage, 'base64'));
} catch (err) {
console.error(`⛔ Unable to save ${filename}: ${err}`);
}
return;
}
if (!url) {
console.error(`🛑 No fifeUrl or encodedImage for ${filename}`);
return;
}
console.log(`✅ Downloading ${filename}`);
try {
const imageResponse = await fetch(url);
if (!imageResponse.ok) {
console.error(`⛔ Unable to download ${filename} (HTTP ${imageResponse.status})`);
return;
}
// Read the whole body before creating the file, so a failed download leaves no
// partial file behind for the next run to skip as "already exists".
const data = Buffer.from(await imageResponse.arrayBuffer());
await writeFile(filename, data);
} catch (err) {
console.error(`⛔ Error during download: ${err}`);
}
}
// Submit a single prompt to the synchronous POST /images endpoint and download the results.
async function submitImage(apiToken, email, prompt, index) {
const model = prompt.model ?? DEFAULT_MODEL;
// Build the request body.
const body = { model, email, prompt: prompt.prompt };
for (const key of ['aspectRatio', 'count', 'seed'])
if (prompt[key] !== undefined) body[key] = prompt[key];
console.log(`🚀 ${model} » Prompt #${index} • account ${email} …`);
const startTime = Date.now();
while (true) {
const response = await fetch(urlImages, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiToken}`
},
body: JSON.stringify(body)
});
const responseText = await response.text();
if (response.status == 200) {
const media = JSON.parse(responseText)?.media ?? [];
if (media.length == 0)
console.error(`🛑 200 OK but no media (moderated?) for ${model}`);
// count > 1 returns multiple images in the media array.
for (let i = 0; i < media.length; i++) {
const img = media[i]?.image?.generatedImage;
await downloadImage(img, `${model}_${i + 1}.jpg`);
}
console.log(`🆗 ${model} done (${elapsedTimeSec(startTime)} sec)`);
return 200;
}
switch (response.status) {
case 429:
case 503:
console.log(`🔄️ Retry on HTTP ${response.status}`, responseText);
await sleep(SLEEP_RETRY);
break;
default:
console.error(`🛑 ${model} failed with HTTP ${response.status}`, responseText);
return response.status;
}
}
}
// Main function
async function main() {
const apiToken = process.argv[2];
const email = process.argv[3];
const promptFile = process.argv[4] || DEFAULT_PROMPTS_FILE;
if (!apiToken || !email) {
console.error('Usage: node google-flow-nano-banana-compare.mjs <API_TOKEN> <EMAIL> [PROMPTS_FILE]');
process.exit(1);
}
console.info('Script v1.1 • Node version ' + process.version);
const accounts = await fetchAccounts(apiToken);
if (!accounts[email]) {
console.error(`⛔ Account ${email} not found. Please refer to https://useapi.net/docs/start-here/setup-google-flow`);
process.exit(1);
}
if (accounts[email].health && accounts[email].health !== 'OK') {
console.error(`⛔ Account ${email} health is '${accounts[email].health}'. Please resolve and update the account, see https://useapi.net/docs/start-here/setup-google-flow`);
process.exit(1);
}
const prompts = JSON.parse(await fs.readFile(promptFile, 'utf8'));
console.log(`Comparing ${prompts.length} model runs …`);
const start = new Date();
for (let i = 0; i < prompts.length; i++)
await submitImage(apiToken, email, prompts[i], i + 1);
console.info('COMPLETED', new Date(), '• elapsed', elapsedTimeSec(start), 'sec');
}
main();
Ví dụ
Đây là cùng một prompt người nuôi ong do từng model tạo ở tỷ lệ 9:16, qua chính Google Flow API này. Khác biệt lặp lại đều đặn: Pro trau chuốt nhất và bám chỉ dẫn sát nhất, 2.1 sống động nhất, còn Lite nhanh nhất mà vẫn rất gần.
nano-banana-pro: trau chuốt và mang chất tạp chí nhất, và là model duy nhất vẽ ổn định lớp lưới mạng che mặt, những con ong bò trên sáp và đúng đôi mắt hoạt hình o_O.

nano-banana-2: cách diễn giải sống động và giàu năng lượng nhất, với đàn ong hình mũi tên rõ nhất và nhiều chi tiết tình huống (ủng lao động, ong trên khung).

nano-banana-2-lite: nhanh nhất trong ba model (khoảng một nửa thời gian của Pro trong các lần chạy của chúng tôi) mà vẫn giữ bố cục, dòng mật nhỏ giọt và con ong mắt lồi ở tiền cảnh.

Nên dùng model Nano Banana nào?
- Chọn
nano-banana-prokhi độ trung thực quan trọng nhất: ảnh chủ đạo, cảnh phức tạp nhiều chủ thể, chữ chính xác hoặc bám sát chỉ dẫn. Đây là model chậm nhất trong ba. - Chọn
nano-banana-2để cân bằng tốt giữa chất lượng và tốc độ, hoặc khi bạn muốn prompt được diễn giải sống động, cách điệu hơn. - Chọn
nano-banana-2-lite(mặc định) để thử nhiều lần và chạy hàng loạt số lượng lớn, khi tốc độ quan trọng mà chất lượng vẫn rất gần.
Vì cả ba dùng cùng dạng request, đổi model chỉ là sửa một từ trong model: tạo một loạt ảnh trên cả ba rồi chọn ảnh đẹp nhất, đúng như script ở trên làm.
Tự chạy thử
Script Node.js đầy đủ, bản Python và prompts.json nằm ở useapi/google-flow-api/nano-banana-compare. Clone về, sửa prompts.json và chạy một lệnh để tạo toàn bộ bộ ảnh so sánh bằng tài khoản Google Flow của bạn.
Câu hỏi thường gặp
- Có API Nano Banana 2.1 hay Nano Banana Pro không? Qua useapi.net thì có: Google Flow API chạy các phiên bản của Google Flow dưới tên
nano-banana-2(Nano Banana 2.1),nano-banana-2-litevànano-banana-protrên POST /images. Trên Gemini API chính thức, Nano Banana 2.1 tốn khoảng $0,034 mỗi ảnh 1K và Nano Banana Pro $0,134 mỗi ảnh, còn ở đây không tính phí theo ảnh (tính đến tháng 11/2026). - Nano Banana 2 Lite, 2.1 và Pro khác nhau thế nào? Qua useapi.net cả ba chạy trên cùng một endpoint, mỗi model có thế mạnh riêng.
nano-banana-pro(Gemini 3 Pro Image) trau chuốt nhất và bám chỉ dẫn sát nhất,nano-banana-2(Nano Banana 2.1) cho cách diễn giải sống động nhất, cònnano-banana-2-lite(Gemini 3.1 Flash-Lite Image), model mặc định, mất khoảng một nửa thời gian của Pro trong các lần chạy của chúng tôi. Xem Nên dùng model nào? - API Nano Banana giá bao nhiêu? Qua useapi.net, ảnh không tốn credit Flow trên bất kỳ gói Google AI nào, kể cả tài khoản miễn phí, và không cần thiết lập Gemini API key hay tài khoản thanh toán Cloud. Trên Gemini API chính thức, Nano Banana 2 Lite tốn khoảng $0,034 mỗi ảnh 1K (tính đến tháng 11/2026). Xem Giá.
- Ảnh có bị kiểm duyệt không? Qua useapi.net, prompt của bạn vẫn đi qua bộ kiểm duyệt nội dung của chính Google, và request bị từ chối sẽ trả về kết quả rỗng. Quyết định kiểm duyệt khác nhau giữa các request và giữa các model, nên thử lại, sửa prompt hoặc đổi model thường thành công, vì mỗi model Nano Banana kiểm duyệt hơi khác nhau.
- Có cần captcha hay dự án Google Cloud không? Với useapi.net, bạn không cần dự án Google Cloud, cũng không cần tự giải captcha. Google Flow yêu cầu reCAPTCHA cho mỗi ảnh, và worker của useapi.net tự động giải: tài khoản Google Flow đầu tiên của bạn được 300 lượt giải miễn phí bằng key AntiCaptcha, CapSolver và EzCaptcha của chính chúng tôi, sau đó bạn thêm key nhà cung cấp của riêng mình. Script trong hướng dẫn này không gửi
captchaToken.
Kết luận
Hãy ghé Discord Server hoặc
Telegram Channel của chúng tôi nếu bạn có câu hỏi hoặc cần hỗ trợ.
Xem repo GitHub của chúng tôi với các ví dụ code.
Đăng ở nơi khác
Cũng đăng trên dev.to (tiếng Anh) và được thảo luận trên Reddit (tiếng Anh).
Bắt đầu dùng API
Một gói đăng ký $15/tháng dùng được mọi API trên useapi.net: một token cho tất cả dịch vụ. Mỗi dịch vụ bạn kết nối tối đa 3 tài khoản của riêng mình, còn useapi.net lo REST API, cân bằng tải và polling. Cần thêm tài khoản? Mỗi gói đăng ký thêm giá $10/tháng và cho thêm 3 tài khoản ở mỗi dịch vụ.
Đăng ký — $15/tháng Thanh toán bằng tiền mã hóa
Không có thẻ thanh toán quốc tế? Bạn có thể đăng ký bằng tiền mã hóa (thanh toán bằng tiền mã hóa không được hoàn tiền). Giá và các gói số lượng lớn có trên trang đăng ký. Nếu thanh toán qua Stripe, bạn được hoàn tiền toàn bộ trong 14 ngày kể từ lần mua đầu tiên khi có dưới 50 lượt tạo thành công. Đã đăng ký rồi? Hãy đổi số lượng trong Stripe Customer Portal thay vì mua lại.