Catatan Penulis: Penjelasan mendalam tentang 6 penyebab umum dan solusi perbaikan terkait error 400 "required oneof field data must have one initialized field" saat memanggil model gambar Gemini seperti gemini-3.1-flash-image-preview.

Saat memanggil gemini-3.1-flash-image-preview (Nano Banana 2) atau gemini-3.0-pro-image (Nano Banana Pro) untuk membuat gambar, banyak pengembang mengalami error 400 yang membingungkan ini:
{
"status_code": 400,
"error": {
"message": "* GenerateContentRequest.contents[0].parts[2].data: required oneof field 'data' must have one initialized field",
"type": "upstream_error",
"code": 400
}
}
Inti dari error ini adalah: di dalam request body Anda, elemen parts tertentu memiliki field data yang kosong atau formatnya salah. Error 400 termasuk kesalahan parameter klien, tidak akan pulih otomatis, dan harus diperbaiki di kode.
Artikel ini merangkum 6 penyebab umum yang memicu error ini, masing-masing dilengkapi dengan perbandingan kode salah vs kode benar, untuk membantu Anda menemukan dan memperbaiki masalah dengan cepat.
Nilai inti: Setelah membaca artikel ini, Anda dapat menggunakan nomor indeks parts[N] dari pesan error untuk secara tepat menemukan lokasi masalah, lalu memeriksa satu per satu dari 6 penyebab, biasanya dapat diperbaiki dalam 5 menit.
Analisis Inti Error "required oneof field data" pada Model Gambar Gemini
| Poin | Penjelasan | Arah Pemeriksaan |
|---|---|---|
| Inti Error | Ada elemen kosong atau format salah di array parts |
Periksa setiap elemen di contents[].parts[] |
| Petunjuk Kunci | parts[2] menunjukkan elemen ke-3 (indeks mulai dari 0) |
Langsung menuju ke part dengan indeks tersebut |
| Jenis Error | 400 INVALID_ARGUMENT, kesalahan klien | Tidak pulih otomatis, harus ubah kode |
| Cakupan Dampak | Berlaku untuk semua model gambar Gemini | NB2, NB Pro, Gemini Flash semuanya berlaku |
| Tingkat Kesulitan Perbaikan | Rendah, biasanya masalah format | Cukup ubah sesuai format yang benar |
Interpretasi Struktur Pesan Error Model Gambar Gemini
Mari kita uraikan struktur pesan error terlebih dahulu, ini adalah kunci untuk menemukan masalah:
GenerateContentRequest.contents[0].parts[2].data
^^^^^^^^ ^^^^^^^^
│ │
│ └── Part ke-3 (indeks mulai dari 0)
└── Blok content ke-1
contents[0]: Menunjuk ke objek content pertama di request body Andaparts[2]: Menunjuk ke elemen part ke-3 di dalam content tersebutdata: Field data dari part tersebut kosong atau tidak diinisialisasi dengan benar
Cara pemeriksaan: Langsung periksa elemen ke-[2] dari array parts di elemen ke-[0] dari array contents di kode Anda, lihat apa yang dikirimkan.

6 Penyebab Umum dan Cara Perbaiki Error Model Gambar Gemini
Penyebab 1: Ada Objek Kosong atau String Kosong di parts
Ini adalah penyebab paling umum. Array parts dalam permintaan berisi elemen kosong seperti {}, null, atau string kosong "".
| Penulisan Salah | Penulisan Benar |
|---|---|
parts mengandung objek kosong {} |
Setiap part harus memiliki text atau inlineData |
parts mengandung {"text": ""} |
Teks kosong juga memicu error, setidaknya tulis satu karakter |
parts mengandung elemen null |
Hapus semua nilai null |
Kode yang Salah:
# ❌ Ada objek kosong di parts
payload = {
"contents": [{
"parts": [
{"text": "Buat gambar kucing"},
{}, # ← Objek kosong, memicu error
{"text": "dengan gaya cat air"}
]
}]
}
Kode yang Benar:
# ✅ Setiap part memiliki konten yang valid
payload = {
"contents": [{
"parts": [
{"text": "Buat gambar kucing dengan gaya cat air"}
]
}]
}
Cara Perbaiki: Gabungkan teks ke dalam satu part text, atau pastikan setiap part berisi field text atau inlineData yang valid.
Penyebab 2: Data Base64 Gambar Kosong atau Formatnya Salah
Saat mengirim permintaan gambar-ke-gambar (image-to-image), data base64 di dalam inlineData mungkin kosong, rusak, atau formatnya tidak benar.
Kode yang Salah:
# ❌ Data base64 mengandung awalan data URI
payload = {
"contents": [{
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "data:image/png;base64,iVBORw0KGgo..." # ← Jangan sertakan awalan
}
},
{"text": "Ubah latar belakang menjadi biru"}
]
}]
}
# ❌ Data base64 adalah string kosong
"inlineData": {
"mimeType": "image/jpeg",
"data": "" # ← Data kosong, langsung memicu error
}
Kode yang Benar:
import base64
import pathlib
# ✅ Baca gambar dengan benar dan ubah ke base64 murni
image_bytes = pathlib.Path("input.png").read_bytes()
image_b64 = base64.b64encode(image_bytes).decode("utf-8")
payload = {
"contents": [{
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": image_b64 # ← String base64 murni, tanpa awalan
}
},
{"text": "Ubah latar belakang menjadi biru"}
]
}]
}
Cara Perbaiki:
- Field
datahanya menerima string base64 murni, tidak boleh mengandung awalandata:image/png;base64, - Pastikan file gambar benar-benar ada dan berhasil dibaca, hindari mengirim string kosong
mimeTypeharus cocok dengan format gambar sebenarnya (image/png,image/jpeg,image/webp)
Penyebab 3: Objek File Tidak Dikonversi dengan Benar ke Referensi Konten
Setelah mengunggah file menggunakan Files API dari Google GenAI SDK, memasukkan objek File langsung ke contents dapat menyebabkan SDK gagal mengonversinya dengan benar.
Kode yang Salah:
from google import genai
client = genai.Client(api_key="KUNCI_ANDA")
# Unggah file
file = client.files.upload(file="foto.png")
# ❌ Di beberapa versi SDK, mengirim objek File langsung bisa gagal
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=["Edit gambar ini", file] # ← Objek File mungkin tidak bisa dikonversi otomatis
)
Kode yang Benar:
from google import genai
from google.genai import types
client = genai.Client(api_key="KUNCI_ANDA")
# Unggah file
file = client.files.upload(file="foto.png")
# ✅ Metode 1: Bangun referensi file secara manual
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=[
types.Content(parts=[
types.Part(file_data=types.FileData(file_uri=file.uri, mime_type=file.mime_type)),
types.Part(text="Edit gambar ini: ubah latar belakang menjadi sunset")
])
],
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"]
)
)
# ✅ Metode 2: Gunakan inlineData untuk mengirim base64 langsung (lebih andal)
import base64, pathlib
image_b64 = base64.b64encode(pathlib.Path("foto.png").read_bytes()).decode()
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=[
types.Content(parts=[
types.Part(inline_data=types.Blob(mime_type="image/png", data=image_b64)),
types.Part(text="Edit gambar ini: ubah latar belakang menjadi sunset")
])
],
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"]
)
)
Cara Perbaiki: Disarankan untuk menggunakan metode inlineData + base64 untuk mengirim data gambar langsung, karena lebih stabil dan andal dibandingkan Files API.
Penyebab 4: Riwayat Percakapan Multi-Turn Mengandung Konten Kosong
Saat mengedit gambar dalam percakapan multi-turn, jika respons dari putaran sebelumnya tidak ditangani dengan benar, riwayat percakapan mungkin tercampur dengan blok konten yang kosong.
Kode yang Salah:
# ❌ Riwayat percakapan tercampur parts kosong
history = [
{"role": "user", "parts": [{"text": "Buat sebuah logo"}]},
{"role": "model", "parts": []}, # ← Parts kosong, memicu error
{"role": "user", "parts": [{"text": "Buat warnanya biru"}]}
]
payload = {"contents": history}
Kode yang Benar:
# ✅ Saring blok konten yang kosong
history = [
{"role": "user", "parts": [{"text": "Buat sebuah logo"}]},
{"role": "model", "parts": [{"text": "Ini logo yang saya buat."}]},
{"role": "user", "parts": [{"text": "Buat warnanya biru"}]}
]
# Filter aman: Hapus catatan yang parts-nya kosong
clean_history = [msg for msg in history if msg.get("parts") and len(msg["parts"]) > 0]
payload = {"contents": clean_history}
Cara Perbaiki: Sebelum mengirim permintaan, telusuri array contents dan saring semua elemen yang parts-nya berupa daftar kosong atau mengandung objek kosong.
Penyebab 5: Kesalahan Kapitalisasi Nama Field JSON di REST API
Nama field JSON untuk Gemini API menggunakan camelCase (penulisan kapital unta), dan bersifat case-sensitive. Salah mengeja nama field akan menyebabkan field tersebut diabaikan, sama seperti mengirim data kosong.
| Nama Field Salah | Nama Field Benar | Keterangan |
|---|---|---|
inline_data |
inlineData |
REST API menggunakan camelCase |
mime_type |
mimeType |
REST API menggunakan camelCase |
file_uri |
fileUri |
REST API menggunakan camelCase |
response_modalities |
responseModalities |
REST API menggunakan camelCase |
image_config |
imageConfig |
REST API menggunakan camelCase |
aspect_ratio |
aspectRatio |
REST API menggunakan camelCase |
image_size |
imageSize |
REST API menggunakan camelCase |
Kode yang Salah:
# ❌ Menggunakan snake_case di REST API (gaya Python SDK)
payload = {
"contents": [{
"parts": [{
"inline_data": { # ← Seharusnya inlineData
"mime_type": "image/png", # ← Seharusnya mimeType
"data": image_b64
}
}]
}],
"generation_config": { # ← Seharusnya generationConfig
"response_modalities": ["IMAGE"] # ← Seharusnya responseModalities
}
}
Kode yang Benar:
# ✅ REST API menggunakan camelCase
payload = {
"contents": [{
"parts": [{
"inlineData": {
"mimeType": "image/png",
"data": image_b64
}
}]
}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {
"aspectRatio": "1:1",
"imageSize": "2K"
}
}
}
🎯 Pengingat yang Sering Membingungkan: Python SDK (
google-genai) menggunakansnake_case(sepertiinline_data), sedangkan pemanggilan langsung REST API menggunakancamelCase(sepertiinlineData). Saat memanggil melalui platform proksi seperti APIYI apiyi.com, format yang digunakan adalah REST API, jadi harus menggunakan camelCase.
Penyebab 6: Format Gambar Tidak Didukung atau File Rusak
Gambar yang dikirim memiliki data base64, tetapi format gambar itu sendiri tidak didukung atau file sudah rusak.
Format Input yang Didukung Model Gambar Gemini:
| Format | mimeType | Status Dukungan |
|---|---|---|
| PNG | image/png |
Didukung |
| JPEG | image/jpeg |
Didukung |
| WebP | image/webp |
Didukung |
| GIF | image/gif |
Didukung sebagian (hanya frame pertama) |
| BMP | image/bmp |
Tidak didukung |
| SVG | image/svg+xml |
Tidak didukung |
| TIFF | image/tiff |
Tidak didukung |
Metode Pemeriksaan:
import base64
# Periksa apakah data base64 valid
def validate_image_data(b64_string, mime_type):
# 1. Periksa apakah kosong
if not b64_string:
print("ERROR: Data base64 kosong")
return False
# 2. Periksa apakah mengandung awalan data URI
if b64_string.startswith("data:"):
print("ERROR: Hapus awalan 'data:image/...;base64,'")
return False
# 3. Periksa apakah base64 bisa didekode
try:
decoded = base64.b64decode(b64_string)
print(f"OK: Ukuran hasil dekode = {len(decoded)} bytes")
except Exception as e:
print(f"ERROR: Base64 tidak valid - {e}")
return False
# 4. Periksa apakah mimeType didukung
supported = ["image/png", "image/jpeg", "image/webp", "image/gif"]
if mime_type not in supported:
print(f"ERROR: mimeType '{mime_type}' tidak didukung")
return False
print("LULUS: Data gambar valid")
return True
💡 Saran: Tambahkan fungsi validasi data sebelum mengirim permintaan, ini dapat menangkap sebagian besar masalah format lebih awal. Metode ini juga berlaku saat memanggil melalui platform APIYI apiyi.com.
Daftar Periksa Lengkap untuk Error Model Gambar Gemini
Saat Anda menemukan error required oneof field 'data', periksa daftar berikut satu per satu:

| Langkah Pemeriksaan | Yang Diperiksa | Cara Perbaiki |
|---|---|---|
| Langkah 1 | Lihat elemen ke-N di parts[N] |
Langsung cari posisi yang sesuai di kode |
| Langkah 2 | Apakah part tersebut {}, null, "" |
Hapus elemen kosong atau isi dengan konten yang valid |
| Langkah 3 | Jika inlineData, apakah base64 kosong |
Pastikan file gambar berhasil dibaca |
| Langkah 4 | Apakah base64 mengandung awalan data: |
Hapus awalan, hanya gunakan base64 murni |
| Langkah 5 | Apakah nama field JSON menggunakan camelCase | REST API harus menggunakan inlineData, bukan inline_data |
| Langkah 6 | Apakah format gambar didukung | Hanya PNG/JPEG/WebP/GIF |
Perbaikan Cepat: Jika Anda sering mengalami error ini selama pengembangan, disarankan untuk menambahkan fungsi
validate_payload()sebelum mengirim permintaan, yang secara otomatis memeriksa apakah setiap elemen dalam arraypartsvalid. Saat memanggil model gambar Gemini melalui platform APIYI apiyi.com, format permintaannya sama persis dengan REST API resmi, sehingga metode pemeriksaan di atas juga berlaku.
Format Permintaan yang Benar untuk Model Gambar Gemini
Format Benar untuk Teks ke Gambar (Text-to-Image)
import requests, base64
API_KEY = "your-apiyi-api-key"
ENDPOINT = "https://api.apiyi.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent"
# ✅ Format paling sederhana yang benar
payload = {
"contents": [{
"parts": [
{"text": "Kucing oranye yang lucu duduk di ambang jendela, gaya cat air, 4K"}
]
}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {
"aspectRatio": "1:1",
"imageSize": "2K"
}
}
}
response = requests.post(
ENDPOINT,
headers={"Content-Type": "application/json", "x-goog-api-key": API_KEY},
json=payload,
timeout=120
)
result = response.json()
image_data = result["candidates"][0]["content"]["parts"][0]["inlineData"]["data"]
with open("output.png", "wb") as f:
f.write(base64.b64decode(image_data))
Format Benar untuk Gambar ke Gambar (Image-to-Image)
Lihat kode lengkap yang benar untuk gambar ke gambar
import requests
import base64
import pathlib
API_KEY = "your-apiyi-api-key"
ENDPOINT = "https://api.apiyi.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent"
# Baca gambar asli dan ubah menjadi base64 murni
image_path = pathlib.Path("input_photo.png")
if not image_path.exists():
raise FileNotFoundError(f"Gambar tidak ditemukan: {image_path}")
image_bytes = image_path.read_bytes()
image_b64 = base64.b64encode(image_bytes).decode("utf-8")
# Verifikasi data
assert len(image_b64) > 0, "Data Base64 kosong"
assert not image_b64.startswith("data:"), "Hapus awalan data URI"
# ✅ Format permintaan gambar ke gambar yang benar
payload = {
"contents": [{
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": image_b64
}
},
{
"text": "Ubah latar belakang menjadi pemandangan pantai saat matahari terbenam, pertahankan subjek tetap sama"
}
]
}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {
"aspectRatio": "1:1",
"imageSize": "2K"
}
}
}
response = requests.post(
ENDPOINT,
headers={"Content-Type": "application/json", "x-goog-api-key": API_KEY},
json=payload,
timeout=120
)
if response.status_code == 200:
result = response.json()
output_data = result["candidates"][0]["content"]["parts"][0]["inlineData"]["data"]
with open("output_edited.png", "wb") as f:
f.write(base64.b64decode(output_data))
print("Sukses! Gambar disimpan.")
else:
print(f"Error {response.status_code}: {response.text}")
Saran: Untuk skenario teks ke gambar, disarankan untuk memulai dari format paling sederhana, pastikan berjalan dengan baik sebelum menambahkan parameter secara bertahap. Melalui platform APIYI apiyi.com untuk memanggil Nano Banana 2, biaya per pemanggilan adalah $0.045, biaya pada tahap debugging sangat rendah.
Pertanyaan Umum
Q1: Apa arti parts[2] dalam pesan error?
parts[2] merujuk pada elemen dengan indeks 2 dalam array parts, yaitu elemen ke-3 (indeks dimulai dari 0). Cukup cari elemen ke-3 dari array contents[0].parts dalam kode Anda, dan periksa isinya. Jika array parts Anda hanya memiliki 2 elemen (indeks 0 dan 1), itu berarti logika kode mungkin secara tidak sengaja menambahkan elemen kosong saat menggabungkan parts.
Q2: Apakah error ini juga terjadi saat memanggil melalui APIYI?
Ya. APIYI apiyi.com sebagai layanan proksi API, akan meneruskan permintaan Anda ke backend Gemini. Jika ada masalah format pada body permintaan itu sendiri, backend akan mengembalikan error 400 yang sama. APIYI tidak akan mengubah struktur body permintaan Anda, jadi memastikan format permintaan benar adalah tanggung jawab pengembang. Kabar baiknya, metode perbaikannya sama persis dengan memanggil Google API secara langsung.
Q3: Mengapa nama field berbeda antara Python SDK dan REST API?
Google GenAI Python SDK mengikuti konvensi penamaan snake_case Python (seperti inline_data, mime_type), SDK akan mengonversinya secara internal ke camelCase yang diperlukan oleh API. Namun, jika Anda memanggil REST API secara langsung menggunakan library requests (termasuk melalui APIYI apiyi.com), Anda harus secara manual menggunakan format camelCase (seperti inlineData, mimeType), jika tidak field akan diabaikan dan menyebabkan error.
Q4: Apakah error ini sama dengan ‘contents.parts must not be empty’?
Tidak sepenuhnya sama, tetapi penyebabnya mirip. contents.parts must not be empty berarti array parts itu sendiri kosong ("parts": []), sedangkan required oneof field 'data' berarti ada elemen dalam parts tetapi field data dari elemen tersebut tidak diinisialisasi (misalnya "parts": [{}]). Cara perbaikannya sama: pastikan setiap part berisi text atau inlineData yang valid.
Ringkasan
Poin inti dari error required oneof field 'data' pada model gambar Gemini:
- Penyebab Utama: Terdapat elemen kosong, data kosong, atau elemen dengan format salah dalam array
parts. - Metode Pelacakan: Langsung lacak ke posisi yang sesuai dalam kode berdasarkan nomor indeks
parts[N]dalam pesan error. - Penyebab Paling Umum: Objek kosong
{}, base64 yang mengandung awalandata:, kesalahan huruf besar/kecil pada nama field JSON. - REST API HARUS menggunakan camelCase:
inlineData(bukaninline_data),mimeType(bukanmime_type). - Tindakan Pencegahan: Tambahkan fungsi validasi payload sebelum dikirim, untuk mendeteksi elemen kosong dan masalah format secara otomatis.
Direkomendasikan untuk melakukan pengembangan dan debugging melalui platform APIYI apiyi.com untuk memanggil model gambar Gemini. Nano Banana 2 dengan pembayaran per penggunaan $0.045/kali, biaya debugging sangat rendah, dan format antarmuka sepenuhnya kompatibel dengan REST API resmi.
📚 Referensi
-
Dokumentasi Resmi Pembuatan Gambar Gemini API: Format permintaan dan penjelasan parameter lengkap.
- Tautan:
ai.google.dev/gemini-api/docs/image-generation - Penjelasan: Berisi format permintaan standar untuk Text-to-Image dan Image-to-Image.
- Tautan:
-
Panduan Pemecahan Masalah Gemini API: Kode error dan saran perbaikan yang disediakan secara resmi.
- Tautan:
ai.google.dev/gemini-api/docs/troubleshooting - Penjelasan: Mencakup metode pemecahan masalah untuk error umum seperti 400, 429, 500.
- Tautan:
-
GitHub Issue: Diskusi Error required oneof field data: Laporan komunitas dan solusi perbaikan.
- Tautan:
github.com/google-gemini/cookbook/issues/786 - Penjelasan: Berisi analisis mendetail dan workaround untuk error yang disebabkan oleh penerusan objek File.
- Tautan:
-
Dokumentasi Integrasi APIYI Nano Banana 2: Panduan lengkap untuk memanggil model gambar Gemini di platform APIYI.
- Tautan:
docs.apiyi.com/en/api-capabilities/nano-banana-2-image - Penjelasan: Berisi contoh format permintaan yang benar dan tanya jawab umum.
- Tautan:
Penulis: Tim Teknis APIYI
Diskusi Teknis: Jika mengalami masalah dalam pemanggilan Gemini API, silakan kunjungi pusat dokumentasi APIYI di docs.apiyi.com untuk melihat lebih banyak panduan pemecahan masalah.
