Nano Banana 2 (Gemini 3.1 Flash Image)
Tạo ảnh AI và chỉnh sửa ảnh với Nano Banana 2 qua một endpoint bất đồng bộ duy nhất, dùng thân yêu cầu generateContent của Google: đầu ra tới 4K và 14 ảnh tham chiếu.
Nano Banana 2 là mô hình Gemini 3.1 Flash Image của Google. Hãy gửi thân yêu cầu generateContent của Google kèm trường model, giữ lại ID tác vụ được trả về, rồi truy vấn tác vụ đó để lấy ảnh đã hoàn thành. Ảnh tham chiếu được đặt trong contents dưới dạng URL fileData.
ID mô hình
| ID mô hình | Kênh | Cách tính phí |
|---|---|---|
gemini-3.1-flash-image | Standard | Một mức giá cố định cho mỗi ảnh được giao |
gemini-3.1-flash-image-official | Official | Đơn giá theo token cho đầu vào, đầu ra văn bản/suy luận và đầu ra hình ảnh |
Cả hai ID nhận cùng tham số. Xem giá hiện tại trên trang mô hình.
Ví dụ nhanh
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-image",
"contents": [{"parts": [{"text": "A ceramic teapot on a linen tablecloth, soft window light"}]}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {"aspectRatio": "16:9", "imageSize": "2K"}
}
}'Endpoint
POST https://api.seedrouter.ai/v1/images/generations| Header | Giá trị |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Thân yêu cầu là yêu cầu generateContent của Google với một bổ sung duy nhất: model, vì endpoint này không chứa tên mô hình trong đường dẫn. Phản hồi chứa ID tác vụ, không phải ảnh đã hoàn thành. Hãy giữ khóa API trong mã phía máy chủ. Không hỗ trợ gọi trực tiếp /v1beta/models/...:generateContent; hãy dùng endpoint này.
Tham số
| Tên | Kiểu | Bắt buộc | Mặc định | Ghi chú |
|---|---|---|---|---|
model | string | Có | — | Một trong hai ID mô hình ở trên. |
contents | Content[] | Có | — | Từ 1 đến 32 lượt. Mỗi lượt có parts và role tùy chọn (user hoặc model); lượt cuối cùng là user. |
contents[].parts[].text | string | — | — | Một phần văn bản. Cần ít nhất một phần văn bản. |
contents[].parts[].fileData | object | Không | — | {"mimeType": "...", "fileUri": "https://..."}; tham chiếu tới ảnh, video hoặc PDF. Tổng cộng tối đa 14. |
systemInstruction | object | Không | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | Không | — | Các cặp {"category", "threshold"}; xem bên dưới. |
generationConfig.responseModalities | enum[] | Không | văn bản và hình ảnh | ["IMAGE"] để chỉ nhận ảnh, hoặc ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | Không | Tỷ lệ của ảnh đầu vào, nếu không có thì 1:1 | 1:1, 1:4, 4:1, 1:8, 8:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9. |
generationConfig.imageConfig.imageSize | enum | Không | 1K | 512, 1K, 2K, 4K. Chữ K viết hoa. |
generationConfig.candidateCount | integer | Không | 1 | Chỉ 1. Mỗi yêu cầu trả về một ảnh. |
generationConfig.temperature | number | Không | Mặc định của mô hình | Từ 0 đến 2. |
generationConfig.topP | number | Không | Mặc định của mô hình | Từ 0 đến 1. |
generationConfig.topK | integer | Không | Mặc định của mô hình | Từ 1 trở lên. |
generationConfig.seed | integer | Không | — | Số nguyên 32 bit. |
generationConfig.maxOutputTokens | integer | Không | Mặc định của mô hình | Từ 1 đến 32.768. |
generationConfig.stopSequences | string[] | Không | — | Tối đa 5. |
generationConfig.mediaResolution | enum | Không | Mặc định của mô hình | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Quy định số token mà media đầu vào sử dụng. |
generationConfig.thinkingConfig.includeThoughts | boolean | Không | false | Trả về bản tóm tắt suy luận của mô hình dưới dạng output.thoughts. |
generationConfig.responseFormat.image | object | Không | — | mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio và imageSize dùng giá trị enum của Google, ví dụ ASPECT_RATIO_SIXTEEN_BY_NINE và IMAGE_SIZE_TWO_K, với cùng các tỷ lệ và kích thước như imageConfig. |
Danh mục an toàn: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Ngưỡng: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.
Các trường không xác định sẽ bị từ chối. Chưa hỗ trợ: Google Search grounding (tools) và nội dung được lưu đệm; thinkingLevel không được ghi trong tài liệu của mô hình này. Không chấp nhận inlineData; hãy truyền media dưới dạng URL fileData. responseFormat.image.delivery chỉ nhận INLINE: ảnh hoàn thành luôn được trả về dưới dạng URL được lưu trữ.
Kích thước đầu ra
imageSize | Đầu ra 1:1 | Token hình ảnh |
|---|---|---|
512 | 512×512 | 747 |
1K | 1024×1024 | 1.120 |
2K | 2048×2048 | 1.680 |
4K | 4096×4096 | 2.520 |
Các tỷ lệ khung hình khác giữ nguyên số token; ví dụ 16:9 ở 1K là 1376×768.
Các chế độ
Không có tham số chế độ riêng hay endpoint chỉnh sửa riêng.
| Thao tác | Tham số |
|---|---|
| Văn bản thành ảnh | một phần văn bản |
| Chỉnh sửa hoặc ghép ảnh | phần văn bản + một hoặc nhiều phần fileData |
| Chỉnh sửa nhiều lượt | các lượt user và model trước đó, rồi một lượt user mới (xem ghi chú bên dưới) |
Để tiếp tục một cuộc hội thoại, hãy dựng lại lượt model từ output.parts của tác vụ trước, theo đúng thứ tự: một phần văn bản trở thành {"text": ..., "thoughtSignature": ...} và một phần hình ảnh trở thành {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Giữ nguyên từng thoughtSignature đúng như khi được trả về: đó là URL của chữ ký mà chúng tôi lưu giúp bạn (chữ ký của một ảnh 4K nặng vài megabyte), và chúng tôi khôi phục nó trước khi yêu cầu đến mô hình. Chỉ chấp nhận chữ ký từ kết quả tác vụ của chính bạn.
Chỉnh sửa với ảnh tham chiếu
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-image",
"contents": [{
"role": "user",
"parts": [
{"text": "Turn this photo into a watercolor painting. Keep the composition."},
{"fileData": {"mimeType": "image/jpeg", "fileUri": "https://example.com/photo.jpg"}}
]
}]
}'Hãy thay URL ví dụ bằng ảnh của bạn mà hệ thống truy cập được.
Đầu vào media
API này chỉ nhận tham chiếu bằng URL. Không chấp nhận inlineData base64, URL data: và tải lên dạng multipart. Playground tải các tệp đã chọn lên kho lưu trữ trước, rồi mới gửi URL của chúng.
Tham chiếu phải là URL HTTP(S) công khai, mỗi tệp nhỏ hơn 50 MB và tổng cộng không quá 100 MB: ảnh (image/png, image/jpeg, image/webp, image/heic, image/heif), video (video/mp4, video/mpeg, video/mov, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp) hoặc tài liệu PDF (application/pdf). mimeType phải khớp với tệp. URL được tải về trong lúc xử lý; ảnh không truy cập được sẽ khiến tác vụ thất bại, và tác vụ thất bại không bị tính phí.
Các yếu tố chi phí
Hãy xem phần giá của mô hình để biết biểu phí hiện tại. gemini-3.1-flash-image tính một mức giá cố định cho mỗi ảnh được giao, bất kể kích thước hay prompt. gemini-3.1-flash-image-official tính theo mức sử dụng: token đầu vào (văn bản và ảnh tham chiếu), token đầu ra văn bản và suy luận, và token đầu ra hình ảnh, mỗi loại một đơn giá riêng. Kích thước ảnh là yếu tố chính; xem bảng ở trên.
Hãy xem chi phí cuối cùng trong lịch sử sử dụng của tài khoản. Tác vụ thất bại không bị tính phí.
Lược đồ đầu ra
Khi gửi, API trả về một tham chiếu tác vụ:
{
"id": "task_...",
"model": "gemini-3.1-flash-image",
"status": "processing",
"created_at": 1790310979
}Truy vấn tác vụ
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Hãy truy vấn vài giây một lần cho đến khi status là completed hoặc failed. Hết thời gian mạng trong lúc truy vấn không có nghĩa là việc tạo ảnh đã thất bại: hãy giữ ID tác vụ và tiếp tục kiểm tra. Đừng tạo tác vụ khác chỉ để xem tiến độ.
Ví dụ truy vấn đầy đủ
Hãy chạy đoạn này sau ví dụ gửi bằng Python ở trên.
import time
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
result = requests.get(
f"https://api.seedrouter.ai/v1/tasks/{task_id}",
headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
timeout=30,
)
result.raise_for_status()
task = result.json()
if task["status"] == "completed":
for image in task["output"]["data"]:
print(image["url"])
break
if task["status"] == "failed":
raise RuntimeError(task["error"]["message"])
time.sleep(3)
else:
raise TimeoutError(f"Still waiting. Resume polling task {task_id}.")Tác vụ đã hoàn tất
{
"id": "task_...",
"model": "gemini-3.1-flash-image",
"status": "completed",
"created_at": 1790310979,
"finished_at": 1790311001,
"output": {
"created": 1790310999,
"data": [{"url": "https://static.seedrouter.ai/media/tasks/task_example/0.jpg"}],
"output_format": "jpeg",
"usage": {
"input_tokens": 27,
"output_tokens": 1525,
"total_tokens": 1552,
"output_tokens_details": {"image_tokens": 1120, "text_tokens": 405, "reasoning_tokens": 0}
}
}
}| Trường | Ý nghĩa |
|---|---|
id | Hãy giữ ID này cho các lần truy vấn sau. |
status | processing, completed hoặc failed. |
created_at, finished_at | Dấu thời gian Unix tính bằng giây. |
output.data[].url | URL của ảnh đã tạo. |
output.text | Văn bản mô hình trả về kèm ảnh, khi responseModalities có TEXT. Không bao gồm phần suy luận. |
output.thoughts | Bản tóm tắt suy luận của mô hình, khi includeThoughts là true. Các ảnh trung gian mô hình vẽ trong lúc suy luận không được giao. |
output.output_format | Định dạng ảnh thực tế. |
output.parts | Các phần phản hồi cuối cùng theo thứ tự, dùng cho chỉnh sửa nhiều lượt: {"text", "thoughtSignature"} hoặc {"image": <index into data>, "thoughtSignature"}. thoughtSignature là một URL; hãy gửi lại nguyên vẹn. |
output.usage | Mức sử dụng token. output_tokens tính cả đầu ra văn bản, suy luận và hình ảnh; output_tokens_details.image_tokens là phần hình ảnh. |
error | Lỗi có cấu trúc của một tác vụ thất bại. |
Không hỗ trợ streaming (streamGenerateContent); kết quả được giao qua tác vụ.
Lỗi
Những yêu cầu bị từ chối trước khi tác vụ được tạo sẽ trả về lỗi HTTP kèm đối tượng error. Tác vụ thất bại sau khi đã được tiếp nhận sẽ trả về HTTP 200 khi truy vấn, kèm status: "failed" và một đối tượng error. Ảnh bị bộ lọc an toàn của mô hình chặn sẽ thất bại với content_policy_violation; phản hồi không có ảnh sẽ thất bại với no_output.
Hãy xem danh mục lỗi dùng chung để biết mã lỗi, mã trạng thái HTTP và hướng dẫn thử lại.
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Nếu chính lần gửi bị hết thời gian chờ, hãy kiểm tra lịch sử tác vụ trước khi gửi lại: yêu cầu đầu tiên có thể đã được tiếp nhận.
Mẹo
- Hãy mô tả chủ thể, bối cảnh, ánh sáng và phong cách bằng câu hoàn chỉnh.
- Khi chỉnh sửa, hãy nêu rõ phần cần thay đổi và phần phải giữ nguyên.
- Dùng
512hoặc1Kcho bản nháp, và2Khoặc4Kcho ảnh hoàn chỉnh. - Hãy lưu ảnh trả về vào kho lưu trữ của riêng bạn nếu cần bản sao lâu dài.
