Перейти к содержанию

Endpoint OpenAI Image Generation API: какой выбрать

Одна картинка — POST /v1/images/generations с gpt-image-2.5, правки — /v1/images/edits, Responses — для диалогов. По gen_id из ChatGPT API картинку не отдаёт.

•••12 мин чтения•Руководства по API
Схема прямого Images API и инструмента image_generation в Responses

У публичного API OpenAI для изображений по состоянию на 9 октября 2026 года ровно два живых endpoint: POST https://api.openai.com/v1/images/generations для генерации по текстовому запросу и POST https://api.openai.com/v1/images/edits для правок по одному или нескольким входным изображениям. Третий путь — инструмент image_generation в Responses API — нужен только тогда, когда картинка является одним шагом более длинного диалога или агентного процесса. В поле model сегодня ставят gpt-image-2.5-sunburst или gpt-image-2.5-flare; gpt-image-1 отключается 23 октября 2026 года, gpt-image-1.5 — 1 декабря.

Второй частый вопрос звучит иначе: «у меня есть gen_id (или parent_gen_id, referenced_image_ids, asset_pointer) из переписки с ChatGPT — какой endpoint отдаст мне картинку?» Ответ короткий: такого endpoint нет. Эти поля живут внутри продукта ChatGPT, ни один метод публичного API их не принимает, а модели GPT Image возвращают изображение только в теле ответа в base64 — повторно получить его по идентификатору нельзя. Где физически лежит изображение на каждой поверхности и какой поддерживаемый путь остаётся, разобрано в разделе про gen_id.

Какой endpoint выбрать: два пути Images API и инструмент в Responses

Таблица маршрутов /v1/images/generations, /v1/images/edits и инструмента image_generation в Responses

Правило выбора не изменилось со времён gpt-image-1, изменились только идентификаторы моделей. Руководство по генерации изображений называет два основных способа: Image API, «если нужно сгенерировать или отредактировать одно изображение по одному запросу», и Responses API с инструментом image_generation для диалогов и многошаговых сценариев. Из моделей руководство называет только две актуальные: gpt-image-2.5-sunburst (когда важнее точность правок) и gpt-image-2.5-flare (быстрая повседневная генерация).

ЗадачаПоверхностьПуть или вызов SDKЧто ставить в modelКогда начинать с этогоТипичная ошибка
Одна картинка по текстовому запросуImages APIPOST /v1/images/generations, client.images.generate()gpt-image-2.5-sunburst или gpt-image-2.5-flareнужен самый короткий путь до первого результатаидти в Responses только потому, что он кажется новее
Правка, расширение или композиция готовых изображенийImages APIPOST /v1/images/edits, client.images.edit()те же модели; без model на edits подставляется gpt-image-2.5-sunburstуже есть входные файлысчитать, что для правок обязательно нужен Responses
Картинка — один шаг диалога или агентаResponses API + инструмент image_generationclient.responses.create()в верхнем model — основная текстовая модель, image-модель задаётся внутри инструментанужны контекст диалога, цепочка правок и другие инструменты в одном запросеставить gpt-image-2.5-* в верхний model

Третьего пути в Images API больше нет: POST /v1/images/variations отключён, в справочнике Images API он помечен «This endpoint is retired and no longer available». Вариации делают через edits с моделью GPT Image и текстовым запросом. Метода GET или «retrieve» для изображений в справочнике тоже нет — это ключевой факт для вопроса о gen_id ниже.

Если первый вопрос у вас не «какой endpoint», а «какой ID модели», короткий ответ есть в таблице выше, а про различия 2.5 и gpt-image-2 написано в статье GPT Image 2 API и Codex: сначала выберите маршрут.

POST /v1/images/generations: первый запрос с gpt-image-2.5-sunburst

Первый запрос стоит сделать намеренно скучным: один запрос, квадратный размер, одна актуальная модель. Так проверяются сразу ключ, проект, доступ к модели и форма тела запроса, и ничего лишнего не мешает найти причину сбоя. Модель на generations указывается обязательно — значения по умолчанию у этого endpoint нет.

bash
curl https://api.openai.com/v1/images/generations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2.5-sunburst",
    "prompt": "Чистая редакционная иллюстрация: робот-оператор с камерой в светлой студии",
    "size": "1024x1024",
    "quality": "medium"
  }'

В ответе для моделей GPT Image всегда приходит data[0].b64_json. Параметр response_format в справочнике помечен как устаревший и относится к уже отключённым моделям, а значение url для GPT Image «не поддерживается: эти модели всегда возвращают изображение в base64». Поэтому «успех» первого запроса — это не HTTP 200, а файл на диске:

js
import fs from "node:fs";
import OpenAI from "openai";

const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const result = await client.images.generate({
  model: "gpt-image-2.5-sunburst",
  prompt: "Чистая редакционная иллюстрация: робот-оператор с камерой в светлой студии",
  size: "1024x1024",
  quality: "medium",
});

fs.writeFileSync("studio-robot.png", Buffer.from(result.data[0].b64_json, "base64"));
console.log(result.usage); // input_tokens, output_tokens, total_tokens

Кроме байтов ответ содержит usage (входные токены с разбивкой на image_tokens и text_tokens, выходные токены), created, а также фактические size, quality, output_format и background. Поля revised_prompt у моделей GPT Image нет. Следствие, которое меняет архитектуру: изображение существует только в этом ответе. Если вы его не декодировали и не положили в своё хранилище, запросить его повторно по какому-либо идентификатору из Images API невозможно.

Основные параметры по справочнику: size — auto, 1024x1024, 1536x1024, 1024x1536, а для семейства gpt-image-2 — произвольное WIDTHxHEIGHT; quality — low, medium, high, auto, причём xhigh и max принимают только модели gpt-image-2.5; output_format — png (по умолчанию), jpeg, webp; output_compression 0–100 для jpeg и webp; background — transparent, opaque, auto (прозрачность требует png или webp); n от 1 до 10; moderation — auto или low; длина prompt до 32 000 символов; stream с partial_images от 0 до 3. Для свободного размера у gpt-image-2 действуют ограничения из руководства: длинная сторона не больше 3840 px, обе стороны кратны 16, соотношение сторон не больше 3:1, общее число пикселей от 655 360 до 8 294 400.

Готовые запросы для разных размеров, прозрачного фона и потоковой выдачи собраны в статье OpenAI Image Generation API cURL: актуальные запросы для генерации и редактирования.

POST /v1/images/edits: правки, маски и замена отключённого variations

Шпаргалка параметров Images API для generations и edits: size, quality, output_format, background, input_fidelity и ограничения по моделям

Многие ищут «endpoint генерации», а на деле хотят изменить уже существующее изображение. Маршрут остаётся тем же — прямой Images API, только ветка edits. Endpoint принимает до 16 входных изображений для моделей GPT Image, необязательную маску (mask как image_url или file_id) и текстовый запрос; входные изображения передаются файлами, идентификаторами файлов или в base64. Это и есть замена отключённого variations.

js
import fs from "node:fs";
import OpenAI from "openai";

const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const result = await client.images.edit({
  model: "gpt-image-2.5-sunburst",
  image: [fs.createReadStream("product-shot.png"), fs.createReadStream("shelf-reference.png")],
  prompt: "Сохрани форму товара и поставь его на чистую студийную полку с тёплым светом",
});

fs.writeFileSync("product-on-shelf.png", Buffer.from(result.data[0].b64_json, "base64"));

Два параметра зависят от модели. input_fidelity (high или low) задаёт, насколько точно сохраняются детали входных изображений: у gpt-image-1-mini доступен только low, а для gpt-image-2 руководство просит параметр не указывать — модель всегда работает с высокой точностью, из-за чего правки по референсам могут потреблять больше входных токенов. background: "transparent" для gpt-image-2 в справочнике помечен как предварительная возможность. Модель на edits можно не указывать — тогда подставляется gpt-image-2.5-sunburst, но явное значение избавит от сюрпризов при смене значения по умолчанию.

Если дальше вас интересуют маски, сохранение деталей и композиция из нескольких файлов, продолжение — OpenAI Image Editing API: правка изображений через images.edit. Для этой страницы достаточно правила: правка — полноценный сценарий Images API, а не повод переходить в Responses.

Responses и image_generation: когда картинка — шаг большего процесса

Responses API выигрывает не потому, что он новее, а потому, что он держит контекст. Основная модель читает инструкции, вызывает другие инструменты, помнит предыдущие ходы и на одном из шагов генерирует изображение. По руководству по инструменту image_generation в tools добавляется объект {"type": "image_generation", "model": "gpt-image-2.5-sunburst"}; внутри инструмента принимаются gpt-image-2.5-sunburst, gpt-image-2.5-flare, gpt-image-2, gpt-image-1.5, gpt-image-1 и gpt-image-1-mini. В верхнем model стоит основная текстовая модель: руководство требует gpt-5 или новее, а страница инструмента приводит собственный список поддерживаемых моделей, поэтому перед выбором сверьтесь со страницей конкретной модели.

js
import fs from "node:fs";
import OpenAI from "openai";

const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const response = await client.responses.create({
  model: "gpt-5.5",
  input: "Нарисуй иконку бумажного самолётика в стиле стикера для приложения о путешествиях",
  tools: [{ type: "image_generation", model: "gpt-image-2.5-sunburst" }],
});

const call = response.output.find((item) => item.type === "image_generation_call");
fs.writeFileSync("plane.png", Buffer.from(call.result, "base64"));
console.log(call.id, call.revised_prompt); // id вида ig_..., понадобится для следующей правки

Результат приходит элементом image_generation_call: в result лежит base64, рядом есть id и revised_prompt. Байты и здесь нужно сохранять самим. А вот продолжать правки проще, чем в Images API: в следующий запрос передаётся previous_response_id либо входной элемент {"type": "image_generation_call", "id": "ig_..."} вместе с новым сообщением пользователя.

js
const edited = await client.responses.create({
  model: "gpt-5.5",
  previous_response_id: response.id,
  input: "Сделай самолётик синим и добавь тонкую белую обводку",
  tools: [{ type: "image_generation", model: "gpt-image-2.5-sunburst" }],
});

Полезные параметры инструмента: action со значениями auto, generate, edit (запрос edit без изображения в контексте вернёт ошибку), partial_images от 1 до 3 для потоковых событий response.image_generation_call.partial_image с полем partial_image_b64, а tool_choice: {"type": "image_generation"} заставляет модель вызвать инструмент обязательно.

Стоимость считается по токенам: у GPT Image 2.5 это $8 за миллион входных токенов изображения, $2 за миллион кешированных входных, $30 за миллион выходных токенов изображения, $5 за миллион входных текстовых токенов и $1,25 за миллион кешированных текстовых. Две оговорки влияют на выбор маршрута: кешированный тариф применяется только через инструмент в Responses, а не при прямом вызове /v1/images/*, и Responses дополнительно списывает токены основной модели. Каждое промежуточное изображение при потоковой выдаче добавляет 100 выходных токенов. Пересчёт в цену за картинку по качеству и размеру — в статье Сколько стоит изображение в OpenAI API: GPT Image 2.5 и GPT Image 2.

Когда ваша задача — «с какого endpoint начать», Responses добавляет лишние слои: основную модель, разбор вывода инструмента и более длинную цепочку отладки. Переходите на него, когда проблемой становится сама оркестрация, а не отдельная картинка.

gen_id и parent_gen_id из ChatGPT: endpoint для скачивания не существует

В JSON диалога ChatGPT, в экспорте данных или в инструментах разработчика браузера видны поля gen_id, parent_gen_id, referenced_image_ids, asset_pointer вида file-service://file-… и имя инструмента image_gen. Отсюда естественная гипотеза: должен быть endpoint вида «дай картинку по gen_id». Проверка по документации даёт однозначный результат:

  • в справочнике Images API есть только generations, edits и отключённый variations; ни один из них не принимает идентификатор ранее созданного изображения и ни один не возвращает изображение по id;
  • в Responses единственные идентификаторы для продолжения — id элемента image_generation_call (вида ig_…) и previous_response_id; это идентификаторы API, с gen_id из ChatGPT они не совпадают и для скачивания чужой картинки не подходят;
  • gen_id — внутреннее поле инструмента image_gen в продукте ChatGPT. В публичной документации OpenAI нет метода, который принимал бы его, и нет описания формата file-service://.

Адреса backend-api, которые видны в сетевых запросах веб-клиента ChatGPT, — внутренний интерфейс приложения, а не поддерживаемый API: он не задокументирован, меняется без предупреждения и не относится к https://api.openai.com/v1. По сторонним разборам сетевого трафика ChatGPT (лето 2026 года), ссылки files.oaiusercontent.com — временные подписанные URL: 404 означает истёкший срок, 422 — потерянные параметры запроса. Строить на них скачивание бессмысленно.

История полей объясняет, почему они всплывают до сих пор. В 2023–2024 годах, когда ChatGPT рисовал через DALL·E 3, пользователи просили модель назвать gen_id картинки и подставляли его в referenced_image_ids (в обсуждениях встречается и написание reference_image_ids), чтобы сохранить персонажа между запросами; parent_gen_id указывал на предыдущую генерацию в цепочке правок. Это были приёмы внутри чата, а не параметры API — и в API они не появились.

Где лежит изображение на каждой поверхности

ПоверхностьГде байтыКакой идентификатор существуетЧто можно сделать
Чат и библиотека ChatGPTв хранилище ChatGPT; по сторонним разборам — за указателем file-service://file-…gen_id, parent_gen_id, asset_pointer в JSON диалогаскачать кнопкой в чате или в библиотеке; запросить экспорт данных; публичного метода по идентификатору нет
Экспорт данных ChatGPTZIP-архив, по справке OpenAI — «история чатов и другие данные аккаунта»; по сторонним разборам в conversations.json есть записи image_asset_pointer, чьи file-… совпадают с файлами в архивете же поляодин раз сохранить архив у себя и разложить файлы по своему хранилищу
Images APIтолько в теле ответа, data[].b64_jsonнет; в ответе лишь usage, created и фактические параметрыдекодировать и сохранить сразу; повторный запрос по id невозможен
Responses + image_generationв поле result элемента image_generation_call (base64)id элемента (ig_…) и id ответапродолжить правки через previous_response_id; байты сохранить самостоятельно

Поля ChatGPT и их аналоги в API

Поле в ChatGPTЧто этоЧем заменяется в API
gen_idидентификатор генерации внутри инструмента image_genid элемента image_generation_call в Responses; в Images API идентификатора нет, есть только сохранённые вами байты
parent_gen_idссылка на предыдущую генерацию в цепочке правокprevious_response_id или входной элемент {"type": "image_generation_call", "id": "ig_…"}
referenced_image_ids (reference_image_ids)изображения-референсы для следующей генерациимассив image в /v1/images/edits (до 16 файлов, file_id или base64) или изображение во входе Responses
asset_pointer file-service://file-…указатель на файл в хранилище ChatGPT (по сторонним разборам)аналога нет; байты приходят в b64_json или result и хранятся у вас
image_genимя инструмента в диалоге ChatGPTинструмент image_generation в Responses
backend-apiвнутренний интерфейс веб-клиентапубличная база https://api.openai.com/v1

Что делать, если остался только gen_id

  1. Картинка ещё видна в чате или библиотеке. Скачайте её кнопкой в интерфейсе: в библиотеке изображение выбирается и сохраняется командой «Download image». Это единственный штатный путь получить именно те байты, которые сгенерировал ChatGPT.
  2. Нужны все изображения аккаунта. Запросите экспорт: Settings → Data controls → Export data или через Privacy Portal. По справке OpenAI экспорт доступен на Free, Go, Plus, Pro и подходящих Edu-аккаунтах, но не в рабочих пространствах Business, Enterprise и Healthcare; подготовка занимает до 7 дней, ссылка на архив действует 24 часа после получения, удалённые чаты восстановить нельзя. Справка не перечисляет содержимое архива поимённо — что в нём есть файлы изображений, совпадающие с image_asset_pointer, известно из сторонних разборов, а не из документации.
  3. Нужна воспроизводимая картинка для продукта. Сгенерируйте её через API — /v1/images/generations для одного запроса или Responses, если нужна цепочка правок, — и сохраните байты в своё хранилище с собственным идентификатором. Исходный gen_id при этом не используется: это не ключ к файлу, а запись о том, что генерация когда-то произошла в ChatGPT.

Если же проблема в самом ChatGPT — изображения не генерируются или не открываются — порядок проверки описан в статье ChatGPT не генерирует изображения? Сначала проверьте статус, потом ветку сбоя.

Сроки отключения gpt-image-1 и gpt-image-1.5: на что переходить

Перечисление моделей в справочнике по-прежнему включает старые идентификаторы, но страница отключений даёт даты, после которых запросы с ними перестанут работать:

МодельОбъявленоОтключениеРекомендованная замена
gpt-image-122 апреля 2026 года23 октября 2026 годаgpt-image-2.5-sunburst или gpt-image-2.5-flare
gpt-image-1.5, gpt-image-1-mini, chatgpt-image-latest2 июня 2026 года1 декабря 2026 годаgpt-image-2.5-sunburst или gpt-image-2.5-flare
dall-e-2, dall-e-314 ноября 2025 годаотключены 12 мая 2026 годаgpt-image-2 (на момент объявления также gpt-image-1 и gpt-image-1-mini)
gpt-image-2—в списке отключений нет—

Для миграции обычно достаточно заменить строку model: generations и edits у всех моделей GPT Image одни и те же, ответ — тот же b64_json. Отличия, которые стоит проверить: уровни xhigh и max появляются только у 2.5, у ранних моделей качество ограничено high; input_fidelity для gpt-image-2 не указывается; свободный размер WIDTHxHEIGHT относится к семейству gpt-image-2.

Отдельно о chatgpt-image-latest. По странице модели это «предыдущая модель изображений, использовавшаяся в ChatGPT», то есть снимок, который ранее стоял за генерацией в самом ChatGPT; для работы через API страница рекомендует GPT Image 2.5 Sunburst. Модель доступна только в v1/images/generations, v1/images/edits и v1/batch, а её страница публикует цены за изображение: качество low — $0,009 за 1024×1024 и $0,013 за 1024×1536 или 1536×1024, medium — $0,034 и $0,05, high — $0,133 и $0,20. Переходить на неё ради «того же, что в ChatGPT» нет смысла: 1 декабря 2026 года она отключается вместе с gpt-image-1.5.

Старые идентификаторы и даты стоит держать в голове ещё по одной причине: ошибка после отключения выглядит как «модель не найдена», а не как «неверный endpoint». Если endpoint правильный, а запрос всё равно отклоняется, проверьте по порядку: не отключена ли модель; не вернулась ли ошибка moderation_blocked (в moderation_details указаны categories и moderation_stage — input или output); не требует ли организация подтверждения — для этого случая есть разбор GPT Image 2: что делать с ошибкой Your organization must be verified. И только затем переписывайте тело запроса.

Короткие ответы: gen_id, Responses, chatgpt-image-latest и ошибки

Можно ли получить картинку ChatGPT по gen_id через OpenAI API?

Нет. Ни /v1/images/generations, ни /v1/images/edits, ни Responses не принимают gen_id; метода GET для изображений в Images API нет. Картинку скачивают из чата или библиотеки ChatGPT, забирают из экспорта данных либо генерируют заново через API и хранят у себя.

Нужен ли Responses для обычного image editing?

Нет. POST /v1/images/edits и client.images.edit() остаются основным путём для правок: до 16 входных изображений, маска, текстовый запрос, модель по умолчанию gpt-image-2.5-sunburst. Responses нужен, когда правка — часть диалога или агентного процесса.

Что ставить в model на /v1/images/generations сегодня?

gpt-image-2.5-sunburst, если важна точность правок и верхние уровни качества xhigh и max, или gpt-image-2.5-flare для быстрой повседневной генерации. gpt-image-2 продолжает работать и даёт произвольный размер WIDTHxHEIGHT; gpt-image-1 и gpt-image-1.5 подходят только до дат отключения.

Что такое chatgpt-image-latest и стоит ли на него переходить?

Это снимок модели, которая раньше использовалась в ChatGPT, с фиксированными ценами за изображение (от $0,009 за 1024×1024 в качестве low). Отключается 1 декабря 2026 года; страница модели рекомендует для API GPT Image 2.5 Sunburst.

Почему запрос может падать, даже если endpoint выбран правильно?

Три частые причины: идентификатор модели уже отключён, запрос заблокирован модерацией (ошибка moderation_blocked с категориями и стадией в moderation_details) или организация должна пройти подтверждение. Endpoint в этих случаях менять не нужно — проверьте модель, текст запроса и статус организации.

Чем заменить отключённый /v1/images/variations?

Вызовом /v1/images/edits с моделью GPT Image и текстовым запросом, который описывает желаемое изменение; исходное изображение передаётся в image.

Нашли ошибку или столкнулись с проблемой, которой нет в статье? Отправьте адрес статьи и описание на hi@laozhang.ai. Мы проверим и обновим текст.