Изображения

Создание изображений по тексту или с референсами. Общие правила авторизации и статусов — в обзоре API.

Параметры создания

ПолеОбязательноеЗначения
modelДаnano-banana-2 или nano-banana-pro.
qualityДаВ запросе: 1k, 2k, 4k. В ответе нормализуется в 1K, 2K, 4K.
promptДаНепустая строка до 12 000 символов.
aspect_ratioНет1:1 по умолчанию; также 9:16, 16:9, 4:5, 3:4, 4:3, 2:3, 3:2.
upload_idsНетМассив до пяти уникальных UUID, полученных через POST /files.

Быстрый старт

1. Загрузите референс (необязательно)

curl -X POST https://corp.aitale.ru/api/v1/files \
  -H "Authorization: Bearer $AITALE_CORP_KEY" \
  -F "file=@reference.jpg"

Если генерация не использует исходное изображение, пропустите этот шаг и не передавайте upload_ids. Для референса используется только multipart/form-data. Один запрос загружает один JPG, PNG или WEBP до 8 МиБ (8 388 608 байт). Для одной генерации можно указать до пяти уникальных upload_id. Base64 и внешние URL не принимаются. Upload хранится 12 часов и принадлежит тому API-ключу, чей аккаунт его загрузил.

2. Создайте задание

curl -X POST https://corp.aitale.ru/api/v1/images/generations \
  -H "Authorization: Bearer $AITALE_CORP_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-8472-image-1" \
  -H "X-Request-Id: my-trace-8472" \
  -d '{
    "model": "nano-banana-2",
    "quality": "2k",
    "aspect_ratio": "4:5",
    "prompt": "Создай рекламный портрет продукта",
    "upload_ids": ["UUID_FROM_UPLOAD"]
  }'

Заголовок Idempotency-Key обязателен. Повтор с тем же ключом и телом возвращает исходное задание; тот же ключ с другими параметрами дает 409 idempotency_conflict.

{
  "data": {
    "id": "f01d6d17-...",
    "object": "image_generation",
    "status": "queued",
    "model": "nano-banana-2",
    "quality": "2K",
    "cost_tokens": "2.50",
    "result": null,
    "error": null
  }
}

3. Опрашивайте статус

curl https://corp.aitale.ru/api/v1/images/generations/f01d6d17-... \
  -H "Authorization: Bearer $AITALE_CORP_KEY"

Соблюдайте Retry-After (обычно 2 секунды) и не запускайте параллельный polling одного задания. После succeeded скачайте URL из result.url отдельным HTTP-запросом с тем же Bearer-ключом. Обычный тег <img src="…"> не передаст авторизацию. Сохраните бинарный ответ у себя: результат удаляется через 12 часов, а API не предоставляет постоянное хранилище.

Полный пример на Python

Функция use_your_fallback в примере обозначает ваш собственный резервный маршрут. Правила — в разделе ошибок.

import os, time, uuid, requests

BASE = "https://corp.aitale.ru/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['AITALE_CORP_KEY']}"}

with open("reference.jpg", "rb") as image:
    uploaded = requests.post(
        f"{BASE}/files", headers=HEADERS,
        files={"file": ("reference.jpg", image, "image/jpeg")}, timeout=30,
    ).json()["data"]

response = requests.post(
    f"{BASE}/images/generations",
    headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
    json={
        "model": "nano-banana-pro", "quality": "4k",
        "aspect_ratio": "1:1", "prompt": "Product photo",
        "upload_ids": [uploaded["id"]],
    }, timeout=15,
)
if response.status_code == 503:
    use_your_fallback(response.json())
response.raise_for_status()
job = response.json()["data"]

while job["status"] in ("queued", "processing"):
    time.sleep(int(response.headers.get("Retry-After", "2")))
    response = requests.get(f"{BASE}/images/generations/{job['id']}", headers=HEADERS, timeout=15)
    response.raise_for_status()
    job = response.json()["data"]

if job["status"] == "succeeded":
    content = requests.get(job["result"]["url"], headers=HEADERS, timeout=60)
    content.raise_for_status()
    open("result.png", "wb").write(content.content)
else:
    use_your_fallback(job["error"])