01
Seed помогает сравнивать, но не гарантирует одинаковые пиксели
Если модель поддерживает seed, сохраняйте его вместе с промптом, версией, размером и референсами. Некоторые endpoint дают разные изображения даже с одним seed.
Решение: image-API
Каждый эндпоинт объявляет собственные поля: где-то есть негативный запрос, где-то сид, где-то четыре варианта за вызов. Универсальная форма прячет ровно те регуляторы, которые делают результат воспроизводимым.

Задача
«Запрос на входе, картинка на выходе» работает секунд десять. Дальше нужен тот же персонаж во второй раз, 3:2 вместо квадрата, четыре варианта за вызов и сид, который можно записать.
01
Если модель поддерживает seed, сохраняйте его вместе с промптом, версией, размером и референсами. Некоторые endpoint дают разные изображения даже с одним seed.
02
Одни эндпоинты принимают resolution или aspect_ratio, другие — width и height в пикселях. Не то поле — это 400, а там, где тариф за мегапиксель, выбранный размер и есть цена.
03
Там, где есть num_outputs, списание идёт по числу изображений, а не запросов. Значение 4 по умолчанию стоит вчетверо дороже единицы, и до отправки эта разница видна только в оценке.
Подход
Создавайте входные данные по схеме endpoint. Сохраняйте точный запрос, порядок референсов и версию вместе с результатом для сравнения вариантов. Храните оригинал: идентичная повторная генерация не гарантирована.
Задачи с изображениями используют тот же контракт «создать и отслеживать», что и видео. Вся разница — внутри input.
POST /api/v1/jobs/createTask
POST /api/v1/jobs/createTask
Authorization: Bearer $SPICY_API_KEY
Idempotency-Key: 7b1f0c2e-9a4d-4f31-8c67-2b5e0d9a1c44
Content-Type: application/json
{
"model": "<publisher>/<model>/text-to-image",
"input": {
"prompt": "A ceramic teapot on linen, soft window light, muted palette",
"aspect_ratio": "3:2",
"num_outputs": 2,
"seed": 1337
}
}GET /api/v1/jobs/recordInfo?taskId=…
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"state": "succeeded",
"output": {
"assets": [
{
"mime": "image/png",
"url": "https://…/result.png?X-Amz-Signature=…",
"expiresAt": "2026-09-12T12:20:08Z"
}
]
},
"cost": "0.040000",
"settled": true
}
}Контракт
| Поле или заголовок | Значение или предел |
|---|---|
| input | additionalProperties: false |
| seed · num_outputs · aspect_ratio | declared per endpoint |
| cost + settled: false | hold · final charge never exceeds it |
| errorCode | 9 stable values, content_rejected included |
Проведите по горизонтали, чтобы увидеть все столбцы.
Интеграция
Применимость
Проверки
Тело, собранное на странице модели, — это то же тело, которое отправляет ваш сервер: те же поля, та же проверка, та же оценка. Упрощённого предпросмотра, который потом разойдётся с реальностью, здесь нет.
Ввод проверяется по схеме эндпоинта с закрытым additionalProperties. Необъявленный параметр возвращает 400 со стабильным errorCode, а не игнорируется.
Они приходят в output.assets с key, MIME-типом, подписанной url и expiresAt. Ничто не ведёт туда, где выполнялась модель.
Перед запуском
Частые вопросы
Модели
Каждая ссылка ведёт на страницу семейства моделей: входные данные, ограничения, контентная политика и текущая цена за единицу.
Дальше
Сравните эндпоинты по входам, управлению размером и сидом, числу результатов и цене за изображение и переиспользуйте проверенный запрос.