Генерация и редактирование изображений через GPT Image 2 API
GPT Image 2 API на apiToken.sale — это два маршрута: POST /v1/images/generations для новых ассетов и POST /v1/images/edits для редактирования по референсам. Оба работают с тем же Bearer-ключом и предоплаченным балансом, что ваши текстовые запросы к GPT. Usage тарифицируется по токенам вдвое дешевле официальных расценок OpenAI. В гайде — точные запросы, путь через SDK, реальная таблица цен и лимиты поверхности, которые стоит знать до релиза.
·
Маршрут генерации одним запросом
GPT Image 2 — image-модель на OpenAI-совместимой поверхности: отправьте промпт на /v1/images/generations с моделью gpt-image-2 и заголовком Authorization: Bearer — и получите в ответ один PNG. Ни отдельного image-тарифа, ни второго ключа: тот же sk-pool ключ и предоплаченный баланс, которыми оплачиваются запросы к GPT, Claude и Gemini, покрывают и генерацию изображений.
curl https://router.apitoken.sale/v1/images/generations \
-H "Authorization: Bearer $APITOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"prompt": "A precise technical cutaway of a lunar rover",
"quality": "low"
}'Официальные поля GPT Image принимаются и переводятся на этот пул. Лишние ключи (user, stream, moderation, style) игнорируются, а не дают 400. quality medium/high/auto всё равно генерирует на низком тарифе пула. output_format jpeg или webp транскодирует нативный PNG локально; omit или png оставляют PNG. response_format=url игнорируется — тело всегда b64_json. n может быть 1–10; каждый лишний кадр — ещё один нативный ход. background=auto это opaque; transparent добавляет cutout-фразу и просит настоящий PNG alpha — проверьте файл; отсутствие альфы всё равно HTTP 200, не 502. size выбирает пропорцию, не пиксельный замок. 2048x2048 и 3840x2160 мапятся в 1:1 и 16:9; PNG остаётся около 1,57 мегапикселей, а поле size в ответе — реальный IHDR.
| size | Proportion | Steer target (inspect the PNG) |
|---|---|---|
| omitted or auto | no size steer | typically ~1254×1254; not a lock |
| 1024x1024, 1:1, 2048x2048 | 1:1 | 1254×1254 |
| 1536x1024 or 3:2 | 3:2 landscape | 1536×1024 |
| 1024x1536 or 2:3 | 2:3 portrait | 1024×1536 |
| 4:3 | 4:3 | 1448×1086 |
| 16:9, 2048x1152, 3840x2160 | 16:9 | 1672×941 |
| 9:16, 2160x3840 | 9:16 | 944×1665 |
1024x1024 — квадратный бакет, а не фиксация 1024 пикселей. 1536x1024 и 1024x1536 — срезы 3:2 и 2:3 того же мегапиксельного бюджета. Таблица — цель prompt-steer. Если заголовок PNG не совпал с бакетом, API всё равно вернёт HTTP 200 и PNG — проверяйте IHDR и альфу в приёмке, а не рассчитывайте на 502.
POST /v1/images/* возвращает один PNG на вызов, без стриминга. Не стройте прогресс-UI вокруг этого маршрута. Для потоковых preview-кадров используйте отдельный Responses-инструмент image_generation с partial_images (ниже) — тривиальные промпты могут пропустить partials.
Читайте также: Стоимость GPT Image 2 API и скидка 50% для B2C
Редактирование изображений по пяти PNG, JPEG или WebP референсам
Редактирование уходит на другой маршрут и с другим content type. Отправьте multipart/form-data на /v1/images/edits с той же моделью gpt-image-2, промптом и от одного до пяти PNG, JPEG или WebP (каждый файл ≤50 MB). Референсы — способ попросить точечное изменение: переосветить этот предметный кадр, заменить этот фон, расширить этот баннер — вместо генерации с нуля.
curl https://router.apitoken.sale/v1/images/edits \ -H "Authorization: Bearer $APITOKEN_API_KEY" \ -F "model=gpt-image-2" \ -F "prompt=Replace the backdrop with a seamless light-gray studio sweep" \ -F "image=@packshot.png" \ -F "image=@brand-swatch.png"
- Повторяйте имя поля image для каждого файла или отправьте image[]. Multipart mask на этом маршруте игнорируется — inpaint через Responses input_image_mask.
- Референсы — PNG, JPEG или WebP, каждый не больше 50 MB. GIF, HEIC и прочие типы отклоняются.
- Лимит — пять референсов на вызов: выбирайте те немногие, что несут инструкцию, а не выгружайте всю библиотеку ассетов.
- Каждый референс тарифицируется как image input, поэтому редактирование стоит дороже генерации того же результата по чистому промпту.
- Формат ответа совпадает с генерацией: один PNG на вызов, без стриминга.
Более глубокие сценарии редактирования: маски, батчи и приёмочные проверки →
Inpaint области и Responses image_generation
Не отправляйте multipart-поле mask на /v1/images/edits. Это поле отклоняется, а URL редактирования ChatGPT его всё равно игнорирует. Чтобы изменить только часть картинки — или вызвать hosted-инструмент image_generation с текстовой GPT-модели — используйте POST /v1/responses (Chat Completions мапит те же hosted-инструменты на Responses). Исходный PNG в input как input_image при правке, tools: [{type:"image_generation", …}]. Для маски — input_image_mask.image_url как PNG data URL. Прозрачные пиксели маски — зона правки, непрозрачные остаются. Маска того же размера, что исходник. file_id не поддерживается: Files API на этой плоскости нет.
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")},
}],
)- Текстовая GPT-модель на /v1/responses или /v1/chat/completions (например gpt-5.6-sol), не gpt-image-2 — этот id принадлежит маршрутам Images.
- Исходник и маска — только data:image/png;base64,…, не https:// и не OpenAI file id.
- Responses image_generation пробрасывает output_format jpeg или webp и partial_images 1..=3; SSE отдаёт response.image_generation_call.partial_image, когда partials приходят.
- background=transparent переписывается в opaque, input_fidelity отбрасывается — эти поля дают 400 на этом ChatGPT image tool. Quality/size на инструменте всё ещё ремапятся; completed item эхо того, что вернул ChatGPT.
- Маска не тарифицируется как второй референс; settlement идёт по image-input и image-output токенам хода.
- Отдельные маршруты POST /v1/images/* по-прежнему принимают только PNG на выходе и не стримят partials — не смешивайте два контракта.
Вызов через официальный OpenAI SDK
Официальный SDK OpenAI можно оставить. base_url и api_key — как для текстовых моделей. Лишние ключи (user, stream, moderation) игнорируются. response_format=url всё равно вернёт b64_json. size=2048x2048 принимается и переводится в квадратную пропорцию; PNG не 2K пикселей — читайте size в ответе.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["APITOKEN_API_KEY"],
base_url="https://router.apitoken.sale/v1",
)
result = client.images.generate(
model="gpt-image-2",
prompt="A clean isometric diagram of a wind turbine",
quality="low",
size="3:2",
)
png_bytes = result.data[0].b64_json # decode base64 and write to diskДля редактирования тот же клиент предоставляет images.edits — референс-файлы открываются в бинарном режиме. Держите ключ в серверной переменной окружения: image-endpoints так же чувствительны, как chat, потому что списывают с того же баланса.
Сколько на самом деле стоит генерация
Честной фиксированной цены за картинку нет. GPT Image 2 тарифицируется по токенам через четыре составляющие usage — text input (ваш промпт), image input (референсы при редактировании), cached input и image output, — а итог запроса определяется финальным usage, который возвращает API, а не размером или разрешением PNG.
| Составляющая | Официально за 1 млн токенов | Цена здесь |
|---|---|---|
| Text input, некэшированный | $5 | $2.50 |
| Image input, некэшированный | $8 | $4 |
| Text input, кэшированный | $1.25 | $0.625 |
| Image input, кэшированный | $2 | $1 |
| Image output | $30 | $15 |
- На каждую составляющую действует плоская B2C-скидка 50%; кэшированный text и image input тарифицируются по 25% обычной input-ставки ещё до применения скидки.
- Читайте объект usage в каждом ответе и логируйте его рядом с ассетом — это биллинговый авторитет, именно с ним сверяется списание в дашборде.
- gpt-image-2 — алиас иммутабельного снапшота gpt-image-2-2026-04-21, поэтому поведение не плывёт между вызовами; зафиксируйте датированный ID, если хотите эту гарантию явно в коде.
Не выводите цену за изображение на своей странице тарифов по паре тестовых рендеров. Output usage меняется от ассета к ассету, и число, полученное из трёх примеров, в проде окажется неверным. Просуммируйте составляющие по реальному usage за неделю — и решайте.
Лимиты текущей image-поверхности
Планируйте от того, что маршрут доказуемо умеет сегодня, а не от того, что обещает маркетинговое имя. Подтверждённый профиль намеренно узкий:
- POST /v1/images/* без стриминга. n=1..10 запускает столько последовательных нативных ходов и тарифицирует их все. n>10 режется до 10.
- Лишние JSON-ключи игнорируются. openai/gpt-image-2 принимается как gpt-image-2. GET /v1/models перечисляет два id и image-маршруты.
- size — пропорция: 2K/4K строки мапятся в 1:1 или 16:9, PNG остаётся ~1,57 Мп. quality medium/high всё равно low. jpeg/webp — локальный транскод. background=transparent — cutout в промпте.
- Разобранный PNG с terminal usage — HTTP 200, даже если size или альфа не совпали со steer. Единственный post-success 502 на этом маршруте — отсутствие usage после PNG.
- Редактирование принимает от одного до пяти PNG, JPEG или WebP (каждый ≤50 MB). image[] = image. mask игнорируется; inpaint области — Responses image_generation выше.
- Image usage списывается с того же предоплаченного баланса, что запросы к GPT, Claude и Gemini: следить нужно за одним пулом, а не за четырьмя.
Если для сравнения нужна другая image-модель, маршрут на стороне Gemini задокументирован рядом с этим, а в сравнительном гайде разобрано, где какая модель сильнее.
Как удержать расходы на изображения в рамках на общем балансе
Image output — самая дорогая составляющая, а батч-циклы её умножают, поэтому выделите image-воркеру отдельный API-ключ с общим лимитом расходов (lifetime). Тогда уехавшая джоба рендеринга упрётся в собственный потолок, а не сольёт баланс, от которого зависит chat-трафик, а usage по ключам в дашборде точно покажет, какой воркер сколько потратил.
- 01Создайте в дашборде отдельный ключ для image-пайплайна и установите его общий лимит расходов равным бюджету батча.
- 02Отправьте один ограниченный запрос на генерацию (curl выше) и проверьте возвращённый PNG плюс объект usage с ожидаемыми составляющими.
- 03Прогоните свой реальный набор промптов в небольшом цикле, запишите финальный usage по каждому ассету и сверьте сумму со списанием в дашборде.
- 04Только после этого масштабируйтесь до полного объёма батча, держа лимит ключа в соответствии с реально утверждённым бюджетом.
Частые вопросы
Какой endpoint использует GPT Image 2 API?
POST /v1/images/generations для нового изображения и POST /v1/images/edits для редактирования по референсам — оба на OpenAI-совместимом base URL https://router.apitoken.sale/v1 с заголовком Authorization: Bearer.
Умеет ли GPT Image 2 редактировать существующее изображение?
Да. Маршрут edits принимает multipart/form-data с одним-пятью PNG, JPEG или WebP (каждый ≤50 MB) и промптом. Повторяйте имя поля image или отправьте image[]. Multipart mask игнорируется; inpaint области — Responses input_image_mask.
Как закрасить только часть изображения?
POST /v1/responses с текстовой GPT-моделью, исходный PNG как input_image и tools: [{type:"image_generation", input_image_mask:{image_url:"data:image/png;base64,…"}}]. Можно задать output_format jpeg|webp и partial_images 1..=3. Прозрачные пиксели маски — зона правки. Не отправляйте mask на /v1/images/edits и не используйте file_id. Chat Completions мапит тот же image_generation на Responses.
Какой точный model ID у GPT Image 2?
Используйте gpt-image-2 — алиас иммутабельного снапшота gpt-image-2-2026-04-21. Зафиксируйте датированный ID в коде, если хотите снапшот прописанным явно.
Сколько стоит одно изображение в GPT Image 2?
Фиксированной цены за изображение нет: биллинг идёт по финальному usage — text input ($5/1M официально), image input ($8/1M), cached input (25% от некэшированного) и image output ($30/1M) — с плоской скидкой 50% на каждую составляющую здесь: $2.50, $4 и $15 за 1M соответственно.
Поддерживает ли GPT Image 2 прозрачный фон или стриминг?
На POST /v1/images/*: прозрачный фон как запрос — да, стриминг — нет; background=transparent просит PNG с альфой; omit/opaque — сплошной; без альфы всё равно HTTP 200. На Responses image_generation: background=transparent переписывается в opaque; для SSE preview используйте partial_images 1..=3 (response.image_generation_call.partial_image).
Можно ли задать размер изображения?
Задаёте пропорцию, не 2K/4K пиксели. omitted или auto обычно около 1254×1254. 1024x1024, 1:1 и 2048x2048 направляют в квадрат; 3840x2160 — в 16:9. Поле size в ответе — IHDR PNG, не запрос. Если заголовок другой, API всё равно вернёт HTTP 200.
Нужны ли для генерации изображений отдельный ключ или баланс?
Нет. Используются тот же Bearer-ключ и предоплаченный баланс, что для всех остальных поддерживаемых моделей, — включая GPT, Claude и Gemini, — хотя для батч-воркеров с изображениями разумен отдельный ключ с общим лимитом расходов.
Создайте аккаунт через Google или GitHub и протестируйте шлюз с бонусом $5 на балансе платформы.