Для редактирования изображения используйте client.images.edit(model="gpt-image-2", ...) или POST /v1/images/edits. По документации OpenAI на 8 сентября 2026 года GPT Image 2 поддерживает эту операцию. Сообщение Value must be 'dall-e-2' не означает, что нужно заменить модель: DALL·E 2 уже удалена из OpenAI API. Поддержка редактирования указана на странице GPT Image 2, статус старой модели — на странице DALL·E 2.
В актуальном запросе с GPT Image 2 уберите старый response_format и не передавайте input_fidelity: результат приходит в b64_json, а высокая точность обработки исходных изображений включена автоматически. Формат итогового файла задаётся через output_format. Если после этого ошибка остаётся, проверьте, какой запрос действительно отправляет приложение и какой сервер его принимает.
Если нужен новый вариант: переход с variations на edits
Ошибка images/variations not supported требует проверки выбранной операции. В справочнике variations указана поддержка только DALL-E 2. Наличие GPT Image 2 в общем типе ImageModel не расширяет возможности этого метода. Чтобы получить вариант по исходному изображению, поменяйте сам вызов и добавьте описание результата:
| В старом коде | Для GPT Image 2 |
|---|---|
client.images.create_variation() в Python | client.images.edit() |
client.images.createVariation() в JavaScript | client.images.edit() |
POST /v1/images/variations | POST /v1/images/edits |
| Только исходная картинка | Картинка и содержательный непустой prompt |
Одной замены имени модели недостаточно. Схема edits требует непустой prompt; для полезного варианта в нём нужно определить, что разрешено изменить и что требуется сохранить. Например: «Создай другой вариант фотографии этой комнаты: замени постер на абстрактную картину в тёплых тонах. Сохрани мебель, освещение и положение камеры». Для более свободного варианта можно разрешить другой ракурс или цвет стен — это уже другое задание.
Кнопка «Другой вариант» в приложении может остаться: предложите пользователю выбрать фон, свет, композицию или стиль, а затем сформируйте понятное описание. Параметр n задаёт количество выходных изображений, но не возвращает старый режим variations без промпта. Если запрашиваете несколько результатов, сохраняйте каждый элемент data: примеры ниже для простоты берут только первый. Если исходной картинки вообще нет, нужна генерация через images.generate(), а не редактирование.
Запрос, с которого удобно начать проверку
Возьмите обычный PNG-файл, например фотографию комнаты room.png. Пока не добавляйте маску, несколько исходников и дополнительные настройки: сначала нужно установить, проходит ли простое редактирование. Следующий пример загружает файл напрямую в OpenAI через multipart и сохраняет весь JSON-ответ:
bashcurl --fail-with-body https://api.openai.com/v1/images/edits \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -F "model=gpt-image-2" \ -F "image[]=@room.png;type=image/png" \ -F 'prompt=На фотографии комнаты замените постер на стене на абстрактную картину в рамке. Сохраните мебель, освещение, тени и ракурс.' \ -F "output_format=png" \ -o edit-response.json
Здесь image[] — загрузка локального файла, а не строка с его именем. Заголовок Content-Type вручную не нужен: cURL сам добавит multipart/form-data с правильной границей частей. В актуальном справочнике edits есть и JSON-запрос с массивом images: изображение задаётся через image_url — полный URL или base64 data URL — либо через file_id ранее загруженного файла. Строка локального пути вроде "room.png" не загружает байты с компьютера. Пример выше использует multipart именно для локального файла; перед применением JSON-формы через SDK проверьте, поддерживает ли её установленная версия библиотеки.
Команда предназначена для ключа OpenAI. Если приложение работает через другой сервис, сначала выполните аналогичную минимальную проверку на его фактическом адресе и с его ключом. Сравнение двух разных провайдеров одновременно меняет и клиент, и сервер, поэтому хуже помогает локализовать ошибку. Не отправляйте ключ одного сервиса другому.
После успешного HTTP-ответа декодируйте изображение:
pythonimport base64 import json from pathlib import Path payload = json.loads(Path("edit-response.json").read_text()) if payload.get("error"): raise RuntimeError(payload["error"]) images = payload.get("data") or [] encoded = images[0].get("b64_json") if images else None if not encoded: raise RuntimeError("В ответе нет изображения b64_json") image_bytes = base64.b64decode(encoded, validate=True) if not image_bytes: raise RuntimeError("Получен пустой файл") Path("room-edited.png").write_bytes(image_bytes)
edit-response.json содержит JSON, а room-edited.png — декодированные байты изображения. Переименование JSON в PNG не создаёт картинку. Для output_format="jpeg" или "webp" используйте соответствующее расширение выходного файла. Эти примеры составлены по официальному руководству; платный вызов для этой статьи не выполнялся.
Что известно об ошибке Value must be 'dall-e-2'
Одинаковая формулировка встречалась при разных обстоятельствах. Полезно отделить подтверждённые сообщения от предположения о вашем запросе.
В issue openai-node #1844 от 27 апреля 2026 года разработчик показал ошибку для gpt-image-2 и в Node SDK 6.34.0, и в обычном cURL. В минимальном запросе не было response_format. Значит, этот случай нельзя объяснить исключительно лишним параметром или поведением SDK. В августовском ответе участника обсуждения сообщалось об исправлении проверки редактирования на стороне сервиса; issue закрыли. Это история конкретного сбоя, а не подтверждение текущей работоспособности любого шлюза.
В мартовском обсуждении OpenAI Community, посвящённом более ранним GPT Image, есть другие частные наблюдения: одному участнику помогло удаление response_format, автору исходного сообщения — имя для файла в памяти. Ни один из этих способов нельзя объявить универсальным решением для GPT Image 2.

Поэтому полезная последовательность диагностики выглядит так:
| Результат сравнения | Что проверять дальше |
|---|---|
Приложение всё ещё отправляет запрос на /images/variations | Заменить операцию в обёртке или серверном коде, затем добавить осмысленный prompt |
| Минимальный cURL работает, приложение получает ошибку модели | Отличия тела запроса, дополнительные поля обёртки, фактический base_url, способ загрузки файла |
| Оба запроса на один адрес возвращают ту же ошибку модели | Проверку параметров на сервере или шлюзе, доступность нужной модели у этого провайдера; передать сведения о запросе в поддержку |
| В приложении запрос не отправляется, ошибка возникает сразу | Локальную проверку схемы, типы SDK, версию библиотеки и обёртку |
Ошибка теперь указывает на image или mask | Формат, размер, имя файла, MIME и прозрачность маски |
| Картинка получена, но изменены лишние детали | Текст задания, маску и требования к сохранению исходника |
Это способ сузить место отказа, а не автоматически определить виновника. Если два вызова различаются размером, файлом, моделью и адресом одновременно, результат сравнения неоднозначен.
Для обращения в поддержку сохраните время запроса с часовым поясом, URL, HTTP-статус, поля error.message, error.type, error.param, error.code, идентификатор запроса из ответа, версию SDK и список отправленных параметров. Для файла достаточно имени, MIME и размера; ключи, токены и приватные изображения в публичный отчёт не включайте. Если запрос не вышел из приложения, прямо укажите это — серверного идентификатора у него может не быть.
Python: локальный файл и изображение в памяти
В SDK тот же сценарий короче. Контекстный менеджер сохраняет файл открытым до окончания запроса и затем закрывает его:
pythonimport base64 from pathlib import Path from openai import OpenAI client = OpenAI() with open("room.png", "rb") as source: result = client.images.edit( model="gpt-image-2", image=source, prompt=( "На фотографии комнаты замените постер на стене " "на абстрактную картину в рамке. " "Сохраните мебель, освещение, тени и ракурс." ), output_format="png", ) encoded = result.data[0].b64_json if result.data else None if not encoded: raise RuntimeError("API не вернул b64_json") Path("room-edited.png").write_bytes( base64.b64decode(encoded, validate=True) )
В приложении исходник часто приходит из формы загрузки или другого API и уже находится в памяти. Это допустимо: официальный Python SDK поддерживает bytes, PathLike и кортеж (имя файла, содержимое, MIME). Сохранять каждый исходник на диск только ради SDK не требуется.
Для диагностики удобно задать имя и тип явно. Если image_bytes содержит PNG, замените аргумент image на:
pythonimage=("room.png", image_bytes, "image/png")
Для BytesIO можно задать buffer.name = "room.png" и перед повторной отправкой вернуть указатель в начало через buffer.seek(0). Но название с расширением .png не превращает JPEG-байты в PNG: имя и MIME должны соответствовать содержимому.
В Node SDK доступны File, Response, поток fs.ReadStream и помощник toFile; это перечислено в документации загрузки файлов. При сравнении с cURL проверьте, не превратила ли ваша обёртка файл в строку, пустой буфер или объект с другим набором полей.
Какие параметры перенести из старого примера, а какие убрать
| Поле | Как использовать с GPT Image 2 |
|---|---|
model | Задать явно: gpt-image-2 |
image | Передать исходное изображение; в примерах выше это загрузка файла |
prompt | Описать желаемую итоговую сцену и то, что нужно сохранить |
response_format | Не передавать: GPT Image возвращает изображение в b64_json |
output_format | Выбрать формат байтов результата: png, jpeg или webp |
input_fidelity | Не передавать: для GPT Image 2 высокая точность обработки входов автоматическая |
mask | Добавить при необходимости указать область правки; ограничения разобраны ниже |
Различие между response_format и output_format особенно легко пропустить: первое поле связано со старым выбором представления ответа DALL·E, второе — с кодированием самого изображения. Передача response_format="b64_json" не нужна даже тогда, когда именно base64 вы и хотите получить. Правило для точности входов отдельно описано в разделе про image input fidelity.
Маска: подготовка файла и сохранение остальной сцены

Маска помогает указать, где требуется изменение. Для первого запроса используйте исходный PNG и PNG-маску с одинаковой шириной и высотой. У маски должен быть альфа-канал: полностью прозрачные пиксели обозначают область редактирования. Просто закрасить участок белым в непрозрачной чёрно-белой картинке недостаточно.
Справочник edits указывает для маски PNG размер меньше 4 MB. В руководстве встречается более общая формулировка про 50 MB, поэтому для совместимого примера здесь выбран более строгий предел маски. Для обычных входных изображений справочник перечисляет PNG, WebP и JPG, меньше 50 MB каждое, до 16 изображений. Если исходников несколько, маска относится к первому.
Добавить подготовленную маску в Python можно так:
pythonwith open("room.png", "rb") as source, open("mask.png", "rb") as mask: result = client.images.edit( model="gpt-image-2", image=source, mask=mask, prompt=( "Фотография той же комнаты с абстрактной картиной " "в рамке вместо постера в отмеченной области. " "Сохраните стены, мебель, освещение, тени и положение камеры." ), output_format="png", )
Сохраните result тем же способом через b64_json. Если сервер отклоняет маску, проверьте её размеры, формат, размер файла и наличие настоящей прозрачности. Это отдельная проверка от той, где сервер отвергает значение model.
Принятая маска не гарантирует неизменность каждого пикселя за её пределами. В руководстве по маскам OpenAI описывает маску как ориентир для генерации. Поэтому после получения изображения сравните важные детали: геометрию товара, лицо, логотип, текст или фон — в зависимости от задачи.
Для фотографии комнаты полезнее задание «тот же интерьер с другой картиной, сохранить мебель, тени и ракурс», чем просто «замени постер». Для переноса объекта из второго изображения укажите, какое фото является основным и что именно взять из второго. Если нужны строго неизменные пиксели снаружи выделения, предусмотрите отдельное наложение выбранной области на оригинал и проверку границ; один текст запроса такого свойства не обеспечивает.
Как продолжить правку и когда нужен Responses API
Для следующего изменения можно снова вызвать images.edit(), передав сохранённую принятую версию. Например, после замены постера загрузите room-edited.png и попросите уменьшить блик на рамке. Если снова отправить исходный room.png, прежняя замена автоматически в запрос не попадёт. Храните оригинал отдельно, а удачные результаты — как room-v1.png, room-v2.png, вместе с описанием правки и связью с предыдущей версией. Тогда неудачное изменение не помешает вернуться к выбранному варианту.
Для одной правки и сохранения файла достаточно Images API. Responses имеет смысл, когда пользователь продолжает диалог: «теперь сделай рамку тоньше», «верни предыдущий фон», «сравни два варианта». Он позволяет включить генерацию изображений в работу помощника с историей и другими инструментами, а также использовать поддерживаемые способы передачи изображений, включая идентификаторы файлов.
У Responses другая структура запроса: в верхнем поле model используется поддерживаемая основная модель, а работа с изображениями подключается через инструмент image_generation. Не переносите туда model="gpt-image-2" из примера images.edit как прямую замену. Подробности и актуальные варианты показаны в руководстве OpenAI.
Историческая ошибка проверки модели сама по себе не требует переписывать интеграцию на Responses. Сначала добейтесь понятного результата на выбранном API, затем выбирайте структуру приложения под нужный сценарий.
Если после исправлений всё ещё приходит 400
Смотрите на содержимое ошибки, а не только HTTP-статус. moderation_blocked указывает на иной вид отказа, чем перечисление допустимых значений model; обновление имени файла не является общим решением для фильтрации содержимого. Ошибка доступа или неподдерживаемый провайдером идентификатор модели также требуют своей проверки.
Если минимальный запрос по-прежнему отвечает Value must be 'dall-e-2', передайте провайдеру воспроизводимый пример без секретов и идентификатор запроса. Если минимальный запрос работает, возвращайте параметры приложения по одному до появления отличия. А если API уже возвращает изображение, продолжайте отладку сохранения или самой правки — повторное исправление model эту часть задачи не решит.
Для настройки модели за пределами редактирования пригодится отдельное руководство по GPT Image 2 API.



