NanoBanana Pro Edit
L’édition d’images utilise la même API Gemini (generateContent) que la génération d’images NanoBanana Pro. Vous envoyez l’image d’origine + l’instruction d’édition dans la requête et recevez l’image éditée dans la réponse. Voir Documentation Gemini : Édition d’images.
Point de terminaison : Identique à la génération : POST https://aiberm.com/v1beta/models/gemini-3-pro-image-preview:generateContent.
Points clés : Placez une partie image (inlineData) et une partie texte (instruction d’édition) dans contents ; définissez generationConfig.responseModalities sur ["TEXT", "IMAGE"] pour obtenir l’image éditée ; lisez le résultat depuis candidates[0].content.parts → inline_data.
Exemple de code
Python utilise snake_case ; REST/cURL utilise camelCase. Même signification.
1from google import genai2from google.genai import types3from PIL import Image4from io import BytesIO5 6base_url = "https://aiberm.com"7api_key = "YOUR_API_KEY"8model = "gemini-3-pro-image-preview"9output_file = "edited.png"10 11image_path = "original.png"12edit_prompt = "Add a stylish top hat to this image, keep the rest unchanged."13 14client = genai.Client(15 api_key=api_key,16 http_options=types.HttpOptions(api_version="v1beta", base_url=base_url),17)18image = Image.open(image_path)19 20response = client.models.generate_content(21 model=model,22 contents=[edit_prompt, image],23 config=types.GenerateContentConfig(24 response_modalities=["TEXT", "IMAGE"],25 ),26)27 28for part in response.parts:29 if part.text is not None:30 print(part.text)31 elif part.inline_data is not None:32 Image.open(BytesIO(part.inline_data.data)).save(output_file)33 print(f"Saved edited image: {output_file}")Éditer vs générer
| Générer (NanoBanana Pro) | Éditer (cette page) | |
|---|---|---|
contents | Texte uniquement (décrire l’image à créer) | Image + texte (décrire comment éditer) |
generationConfig.imageConfig | Obligatoire (rapport d’aspect, 1K/2K/4K) | Optionnel pour l’édition |
responseModalities | ["IMAGE"] ou ["TEXT","IMAGE"] | En général ["TEXT","IMAGE"] |
Même point de terminaison et même authentification ; seuls contents et le fait de passer ou non imageConfig diffèrent. Pour plus de paramètres, voir NanoBanana Pro.
Images multiples
Placez plusieurs parties image dans contents.parts (un inlineData par image), puis une partie texte avec l’instruction d’édition. Le modèle utilise toutes les images et l’instruction pour produire le résultat (par ex. « composer le sujet de la première image sur l’arrière-plan de la seconde »).
Python : passez plusieurs objets image et un texte dans contents.
image1 = Image.open("photo.png")
image2 = Image.open("background.png")
response = client.models.generate_content(
model=model,
contents=["Place the person from the first image onto the background of the second.", image1, image2],
config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
)
cURL : dans contents[0].parts, ajoutez un inlineData par image, puis un text.
"contents": [{
"parts": [
{ "inlineData": { "mimeType": "image/png", "data": "<BASE64_IMAGE1>" }},
{ "inlineData": { "mimeType": "image/png", "data": "<BASE64_IMAGE2>" }},
{ "text": "Place the person from the first image onto the background of the second." }
]
}]
Utiliser une URL d’image
L’API n’accepte que inlineData (base64) ou fileData (via l’API File) ; elle n’accepte pas directement les URL d’images. Pour les images à une URL, téléchargez-les d’abord puis incluez-les dans la requête.
Python : téléchargez depuis l’URL et passez l’image au SDK (le SDK l’encodera si nécessaire).
import requests
from io import BytesIO
image_url = "https://example.com/photo.jpg"
resp = requests.get(image_url)
image = Image.open(BytesIO(resp.content))
response = client.models.generate_content(
model=model,
contents=["Add a top hat to this image.", image],
config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
)
cURL : téléchargez l’image depuis l’URL, convertissez-la en base64, puis placez le résultat dans inlineData.data.