Перейти к основному контенту

Решение: image-API

Генерируйте изображения теми регуляторами, которые модель действительно открывает.

Каждый эндпоинт объявляет собственные поля: где-то есть негативный запрос, где-то сид, где-то четыре варианта за вызов. Универсальная форма прячет ровно те регуляторы, которые делают результат воспроизводимым.

Задача

Универсальные формы теряют главное

«Запрос на входе, картинка на выходе» работает секунд десять. Дальше нужен тот же персонаж во второй раз, 3:2 вместо квадрата, четыре варианта за вызов и сид, который можно записать.

01

Seed помогает сравнивать, но не гарантирует одинаковые пиксели

Если модель поддерживает 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
  }
}

Контракт

Что стоит зафиксировать сразу

API генерации изображений: много моделей — Что стоит зафиксировать сразу
Поле или заголовокЗначение или предел
inputadditionalProperties: false
seed · num_outputs · aspect_ratiodeclared per endpoint
cost + settled: falsehold · final charge never exceeds it
errorCode9 stable values, content_rejected included

Проведите по горизонтали, чтобы увидеть все столбцы.

Интеграция

От первого вызова до продакшена

  1. 01Откройте страницу модели и посмотрите, какие из seed, negative_prompt, num_outputs и полей размера объявлены.
  2. 02Соберите тело по input_schema: additionalProperties закрыт, поэтому необъявленный ключ — это 400, а не тишина.
  3. 03Оцените, отправьте с Idempotency-Key и сохраните taskId, сид и разрешённое значение model рядом с результатом.
  4. 04Заберите output.assets из обратного вызова или recordInfo и скопируйте файлы в собственное хранилище.

Применимость

Когда этот путь подходит

Выбирайте, если

  • Вы генерируете из текста и хотите видеть несколько разработчиков за одной формой запроса, одним балансом и одним счётом.
  • Вы хотите сравнивать варианты с сохранённым запросом и версией модели.

Ищите другое, если

  • Ваши пользователи начинают с уже имеющейся фотографии. Редактирование — отдельная задача со своим контрактом ссылок.
  • Вы хотите один фирменный стиль на всех моделях. Стиль живёт в модели, а не в этом слое.

Проверки

Что вы можете проверить сами

Пробный запрос и есть боевой

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

Необъявленные поля падают громко

Ввод проверяется по схеме эндпоинта с закрытым additionalProperties. Необъявленный параметр возвращает 400 со стабильным errorCode, а не игнорируется.

Результаты отдаёт хранилище платформы

Они приходят в output.assets с key, MIME-типом, подписанной url и expiresAt. Ничто не ведёт туда, где выполнялась модель.

Перед запуском

Поведение платформы, которое стоит подтвердить

  • До запуска решите, где хранятся сиды: несохранённый сид бесполезен.
  • Задайте обязательный дневной лимит на каждый новый ключ, а при необходимости месячный и накопительный.
  • Обрабатывайте закрытый набор errorCode, включая content_rejected, как обычные состояния продукта.
  • Зеркалируйте файлы в своё хранилище в пределах 14-дневного срока хранения.

Частые вопросы

О чём спрашивают на этой странице

Повторите исходные данные, версию и seed, если он поддерживается. Это не гарантирует одинаковые пиксели. Скачайте и сохраните оригинальный результат, если нужен именно этот файл.