- Когда использовать этот гайд
- Шаг 1: Получите ключ API Novita
- Шаг 2: Подтвердите эндпоинт и модель
- Шаг 3: Отправьте первый запрос
- Шаг 4: Опрашивайте результат
- Пример на Python: от начала до конца
- Пример с cURL
- Ключевые параметры
- Что Qwen 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, поэтому пакетные рабочие процессы просты — не нужно ждать завершения одной задачи перед отправкой следующей.
