Настройка инструментов

Редактирование изображений через 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 2Nano Banana 2
RoutePOST /v1/images/edits (multipart)generateContent с inlineData parts
References1–5до 14
Input filesPNG, JPEG, WebP; каждый ≤50 MBPNG, JPEG, WEBP, HEIC, HEIF
Outputодин non-streaming base64 PNGimage inlineData part
Region inpaintPOST /v1/responses image_generation (+ jpeg/webp, partial_images)prompt + reference parts в generateContent
Published controlsbackground 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

  1. 01Нормализуйте и проверяйте каждую reference на server-side: декодируйте файл, подтвердите supported MIME type и отклоняйте empty или oversized payloads до любого paid call.
  2. 02Напишите edit brief, отделяющий immutable traits — product geometry, logo, label text — от единственного named change: одно изменение на request делает failures диагностируемыми.
  3. 03Выберите route, чей output contract умеет декодировать ваш client, и никогда не смешивайте inlineData parsing с OpenAI Images parsing.
  4. 04Отправляйте один bounded candidate на source asset; не запускайте paid variants, пока первый output не прошёл review.
  5. 05Валидируйте доставленное изображение — format, plausible dimensions, product identity и отсутствие prohibited changes — до того, как его увидит downstream.
  6. 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 на балансе платформы.