NanoBanana Pro Edit

A edição de imagens usa a mesma API Gemini (generateContent) que a geração de imagens do NanoBanana Pro. Você envia a imagem original + a instrução de edição na solicitação e recebe a imagem editada na resposta. Consulte documentação do Gemini: Image editing.

Endpoint: O mesmo da geração: POST https://aiberm.com/v1beta/models/gemini-3-pro-image-preview:generateContent.

Pontos-chave: Coloque uma parte de imagem (inlineData) e uma parte de texto (instrução de edição) em contents; defina generationConfig.responseModalities como ["TEXT", "IMAGE"] para obter a imagem editada; leia o resultado em candidates[0].content.partsinline_data.

Exemplo de código

O Python usa snake_case; REST/cURL usa camelCase. O significado é o mesmo.

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 versus gerar

Gerar (NanoBanana Pro)Editar (esta página)
contentsSomente texto (descreva a imagem a ser criada)Imagem + texto (descreva como editar)
generationConfig.imageConfigObrigatório (proporção, 1K/2K/4K)Opcional na edição
responseModalities["IMAGE"] ou ["TEXT","IMAGE"]Normalmente ["TEXT","IMAGE"]

O mesmo endpoint e a mesma autenticação; apenas contents e o fato de você passar ou não imageConfig são diferentes. Para mais parâmetros, consulte NanoBanana Pro.

Várias imagens

Coloque várias partes de imagem em contents.parts (um inlineData por imagem) e, em seguida, uma parte de texto com a instrução de edição. O modelo usa todas as imagens e a instrução para produzir o resultado (por exemplo, “compose the subject from the first image onto the background of the second”).

Python: passe vários objetos de imagem e um texto em 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: em contents[0].parts, adicione um inlineData por imagem e, em seguida, um 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 uma URL de imagem

A API aceita apenas inlineData (base64) ou fileData (pela File API); ela não aceita URLs de imagem diretamente. Para imagens em uma URL, baixe-as primeiro e depois inclua-as na solicitação.

Python: baixe da URL e passe a imagem para o SDK (o SDK a codificará conforme necessário).

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: baixe a imagem da URL, converta-a para base64 e coloque o resultado em inlineData.data.