Редактирование изображений через GPT Image 2 или Nano Banana 2
GPT Image 2 предоставляет multipart edit route: PNG, JPEG или WebP на входе, один base64 PNG на выходе. Nano Banana 2 принимает references как native multimodal input — больше форматов, больше изображений, явные размеры. Выбирайте по reference contract, который pipeline умеет валидировать, и считайте деньги по terminal usage.
·
Выберите route под ваш reference contract
Image edit — это generation request, который несёт reference images как billable input и prompt с одним разрешённым изменением. Один prepaid-ключ apiToken.sale открывает оба production edit routes: GPT Image 2 на OpenAI Images edits endpoint принимает 1–5 PNG, JPEG или WebP (каждый ≤50 MB) и возвращает один non-streaming base64 PNG, а Nano Banana 2 (модель gemini-3.1-flash-image) на native Gemini generateContent route принимает до 14 references в PNG, JPEG, WEBP, HEIC или HEIF и отвечает image inlineData part. Выбирайте по reference contract, который приложение умеет валидировать, а не по бренду.
| Возможность | GPT Image 2 | Nano Banana 2 |
|---|---|---|
| Route | POST /v1/images/edits (multipart) | generateContent с inlineData parts |
| References | 1–5 | до 14 |
| Input files | PNG, JPEG, WebP; каждый ≤50 MB | PNG, JPEG, WEBP, HEIC, HEIF |
| Output | один non-streaming base64 PNG | image inlineData part |
| Region inpaint | POST /v1/responses image_generation (+ jpeg/webp, partial_images) | prompt + reference parts в generateContent |
| Published controls | background opaque или transparent, quality low, size as proportion (auto/1:1/3:2/2:3/4:3/16:9/9:16) | 1K/2K/4K + published aspect ratios |
Эти protocols невзаимозаменяемы. Client, написанный под OpenAI Images schema, не разберёт Gemini inlineData response. GPT Image 2 edits принимают PNG, JPEG или WebP до 50 MB и всё равно возвращают один PNG. Закрепите route за классом ассетов на design stage: смена protocol внутри retry loop ломает и parsing output, и cost attribution.
Читайте также: Генерация и редактирование изображений через GPT Image 2 API
Edit через GPT Image 2: PNG, JPEG или WebP на входе, один base64 PNG на выходе
Edits endpoint — это multipart form data: model, prompt и по одному image-полю на reference. Published profile: background opaque или transparent, quality low, size как пропорция (auto, 1024x1024/1:1, 1536x1024/3:2, 1024x1536/2:3, 4:3, 16:9, 9:16). Response — один JSON с одним base64 PNG. 2K/4K и прочие pixel sizes отклоняются.
curl https://router.apitoken.sale/v1/images/edits \ -H "Authorization: Bearer $APITOKEN_API_KEY" \ -F "model=gpt-image-2" \ -F "prompt=Replace only the background with a neutral studio backdrop; keep the product untouched" \ -F "image=@reference.png;type=image/png" \ -F "background=opaque" \ -F "quality=low" \ -F "size=auto"
Повторяйте имя поля image для каждого референса или отправьте image[]. Multipart mask на /v1/images/edits игнорируется; inpaint — Responses input_image_mask.
// Response (abridged): decode data[0].b64_json into a PNG file.
{
"data": [
{ "b64_json": "<BASE64 PNG>" }
]
}Декодирование payload не завершает request. Сохраните request ID и terminal usage рядом с source и result: размер PNG в байтах — не формула цены, billing authority — terminal usage event, и именно с ним сверяется charge в дашборде.
Inpaint области: маска в Responses, не в Images
Multipart-поле mask на POST /v1/images/edits отклоняется. Форма OpenAI Images на этом пуле ChatGPT недоступна. Чтобы изменить только часть картинки — или вызвать hosted image_generation с текстовой GPT — вызовите POST /v1/responses (Chat Completions мапит тот же инструмент): исходный PNG в input как input_image и tools: [{type:"image_generation", …}]. Для маски — input_image_mask.image_url как data:image/png;base64,…. Маска того же размера, что исходник. Прозрачные пиксели — зона правки, непрозрачные остаются. Responses также пробрасывает output_format jpeg/webp и partial_images 1..=3 (SSE response.image_generation_call.partial_image); background=transparent → opaque, input_fidelity отбрасывается. file_id не работает: Files API здесь нет. Биллинг по image-токенам; маска не второй референс. Отдельные POST /v1/images/* по-прежнему отдают только non-streaming PNG.
import base64, os
from pathlib import Path
from openai import OpenAI
client = OpenAI(
api_key=os.environ["APITOKEN_API_KEY"],
base_url="https://router.apitoken.sale/v1",
)
def png_url(path):
return "data:image/png;base64," + base64.b64encode(Path(path).read_bytes()).decode()
response = client.responses.create(
model="gpt-5.6-sol",
input=[{
"role": "user",
"content": [
{"type": "input_text", "text": "Change only the masked region."},
{"type": "input_image", "image_url": png_url("photo.png")},
],
}],
tools=[{
"type": "image_generation",
"output_format": "webp",
"partial_images": 2,
"input_image_mask": {"image_url": png_url("mask.png")},
}],
)Edit через Nano Banana 2: references как multimodal input
У Nano Banana 2 нет отдельного edits endpoint. Edit — это обычный вызов generateContent, чей parts array смешивает instruction text с одним inline_data part на reference — до 14 поддерживаемых изображений. Поскольку reference — просто ещё один part, JPEG или WEBP фото каталога отправляются без конвертации, что реально упрощает pipeline, когда архив источников не в PNG.
curl https://router.apitoken.sale/v1beta/models/gemini-3.1-flash-image:generateContent \
-H "x-goog-api-key: $APITOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d @edit-request.json
// edit-request.json
{
"contents": [{
"parts": [
{ "text": "Replace only the background with a neutral studio backdrop; keep the product untouched" },
{ "inline_data": { "mime_type": "image/jpeg", "data": "<BASE64 REFERENCE>" } }
]
}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": { "imageSize": "1K", "aspectRatio": "1:1" }
}
}generationConfig фиксирует output contract: responseModalities TEXT плюс IMAGE, явный imageSize 0.5K, 1K, 2K или 4K и один из published aspect ratios. Response содержит собственный parts array: изображение приходит как inlineData part с MIME type и base64 payload рядом с возможными text parts. Для самого дешёвого живого размера передайте 0.5K или 512; subscription wire использует 512.
Запускайте edits как validated pipeline
- 01Нормализуйте и проверяйте каждую reference на server-side: декодируйте файл, подтвердите supported MIME type и отклоняйте empty или oversized payloads до любого paid call.
- 02Напишите edit brief, отделяющий immutable traits — product geometry, logo, label text — от единственного named change: одно изменение на request делает failures диагностируемыми.
- 03Выберите route, чей output contract умеет декодировать ваш client, и никогда не смешивайте inlineData parsing с OpenAI Images parsing.
- 04Отправляйте один bounded candidate на source asset; не запускайте paid variants, пока первый output не прошёл review.
- 05Валидируйте доставленное изображение — format, plausible dimensions, product identity и отсутствие prohibited changes — до того, как его увидит downstream.
- 06Сохраняйте request ID, terminal usage, prompt version, source и result вместе: эта запись — одновременно rollback path и cost attribution.
Расчёт стоимости edits по published rates
Для обычных B2C-аккаунтов обе модели тарифицируются ровно в 50% от official usage total. GPT Image 2 считает по токенам: $2.50 за 1M fresh text input, $4 за 1M fresh image input и $15 за 1M image output после скидки, а cached input признаётся как четверть fresh rate до скидки. Каждая приложенная reference — это billable image input, поэтому число references является cost control, а не только quality control.
| Пример расчёта | Что тарифицируется | Итог для обычного B2C |
|---|---|---|
| Edit GPT Image 2 с 1,200 text-input, 4,000 image-input и 4,200 image-output tokens | (1,200 × $2.50 + 4,000 × $4 + 4,200 × $15) / 1M | $0.082 settled |
| Edit Nano Banana 2 в 1K | фиксированные 1,120 image-output tokens + измеренный input | $0.0336 image output + input |
| Edit Nano Banana 2 в 4K | фиксированные 2,520 image-output tokens + измеренный input | $0.0756 image output + input |
Числа токенов в первой строке — иллюстрация, а не тариф: output usage GPT Image 2 меняется от запроса к запросу, и авторитетен только terminal usage. Nano Banana 2 устроен противоположно: image-output leg фиксирован размером ($0.0336 за 1K, $0.0504 за 2K, $0.0756 за 4K после B2C-скидки), а text input, reference image input и возможный text/thinking output остаются переменными. Edit обычно дороже prompt-only generation по input; это окупается, когда хорошая reference повышает acceptance rate и убирает retries.
Все ставки за tokens, из которых складывается счёт за edit →
Дисциплина стоимости и retries
- Отправляйте только references, которые ограничивают requested edit: каждая — billable image input на обоих routes.
- Никогда не делайте automatic replay edit после ambiguous timeout: provider мог завершить работу, а blind retry — это второй paid render. Сначала проведите reconciliation по request ID.
- Ограничьте variants и attempts на source asset и позвольте quality gate завершать loop: скидка 50% делит цену waste пополам, но не устраняет его.
- Выдайте image-editing worker отдельный ключ с lifetime spending limit в стороне от experiments, чтобы batch bug не опустошил общий баланс.
- Оценивайте до траты: countTokens на gemini-3.1-flash-image бесплатно измеряет input, а новые аккаунты через Google или GitHub получают welcome bonus $5, которого хватает на ранние тесты pipeline.
Частые вопросы
Какой API принимает больше references?
Nano Banana 2 принимает до 14 поддерживаемых image inputs на generateContent route. GPT Image 2 edits route принимает 1–5 PNG, JPEG или WebP (каждый ≤50 MB).
Может ли GPT Image 2 напрямую редактировать JPEG или WEBP references?
Edits принимают PNG, JPEG или WebP, каждый не больше 50 MB. GIF, HEIC и прочие типы отклоняются. На выходе по-прежнему один PNG. Nano Banana 2 — если нужны HEIC/HEIF или больше пяти референсов.
Edits дороже prompt-only generation?
Они добавляют billable image input, поэтому comparable edit обычно дороже по input. Но он может быть дешевле per accepted asset, если references повышают acceptance rate и убирают retries: считайте settled cost на принятый ассет, а не на request.
Безопасно ли retry edit после timeout?
Только если доказано, что prior attempt не был принят. Ambiguous timeout может скрывать завершённую работу provider; сохраните request ID и проведите reconciliation до нового paid attempt — иначе retry станет вторым paid render той же задачи.
Как выглядит response редактирования на каждом route?
GPT Image 2 возвращает один JSON-документ с единственным base64 PNG в data[0].b64_json. Nano Banana 2 возвращает Gemini candidates structure, где изображение — inlineData part с MIME type и base64 payload. Ни один route не даёт hosted URL: декодируйте, валидируйте и сохраняйте байты самостоятельно.
Как дёшево протестировать edit routes?
Зарегистрируйтесь через Google или GitHub и получите welcome bonus $5, запускайте GPT Image 2 в published low/auto profile и используйте countTokens, чтобы оценить input Nano Banana 2 до рендера изображения. Проверяйте весь pipeline на 1K, прежде чем резервировать 2K или 4K output.
Создайте аккаунт через Google или GitHub и протестируйте шлюз с бонусом $5 на балансе платформы.