Генерация изображений с Seedream 5.5 (Beta) — новейшей моделью изображений Seedream от ByteDance: одна модель для текста в изображение, правок и слияния нескольких изображений, асинхронными задачами. Отправка сразу возвращает id задачи (HTTP 202), а результат вы опрашиваете или получаете вебхуком. 1K и 2K в 9 пропорциях, выдаётся оригинальный PNG; оплата за изображение, при ошибке ничего не списывается. Во время Beta в часы пик запрос может завершиться ошибкой или выполняться дольше; отправьте его заново без изменений.
Попробовать в песочнице →Быстрый старт
Три шага: отправить задачу, опросить её и забрать ссылку на изображение. Замените YOUR_API_KEY своим ключом, и команды ниже заработают как есть.
Шаг 1 · Отправка (сразу возвращает id задачи, HTTP 202)
curl https://kovapi.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "seedream-5.5", "prompt": "Вход в кафе в старом переулке на закате, на меловой доске написано «Сегодня: латте с османтусом 350 ₽», рядом рыжий кот, фотореализм", "size": "16:9", "resolution": "2K"}'Ответ (HTTP 202)
{
"id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
"object": "image.generation.job",
"status": "queued",
"created": 1791281400,
"model": "seedream-5.5"
}Шаг 2 · Опрашивайте каждые 2–3 секунды, пока status не станет succeeded или failed
curl https://kovapi.com/v1/images/jobs/img_7f3c9a1e2b4d6f8a0c1e3b5d \ -H "Authorization: Bearer YOUR_API_KEY"
Ответ при успехе
{
"id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
"object": "image.generation.job",
"status": "succeeded",
"created": 1791281400,
"model": "seedream-5.5",
"data": [
{"url": "https://img.kovapi.com/i/2be8cd16d37f3a4b9c0e1f2a3b4c5d6e.png"}
],
"usage": {"images": 1, "resolution": "2K", "model": "seedream-5.5"}
}Шаг 3 · data[0].url — это изображение (оригинальный PNG). Оно хранится 7 дней; чтобы пользоваться им дольше, скачайте его в своё хранилище.
Полный пример (Python: отправить, дождаться, сохранить на диск)
import time
import requests
BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. отправка
job = requests.post(f"{BASE}/images/generations", headers=HEADERS, json={
"model": "seedream-5.5",
"prompt": "Вход в кафе в старом переулке на закате, на меловой доске написано «Сегодня: латте с османтусом 350 ₽», рядом рыжий кот, фотореализм",
"size": "16:9",
"resolution": "2K",
}).json()
if "error" in job:
raise SystemExit(job["error"]["message"])
# 2. опрос каждые 3 секунды до завершения
while job["status"] not in ("succeeded", "failed"):
time.sleep(3)
job = requests.get(f"{BASE}/images/jobs/{job['id']}", headers=HEADERS).json()
# 3. скачивание изображения
if job["status"] == "succeeded":
url = job["data"][0]["url"]
with open("seedream-5.5.png", "wb") as f:
f.write(requests.get(url).content)
print("saved", url)
else:
print("failed:", job["error"]["code"], job["error"]["message"])Аутентификация
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
Чтобы начать, создайте API-ключ в консоли.
Параметры запроса
JSON-тело запроса POST /v1/images/generations:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| model | string | Да | ID модели: seedream-5.5. |
| prompt | string | Да | Что нарисовать. Для изображения из изображения опишите, что нужно изменить. |
| size | string | Нет | Пропорция: 1:1 (по умолчанию), 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 9:21. Можно указать и размер в пикселях (например, 2560x1440) — по его пропорции выбирается одна из этих 9; любая другая пропорция возвращает 400 при отправке, ничего не списывается. Вы получаете родной размер этой пропорции (см. таблицу размеров). |
| resolution | string | Нет | Уровень: 1K (по умолчанию) или 2K. 4K нет. |
| image / images | string / array | Нет | Референсы; если они есть, это правка или слияние: одно изображение в image, несколько в images (до 10). Каждое — публичный URL, data: URI или base64. Если их несколько, по порядку укажите в промпте, для чего каждое, например: «человек с изображения 1 сидит в кафе с изображения 2». |
| n | integer | Нет | Всегда 1: одно изображение на запрос. Чтобы получить несколько, отправьте несколько заданий сразу; любое другое значение возвращает 400 при отправке, ничего не списывается. |
| callback_url | string | Нет | Куда отправить результат, когда задача завершится; подробнее — в разделе о вебхуках ниже. |
Другие параметры OpenAI (quality, background, output_format, style и подобные) не поддерживаются: они ни на что не влияют и не меняют цену. Результат — всегда оригинальный PNG, возвращается как url; при response_format: "b64_json" в результате есть ещё и копия в base64.
Цена
Оплата за изображение; цена зависит только от уровня, а пропорция и режим (из текста или из изображения) на неё не влияют. Цена уровня резервируется при отправке и полностью возвращается, если задача завершится ошибкой. 1 кредит = $0.005.
| Уровень | Кредитов за изображение | USD за изображение |
|---|---|---|
| 1K | 4 | $0.02 |
| 2K | 6 | $0.03 |
Пропорции, разрешение и размер изображения
Пропорцию указывайте в size, уровень — в resolution. Вы получаете оригинал, который модель рисует в этой пропорции, с фиксированным размером для каждой пропорции и уровня (см. таблицу); без обрезки и масштабирования.
| Пропорция | 1K | 2K |
|---|---|---|
| 1:1 | 1024x1024 | 2048x2048 |
| 16:9 | 1424x800 | 2816x1584 |
| 9:16 | 800x1424 | 1584x2816 |
| 4:3 | 1152x864 | 2368x1776 |
| 3:4 | 864x1152 | 1776x2368 |
| 3:2 | 1248x832 | 2496x1664 |
| 2:3 | 832x1248 | 1664x2496 |
| 21:9 | 1568x672 | 3136x1344 |
| 9:21 | 672x1568 | 1344x3136 |
- Поддерживаются только 9 пропорций из таблицы; любая другая (5:4, 2:1 ...) возвращает 400
unsupported_sizeпри отправке, ничего не списывается. Некоторые родные размеры немного отличаются от номинальной пропорции (1K 16:9 — 1424×800): это размер, который рисует сама модель. Перед выдачей проверяются пропорция, размер и модель, указанная в учётных данных C2PA; если что-то не совпадает, изображение не выдаётся, задача завершается ошибкой и ничего не списывается. - В
sizeможно указать и размер в пикселях (например,2560x1440): он задаёт только пропорцию (в пределах 1,5% от одной из 9), а вы всё равно получаете оригинал в размере этой пропорции из таблицы. Уровень задаётresolution; без него решает длинная сторона: до 1600 — 1K, от 1601 до 3200 — 2K. - У этой модели только 1K и 2K: запрос 4K (
resolution: "4K"илиsizeс длинной стороной больше 3200) сразу отклоняется с 400unsupported_resolution, ничего не списывается. Для 2K передайтеresolution: "2K".
Изображение из изображения и референсы
- Передайте
image(одно изображение) илиimages(несколько, до 8; сверх 8 не используются) — и задача выполнится как изображение из изображения; в промпте напишите, что изменить.POST /v1/images/editsпринимает те же параметры. - Оба эндпоинта принимают только JSON-тело, а не загрузку файлов через multipart, поэтому
images.edit()из OpenAI SDK напрямую не подойдёт: передавайте ссылки или base64, как в примере ниже. - Каждый референс — это публичная ссылка на изображение (http или https), data: URI или просто base64, до 16MB каждый, в распространённом формате: JPEG, PNG, WebP и т. п.
- Ссылка должна отдавать само изображение, а не веб-страницу и не адрес за логином или с защитой от хотлинка. Референс, который не удаётся прочитать, отклоняется при отправке с ошибкой 400, где указано, какой именно и почему; задача не создаётся, ничего не списывается.
- При правках и слиянии пропорция результата задаётся
size(1:1, если не указан), а не референсом; чтобы сохранить пропорцию оригинала, укажите её вsize. Вы получаете оригинал модели без обрезки и масштабирования. Чтобы править в несколько раундов, передайте предыдущий результат как референс следующего. - Референсы мы размещаем у себя и храним 7 дней.
Изображение из изображения по двум референсам
curl https://kovapi.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "seedream-5.5", "prompt": "Сохрани людей, замени фон на ночной пляж с гирляндами тёплого света", "images": ["https://example.com/people.jpg", "https://example.com/beach.jpg"], "size": "3:4", "resolution": "2K"}'Статус задачи и поля ответа
GET /v1/images/jobs/{id} возвращает эти статусы; все поля описаны в разделе Асинхронные задачи. Опрашивайте каждые 2–3 секунды или используйте вебхук.
| Статус | Что значит |
|---|---|
| queued | В очереди. В ответе есть queue_position (сколько задач впереди) и eta_seconds (ожидаемое время ожидания). |
| processing | Генерируется. |
| succeeded | Готово. Результат в data[0].url, детали оплаты в usage. |
| failed | Ошибка. Причина в error; зарезервированные кредиты возвращаются полностью. |
Один аккаунт выполняет до 50 задач одновременно; остальные ждут в порядке отправки, а задача, не начавшаяся за 15 минут, завершается ошибкой с полным возвратом. Записи о задачах хранятся 3 дня, ссылки на изображения — 7 дней.
Сколько ждать
Обычно 20–40 секунд от отправки до результата, если сервис не перегружен; 2K и несколько референсов — чуть дольше. Во время Beta в часы пик может быть дольше или завершиться ошибкой (неудачи не оплачиваются).
Ошибки и возвраты
Ошибка при отправке сразу возвращается как HTTP 4xx / 5xx: задача не создаётся, ничего не списывается. О неудаче после того, как задача принята, сообщает эндпоинт задачи, а резерв возвращается полностью. Все коды перечислены в разделе Коды ошибок.
Ошибки при отправке
| HTTP | code | Причина | Что делать |
|---|---|---|---|
| 400 | missing_prompt | В запросе к /v1/images/generations нет prompt. | Добавьте prompt. |
| 400 | invalid_request | Не удаётся прочитать референсное изображение (битая ссылка, не изображение, больше 16MB…; в message указано, какое и почему), в /v1/images/edits нет референсного изображения, тело запроса — не JSON-объект или n — не целое число. | Исправьте то, что указано в message, и отправьте снова. |
| 400 | unsupported_resolution | Модель не поддерживает выбранный уровень разрешения (например, у генерации изображений Grok нет 4K). | Выберите другой уровень; доступные уровни указаны в документации каждой модели. |
| 400 | model_not_found | ID модели написан с ошибкой, model не передан или модель нельзя использовать на этом эндпоинте (например, чат-модель на эндпоинте изображений). | Берите ID модели из GET /v1/models или из справочника API. |
| 401 | invalid_api_key | Ключ не существует, удалён или отключён, либо отключён аккаунт. | Проверьте ключ на странице API Keys в консоли. |
| 402 | insufficient_quota | Баланса не хватает, чтобы зарезервировать стоимость этого запроса. Шлюз сначала резервирует максимально возможную стоимость запроса, поэтому ошибка может возникнуть и при всплеске одновременных вызовов. | Если был всплеск запросов, подождите несколько секунд и повторите; в остальных случаях пополните баланс. |
| 429 | rate_limit_exceeded | Превышен лимит запросов в минуту, заданный для этого ключа (считается за последние 60 секунд). Заголовка Retry-After нет. | Подождите несколько секунд и повторите или увеличьте лимит ключа в консоли. |
| 503 | model_maintenance | Модель на обслуживании и не принимает запросы; пока идёт обслуживание, другая модель вместо неё не ответит. | Повторите, когда обслуживание закончится; ход работ — на странице статуса. |
| 503 | service_unavailable | Временный сбой на нашей стороне, например при сохранении референсного файла; /v1/responses также отвечает 503 с Retry-After, когда временно не может принять запрос. | Повторите чуть позже. |
Неудачные задачи (status — failed)
| code | Когда возникает | Что делать |
|---|---|---|
| moderation_blocked | Изображение: система безопасности поставщика модели отклонила промпт или референсное изображение (код может быть и content_policy_violation). | Перепишите промпт или замените референс; повторная отправка без изменений обычно снова отклоняется. |
| upstream_error | Любая другая ошибка: автоматические повторы не помогли, задача ждала 15 минут и так и не запустилась, поставщик отказал без объяснения причины и т. п.; что именно произошло, указано в message. | Обычно повторная отправка проходит успешно. |
Вебхуки вместо опроса
Добавьте при отправке callback_url — как только задача завершится, успешно или с ошибкой, шлюз отправит на этот URL ровно то же, что возвращает эндпоинт опроса; запрос подписан, а при неудачной доставке повторяется. Общий адрес для всего аккаунта можно также задать в консоли, в разделе «Настройки → Вебхуки». Документация по вебхукам →
curl https://kovapi.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "seedream-5.5", "prompt": "Вход в кафе в старом переулке на закате, на меловой доске написано «Сегодня: латте с османтусом 350 ₽», рядом рыжий кот, фотореализм", "size": "1:1", "callback_url": "https://your-domain.com/webhook"}'