# Seedream 5.0 Pro API: разделение на слои, PSD и цена вызова

> Разделение на слои включается параметром layer_decomposition у Seedream 5.0 Pro и Flash. Счёт идёт за каждое возвращённое изображение: от 2 до 17 за вызов.

- URL: https://blog.laozhang.ai/ru/posts/seedream-5-pro-layer-decomposition-api
- Published: 2026-10-02
- Updated: 2026-10-02
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ru/about)
- Category: Генерация изображений
- Tags: Seedream 5.0 Pro, Seedream 5.0 Flash, Разделение на слои, layer_decomposition, PSD

---
Разделение на слои (layer decomposition) в Seedream 5.0 — не отдельная модель, а режим обычного эндпоинта генерации изображений: в тело запроса добавляется `"layer_decomposition": true` и ровно одно входное изображение. В ответ приходит базовое изображение (base image, `z_index: 0`) и до 16 слоёв PNG с альфа-каналом, у каждого — рамка `bounding_box`, имя и описание. Режим поддерживают только Seedream 5.0 Pro и Seedream 5.0 Flash, а платите вы за каждое возвращённое изображение, включая базовое.

Что стоит за цифрами ниже. 2 октября 2026 года выполнены три вызова через `api.laozhang.ai` на размере `1K`, все на одном образце из учебника BytePlus: Flash без `prompt`, Pro без `prompt` и Flash с названными элементами. Затем скрипт на Python собрал из каждого ответа PNG-слои, превью и PSD. Не запускались: BytePlus ModelArk напрямую, размеры `1.5K`, `2K` и `auto`, теги bbox, плакаты с большим количеством текста, сценарии ошибок и открытие PSD в Photoshop. Всё, что касается этих случаев, пересказано по документации и так и помечено. Параметры и ограничения взяты из [учебника BytePlus по Seedream 5.0 pro / flash](https://docs.byteplus.com/en/docs/modelark/seedream-5-0-pro) — он существует только на английском, русские формулировки здесь являются пересказом оригинала.

## Три вызова на 1K: 14, 14 и 3 изображения за 35–111 секунд

Входной файл — `layer_auto.png` из учебника BytePlus: трёхмерная иллюстрация без текста, 2784×3441 пикселей, 9,9 МБ. По одному запуску на конфигурацию, поэтому это отдельные наблюдения, а не средние значения.

| Вызов | Модель | `prompt` | Время до ответа | Изображений в ответе | Базовое изображение | Сумма по прайсу LaoZhang |
|---|---|---|---|---|---|---|
| 1 | `seedream-5-0-flash-260915` | нет | 94,8 с | 14 (базовое + 13 слоёв) | 880×1088, jpeg | 14 × $0,018 = $0,252 |
| 2 | `seedream-5-0-pro-260628` | нет | 110,6 с | 14 (базовое + 13 слоёв) | 880×1088, jpeg | 14 × $0,12 = $1,68 |
| 3 | `seedream-5-0-flash-260915` | названы два элемента | 34,8 с | 3 (базовое + 2 слоя) | 880×1088, jpeg | 3 × $0,018 = $0,054 |

Все три запроса вернули HTTP 200. Суммы получены умножением опубликованной цены на поле `usage.generated_images`; журнал списаний в консоли не открывался.

Три вывода, которые меняют работу с этим API. Число изображений определяет модель, а не вы: параметра «сколько слоёв» нет, и счёт заранее известен только как диапазон. Названные в `prompt` элементы сократили ответ с 14 изображений до 3, время — с 94,8 до 34,8 с, сумму — с $0,252 до $0,054. Flash и Pro нашли по 13 слоёв, но разные: Flash вынес деревянную сцену в отдельный слой, Pro оставил сцену в базовом изображении и отделил укулеле.

## Запрос: layer_decomposition, одно изображение и size без пикселей

Рабочий запрос — это обычный вызов генерации изображения с тремя отличиями: `layer_decomposition: true`, поле `image` с одним изображением и `size` из списка `1K`, `1.5K`, `2K`, `auto`. Точные размеры вида «ширина x высота» в этом режиме не принимаются.

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

```json
{
  "model": "seedream-5-0-flash-260915",
  "image": "https://arkdocs-en.tos-ap-southeast-1.volces.com/images/image-generation/layer_auto.png",
  "layer_decomposition": true,
  "size": "1K",
  "response_format": "url",
  "watermark": false
}
```

Тот же вызов на Python с библиотекой `requests`. Адрес, заголовок, тело и таймаут 420 с совпадают с отправленными; в тестовом варианте ключ читался из файла, а в таком сокращённом виде, с переменной окружения, файл не запускался.

```python
import json
import os
from pathlib import Path

import requests

body = {
    "model": "seedream-5-0-flash-260915",
    "image": "https://arkdocs-en.tos-ap-southeast-1.volces.com/images/image-generation/layer_auto.png",
    "layer_decomposition": True,
    "size": "1K",
    "response_format": "url",
    "watermark": False,
}
resp = requests.post(
    "https://api.laozhang.ai/v1/images/generations",
    headers={"Authorization": f"Bearer {os.environ['LAOZHANG_API_KEY']}"},
    json=body,
    timeout=420,
)
print("HTTP", resp.status_code)
Path("response.json").write_text(json.dumps(resp.json(), indent=2, ensure_ascii=False))
```

У BytePlus ModelArk тот же JSON уходит на другой адрес и с другим ID модели — с префиксом `dola-`. Официальный пример из учебника выглядит так; он приведён как первичная форма и здесь не запускался:

```bash
curl https://ark.ap-southeast.bytepluses.com/api/v3/images/generations \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "dola-seedream-5-0-pro-260628",
    "image": "https://arkdocs-en.tos-ap-southeast-1.volces.com/images/image-generation/layer_auto.png",
    "size": "2K",
    "layer_decomposition": true,
    "watermark": false
  }'
```

Чтобы запрос прошёл с первого раза, проверьте вход по таблице ограничений BytePlus:

| Что проверять | Требование в режиме слоёв |
|---|---|
| Число входных изображений | ровно одно; несколько изображений дают ошибку |
| Формат | только png и jpeg (обычная генерация принимает ещё webp, bmp, tiff, gif, heic, heif) |
| Число пикселей | от 512×512 до 6000×6000 |
| Соотношение сторон | от 1/16 до 16 |
| Размер файла | не больше 30 МБ |
| Способ передачи | доступный URL или Base64 в виде `data:image/png;base64,...`, формат строчными буквами |
| `size` | `1K`, `1.5K`, `2K`, `auto`; по умолчанию `auto` |
| `output_format` | `png` или `jpeg`, по умолчанию `jpeg`; действует только на базовое изображение, слои всегда png |
| `watermark` | по умолчанию `true`: надпись «AI-generated» в правом нижнем углу |

Значение `auto` работает так: вход от 921 600 до 4 624 220 пикселей возвращается в исходных размерах, меньший приводится к 1K, больший — к 2K. В тесте `1K` для входа 2784×3441 дал базовое изображение 880×1088 с тем же соотношением сторон.

В маршруте LaoZhang есть два собственных условия из [документации шлюза](https://docs.laozhang.ai/en/api-capabilities/seedream-image): в теле не должно быть полей `sequential_image_generation` и `stream` (ответ HTTP 400), а ключ должен работать в режиме оплаты за вызов — «Usage first» или «Per-call» в настройках токена.

## Свои правила разбиения: названия элементов в prompt или теги bbox

Задать, что именно станет слоем, можно двумя способами: перечислить элементы обычными словами или указать рамки координатами. Без `prompt` модель сама выбирает главные объекты, текст, фон и декоративные детали.

**Автоматический режим.** В запросах через cURL, Java или Go поле `prompt` просто не передаётся. Учебник BytePlus отдельно предупреждает, что Python SDK и OpenAI SDK требуют `prompt`; для них советуют общую инструкцию вроде «разложи основные визуальные элементы». В тесте запрос шёл через `requests`, без SDK, и без `prompt` прошёл.

**Названные элементы.** Третий вызов отличался одним полем:

```json
"prompt": "Separate only the central toast lead singer with sunglasses and the toast-shaped electric guitar."
```

В ответе оказались ровно два слоя с именами «toast-shaped electric guitar» и «central toast lead singer with sunglasses». Базовое изображение сохранило всё остальное, а на месте вокалиста модель дорисовала фургон: лобовое стекло и решётку радиатора. По учебнику, элементы можно дополнительно пометить прямо на входной картинке — каракулями или выделением.

**Точные рамки.** В `prompt` вставляются теги bbox с четырьмя числами в шкале 0–1000: левая, верхняя, правая и нижняя граница. Пример из учебника BytePlus (в тестах этот режим не проверялся):

```text
Perform precise layer separation on the image. The text regions to separate are at <bbox>180 64 812 198</bbox>, <bbox>757 210 939 280</bbox>, <bbox>63 212 320 282</bbox>, <bbox>178 714 826 810</bbox>, <bbox>814 819 949 894</bbox>, and <bbox>326 824 669 930</bbox>; the parrot is at <bbox>347 305 642 997</bbox>.
```

Числа для тегов удобно брать из поля `bounding_box.normalized` предыдущего ответа: оно в той же шкале.

Пустая строка в `prompt` — спорное место. Документация LaoZhang утверждает, что поле можно опустить или отправить пустую строку с одинаковым результатом. [Руководство EvoLink](https://evolink.ai/blog/how-to-use-seedream-5-0-pro-layerize-api) от 15 августа 2026 года пишет обратное: с пустой строкой автоматическое определение теряется. Речь о двух разных шлюзах, вариант с пустой строкой в тестах не отправлялся, поэтому безопасный выбор один — не передавать ключ `prompt` вовсе.

Ещё одно ограничение из учебника: если попросить больше слоёв, чем допускает предел в 16, часть информации о слоях может потеряться.

## Что приходит в ответе: z_index, bounding_box и файлы крупнее рамок

Массив `data` содержит базовое изображение и все слои, а порядок наложения задаёт `z_index`: 0 — база, дальше по возрастанию снизу вверх. Вот ответ третьего вызова; ссылки и описания сокращены, остальное без изменений:

```json
{
  "model": "dola-seedream-5-0-flash-260915",
  "created": 1790953817,
  "data": [
    {
      "url": "https://ark-acg-ap-southeast-1.tos-ap-southeast-1.volces.com/...",
      "size": "880x1088",
      "output_format": "jpeg",
      "z_index": 0
    },
    {
      "url": "https://ark-acg-ap-southeast-1.tos-ap-southeast-1.volces.com/...",
      "size": "764x698",
      "output_format": "png",
      "z_index": 1,
      "bounding_box": {
        "absolute": [356, 585, 612, 820],
        "normalized": [405, 538, 694, 753]
      },
      "name": "toast-shaped electric guitar",
      "description": "Extract only the toast-shaped light yellow electric guitar..."
    },
    {
      "url": "https://ark-acg-ap-southeast-1.tos-ap-southeast-1.volces.com/...",
      "size": "774x710",
      "output_format": "png",
      "z_index": 2,
      "bounding_box": {
        "absolute": [248, 293, 657, 668],
        "normalized": [282, 269, 745, 613]
      },
      "name": "central toast lead singer with sunglasses",
      "description": "Extract only the central anthropomorphic toast character..."
    }
  ],
  "usage": {
    "input_images": 1,
    "generated_images": 3,
    "output_tokens": 11924,
    "total_tokens": 11924
  }
}
```

Как читать поля:

- `bounding_box.absolute` — `[left, top, right, bottom]` в пикселях базового изображения.
- `bounding_box.normalized` — та же рамка в шкале 0–1000 от ширины и высоты базы.
- `name` и `description` — английская подпись и описание, которые пишет модель. Между запусками они меняются: один и тот же фургон назван «Light green minivan» у Flash и «Light green minibus» у Pro.
- `usage.generated_images` включает базовое изображение: 14 означает 13 слоёв.
- У базового изображения нет ни `name`, ни `bounding_box`. В автоматических вызовах `z_index` шёл от 1 до 13 без пропусков.

Главная ловушка — размер файла слоя не равен размеру его рамки. Гитара пришла файлом 764×698, а её рамка — 256×235 пикселей. В первом вызове стойка микрофона — файл 271×1037 при рамке 103×394, шезлонг — 660×940 при рамке 118×169, то есть примерно в 5,6 раза больше по каждой стороне. Если вставить слой по координатам без масштабирования, он перекроет полкадра.

![Схема ответа Seedream: базовое изображение с z_index 0, два PNG-слоя над ним и файл слоя 764×698, который крупнее своей рамки 256×235](https://blog.laozhang.ai/posts/ru/seedream-5-pro-layer-decomposition-api/img/response-layers-bounding-box.webp)

Правило сборки из учебника BytePlus: базовое изображение — фон; слои сортируются по возрастанию `z_index`; для каждого `x = left`, `y = top`, `w = right − left`, `h = bottom − top`; слой масштабируется до `w × h` и ставится в точку `(x, y)`. Для собственного холста размером W×H берутся нормализованные координаты:

```text
x = left / 1000 × W
y = top / 1000 × H
w = (right − left) / 1000 × W
h = (bottom − top) / 1000 × H
```

BytePlus предупреждает, что нормализованные координаты — целые числа, и пересчёт даёт ошибку округления. Из размеров файлов следует полезное свойство: в слое пикселей больше, чем занимает его рамка на базе 1K, так что на холсте немного крупнее слой можно разместить без увеличения. Запас у каждого слоя свой: на холсте шириной 2784, как у исходника, рамка стойки микрофона будет около 320 пикселей в ширину при файле в 271. Это вывод из чисел; глазами на большом холсте он не проверялся.

Ссылки из ответа живут 24 часа, так что файлы нужно скачать сразу. По документации LaoZhang ссылки не отдают заголовки CORS, и клиенту в браузере стоит запрашивать `response_format: "b64_json"`.

## PSD API не отдаёт: скрипт на Python собирает его из ответа

Готового PSD в ответе нет: API возвращает JSON и ссылки на отдельные изображения. Утверждение «каждый результат — это PSD», которое встречается на сайтах онлайн-сервисов, описывает их собственную обёртку, а не API. Файл со слоями собирается на вашей стороне.

Скрипт ниже прошёл на всех трёх ответах (Python 3.12, Pillow 12.3.0, psd-tools 1.23.0). Он скачивает изображения, сохраняет каждый слой как `layer-NN-имя.png`, собирает плоское превью `recomposed.png` и пишет `layers.psd`, где каждый слой назван по полю `name` и стоит по своим координатам `absolute`.

```bash
python3 -m pip install pillow psd-tools
python3 layers_to_psd.py response.json out_dir
```

```python
"""Сохраняет все изображения из ответа Seedream с разделением на слои,
собирает плоское превью и записывает PSD со слоями.

Запуск: python3 layers_to_psd.py response.json out_dir
Нужны: python3 -m pip install pillow psd-tools
"""
import base64
import json
import re
import sys
import urllib.request
from io import BytesIO
from pathlib import Path

from PIL import Image
from psd_tools import PSDImage

response = json.loads(Path(sys.argv[1]).read_text())
response = response.get("response", response)  # подойдёт и запись, где ответ вложен в поле response
out = Path(sys.argv[2])
out.mkdir(parents=True, exist_ok=True)


def load(item):
    if item.get("b64_json"):
        value = item["b64_json"].split(",", 1)[-1]
        return base64.b64decode(value + "=" * (-len(value) % 4))
    with urllib.request.urlopen(item["url"], timeout=120) as download:
        return download.read()


items = sorted(response["data"], key=lambda item: item["z_index"])
base_item, layer_items = items[0], items[1:]
assert base_item["z_index"] == 0 and "bounding_box" not in base_item

content = load(base_item)
ext = "png" if base_item.get("output_format") == "png" else "jpg"
(out / f"layer-00-base.{ext}").write_bytes(content)
base = Image.open(BytesIO(content)).convert("RGBA")
canvas = base.copy()

psd = PSDImage.new("RGBA", base.size)
psd.append(psd.create_pixel_layer(base, name="base", top=0, left=0))

for item in layer_items:
    content = load(item)
    slug = re.sub(r"[^a-z0-9]+", "-", item.get("name", "layer").lower()).strip("-") or "layer"
    (out / f"layer-{item['z_index']:02d}-{slug}.png").write_bytes(content)
    left, top, right, bottom = item["bounding_box"]["absolute"]
    # PNG обычно крупнее своей рамки: сначала масштабируем его до рамки.
    layer = Image.open(BytesIO(content)).convert("RGBA").resize((right - left, bottom - top), Image.LANCZOS)
    canvas.alpha_composite(layer, (left, top))
    psd.append(psd.create_pixel_layer(layer, name=item.get("name", slug), top=top, left=left))
    print(f"z={item['z_index']:>2} file={item['size']:>9} box={right - left}x{bottom - top} at ({left},{top})  {item.get('name')}")

canvas.save(out / "recomposed.png")
psd.save(out / "layers.psd")
print(f"Saved {len(layer_items)} layers + base, recomposed.png and layers.psd in {out}")
```

Код совпадает с тем, что запускался; на русский переведены только строка документации и комментарии. Результат на тестовых ответах: PSD 880×1088 с 14 именованными пиксельными слоями для автоматических вызовов и с 3 — для вызова с названными элементами. Проверка была одна: файл заново открыт библиотекой psd-tools, сведён в плоское изображение и сравнён с `recomposed.png` — среднее абсолютное расхождение не больше 0,001. В Photoshop, Photopea и GIMP этот PSD не открывался.

Два ограничения результата. Слои в PSD хранятся в размере рамки на базе 1K, а исходные, более крупные PNG лежат рядом в папке. И все слои растровые: в ответе API нет ничего, что стало бы редактируемым текстовым слоем.

Если PSD нужен без кода, есть браузерный инструмент [layerpsd.com](https://layerpsd.com/) того же владельца, что и этот блог. По описанию на сайте, он делит JPG, PNG или WebP на PSD со слоями по цене от $0,018 за слой, без подписки и с одной бесплатной попыткой после входа через Google; в тестах он не участвовал.

## Совпадёт ли сборка с оригиналом: расходятся от 4 до 30 % пикселей

Нет, сборка слоёв по `bounding_box.absolute` в порядке `z_index` не воспроизводит входное изображение пиксель в пиксель. Мера в таблице — доля пикселей, у которых хотя бы один канал отличается от уменьшенного оригинала больше чем на 32 из 255.

| Вызов | Вынуто слоёв | Доля отличающихся пикселей | Среднее абсолютное расхождение |
|---|---|---|---|
| Flash, без `prompt` | 13 | 30,2 % | 20,6 |
| Pro, без `prompt` | 13 | 12,6 % | 13,6 |
| Flash, два названных элемента | 2 | 4,0 % | 6,7 |

![Сравнение трёх вызовов Seedream на 1K: число изображений, время до ответа, сумма по прайсу LaoZhang и доля отличающихся пикселей](https://blog.laozhang.ai/posts/ru/seedream-5-pro-layer-decomposition-api/img/three-calls-compared.webp)

Причина видна в самих файлах. Каждый слой — законченный объект: скрытые части дорисованы, иначе его нельзя было бы сдвинуть. Базовое изображение перерисовано за каждым вынутым элементом. Поэтому это не вырезание фона и не маска сегментации, а новая генерация, близкая к оригиналу.

У Flash в автоматическом режиме расхождения заметны глазом. Два размытых персонажа на переднем плане вернулись резкими и с другой формой. Музыкант слева перерисован целым и более крупным. Сцена стала полным диском и закрыла траву, которая была видна в оригинале. Летающие пузыри пропали и из базы, и из слоёв. Pro сохранил размытие переднего плана и пузыри и визуально близок к оригиналу, отличия остались на краях.

Это одна стилизованная трёхмерная картинка и по одному запуску на модель, а не общая оценка качества. Для работы из неё следуют два правила: чем меньше элементов вынимается, тем меньше меняется картинка, и результат нужно смотреть глазами рядом с оригиналом до того, как он уйдёт в макет. Утверждение из руководства EvoLink, что такая сборка воспроизводит оригинал в точности, на этом образце не подтвердилось.

## Сколько стоит вызов: цена изображения × от 2 до 17 изображений

Цена вызова равна цене одного изображения, умноженной на число возвращённых изображений, то есть на базовое плюс слои: от 2 до 17. Точную сумму до запуска узнать нельзя, зато известны её границы.

Цены за изображение по состоянию на 2 октября 2026 года:

| Маршрут и модель | Цена за изображение | Источник |
|---|---|---|
| BytePlus, Seedream 5.0 Flash | $0,018 | [прайс BytePlus](https://docs.byteplus.com/en/docs/modelark/model-pricing) |
| BytePlus, Seedream 5.0 Pro, слой до 2,61 млн пикселей (1.5K и ниже) | $0,0225 | прайс BytePlus |
| BytePlus, Seedream 5.0 Pro, слой больше 2,61 млн пикселей | $0,045 | прайс BytePlus |
| LaoZhang, Seedream 5.0 Flash | $0,018 | документация LaoZhang |
| LaoZhang, Seedream 5.0 Pro | $0,12, без градации по пикселям | документация LaoZhang |

Те же цены, умноженные на число изображений:

| Маршрут и модель | 3 изображения | 14 изображений | 17 изображений (максимум) |
|---|---|---|---|
| Flash, BytePlus или LaoZhang | $0,054 | $0,252 | $0,306 |
| Pro, BytePlus, все до 2,61 млн пикселей | $0,0675 | $0,315 | $0,3825 |
| Pro, BytePlus, все больше 2,61 млн пикселей | $0,135 | $0,63 | $0,765 |
| Pro, LaoZhang | $0,36 | $1,68 | $2,04 |

Оговорки к расчёту для BytePlus. Прайс описывает цену слоя и не говорит отдельно, по какой ставке считается базовое изображение; `generated_images` его включает, поэтому в таблице оплачиваемым считается каждое изображение. Слои одного запроса могут попасть в разные ценовые ступени, и каждый считается по своей. На 1K все изображения теста были далеко от границы 2,61 млн пикселей, но база 2048×2048 при 2K — это уже 4,19 млн пикселей и верхняя ступень. Входное изображение у BytePlus в этом режиме бесплатно: оно одно, а первое не оплачивается. Изображения, заблокированные модерацией, в счёт не идут. Налоги и скидки в расчёт не включены.

Счётом управляют два рычага. Первый — `prompt` с названными элементами: в тесте он уменьшил число изображений с 14 до 3. Второй — модель: на том же 14-слойном результате Flash стоит $0,252 на любом из двух маршрутов.

## Flash или Pro: начните с Flash, а Pro берите напрямую у BytePlus

Начинайте с Flash и переходите на Pro, когда собранная картинка должна оставаться близкой к оригиналу. На тестовом образце Flash ответил быстрее (94,8 с против 110,6 с) и стоит дешевле, но изменил 30,2 % пикселей против 12,6 % у Pro и потерял часть деталей.

Маршрут зависит от модели:

- **Flash.** Цена у LaoZhang равна прайсу BytePlus, $0,018 за изображение. Шлюз ничего не добавляет к счёту и избавляет от заведения аккаунта BytePlus.
- **Pro.** У LaoZhang изображение стоит $0,12, у BytePlus в режиме слоёв — $0,0225 или $0,045. Разница — 0,12 / 0,0225 ≈ 5,3 раза на нижней ступени и 0,12 / 0,045 ≈ 2,7 раза на верхней. Для регулярной работы с Pro дешевле прямой доступ к BytePlus ModelArk; шлюз оправдан для разовой проверки, когда 14 изображений за $1,68 обходятся дешевле времени на новый аккаунт.

У BytePlus обе модели размещены только в регионе `ap-southeast-1`; европейского эндпоинта для них в [списке моделей](https://docs.byteplus.com/en/docs/modelark/model-list) нет. Если выбор ещё шире и вопрос в том, [какую из двух моделей запускать первой — Nano Banana Pro или Seedream 5.0 Pro](https://blog.laozhang.ai/ru/posts/nano-banana-pro-vs-seedream), он разобран отдельно, с официальными ценами.

По размеру BytePlus пишет, что `1.5K` стоит столько же, сколько `1K`, и даёт лучшее качество. Это утверждение документации: в тестах был только `1K`.

## Почему так долго и что будет при сбое: таймаут от 300 секунд

Вызов синхронный и занимает десятки секунд, причём время растёт вместе с числом изображений: 3 изображения пришли за 34,8 с, 14 — за 94,8 с у Flash и за 110,6 с у Pro. Потоковый режим `stream` у обеих моделей не поддерживается, поэтому до конца генерации клиент ничего не получает.

Сценарии ошибок в тестах не воспроизводились; ниже — то, что написано в документации.

| Ситуация | Что происходит | Откуда |
|---|---|---|
| Клиентский таймаут | Для 1K ставьте не меньше 300 с. Запрос на 2K может идти долго и оплачивается, даже если клиент отключился | LaoZhang |
| Один из слоёв не сгенерировался | Проваливается весь запрос, частичного успеха нет | BytePlus |
| Изображение не удалось разложить | HTTP 400, без списания, можно повторить | LaoZhang |
| Старая модель (`seedream-5-0-260128`, `seedream-4-5-251128`) | HTTP 400 с кодом `InvalidParameter` | LaoZhang |
| В теле есть `sequential_image_generation` или `stream` | HTTP 400 | LaoZhang |
| Ссылки из ответа | Действуют 24 часа | BytePlus |

Для пакетной обработки важен лимит. У аккаунта BytePlus по умолчанию 500 IPM (изображений в минуту) на версию модели, и каждый запрос с разделением на слои сразу резервирует 17 IPM — под максимум из базы и 16 слоёв. Лишнее возвращается только после завершения запроса. Отсюда расчёт: 500 / 17 = 29 запросов можно начать за минуту на свежей квоте (29 × 17 = 493), а не 500, как при обычной генерации по одному изображению. BytePlus называет эти лимиты теоретическим максимумом; у шлюза лимиты могут быть свои.

Полученный слой можно править дальше. По учебнику BytePlus, PNG слоя отправляется как единственный вход обычного запроса Seedream с `"background": "transparent"` и выходом png — так объект перекрашивается с сохранением прозрачности. Jpeg на входе или `output_format: "jpeg"` в этом режиме дают ошибку. В тестах этот шаг не выполнялся.

## Когда разделение на слои через API не подходит

Режим не подходит, если нужна точная копия исходника, разложенная по слоям: объекты и фон дорисовываются, и собранная картинка отличается от оригинала. Есть и другие случаи:

- **Нужен редактируемый текст.** Все слои растровые. В примерах BytePlus группы текста выделяются в отдельные слои, но это картинки с буквами, а не текстовые объекты. Плакаты с большим количеством текста в тестах не проверялись.
- **Нужен один вырезанный объект.** Платить за набор слоёв незачем: проще [сделать прозрачный фон PNG и проверить, что он настоящий](https://blog.laozhang.ai/ru/posts/transparent-image-maker).
- **Исходник в WebP, HEIC или другом формате.** Режим принимает только png и jpeg, файл придётся перекодировать заранее.
- **Нужно больше 16 слоёв или холст больше 2K.** Предел — базовое изображение плюс 16 слоёв, а `size` ограничен значениями `1K`, `1.5K`, `2K` и `auto`. Упоминания «нативного 4K» для Seedream 5.0 Pro с документацией BytePlus расходятся.
- **Требуется обработка в европейском регионе.** У BytePlus обе модели доступны только в `ap-southeast-1`.
- **Нужна твёрдая цена за файл.** Число изображений выбирает модель, и по документации LaoZhang оно может отличаться между запусками на одном и том же входе.

Для первого запуска на своём материале хватит одной картинки и модели Flash на самом маленьком размере. Вызов без `prompt` на `1K` покажет, что модель считает слоями и сколько это стоит, а второй вызов с названными элементами или рамками из `normalized` оставит только нужное. Дальше ответ сохраняется в `response.json` и передаётся скрипту — на выходе будут PNG-слои, превью для сверки с оригиналом и PSD.
