GPT-6 Sol и Claude Opus 5.5 уже доступныGPT-6 Sol вдвое дешевле 5.6 Sol

Seedream 5.0 Pro API: генерация изображений на Python

Один POST с model Dola-Seedream-5.0-pro создаёт задачу на картинку. Ниже — код запроса, поведение размеров и метки, которое мы видели, и два изображения, сделанные 29 октября 2026 года.

Kiki, OmniaKey COO7 мин чтения
На этой странице

Отправьте один POST на https://api.omniakey.com/v1/media/tasks с model равным Dola-Seedream-5.0-pro и операцией generate, затем опрашивайте id задачи, пока статус не станет succeeded, и скачайте assets[0].url. По умолчанию в углу картинки стоит метка "AI generated". 29 октября 2026 года мы отправили этот запрос и одну правку в 1024x1024, и оба файла вернулись как PNG 1024×1024.

Дальше идут id и две операции, код запроса, который мы запускали без изменений, список запрошенных размеров рядом с пикселями, прочитанными в каждом файле, метка, настройка, которая её выключает (её мы не запускали), и две ошибки, из-за которых создание задачи не проходит. Обе картинки — те, что мы сделали в тот день.

Какой id модели и какие операции использовать

Возьмите Dola-Seedream-5.0-pro — id со страницы модели Seedream 5.0 Pro (проверено 29 октября 2026 года). Страница перечисляет две операции: текст в изображение и правка изображения. Там же сказано, что генерация и правка идут по одному тарифу и что ни выбранный размер, ни приложенные референсы его не увеличивают. Актуальные тарифы — на странице цен.

Вот поля, которые задают запрос до промпта:

  • model: Dola-Seedream-5.0-pro
  • operation: generate или edit
  • parameters.size: 1K, 1.5K, 2K либо widthxheight со строчной x
  • output_format: png или jpeg, и jpeg — значение по умолчанию

Поля размера и формата лежат внутри parameters. Вывод останавливается на 2K: размера 4K на странице модели (проверено 29 октября 2026 года) нет. Seedream принимает строчную x между сторонами, а Qwen и Wan — звёздочку, поэтому в клиенте, который обращается к обоим, держите эти формы раздельно. В наших запусках была форма widthxheight с 1024x1024 и PNG, а три ступени размера остались в стороне.

ByteDance продаёт ту же модель в BytePlus ModelArk под другим id — dola-seedream-5-0-pro-260628. Этот id принадлежит BytePlus, поэтому запрос в OmniaKey хочет id выше.

Код запроса

Скрипт ниже — тот самый, что мы запускали 29 октября 2026 года, без изменений: два помощника, один вызов генерации, один вызов правки, только стандартная библиотека Python. Ключ он читает из OMNIAKEY_API_KEY, а каждый PNG пишет в папку, из которой вы его запускаете. В документации по API изображений описаны те же три шага.

python
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid

API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "Dola-Seedream-5.0-pro"

def request(method, url, body=None, extra_headers=None):
    headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
    data = None
    if body is not None:
        headers["Content-Type"] = "application/json"
        data = json.dumps(body).encode()
    headers.update(extra_headers or {})
    req = urllib.request.Request(url, data=data, headers=headers, method=method)
    with urllib.request.urlopen(req, timeout=120) as resp:
        return json.load(resp)

def poll(url, attempts=5):
    for attempt in range(attempts):
        try:
            return request("GET", url)
        except urllib.error.HTTPError as err:
            if err.code < 500 or attempt == attempts - 1:
                raise
        except urllib.error.URLError:
            if attempt == attempts - 1:
                raise
        time.sleep(5 * (attempt + 1))

def run_task(body, out_path):
    task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
    print("task", task, flush=True)
    for _ in range(150):
        time.sleep(4)
        state = poll(f"{API}/{task}")
        if state["status"] not in ("queued", "processing"):
            break
    if state["status"] != "succeeded":
        raise RuntimeError(state.get("error") or state["status"])
    asset_url = state["assets"][0]["url"]  # signed link: short-lived, so download now
    req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
    with urllib.request.urlopen(req, timeout=120) as resp, open(out_path, "wb") as f:
        f.write(resp.read())
    return task

def generate_image(prompt, out_path, size="1024x1024"):
    body = {
        "model": MODEL,
        "type": "image",
        "operation": "generate",
        "input": {"prompt": prompt},
        "parameters": {"size": size, "output_format": "png"},
    }
    return run_task(body, out_path)

def edit_image(source_path, prompt, out_path, size="1024x1024"):
    with open(source_path, "rb") as f:
        image = base64.b64encode(f.read()).decode()
    body = {
        "model": MODEL,
        "type": "image",
        "operation": "edit",
        "input": {"prompt": prompt, "image": {"data": image, "mime_type": "image/jpeg"}},
        "parameters": {"size": size, "output_format": "png"},
    }
    return run_task(body, out_path)

if __name__ == "__main__":
    task = generate_image(
        "A glass bottle of cold-pressed orange juice on a pale stone counter, morning light from the left, "
        "a single orange slice beside it, shallow depth of field, no text, no logos.",
        "juice-bottle.png",
    )
    print("generate task", task)
    task = edit_image(
        "cafe-base.jpg",
        "Change the red bicycle to matte black. Keep everything else exactly the same: "
        "the table, the cup, the window frame and the daylight. Photorealistic, no text, no logos.",
        "cafe-edited.png",
    )
    print("edit task", task)

Три шага собраны в run_task: создать задачу со свежим ключом идемпотентности, опрашивать URL задачи, пока статус не выйдет из queued и processing, и скачать URL первого ассета. Вызов создания отвечает HTTP 202 и возвращает id, который начинается с task_, а статус стартует как queued (документация, проверено 29 октября 2026 года). Задача, которая перешла в failed, выбрасывает ошибку из ответа, поэтому причина видна прямо в терминале.

Какие размеры и форматы мы запускали и что вернулось

Оба запуска просили одну и ту же строку размера и один и тот же формат, и оба файла вернулись как PNG 1024×1024.

  • Генерация — Запрошенный размер: 1024x1024; Пиксели в файле: 1024×1024; Формат: PNG; Дата: 2026-10-29
  • Правка — Запрошенный размер: 1024x1024; Пиксели в файле: 1024×1024; Формат: PNG; Дата: 2026-10-29

Пиксели читайте в файле, который скачали. Строка размера — это то, что вы попросили; файл — это то, что вы получили. Мы открыли каждый PNG, прочитали ширину и высоту и посмотрели на картинку рядом с промптом, который её создал.

Правка интереснее. Мы отправили JPEG 1024×683 с окном кафе и одну инструкцию, а вернулось квадратное изображение. Велосипед теперь тёмный, стол, чашка и растение остались в кадре, а поскольку вывод квадратный, окно и край стола вписаны иначе.

prompt
Change the red bicycle to matte black. Keep everything else exactly the same: the table, the cup, the window frame and the daylight. Photorealistic, no text, no logos.
Слева: окно кафе с красным велосипедом снаружи. Справа: то же окно после правки, велосипед стал тёмным, кадр квадратный.
Слева: исходное фото, которое мы отправили, 1024×683. Справа: результат одной правки 29 октября 2026 года, размер 1024x1024. Велосипед теперь тёмный. Вывод квадратный, поэтому окно и край стола вписаны иначе.

Метка и как её отключить

Каждый вывод несёт метку "AI generated" в углу, если не задать watermark в false внутри parameters, — так пишет страница модели (проверено 29 октября 2026 года). Страница ставит метку в правый нижний угол, и именно там она на выводе по умолчанию ниже: бледная и мелкая. Не указывайте watermark в запросе — и метка останется.

prompt
A glass bottle of cold-pressed orange juice on a pale stone counter, morning light from the left, a single orange slice beside it, shallow depth of field, no text, no logos.

Вот этот вывод, сделанный с настройками по умолчанию:

Стеклянная бутылка апельсинового сока и долька апельсина на светлой каменной столешнице, в углу бледная метка AI generated.
Сделано в Seedream 5.0 Pro через API OmniaKey 29 октября 2026 года, размер 1024x1024, настройки по умолчанию. Бледная метка 'AI generated' стоит в правом нижнем углу.

Вариант с watermark false мы не запускали: лимит расходов на один запуск в инструменте блога остановил вызов до отправки.

Ошибки и ограничения

Пройдёт ли вызов создания, решают два заголовка: bearer token и Idempotency-Key.

Что вы отправляетеЧто приходит
Создание без ключа идемпотентности400 missing_idempotency_key
Тот же ключ и то же тело, ещё раз200 с существующей задачей, повторно не списывается
Тот же ключ, изменённое тело409 idempotency_key_reused

Тот же ключ с тем же телом — это нужный ретрай: возвращается существующая задача, и ничего нового не списывается. Тот же ключ с изменённым промптом или размером даёт 409, поэтому на каждый новый запрос делайте новый ключ. Длина ключа — до 255 символов (документация, проверено 29 октября 2026 года).

Держите тело запроса меньше 1 MiB вместе с картинкой в Base64 и уменьшайте крупное исходное фото перед отправкой. Когда задача завершается успешно, ссылка на скачивание в ответе — подписанная и живёт около часа, по документации, поэтому забирайте файл сразу или опросите задачу ещё раз за новой ссылкой.

Один заголовок удивил нас 29 октября 2026 года. POST с User-Agent по умолчанию из urllib в Python вернул HTTP 403 с телом error code: 1010 от Cloudflare. Наш собственный заголовок User-Agent дошёл до API, и ничего не списали.

Отправляйте свой заголовок User-Agent, например omniakey-example/1. Стандартный из Python получил тот самый 403 29 октября 2026 года.

Seedream или GPT Image 2.5 для работы с API?

Решает задача. В нашей правке Seedream 5.0 Pro изменил тот объект, который мы назвали, — велосипед, — и сохранил большую часть сцены, хотя кадр поменялся; оба наших запуска — окно кафе и бутылка сока. Запрос — это одно тело с operation в generate или edit, а исходником может быть публичный URL или Base64 внутри запроса (документация, проверено 29 октября 2026 года).

Чтобы увидеть результат одного промпта рядом с GPT Image 2, откройте сравнение Seedream 5.0 Pro и GPT Image 2: там оба вывода. Чтобы повторить ту же схему «генерация плюс правка» на другой модели, в руководстве по API GPT Image 2.5 разобраны запрос и размеры. Прогоните свой самый сложный промпт на кандидате до переезда пайплайна, а потом сверьте тарифы.

FAQ

Какой id модели передавать в API?

Dola-Seedream-5.0-pro — id из примера запроса на странице модели (проверено 29 октября 2026 года). Собственный dola-seedream-5-0-pro-260628 от ByteDance принадлежит BytePlus ModelArk, а OmniaKey принимает id выше.

Почему на картинке метка "AI generated"?

Каждый вывод Seedream 5.0 Pro несёт метку в правом нижнем углу, если не задать watermark в false, — так пишет страница модели (проверено 29 октября 2026 года). Наш запуск с настройками по умолчанию 29 октября 2026 года пришёл с меткой.

Какие размеры принимает API?

Ступени 1K, 1.5K и 2K либо форма widthxheight со строчной x между сторонами (страница модели, проверено 29 октября 2026 года). Вывод останавливается на 2K, а оба наших запуска просили 1024x1024.

Можно ли получить PNG вместо JPEG?

Да. output_format принимает png или jpeg, и JPEG — значение по умолчанию (документация, проверено 29 октября 2026 года). В обоих запусках мы просили PNG и получали PNG.

Можно ли редактировать готовую картинку через Seedream?

Да: передайте operation в edit вместе с промптом и исходной картинкой — либо Base64 внутри запроса с mime type, либо публичный URL. Правка окна кафе показана в разделе про размеры выше.

Модели в этой статье

Seedream 5.0 ProAPI изображенийPythonтекст в изображениеAPI

Похожие статьи

Недавние статьи