GPT Image 2 API на Python: полный пример
Полный пример GPT Image 2 API на Python: запрос, опрос задачи, сохранение изображений на диск, правки по референсам и безопасная обработка ошибок.
Читать в MarkdownЧтобы использовать GPT Image 2 API из Python, отправьте запрос методом POST на https://api.seedrouter.ai/v1/images/generations с помощью библиотеки requests, сохраните возвращённый id задачи, опрашивайте /v1/tasks/{id}, пока задача не станет completed, и скачайте перечисленные в ней URL изображений. Скрипт ниже выполняет все четыре шага примерно в 40 строках и сохраняет изображения на диск.
Он работает как есть, если задана переменная SEEDROUTER_API_KEY. Если ключа у вас ещё нет, сначала получите его.
Как выглядит полный скрипт для GPT Image 2?
import os
import time
import requests
API = "https://api.seedrouter.ai/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"}
def submit(body):
response = requests.post(f"{API}/images/generations", headers=HEADERS, json=body, timeout=60)
if response.status_code >= 400:
error = response.json()["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']}")
return response.json()["id"]
def wait(task_id, limit_seconds=600):
deadline = time.monotonic() + limit_seconds
while time.monotonic() < deadline:
task = requests.get(f"{API}/tasks/{task_id}", headers=HEADERS, timeout=30).json()
if task["status"] == "completed":
return [image["url"] for image in task["output"]["data"]]
if task["status"] == "failed":
raise RuntimeError(f"{task['error']['code']}: {task['error']['message']}")
time.sleep(3)
raise TimeoutError(f"Still running. Resume polling task {task_id}.")
def download(urls, prefix):
paths = []
for index, url in enumerate(urls):
path = f"{prefix}-{index}.png"
with open(path, "wb") as file:
file.write(requests.get(url, timeout=60).content)
paths.append(path)
return paths
task_id = submit({
"model": "gpt-image-2",
"prompt": "A matte ceramic vase on a sunlit table, soft shadows",
"size": "1024x1024",
"quality": "low",
"n": 2,
})
print("task", task_id)
print(download(wait(task_id), "vase"))Запустите его командой python example.py. Сначала он выведет ID задачи, затем пути к двум PNG-файлам: vase-0.png и vase-1.png.
Что делает каждая функция?
submit отправляет запрос и возвращает ID задачи. Ответ с ошибкой всегда содержит объект error с числовым code и message, поэтому исключение говорит, что нужно исправить. Например, 400 с кодом 20001 и сообщением «Check the size parameter against the API documentation.» означает, что размер нарушил одно из правил из руководства по параметрам.
wait опрашивает задачу каждые три секунды, пока она не завершится. Дедлайн на вашей стороне останавливает цикл, а не задачу: рендер продолжается, и позже можно возобновить опрос того же ID. Задача, которая завершилась со статусом failed, выбрасывает исключение со своим кодом ошибки и не оплачивается.
download скачивает каждый URL, который вернула задача, и записывает его на диск. URL результатов служат для передачи результата, а не для постоянного хранения, поэтому сохраните то, что хотите оставить. Пример использует requests и для загрузки, и для вызовов API; держитесь одного HTTP-клиента, а не подмешивайте urllib из стандартной библиотеки.
Как изменить настройки изображения?
Всё задаётся в теле запроса. Поля, которые чаще всего меняют первыми:
| Поле | Пример | Эффект |
|---|---|---|
size | "1536x1024" | Размеры результата; auto оставляет выбор модели |
quality | "medium" | low, medium, high или auto |
n | 4 | Число изображений, от 1 до 10 |
output_format | "jpeg" | png или jpeg |
background | "transparent" | Требует png |
Если меняете output_format, поменяйте и расширение .png в download. Полный список полей и ограничений — в справочнике GPT Image 2 API.
Как редактировать изображение из Python?
Передайте референсные изображения как URL в том же вызове. Отдельной конечной точки для правок нет: поле images превращает запрос в правку, а mask ограничивает изменение одной областью:
task_id = submit({
"model": "gpt-image-2",
"prompt": "Make the vase deep blue. Keep the table and the light unchanged.",
"images": [{"image_url": "https://example.com/vase.png"}],
})URL должны быть публичными HTTPS-ссылками на файлы PNG, JPEG или WebP. Можно передать до 16. Локальные файлы и строки base64 отклоняются, поэтому сначала загрузите изображение в собственное хранилище и передайте его URL.
Что делать скрипту, если отправка завершилась тайм-аутом?
Не отправляйте запрос повторно сразу же. Тайм-аут на POST не доказывает, что запрос отклонён: задача может уже выполняться, а списание — пройти. Проверьте свои последние задачи или повторите запрос только после того, как убедитесь, что задача не создана. Как отличить одно от другого, объясняет руководство по задачам.
С опросом всё иначе: тайм-аут во время опроса безвреден. Просто снова вызовите wait с тем же ID.
Часто задаваемые вопросы
Можно ли вместо этого использовать OpenAI Python SDK?
Напрямую — нет. Этот API отдаёт результаты асинхронно через ID задачи, а вызов генерации изображений в SDK ожидает готовое изображение прямо в ответе. Нескольких строк на requests, как выше, хватает на весь процесс.
Как запустить несколько промптов?
Отправьте каждый промпт, сохраните все ID задач, затем опрашивайте их. В руководстве по пакетной генерации показана версия, которая переживает перезапуски без двойной оплаты.
Нужен ли для gpt-image-2-official другой код?
Нет. Поменяйте строку model и больше ничего. Оба ID принимают одинаковые поля и возвращают одинаковый ответ с задачей; отличается только тарификация.
Сохраните ID задачи — остальное дело техники
Отправьте запрос, сохраните ID, опрашивайте с дедлайном и скачайте то, что вернулось. Этот шаблон и есть вся интеграция. Прежде чем писать скрипт, попробуйте промпт без кода в Playground GPT Image 2.



