Qwen Image Text-to-Image: быстрый старт для генерации изображений по описанию

Qwen Image Text-to-Image: быстрый старт для генерации изображений по описанию

API преобразования текста в изображение Qwen Image на платформе Novita AI генерирует изображения по текстовым запросам с помощью модели Qwen Image (20B) — той же основы, которая используется в Qwen Image Edit API для задач точного редактирования. Этот краткий гид охватывает полный асинхронный рабочий процесс: отправка запроса на генерацию, получение идентификатора задачи, опрос для получения результата и получение URL изображения. Эндпоинт: POST https://api.novita.ai/v3/async/qwen-image-txt2img.

Когда использовать этот гайд

Используйте это руководство, когда вам нужно:

  • Генерировать изображения из текстовых запросов с высококачественным отображением текста на английском или китайском языке через POST /v3/async/qwen-image-txt2img.
  • Создавать пайплайны для постеров, графических элементов или иллюстраций, где важна читаемость текста внутри изображения.
  • Быстро прототипировать с помощью размещённого API, не запуская модель 20B на локальном GPU.

Модель Qwen Image особенно хороша для генерации изображений с читаемым, стилизованным текстом, встроенным в изображение — например, постеры, вывески, макеты продуктов и обложки. Если ваш вариант использования включает редактирование существующего изображения, а не генерацию с нуля, см. Qwen Image Edit API. Если нужен полный обзор возможностей модели Qwen Image и сравнительных характеристик, анонс Qwen Image от Novita AI содержит подробности об архитектуре и результатах тестов.

Шаг 1: Получите ключ API Novita

Создайте аккаунт в Novita AI и перейдите в раздел управления ключами API. Сгенерируйте ключ и сохраните его как переменную окружения:

export NOVITA_API_KEY="your_api_key_here"

Не допускайте попадания ключа в клиентский код, фронтенд-сборки и системы контроля версий.

Шаг 2: Подтвердите эндпоинт и модель

Пункт Значение
Эндпоинт генерации POST https://api.novita.ai/v3/async/qwen-image-txt2img
Эндпоинт опроса результатов GET https://api.novita.ai/v3/async/task-result?task_id=<id>
Модель Qwen Image (20B MMDiT)
Документация API Справочник Novita AI Qwen Image txt2img

API использует двухэтапный асинхронный шаблон, общий для всех эндпоинтов генерации изображений Novita AI. Вызов генерации возвращает только task_id; вы отдельно опрашиваете эндпоинт результата до завершения задачи.

Цена — $0.02 за изображение, на одном уровне с эндпоинтом Qwen Image Edit. Актуальный тариф проверяйте на странице цен Novita AI перед расчётом бюджета.

Шаг 3: Отправьте первый запрос

Отправьте POST-запрос к эндпоинту генерации с параметрами prompt и опциональным size:

curl -s -X POST https://api.novita.ai/v3/async/qwen-image-txt2img \
  -H "Authorization: Bearer $NOVITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A cinematic mountain landscape at sunrise, warm golden light, ultra-detailed, 8K",
    "size": "1024*1024"
  }'

Успешный ответ со статусом 200 возвращает:

{
  "task_id": "abc123..."
}

Сохраните task_id. Он понадобится на следующем шаге.

Шаг 4: Опрашивайте результат

Отправьте GET-запрос к эндпоинту результата, передав task_id как параметр запроса:

curl -s "https://api.novita.ai/v3/async/task-result?task_id=abc123..." \
  -H "Authorization: Bearer $NOVITA_API_KEY"

Ответ содержит поле status. Продолжайте опрос, пока статус не станет TASK_STATUS_SUCCEED:

{
  "task": {
    "task_id": "abc123...",
    "status": "TASK_STATUS_SUCCEED"
  },
  "images": [
    {
      "image_url": "https://...",
      "image_url_ttl": "3600",
      "image_type": "png"
    }
  ]
}

image_url — это URL с ограниченным сроком действия; значение image_url_ttl (в секундах) указывает, сколько он остаётся валидным. Загрузите изображение незамедлительно или проксируйте через собственное хранилище, если нужен долгосрочный доступ.

Статусы, которые нужно обрабатывать:

Статус Значение
TASK_STATUS_QUEUED Запрос в очереди, ещё не начат
TASK_STATUS_PROCESSING Генерация выполняется
TASK_STATUS_SUCCEED Изображение готово; читайте images[0].image_url
TASK_STATUS_FAILED Генерация не удалась; проверьте task.reason

Пример на Python: от начала до конца

Этот скрипт отправляет запрос на генерацию, опрашивает до завершения и выводит URL изображения.

import os
import time
import requests

API_KEY = os.environ["NOVITA_API_KEY"]
BASE_URL = "https://api.novita.ai"


def generate_image(prompt: str, size: str = "1024*1024") -> str:
    response = requests.post(
        f"{BASE_URL}/v3/async/qwen-image-txt2img",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
        },
        json={"prompt": prompt, "size": size},
    )
    response.raise_for_status()
    return response.json()["task_id"]


def poll_result(task_id: str, interval: float = 2.0, max_attempts: int = 60) -> str:
    for _ in range(max_attempts):
        response = requests.get(
            f"{BASE_URL}/v3/async/task-result",
            headers={"Authorization": f"Bearer {API_KEY}"},
            params={"task_id": task_id},
        )
        response.raise_for_status()
        data = response.json()
        status = data["task"]["status"]

        if status == "TASK_STATUS_SUCCEED":
            return data["images"][0]["image_url"]
        elif status == "TASK_STATUS_FAILED":
            reason = data["task"].get("reason", "unknown")
            raise RuntimeError(f"Generation failed: {reason}")

        time.sleep(interval)

    raise TimeoutError(f"Task {task_id} did not complete after {max_attempts} polls")


if __name__ == "__main__":
    prompt = (
        "A poster reading 'Welcome to Novita AI' in bold neon letters "
        "against a dark city skyline at night, cinematic lighting"
    )
    task_id = generate_image(prompt, size="1024*1024")
    print(f"Task ID: {task_id}")

    image_url = poll_result(task_id)
    print(f"Image URL: {image_url}")

Пример с cURL

Двухкомандный шаблон для полного рабочего процесса:

# Шаг 1: Отправить запрос на генерацию
TASK_ID=$(curl -s -X POST https://api.novita.ai/v3/async/qwen-image-txt2img \
  -H "Authorization: Bearer $NOVITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A serene Japanese garden with cherry blossoms, koi pond, morning mist, watercolor style",
    "size": "1024*1536"
  }' | python3 -c "import sys,json; print(json.load(sys.stdin)['task_id'])")

echo "Task ID: $TASK_ID"

# Шаг 2: Опрашивать до завершения
while true; do
  STATUS=$(curl -s "https://api.novita.ai/v3/async/task-result?task_id=$TASK_ID" \
    -H "Authorization: Bearer $NOVITA_API_KEY")
  STATE=$(echo $STATUS | python3 -c "import sys,json; print(json.load(sys.stdin)['task']['status'])")
  echo "Status: $STATE"
  if [ "$STATE" = "TASK_STATUS_SUCCEED" ]; then
    echo $STATUS | python3 -c "import sys,json; print(json.load(sys.stdin)['images'][0]['image_url'])"
    break
  elif [ "$STATE" = "TASK_STATUS_FAILED" ]; then
    echo "Generation failed"
    break
  fi
  sleep 2
done

Ключевые параметры

Параметр Тип Обязательный По умолчанию Примечания
prompt string Да Текстовое описание изображения для генерации. Поддерживает английский и китайский.
size string Нет 1024*1024 Ширина × высота в пикселях, формат Ш*В. Каждое измерение: 256–1536.

Рекомендуемые размеры:

Сценарий использования Рекомендуемый размер
Квадрат (соцсети, профиль) 1024*1024
Портрет (мобильные, постер) 1024*1536
Альбом (баннер, превью) 1536*1024

На этом эндпоинте нет отдельных параметров negative_prompt, steps или cfg_scale — модель управляет ими внутри. Сосредоточьте запрос на том, что должно содержать изображение и каким визуальным стилем оно должно обладать.

Что Qwen Image генерирует хорошо

Архитектура 20B MMDiT даёт Qwen Image реальное преимущество в нескольких конкретных областях:

Текст в изображениях. Большинство моделей генерации изображений плохо справляются с читаемым текстом — слова размываются, буквы заменяются, многострочные макеты разваливаются. Qwen Image обрабатывает английский и китайский текст с заметно лучшей точностью. Постеры, вывески, этикетки и изображения с подписями становятся реалистичными сценариями, а не игрой в рулетку.

Семантическая согласованность. Когда запрос описывает сцену с несколькими элементами и конкретными пространственными отношениями, Qwen Image обычно точнее соблюдает задумку компоновки по сравнению с меньшими или более старыми архитектурами.

Следование длинным запросам. Длинные, подробные запросы с множеством атрибутов — сцена, освещение, стиль, цветовая палитра, конкретные объекты — выдают результаты, отражающие полный запрос, а не зацикленные на одном ключевом слове.

Где она менее подходит: сценарии реального времени или интерактивной генерации. Асинхронный паттерн означает неизбежную задержку между запросом и результатом. Если вашему приложению нужна мгновенная обратная связь (субсекундная), этот эндпоинт не подходит.

Частые ошибки и их исправление

401 Unauthorized: Проверьте, что заголовок Authorization отформатирован как Bearer <ключ> с пробелом после Bearer. Убедитесь, что ключ активен в консоли Novita AI.

400 Bad Request при указании size: Параметр size должен использовать разделитель * (например, 1024*1024), а не x, × или JSON-массив. Каждое измерение должно быть от 256 до 1536.

TASK_STATUS_FAILED без указания причины: Обычно вызвано запросом, который триггерит фильтрацию контента. Упростите запрос и повторите. Избегайте запросов с явным насилием, сексуальным контентом или контентом, который может сработать на фильтры безопасности.

Срок действия URL изображения истёк (403 или 404 при переходе): Поле image_url_ttl сообщает, сколько времени URL действителен. Загружайте изображение сразу после успешного опроса или сохраняйте в своём объектном хранилище.

Медленный опрос: Время генерации зависит от нагрузки на сервер. Начинайте опрос с интервалом 2 секунды — это разумно. Если задача всё ещё TASK_STATUS_QUEUED через 10 секунд, продолжайте опрос — глубина очереди может возрастать в часы пик.

Часто задаваемые вопросы

Существует ли эндпоинт, совместимый с OpenAI, для Qwen Image txt2img?

Нет. Эндпоинт /v3/async/qwen-image-txt2img использует собственный асинхронный API изображений Novita AI, а не формат генерации изображений OpenAI. Если вам нужна совместимая с OpenAI генерация изображений, Novita AI предлагает модели FLUX и SDXL через совместимые эндпоинты — см. документацию Novita AI.

В чём разница между этим эндпоинтом и Qwen Image Edit?

Этот эндпоинт генерирует изображение только из текстового запроса — входное изображение не требуется. Эндпоинт Qwen Image Edit принимает существующее изображение и текстовую инструкцию и изменяет изображение соответствующим образом. Используйте txt2img, когда создаёте с нуля; используйте edit, когда нужно изменить что-то в уже существующем изображении.

Поддерживает ли модель соотношения сторон, отличные от квадрата?

Да. Используйте параметр size, чтобы независимо задать ширину и высоту от 256 до 1536 пикселей на каждое измерение. Высокие соотношения (например, 1024*1536) хорошо подходят для портретного контента; широкие (например, 1536*1024) — для баннеров и миниатюр.

Как получить воспроизводимые результаты при нескольких генерациях?

Параметр seed на эндпоинте txt2img отсутствует. Каждый запрос даёт разный результат. Если требуется воспроизводимый вывод, сохраняйте URL изображения сразу и храните изображение в собственном хранилище, а не генерируйте заново.

Могу ли я использовать этот API в пакетном режиме?

Да. Отправляйте несколько запросов на генерацию, собирайте идентификаторы задач и опрашивайте их параллельно. Каждый запрос возвращает свой task_id, поэтому пакетные рабочие процессы просты — не нужно ждать завершения одной задачи перед отправкой следующей.

Рекомендуемые статьи