NanoBanana Pro Edit

Редактирование изображений использует тот же Gemini API (generateContent), что и генерация в NanoBanana Pro. Вы отправляете в запросе исходное изображение + инструкцию по правке и получаете отредактированное изображение в ответе. См. документацию Gemini: Image editing.

Эндпоинт: тот же, что и для генерации: POST https://aiberm.com/v1beta/models/gemini-3-pro-image-preview:generateContent.

Главное: поместите часть с изображением (inlineData) и текстовую часть (инструкцию по правке) в contents; задайте generationConfig.responseModalities как ["TEXT", "IMAGE"], чтобы получить отредактированное изображение; результат читайте из candidates[0].content.partsinline_data.

Пример кода

В Python используется snake_case; в REST/cURL — camelCase. Смысл тот же.

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}")

Редактирование и генерация

Генерация (NanoBanana Pro)Редактирование (эта страница)
contentsТолько текст (описание изображения, которое нужно создать)Изображение + текст (как именно править)
generationConfig.imageConfigОбязательно (соотношение сторон, 1K/2K/4K)Для правки необязательно
responseModalities["IMAGE"] или ["TEXT","IMAGE"]Обычно ["TEXT","IMAGE"]

Эндпоинт и аутентификация те же; отличаются только contents и то, передаёте ли вы imageConfig. Остальные параметры см. в NanoBanana Pro.

Несколько изображений

Поместите несколько частей с изображениями в contents.parts (по одному inlineData на изображение), затем одну текстовую часть с инструкцией. Модель использует все изображения и инструкцию, чтобы получить результат (например, «перенести объект с первого изображения на фон второго»).

Python: передайте несколько объектов изображений и один текст в 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: в contents[0].parts добавьте по одному inlineData на изображение, затем один 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." }
  ]
}]

Использование URL изображения

API принимает только inlineData (base64) или fileData (через File API); URL изображений напрямую не принимаются. Если изображение доступно по URL, сначала скачайте его, затем включите в запрос.

Python: скачайте изображение по URL и передайте его в SDK (SDK закодирует его при необходимости).

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: скачайте изображение по URL, преобразуйте в base64 и поместите результат в inlineData.data.