NanoBanana Pro Edit

La edición de imágenes usa la misma API de Gemini (generateContent) que la generación de imágenes de NanoBanana Pro. Envías la imagen original + la instrucción de edición en la solicitud y recibes la imagen editada en la respuesta. Consulta documentación de Gemini: Image editing.

Endpoint: El mismo que para generación: POST https://aiberm.com/v1beta/models/gemini-3-pro-image-preview:generateContent.

Puntos clave: Coloca una parte de imagen (inlineData) y una parte de texto (instrucción de edición) en contents; define generationConfig.responseModalities como ["TEXT", "IMAGE"] para obtener la imagen editada; lee el resultado de candidates[0].content.partsinline_data.

Código de ejemplo

Python usa snake_case; REST/cURL usa camelCase. El significado es el mismo.

1from google import genai
2from google.genai import types
3from PIL import Image
4from io import BytesIO
5 
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}")

Editar vs generar

Generar (NanoBanana Pro)Editar (esta página)
contentsSolo texto (describe la imagen que se va a crear)Imagen + texto (describe cómo editar)
generationConfig.imageConfigObligatorio (relación de aspecto, 1K/2K/4K)Opcional para editar
responseModalities["IMAGE"] o ["TEXT","IMAGE"]Por lo general ["TEXT","IMAGE"]

Mismo endpoint y autenticación; solo cambian contents y si pasas imageConfig. Para más parámetros, consulta NanoBanana Pro.

Varias imágenes

Coloca varias partes de imagen en contents.parts (un inlineData por imagen) y luego una parte de texto con la instrucción de edición. El modelo usa todas las imágenes y la instrucción para producir el resultado (p. ej., “compón el sujeto de la primera imagen sobre el fondo de la segunda”).

Python: pasa varios objetos de imagen y un texto en 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: en contents[0].parts, agrega un inlineData por imagen y luego 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." }
  ]
}]

Usar una URL de imagen

La API solo acepta inlineData (base64) o fileData (a través de la File API); no acepta URLs de imagen de forma directa. Para imágenes en una URL, descárgalas primero e inclúyelas luego en la solicitud.

Python: descarga desde la URL y pasa la imagen al SDK (el SDK la codificará según sea necesario).

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: descarga la imagen desde la URL, conviértela a base64 y luego coloca el resultado en inlineData.data.