Autorenhinweis: Detaillierte Erklärung der 6 häufigsten Ursachen und entsprechenden Lösungen für den Fehler "required oneof field data must have one initialized field 400" beim Aufruf von Gemini-Bildmodellen wie gemini-3.1-flash-image-preview.

Beim Aufruf von gemini-3.1-flash-image-preview (Nano Banana 2) oder gemini-3.0-pro-image (Nano Banana Pro) zur Bilderzeugung stoßen viele Entwickler auf diesen verwirrenden 400-Fehler:
{
"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
}
}
Die Kernbedeutung dieser Fehlermeldung ist: In Ihrem Anfrage-Body ist das data-Feld eines parts-Elements leer oder falsch formatiert. Der 400-Fehler ist ein Client-seitiger Anfrageparameterfehler, der sich nicht von selbst behebt – Sie müssen Ihren Code korrigieren.
Dieser Artikel fasst die 6 häufigsten Ursachen für diesen Fehler zusammen, jeweils mit einem Vergleich von fehlerhaftem und korrigiertem Code, um Ihnen bei der schnellen Identifizierung und Behebung des Problems zu helfen.
Kernnutzen: Nach dem Lesen dieses Artikels können Sie anhand des Index parts[N] in der Fehlermeldung die Problemstelle genau lokalisieren und die 6 Ursachen nacheinander überprüfen. In der Regel ist das Problem innerhalb von 5 Minuten behoben.
Kernanalyse des Fehlers "required oneof field data" bei Gemini-Bildmodellen
| Punkt | Erklärung | Fehlerbehebungsrichtung |
|---|---|---|
| Fehlerursache | Das parts-Array enthält leere oder fehlerhafte Elemente |
Prüfe jedes Element in contents[].parts[] |
| Wichtiger Hinweis | parts[2] bezieht sich auf das dritte Element (Zählung beginnt bei 0) |
Direktes Lokalisieren des entsprechenden Parts über den Index |
| Fehlertyp | 400 INVALID_ARGUMENT, Client-seitiger Fehler | Wird nicht automatisch behoben, Codeänderung erforderlich |
| Betroffener Bereich | Gilt für alle Gemini-Bildmodelle | NB2, NB Pro, Gemini Flash sind alle betroffen |
| Behebungsaufwand | Gering, meist ein Formatierungsproblem | Einfache Korrektur durch Anpassung an das richtige Format |
Strukturanalyse der Gemini-Bildmodell-Fehlermeldung
Zuerst die Struktur der Fehlermeldung entschlüsseln – das ist der Schlüssel zur Problemidentifikation:
GenerateContentRequest.contents[0].parts[2].data
^^^^^^^^ ^^^^^^^^
│ │
│ └── Dritter Part (Index beginnt bei 0)
└── Erster Content-Block
contents[0]: Verweist auf das erste Content-Objekt in deinem Request-Bodyparts[2]: Verweist auf das dritte Part-Element innerhalb dieses Contentsdata: Das Datenfeld dieses Parts ist leer oder nicht korrekt initialisiert
Vorgehensweise: Überprüfe direkt das Element parts[2] im contents[0]-Array deines Codes, um zu sehen, was tatsächlich übergeben wird.

6 Häufige Ursachen und Lösungen für den Gemini-Bildmodell-Fehler
Ursache 1: Leere Objekte oder Zeichenketten in parts
Das ist die häufigste Ursache. Das parts-Array der Anfrage enthält leere Werte wie {}, null oder leere Zeichenketten "".
| Falsche Schreibweise | Korrekte Schreibweise |
|---|---|
parts enthält leeres Objekt {} |
Jedes Part muss text oder inlineData enthalten |
parts enthält {"text": ""} |
Leerer Text löst ebenfalls Fehler aus, mindestens ein Zeichen erforderlich |
parts enthält null-Elemente |
Entferne alle null-Werte |
Fehlerhafter Code:
# ❌ parts enthält leeres Objekt
payload = {
"contents": [{
"parts": [
{"text": "Erzeuge ein Katzenbild"},
{}, # ← Leeres Objekt, löst Fehler aus
{"text": "im Aquarellstil"}
]
}]
}
Korrekter Code:
# ✅ Jedes Part enthält gültigen Inhalt
payload = {
"contents": [{
"parts": [
{"text": "Erzeuge ein Katzenbild im Aquarellstil"}
]
}]
}
Lösungshinweis: Fasse Texte in einem text-Part zusammen oder stelle sicher, dass jedes Part ein gültiges text– oder inlineData-Feld enthält.
Ursache 2: Base64-Bilddaten sind leer oder fehlerhaft
Bei Bild-zu-Bild-Anfragen (image-to-image) können die Base64-Daten in inlineData leer, beschädigt oder falsch formatiert sein.
Fehlerhafter Code:
# ❌ base64-Daten enthalten data URI-Präfix
payload = {
"contents": [{
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "data:image/png;base64,iVBORw0KGgo..." # ← Sollte kein Präfix enthalten
}
},
{"text": "Ändere den Hintergrund zu blau"}
]
}]
}
# ❌ base64-Daten sind leer
"inlineData": {
"mimeType": "image/jpeg",
"data": "" # ← Leere Daten, löst direkt Fehler aus
}
Korrekter Code:
import base64
import pathlib
# ✅ Korrektes Einlesen des Bildes und Konvertierung in reinen base64-String
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 # ← Reiner base64-String, ohne Präfix
}
},
{"text": "Ändere den Hintergrund zu blau"}
]
}]
}
Lösungshinweis:
- Das
data-Feld akzeptiert nur reinen base64-String, ohnedata:image/png;base64,-Präfix - Stelle sicher, dass die Bilddatei existiert und erfolgreich gelesen wird, um leere Strings zu vermeiden
mimeTypemuss mit dem tatsächlichen Bildformat übereinstimmen (image/png,image/jpeg,image/webp)
Ursache 3: File-Objekt nicht korrekt in Inhaltsreferenz umgewandelt
Nach dem Hochladen einer Datei über die Google GenAI SDK Files API kann die direkte Übergabe des File-Objekts an contents dazu führen, dass das SDK es nicht korrekt konvertiert.
Fehlerhafter Code:
from google import genai
client = genai.Client(api_key="DEIN_SCHLÜSSEL")
# Datei hochladen
file = client.files.upload(file="photo.png")
# ❌ In manchen SDK-Versionen schlägt die direkte Übergabe des File-Objekts fehl
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=["Bearbeite dieses Bild", file] # ← File-Objekt wird möglicherweise nicht automatisch konvertiert
)
Korrekter Code:
from google import genai
from google.genai import types
client = genai.Client(api_key="DEIN_SCHLÜSSEL")
# Datei hochladen
file = client.files.upload(file="photo.png")
# ✅ Methode 1: Manuelle Erstellung der Dateireferenz
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="Bearbeite dieses Bild: Hintergrund zu Sonnenuntergang ändern")
])
],
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"]
)
)
# ✅ Methode 2: Stattdessen inlineData mit base64 verwenden (zuverlässiger)
import base64, pathlib
image_b64 = base64.b64encode(pathlib.Path("photo.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="Bearbeite dieses Bild: Hintergrund zu Sonnenuntergang ändern")
])
],
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"]
)
)
Lösungshinweis: Die Verwendung von inlineData + base64 zur direkten Übergabe von Bilddaten ist stabiler und zuverlässiger als die Files API.
Ursache 4: Leere Inhalte im Mehrrunden-Chatverlauf
Bei der Bildbearbeitung in Mehrrunden-Dialogen können leere Content-Blöcke in den Chatverlauf gelangen, wenn die Antwort der vorherigen Runde nicht korrekt verarbeitet wurde.
Fehlerhafter Code:
# ❌ Chatverlauf enthält leere parts
history = [
{"role": "user", "parts": [{"text": "Erzeuge ein Logo"}]},
{"role": "model", "parts": []}, # ← Leere parts, lösen Fehler aus
{"role": "user", "parts": [{"text": "Mache es blau"}]}
]
payload = {"contents": history}
Korrekter Code:
# ✅ Leere Content-Blöcke herausfiltern
history = [
{"role": "user", "parts": [{"text": "Erzeuge ein Logo"}]},
{"role": "model", "parts": [{"text": "Hier ist das von mir erzeugte Logo."}]},
{"role": "user", "parts": [{"text": "Mache es blau"}]}
]
# Sicherheitsfilter: Entferne Einträge mit leeren parts
clean_history = [msg for msg in history if msg.get("parts") and len(msg["parts"]) > 0]
payload = {"contents": clean_history}
Lösungshinweis: Vor dem Senden der Anfrage das contents-Array durchlaufen und alle Elemente herausfiltern, deren parts-Liste leer ist oder leere Objekte enthält.
Ursache 5: Falsche Groß-/Kleinschreibung von JSON-Feldnamen in REST API-Anfragen
Die JSON-Feldnamen der Gemini API verwenden camelCase (Binnenmajuskel) und sind case-sensitive. Falsch geschriebene Feldnamen werden ignoriert, was dem Übergeben leerer Daten entspricht.
| Falscher Feldname | Korrekter Feldname | Erklärung |
|---|---|---|
inline_data |
inlineData |
REST API verwendet camelCase |
mime_type |
mimeType |
REST API verwendet camelCase |
file_uri |
fileUri |
REST API verwendet camelCase |
response_modalities |
responseModalities |
REST API verwendet camelCase |
image_config |
imageConfig |
REST API verwendet camelCase |
aspect_ratio |
aspectRatio |
REST API verwendet camelCase |
image_size |
imageSize |
REST API verwendet camelCase |
Fehlerhafter Code:
# ❌ REST API verwendet snake_case (Python SDK-Stil)
payload = {
"contents": [{
"parts": [{
"inline_data": { # ← Sollte inlineData sein
"mime_type": "image/png", # ← Sollte mimeType sein
"data": image_b64
}
}]
}],
"generation_config": { # ← Sollte generationConfig sein
"response_modalities": ["IMAGE"] # ← Sollte responseModalities sein
}
}
Korrekter Code:
# ✅ REST API verwendet camelCase
payload = {
"contents": [{
"parts": [{
"inlineData": {
"mimeType": "image/png",
"data": image_b64
}
}]
}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {
"aspectRatio": "1:1",
"imageSize": "2K"
}
}
}
🎯 Wichtiger Hinweis: Das Python SDK (
google-genai) verwendetsnake_case(z.B.inline_data), während direkte REST API-AufrufecamelCase(z.B.inlineData) verwenden. Bei Aufrufen über API-Proxy-Dienste wie APIYI (apiyi.com) wird das REST API-Format verwendet, daher muss camelCase genutzt werden.
Ursache 6: Bildformat nicht unterstützt oder Datei beschädigt
Die übergebenen Bilddaten enthalten zwar Base64-Daten, aber das Bildformat selbst wird nicht unterstützt oder die Datei ist beschädigt.
Von Gemini-Bildmodellen unterstützte Eingabeformate:
| Format | mimeType | Unterstützungsstatus |
|---|---|---|
| PNG | image/png |
Unterstützt |
| JPEG | image/jpeg |
Unterstützt |
| WebP | image/webp |
Unterstützt |
| GIF | image/gif |
Teilweise unterstützt (nur erstes Frame) |
| BMP | image/bmp |
Nicht unterstützt |
| SVG | image/svg+xml |
Nicht unterstützt |
| TIFF | image/tiff |
Nicht unterstützt |
Prüfungsmethode:
import base64
# Prüfen, ob base64-Daten gültig sind
def validate_image_data(b64_string, mime_type):
# 1. Prüfen, ob leer
if not b64_string:
print("FEHLER: base64-Daten sind leer")
return False
# 2. Prüfen, ob data URI-Präfix enthalten ist
if b64_string.startswith("data:"):
print("FEHLER: Entferne 'data:image/...;base64,'-Präfix")
return False
# 3. Prüfen, ob base64 dekodierbar ist
try:
decoded = base64.b64decode(b64_string)
print(f"OK: Dekodierte Größe = {len(decoded)} Bytes")
except Exception as e:
print(f"FEHLER: Ungültiges base64 - {e}")
return False
# 4. Prüfen, ob mimeType unterstützt wird
supported = ["image/png", "image/jpeg", "image/webp", "image/gif"]
if mime_type not in supported:
print(f"FEHLER: Nicht unterstütztes mimeType '{mime_type}'")
return False
print("BESTANDEN: Bilddaten sind gültig")
return True
💡 Empfehlung: Eine Datenvalidierungsfunktion vor dem Senden der Anfrage kann die meisten Formatprobleme frühzeitig erkennen. Dies gilt auch für Aufrufe über die APIYI-Plattform (apiyi.com).
Vollständige Checkliste zur Fehlerbehebung bei Gemini-Bildmodellen
Wenn Sie auf den Fehler required oneof field 'data' stoßen, gehen Sie diese Checkliste Punkt für Punkt durch:

| Fehlerbehebungsschritt | Prüfinhalt | Korrekturmethode |
|---|---|---|
| Schritt 1 | Prüfen, welches Element parts[N] ist (N = Index) |
Direkt zur entsprechenden Stelle im Code navigieren |
| Schritt 2 | Ist dieses Part {}, null oder ""? |
Leeres Element entfernen oder mit gültigem Inhalt füllen |
| Schritt 3 | Bei inlineData: Ist der base64-String leer? |
Sicherstellen, dass die Bilddatei erfolgreich gelesen wurde |
| Schritt 4 | Enthält der base64-String das data:-Präfix? |
Präfix entfernen, nur reinen base64-String behalten |
| Schritt 5 | Wurde der JSON-Feldname in camelCase geschrieben? | REST API erfordert inlineData, nicht inline_data |
| Schritt 6 | Wird das Bildformat unterstützt? | Nur PNG/JPEG/WebP/GIF |
Schnellkorrektur: Wenn Sie diesen Fehler während der Entwicklung häufig erhalten, empfehlen wir, vor dem Senden der Anfrage eine
validate_payload()-Funktion hinzuzufügen, die automatisch jedes Element imparts-Array auf Gültigkeit prüft. Wenn Sie das Gemini-Bildmodell über die APIYI-Plattform apiyi.com aufrufen, ist das Anfrageformat mit der offiziellen REST API identisch, und die oben genannten Fehlerbehebungsmethoden gelten ebenfalls.
Gemini-Bildmodell-Fehler – Korrektes Anfrageformat als Referenz
Reine Text-zu-Bild-Erzeugung (Text-to-Image) – Korrektes Format
import requests, base64
API_KEY = "your-apiyi-api-key"
ENDPOINT = "https://api.apiyi.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent"
# ✅ Minimales korrektes Format
payload = {
"contents": [{
"parts": [
{"text": "Eine niedliche orange Katze sitzt auf einer Fensterbank, Aquarellstil, 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))
Bild-zu-Bild-Erzeugung (Image-to-Image) – Korrektes Format
Vollständigen korrekten Code für Bild-zu-Bild anzeigen
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"
# Quellbild lesen und in reines base64 konvertieren
image_path = pathlib.Path("input_photo.png")
if not image_path.exists():
raise FileNotFoundError(f"Bild nicht gefunden: {image_path}")
image_bytes = image_path.read_bytes()
image_b64 = base64.b64encode(image_bytes).decode("utf-8")
# Daten validieren
assert len(image_b64) > 0, "Base64-Daten sind leer"
assert not image_b64.startswith("data:"), "Data-URI-Präfix entfernen"
# ✅ Korrektes Anfrageformat für Bild-zu-Bild
payload = {
"contents": [{
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": image_b64
}
},
{
"text": "Ändere den Hintergrund zu einer Sonnenuntergangsstrandszene, behalte das Hauptmotiv unverändert"
}
]
}],
"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("Erfolg! Bild gespeichert.")
else:
print(f"Fehler {response.status_code}: {response.text}")
Empfehlung: Für Text-zu-Bild-Szenarien starte mit dem minimalen Format, bestätige, dass es funktioniert, und füge dann schrittweise Parameter hinzu. Der Aufruf von Nano Banana 2 über die APIYI-Plattform apiyi.com erfolgt nutzungsbasiert zu $0,045 pro Aufruf, die Kosten in der Debug-Phase sind sehr gering.
Häufig gestellte Fragen
Q1: Was bedeutet parts[2] in der Fehlermeldung?
parts[2] bezeichnet das Element am Index 2 im parts-Array, also das dritte Element (Indizes beginnen bei 0). Suche direkt in deinem Code nach dem dritten Element im contents[0].parts-Array und prüfe seinen Inhalt. Wenn dein parts-Array nur 2 Elemente hat (Index 0 und 1), bedeutet das, dass deine Code-Logik beim Zusammenstellen der Parts möglicherweise versehentlich ein leeres Element hinzugefügt hat.
Q2: Tritt dieser Fehler auch beim Aufruf über APIYI auf?
Ja. APIYI apiyi.com fungiert als API-Proxy-Dienst und leitet deine Anfrage unverändert an das Gemini-Backend weiter. Wenn der Anfragekörper selbst ein Formatproblem hat, gibt das Backend denselben 400-Fehler zurück. APIYI verändert die Struktur deines Anfragekörpers nicht, daher liegt es in der Verantwortung des Entwicklers, das korrekte Anfrageformat sicherzustellen. Die gute Nachricht ist, dass die Lösungsmethode dieselbe ist wie beim direkten Aufruf der Google-API.
Q3: Warum unterscheiden sich die Feldnamen im Python SDK und der REST API?
Das Google GenAI Python SDK folgt der snake_case-Namenskonvention von Python (z.B. inline_data, mime_type). Das SDK konvertiert diese intern automatisch in das von der API benötigte camelCase. Wenn du jedoch direkt mit der requests-Bibliothek die REST API aufrufst (auch über APIYI apiyi.com), musst du manuell das camelCase-Format verwenden (z.B. inlineData, mimeType), da die Felder sonst ignoriert werden und einen Fehler verursachen.
Q4: Ist dieser Fehler derselbe wie ‚contents.parts must not be empty‘?
Nicht ganz, aber die Ursache ist ähnlich. contents.parts must not be empty bedeutet, dass das parts-Array selbst leer ist ("parts": []). required oneof field 'data' hingegen bedeutet, dass das Array Elemente enthält, aber das Datenfeld eines dieser Elemente nicht initialisiert ist (z.B. "parts": [{}]). Der Lösungsansatz ist derselbe: Stelle sicher, dass jedes Part gültigen text oder inlineData enthält.
Zusammenfassung
Die Kernpunkte des Gemini-Bildmodell-Fehlers required oneof field 'data':
- Ursache: Das
parts-Array enthält leere Objekte, leere Daten oder falsch formatierte Elemente. - Lokalisierung: Nutzen Sie die Indexnummer
parts[N]aus der Fehlermeldung, um direkt die entsprechende Stelle im Code zu finden. - Häufigste Ursachen: Leeres Objekt
{}, Base64-Daten mitdata:-Präfix, falsche Groß-/Kleinschreibung bei JSON-Feldnamen. - REST API erfordert camelCase:
inlineData(nichtinline_data),mimeType(nichtmime_type). - Vorbeugung: Vor dem Senden eine Payload-Validierungsfunktion hinzufügen, um leere Elemente und Formatprobleme automatisch zu erkennen.
Empfohlen wird die Nutzung der APIYI-Plattform apiyi.com für die Entwicklung und das Debugging mit dem Gemini-Bildmodell. Nano Banana 2 kostet nur $0,045 pro Aufruf, was die Debugging-Kosten extrem niedrig hält. Das Schnittstellenformat ist vollständig kompatibel mit der offiziellen REST API.
📚 Referenzen
-
Offizielle Gemini API Dokumentation zur Bilderzeugung: Vollständige Anfrageformate und Parameterbeschreibungen.
- Link:
ai.google.dev/gemini-api/docs/image-generation - Beschreibung: Enthält Standardanfrageformate für Text-zu-Bild und Bild-zu-Bild.
- Link:
-
Gemini API Fehlerbehebungsleitfaden: Offizielle Fehlercodes und Lösungsvorschläge.
- Link:
ai.google.dev/gemini-api/docs/troubleshooting - Beschreibung: Deckt häufige Fehler wie 400, 429, 500 und deren Behebung ab.
- Link:
-
GitHub Issue: Diskussion zum Fehler
required oneof field data: Community-Berichte und Lösungsansätze.- Link:
github.com/google-gemini/cookbook/issues/786 - Beschreibung: Enthält eine detaillierte Analyse und Workarounds für diesen Fehler, der durch die Übergabe von File-Objekten verursacht wird.
- Link:
-
APIYI Nano Banana 2 Integrationsdokumentation: Vollständige Anleitung zur Nutzung des Gemini-Bildmodells über die APIYI-Plattform.
- Link:
docs.apiyi.com/en/api-capabilities/nano-banana-2-image - Beschreibung: Enthält korrekte Anfrageformat-Beispiele und Antworten auf häufig gestellte Fragen.
- Link:
Autor: APIYI Technikteam
Technischer Austausch: Bei Problemen mit Gemini API-Aufrufen besuchen Sie bitte das APIYI-Dokumentationszentrum unter docs.apiyi.com für weitere Fehlerbehebungsleitfäden.
