# Nano Banana Pro API: tutorial Python, edit gambar, dan harga

> Memanggil Nano Banana Pro dari Python: id model, kolom ukuran dan input.image, opsi 4K, harga per gambar dari Google, dan JSON yang dikembalikan tiap panggilan.

- Canonical HTML: https://omniakey.com/id/blog/nano-banana-pro-api
- Markdown: https://omniakey.com/id/blog/nano-banana-pro-api.md
- Published: 2026-11-03 (updated 2026-11-03)
- Author: Kiki, COO at OmniaKey
- Language: id
- Category: API setup
- Reading time: 9 min
- All posts: https://omniakey.com/blog/llms.txt

---

Nano Banana Pro adalah `gemini-3-pro-image` milik Google, dan di OmniaKey Anda memanggilnya dengan satu `POST /v1/media/tasks`. Tiga uji 3:4 kami kembali dengan ukuran 896x1200, 1792x2400 dan 3584x4800, dan setiap kata di poster tertulis benar.

## Jawaban singkat

- **Model:** `gemini-3-pro-image` adalah id model GA dari Google. Kartu model Vertex mencantumkan tanggal rilis 28 Mei 2026.
- **Panggilan:** kirim `POST https://api.omniakey.com/v1/media/tasks` dengan `Idempotency-Key`, polling `GET /v1/media/tasks/{id}` sampai statusnya succeeded, lalu unduh `assets[0].url`.
- **Parameter:** `parameters.aspect_ratio` dan `parameters.image_size`; nilai ukurannya 1K, 2K dan 4K, dengan huruf K besar.
- **Batas permintaan:** 1 MiB untuk seluruh body, termasuk data gambar Base64 di dalamnya.
- **Harga Google:** $0.134 per gambar 1K/2K dan $0.24 per gambar 4K, dari halaman harga Gemini API.
- **Jumlah token kami:** ketiga tugas melaporkan 1,133, 1,225 dan 2,480 token keluaran. Dengan $120 per juta token gambar, itu $0.136, $0.147 dan $0.298.
- **Edit:** pakai `operation: "edit"` dan taruh gambar sumber di `input.image` sebagai `{data, mime_type}`.

[Halaman model Nano Banana Pro](https://omniakey.com/id/gemini-3-pro-image) di OmniaKey juga menerima `gemini-3-pro-image-preview`, id snapshot lama, dengan harga yang sama.

## Id model dan yang perlu disiapkan

Id yang ditulis di kode adalah `gemini-3-pro-image`. [Kartu model Vertex](https://cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image) mencantumkannya sebagai GA dengan tanggal rilis 28 Mei 2026. Model ini mendukung keluaran 1K, 2K dan 4K.

Id -preview menunjuk ke model yang sama. [Tabel model gambar](https://docs.omniakey.com/en/media/image) OmniaKey menyebut `gemini-3-pro-image-preview` sebagai "Same model, -preview snapshot id", dengan tarif per panggilan yang sama.

Ada dua hal yang perlu disiapkan:

1. Kunci API OmniaKey, diekspor agar bisa dibaca skrip: `export OMNIAKEY_API_KEY="your-key"`.
2. Python 3. Skrip di bawah hanya memakai pustaka standar: urllib, json, time, uuid, base64 dan pathlib. Tidak ada SDK yang perlu dipasang.

## Skrip Python

Tiga langkah: buat tugas, polling, unduh gambar. Simpan sebagai `nano_banana.py` dan jalankan dengan `python3 nano_banana.py`.

```python
import base64
import json
import os
import time
import urllib.request
import uuid
from pathlib import Path

API = "https://api.omniakey.com/v1/media/tasks"
HEADERS = {
    "Authorization": f"Bearer {os.environ['OMNIAKEY_API_KEY']}",
    "Content-Type": "application/json",
}


def call(url, payload=None, headers=None, method=None):
    body = json.dumps(payload).encode() if payload is not None else None
    req = urllib.request.Request(url, data=body, headers=headers or HEADERS, method=method)
    with urllib.request.urlopen(req, timeout=60) as resp:
        return resp.status, json.loads(resp.read())


def create_task(prompt, aspect_ratio="3:4", image_size="2K", image_path=None):
    body = {
        "model": "gemini-3-pro-image",
        "type": "image",
        "operation": "generate" if image_path is None else "edit",
        "input": {"prompt": prompt},
        "parameters": {"aspect_ratio": aspect_ratio, "image_size": image_size},
    }
    if image_path:
        encoded = base64.b64encode(Path(image_path).read_bytes()).decode("utf-8")
        body["input"]["image"] = {"data": encoded, "mime_type": "image/png"}
    headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
    status, task = call(API, body, headers, "POST")
    print("created", task["id"], "HTTP", status)
    return task


def wait(task_id, interval=3, timeout=300):
    deadline = time.time() + timeout
    while time.time() < deadline:
        _, task = call(f"{API}/{task_id}")
        print(task["status"], task["progress"]["percent"])
        if task["status"] in ("succeeded", "failed", "canceled"):
            return task
        time.sleep(interval)
    # A timeout is not a failure: keep the task id and poll it again.
    raise TimeoutError(f"task {task_id} is still running")


def download(task, out_path):
    asset = task["assets"][0]
    with urllib.request.urlopen(asset["url"], timeout=120) as resp:
        Path(out_path).write_bytes(resp.read())
    print("saved", out_path, asset["mime_type"], asset["byte_size"], "bytes")


if __name__ == "__main__":
    task = create_task(
        "A vintage travel poster for the Night Train from Zürich to Milano, "
        "departing 21:40 from platform 7. A steam train crosses a stone arch "
        "bridge below snowy mountains under a deep blue night sky, with a cream "
        "border. Spell every word exactly as written.",
        aspect_ratio="3:4",
        image_size="2K",
    )
    task = wait(task["id"])
    if task["status"] != "succeeded":
        raise SystemExit(f"{task['status']}: {task.get('error')}")
    download(task, "night-train.jpg")
```

`image_size` menerima 1K, 2K atau 4K. Panduan gambar Google tegas: "You must use an uppercase 'K' … Lowercase parameters (e.g., 1k) will be rejected." Kirim 2K, bukan 2k.

`Idempotency-Key` wajib. UUID baru untuk setiap permintaan adalah aturan paling sederhana; pakai ulang kunci hanya saat mengirim ulang body yang benar-benar sama. OmniaKey mengembalikan tugas asli dengan HTTP 200 alih-alih menagih dua kali, dan menjawab 409 jika kunci yang sama datang dengan body berbeda.

Panggilan pembuatan mengembalikan 202 dengan sebuah id. [Dokumentasi tugas media](https://docs.omniakey.com/en/media/overview) OmniaKey menjelaskan seluruh alurnya; tugas yang selesai membawa kolom berikut:

```json
{
  "id": "task_AbMRVqzSnVh0VwBj0S7NuMUxy5sZtfHP",
  "status": "succeeded",
  "progress": {"percent": 100, "stage": "completed"},
  "usage": {"total_tokens": 1133},
  "assets": [
    {
      "kind": "image",
      "mime_type": "…",
      "url": "https://…signed-url…"
    }
  ]
}
```

Baca `assets[0].url` lalu unduh saat itu juga: tautan bertanda tangan berlaku sekitar satu jam, dan catatan tugas tersimpan 24 jam. Kolom `mime_type` memberi tahu formatnya; model Gemini biasanya mengembalikan JPEG.

Skrip yang sama pada 1:1 dan 2K, dengan papan nama berbahasa Mandarin sebagai prompt, menghasilkan ini:

![Papan logam gelap di dinding bata dengan tiga baris teks Mandarin dan satu nomor telepon](https://omniakey.com/_img/blog/nano-banana-pro-api/g2-sign.7e3e8e4d.1600.webp)

_2K, 1:1: 2048x2048 dalam 47.2 dtk. Ketiga baris Mandarin dan 010-6789 4321 benar; karat menutup sebagian angka 0 pertama._

## Mengedit gambar yang sudah ada

Tulis `operation: "edit"` dan kirim gambar sumber di `input.image` sebagai `{data, mime_type}`. Skrip di atas sudah melakukannya begitu Anda memberi image\_path:

```python
task = create_task(
    "Hang this poster in a thin black frame on a warm white wall, with a brass "
    "picture light above it, a low wooden cabinet below and a trailing plant on "
    "the right. Keep the poster exactly as it is.",
    aspect_ratio="1:1",
    image_size="2K",
    image_path="night-train-2k.png",
)
```

Body yang dikirim tampak seperti ini:

```json
{
  "model": "gemini-3-pro-image",
  "type": "image",
  "operation": "edit",
  "input": {
    "prompt": "Hang this poster in a thin black frame on a warm white wall…",
    "image": {"data": "…base64…", "mime_type": "image/png"}
  },
  "parameters": {"aspect_ratio": "1:1", "image_size": "2K"}
}
```

Sumber contohnya PNG, jadi skrip menulis `image/png`; ganti label itu untuk JPEG. Untuk beberapa referensi, pakai `input.images` dan beri setiap entri bentuk `{data, mime_type}` yang sama. Panduan Google menetapkan batas 14 gambar referensi; untuk `gemini-3-pro-image` pembagiannya 6 gambar objek, 5 gambar karakter dan 3 referensi gaya.

Jaga body di bawah 1 MiB. Base64 membuat file sekitar sepertiga lebih besar, jadi kecilkan atau kompres sumber sebelum mengodekannya. Edit kami memakai poster 2K dan mempertahankan setiap kata serta tata letaknya:

![Poster kereta malam dalam bingkai hitam di dinding, dengan lampu lukisan di atasnya dan tanaman di kanan](https://omniakey.com/_img/blog/nano-banana-pro-api/g3-edit.98011b5c.1600.webp)

_2K, edit 1:1: 2048x2048 dalam 49.9 dtk. Teks dan desain poster bertahan; bingkainya persegi panjang yang rapi._

## 1K, 2K dan 4K: apa yang didapat

Kami menjalankan prompt poster 3:4 yang sama pada ketiga ukuran. Jumlah pikselnya sama persis dengan tabel Google untuk 3:4: 896x1200 di 1K, 1792x2400 di 2K dan 3584x4800 di 4K. Teks poster benar di semua ukuran.

![Poster kereta malam di 1K: kereta uap di jembatan batu, pegunungan bersalju dan langit biru gelap](https://omniakey.com/_img/blog/nano-banana-pro-api/g1-1k.12bc0ed0.896.webp)

_1K, 3:4: 896x1200 dalam 28.4 dtk. Keempat baris poster benar; lampu dan batang penggerak lokomotif berdesakan._

![Poster kereta malam yang sama di 2K, dengan desa dan dua menara ditambahkan di lereng kanan](https://omniakey.com/_img/blog/nano-banana-pro-api/g1-2k.38a932bb.1600.webp)

_2K, 3:4: 1792x2400 dalam 48.2 dtk. Teks sama, ditambah desa dan dua menara di lereng kanan._

![Poster kereta malam yang sama di 4K, dengan tiga gerbong dan tender tergambar di belakang lokomotif](https://omniakey.com/_img/blog/nano-banana-pro-api/g1-4k.6c8048ad.1600.webp)

_4K, 3:4: 3584x4800 dalam 66.9 dtk. Tiga gerbong dan tender tergambar; sambungan bata berbeda ketebalan._

Yang berubah dengan ukuran adalah detailnya, bukan ejaannya:

- **1K:** bagian depan kereta berdesakan: lampu, roda dan batang penggerak berdiri rapat.
- **2K:** desa dan dua menaranya muncul di lereng kanan, cerobong mengeluarkan benang asap pucat, dan jembatan memperlihatkan tujuh lengkung.
- **4K:** ketiga gerbong dan tender terpisah, dan pasangan batunya menunjukkan sambungan dengan ketebalan berbeda. Mesin di bawah lokomotif masih disederhanakan.

Kecepatannya naik seiring ukuran: 28.4 dtk, 48.2 dtk dan 66.9 dtk. Setiap ukuran kami jalankan sekali, jadi baca detik itu sebagai satu kali jalan.

Google menagih keluaran gambar $120 per juta token, dan tabelnya memberi 1,120 token untuk 1K maupun 2K serta 2,000 token untuk 4K. Dari situ muncul perkiraan Google sendiri:

```text
1,120 × $120 ÷ 1,000,000 = $0.134 per 1K image
1,120 × $120 ÷ 1,000,000 = $0.134 per 2K image
2,000 × $120 ÷ 1,000,000 = $0.24  per 4K image
```

Tugas kami melaporkan token lebih banyak daripada contoh Google. Berikut aritmetika yang sama dengan angka kami:

```text
1,133 × $120 ÷ 1,000,000 = $0.136 per 1K image
1,225 × $120 ÷ 1,000,000 = $0.147 per 2K image
2,480 × $120 ÷ 1,000,000 = $0.298 per 4K image
```

|Ukuran|Piksel, 3:4|Waktu kami|Token kami|Perkiraan Google|
|-|-|-|-|-|
|1K|896x1200|28.4 dtk|1,133|$0.134|
|2K|1792x2400|48.2 dtk|1,225|$0.134|
|4K|3584x4800|66.9 dtk|2,480|$0.24|

OmniaKey menagih panggilan gambar dengan tarif tetap, bukan per token, jadi biayanya tidak bergerak mengikuti hitungan itu; tarif per panggilan saat ini ada di [halaman model](https://omniakey.com/id/gemini-3-pro-image), dan tugas yang gagal dikembalikan dananya. Perkiraan Google dengan tarif token untuk ketiga gambar yang sama adalah $0.134, $0.134 dan $0.24.

## Kesalahan yang akan Anda temui

Kegagalan di sini hampir selalu bermuara pada nama kolom atau ukuran file, bukan pada model. Berikut yang dicantumkan dokumentasi media OmniaKey untuk endpoint ini:

|HTTP|Kode atau status|Artinya|Yang harus dilakukan|
|-|-|-|-|
|400|`invalid_request`|Body rusak, operasi tidak didukung, atau parameter salah|Periksa JSON dan nama kolom di bawah|
|503|`no_available_channel`|Tidak ada kanal yang melayani model ini sekarang|Ganti model; mengulang tidak memperbaikinya|
|—|`failed`|Tugas selesai tanpa hasil|Baca `error.code` dan `error.message`|

Tugas `failed` bukan kesalahan HTTP: panggilan pembuatan sudah berhasil, jadi polling tugasnya dan baca objek `error`. Tugas yang gagal dan dibatalkan dikembalikan dananya otomatis.

Sumber resolusi penuh yang dikirim sebagai Base64 bisa mendorong body melewati 1 MiB. Kecilkan dulu, lalu periksa panjang setelah pengodean, bukan hanya ukuran file.

Panduan Google menolak `1k` huruf kecil. Pakai 1K, 2K atau 4K.

Dokumentasi gambar OmniaKey juga menolak `size` dan `mime_type` tingkat atas pada model Gemini, karena keduanya bukan parameter Gemini. Pakai `parameters.aspect_ratio` dan `parameters.image_size`, lalu baca format keluaran dari kolom `mime_type` pada respons.

## Pertanyaan umum

### Apa id model API Nano Banana Pro?

`gemini-3-pro-image`. Kartu model Vertex Google mencantumkannya sebagai GA dengan tanggal rilis 28 Mei 2026, dan OmniaKey menerima id yang sama. Id lama `gemini-3-pro-image-preview` masih berfungsi di OmniaKey dan menunjuk ke model yang sama.

### Berapa harga satu gambar Nano Banana Pro?

Google memperkirakan $0.134 untuk gambar 1K atau 2K dan $0.24 untuk gambar 4K, pada tarif $120 per juta token gambar. Tugas kami melaporkan 1,133, 1,225 dan 2,480 token, yang berarti $0.136, $0.147 dan $0.298 pada tarif itu. Halaman model OmniaKey mencantumkan tarif per panggilannya sendiri.

### Bisakah Nano Banana Pro menulis teks Mandarin?

Bisa. Papan nama 2K kami kembali dengan tiga baris Mandarin yang benar — 同福客栈, 住宿 餐饮 茶水 dan 010-6789 4321 — termasuk 11 angka dan tanda hubungnya.

### Sebaiknya minta 1K, 2K atau 4K?

Untuk poster seperti punya kami, 2K adalah titik tengah yang berguna. Ketiga ukuran menulis poster kami dengan benar, jadi 4K membeli detail lebih halus — gerbong terpisah dan sambungan bata — bukan teks yang lebih baik. Pakai 1K untuk draf yang cukup dengan 896x1200.

### Kenapa edit saya mengembalikan 400 invalid\_request?

Penyebab umumnya body lebih dari 1 MiB, sumber di kolom yang salah, atau model Gemini menerima `size` atau `mime_type` tingkat atas. Taruh gambar di `input.image` sebagai `{data, mime_type}`, jaga body hasil pengodean di bawah 1 MiB, dan pakai `aspect_ratio` serta `image_size`.

## Sumber yang diperiksa

- [Google Cloud: kartu model Gemini 3 Pro Image](https://cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image) — diperiksa 3 November 2026.
- [Google: panduan pembuatan gambar Gemini API](https://ai.google.dev/gemini-api/docs/image-generation) — diperiksa 3 November 2026.
- [Google: harga Gemini API](https://ai.google.dev/gemini-api/docs/pricing) — diperiksa 3 November 2026.
- [Google: pengumuman Nano Banana Pro](https://blog.google/technology/ai/nano-banana-pro/) — diperiksa 3 November 2026.

## Catatan pembaruan

- 2026-11-03: versi pertama; lima panggilan uji lewat OmniaKey pada hari itu.
