Qwen Image Text-to-Image: Schnellstart zur Generierung von Bildern aus Prompts

Qwen Image Text-to-Image: Schnellstart zur Generierung von Bildern aus Prompts

Die Qwen Image Text-to-Image-API auf Novita AI erzeugt Bilder aus Text-Prompts mit dem 20B Qwen Image Modell – derselben Grundlage, die die Qwen Image Edit-API für präzise Bearbeitungsaufgaben antreibt. Dieser Schnellstart behandelt den vollständigen Async-Workflow: Senden einer Generierungsanfrage, Erhalten einer Task-ID, Polling auf Fertigstellung und Abrufen der Bild-URL. Der Endpunkt ist POST https://api.novita.ai/v3/async/qwen-image-txt2img.

Wann dieser Schnellstart verwendet werden sollte

Verwenden Sie diese Anleitung, wenn Sie Folgendes benötigen:

  • Bilder aus Text-Prompts mit hochwertiger Texteinbettung in Englisch oder Chinesisch über POST /v3/async/qwen-image-txt2img generieren.
  • Pipelines erstellen, die Poster, Grafik-Assets oder illustrierte Inhalte produzieren, bei denen die Lesbarkeit von Text im Bild wichtig ist.
  • Schnell gegen eine gehostete API prototypisieren, anstatt das 20B-Modell auf lokaler GPU-Infrastruktur auszuführen.

Das Qwen Image Modell ist besonders stark bei der Generierung von Bildern mit lesbarem, gestaltetem Text im Output – denken Sie an Poster, Schilder, Produkt-Mockups und Cover-Grafiken. Wenn Ihr Anwendungsfall das Bearbeiten eines vorhandenen Bildes und nicht die Neugenerierung betrifft, lesen Sie stattdessen die Qwen Image Edit-API. Wenn Sie einen vollständigen Überblick über die Funktionen und Benchmarks des Qwen Image Modells wünschen, finden Sie im Novita AI Qwen Image Launch-Beitrag die Architektur und Benchmark-Ergebnisse im Detail.

Schritt 1: Holen Sie sich Ihren Novita API-Key

Erstellen Sie ein Novita AI-Konto und navigieren Sie zu API-Key-Verwaltung. Generieren Sie einen Key und speichern Sie ihn als Umgebungsvariable:

export NOVITA_API_KEY="your_api_key_here"

Halten Sie den Key aus clientseitigem Code, Frontend-Bundles und Versionskontrolle fern.

Schritt 2: Bestätigen Sie den Endpunkt und das Modell

Element Wert
Generierungsendpunkt POST https://api.novita.ai/v3/async/qwen-image-txt2img
Ergebnis-Polling-Endpunkt GET https://api.novita.ai/v3/async/task-result?task_id=<id>
Modell Qwen Image (20B MMDiT)
API-Dokumentation Novita AI Qwen Image txt2img Referenz

Die API folgt einem zweistufigen Async-Muster, das bei allen Novita AI Bildgenerierungsendpunkten üblich ist. Der Generierungsaufruf gibt nur eine task_id zurück; Sie pollieren den Ergebnisendpunkt separat, bis die Aufgabe abgeschlossen ist.

Die Preisgestaltung beträgt 0,02 $ pro Bild, konsistent mit dem Qwen Image Edit-Endpunkt. Überprüfen Sie den aktuellen Tarif auf der Novita AI Preisseite, bevor Sie eine Kostenschätzung erstellen.

Schritt 3: Senden Sie Ihre erste Anfrage

POST an den Generierungsendpunkt mit einem prompt und optionalem 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"
  }'

Eine erfolgreiche 200-Antwort gibt Folgendes zurück:

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

Speichern Sie die task_id. Sie werden sie im nächsten Schritt verwenden.

Schritt 4: Pollen Sie auf Ihr Ergebnis

GET am Task-Ergebnisendpunkt mit der task_id als Query-Parameter:

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

Die Antwort enthält ein status-Feld. Pollen Sie weiter, bis der Status TASK_STATUS_SUCCEED ist:

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

Die image_url ist eine zeitlich begrenzte URL – der Wert image_url_ttl (in Sekunden) gibt an, wie lange sie gültig bleibt. Laden Sie das Bild umgehend herunter oder leiten Sie es über Ihren eigenen Speicher weiter, wenn Sie einen langfristigen Zugriff benötigen.

Statuswerte, die behandelt werden sollten:

Status Bedeutung
TASK_STATUS_QUEUED Anfrage ist in der Warteschlange, noch nicht gestartet
TASK_STATUS_PROCESSING Generierung läuft
TASK_STATUS_SUCCEED Bild ist bereit; lesen Sie images[0].image_url
TASK_STATUS_FAILED Generierung fehlgeschlagen; prüfen Sie task.reason

Python-Beispiel: End-to-End

Dieses Skript sendet eine Generierungsanfrage, pollt bis zur Fertigstellung und gibt die Bild-URL aus.

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-Beispiel

Zwei-Befehl-Muster für den vollständigen Workflow:

# Schritt 1: Generierungsanfrage senden
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"

# Schritt 2: Bis zur Fertigstellung pollieren
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 "Generierung fehlgeschlagen"
    break
  fi
  sleep 2
done

Wichtige Parameter

Parameter Typ Erforderlich Standard Hinweise
prompt string Ja Textbeschreibung des zu generierenden Bildes. Unterstützt Englisch und Chinesisch.
size string Nein 1024*1024 Breite × Höhe in Pixeln, formatiert als B*H. Jede Dimension: 256–1536.

Größenoptionen, die in Betracht gezogen werden sollten:

Anwendungsfall Empfohlene Größe
Quadratisch (Social, Profil) 1024*1024
Hochformat (Mobil, Poster) 1024*1536
Querformat (Banner, Thumbnail) 1536*1024

Es gibt keinen separaten Parameter negative_prompt, steps oder cfg_scale an diesem Endpunkt – das Modell trifft diese Entscheidungen intern. Konzentrieren Sie sich in Ihrem Prompt darauf, was das Bild enthalten soll und welchen visuellen Stil es haben soll.

Was Qwen Image gut generiert

Die 20B MMDiT-Architektur verschafft Qwen Image einen echten Vorteil in einigen spezifischen Bereichen:

Text in Bildern. Die meisten Bildgenerierungsmodelle haben Schwierigkeiten mit lesbarem Text – Wörter verschwimmen, Buchstaben vertauschen sich und mehrzeilige Layouts brechen zusammen. Qwen Image verarbeitet englischen und chinesischen Text mit deutlich besserer Genauigkeit. Poster, Schilder, Etiketten und beschriftete Grafiken sind praktikable Anwendungsfälle und kein Glücksspiel.

Semantische Konsistenz. Wenn ein Prompt eine Szene mit mehreren Elementen und spezifischen räumlichen Beziehungen beschreibt, neigt Qwen Image dazu, die Layout-Intention zuverlässiger zu berücksichtigen als kleinere oder ältere Architekturen.

Prompt-Befolgung im Maßstab. Lange, detaillierte Prompts, die mehrere Attribute beschreiben – Szene, Beleuchtung, Stil, Farbpalette, bestimmte Objekte – produzieren Ausgaben, die den gesamten Prompt widerspiegeln, anstatt sich an ein Schlüsselwort zu klammern.

Wo es weniger geeignet ist: Echtzeit- oder interaktive Generierungs-Workflows. Das Async-Muster bedeutet eine inhärente Latenz zwischen Anfrage und Ergebnis. Wenn Ihr Anwendungsfall eine Reaktionszeit unter einer Sekunde erfordert, ist dieser Endpunkt nicht die richtige Wahl.

Häufige Fehler und Behebungen

401 Unauthorized: Überprüfen Sie, ob der Authorization-Header als Bearer <key> mit einem Leerzeichen nach Bearer formatiert ist. Verifizieren Sie, dass der Key in der Novita AI-Konsole aktiv ist.

400 Bad Request bei size: Der Parameter size muss * als Trennzeichen verwenden (z. B. 1024*1024), nicht x, × oder ein JSON-Array. Jede Dimension muss zwischen 256 und 1536 liegen.

TASK_STATUS_FAILED ohne Grund: Wird normalerweise durch einen Prompt verursacht, der die Inhaltsfilterung auslöst. Vereinfachen Sie den Prompt und versuchen Sie es erneut. Vermeiden Sie Prompts mit expliziter Gewalt, sexuellem Inhalt oder Inhalten, die Sicherheitsfilter auslösen könnten.

Bild-URL abgelaufen (403 oder 404 auf der URL): Das Feld image_url_ttl gibt an, wie lange die URL gültig ist. Laden Sie das Bild sofort nach erfolgreichem Polling herunter, oder speichern Sie es in Ihrem eigenen Objektspeicher.

Langsames Polling: Die Generierungszeit variiert mit der Serverlast. Ein Polling-Intervall von 2 Sekunden ist angemessen. Wenn der Task nach 10 Sekunden immer noch TASK_STATUS_QUEUED ist, setzen Sie das Polling fort – die Warteschlangentiefe kann bei Spitzenauslastung ansteigen.

FAQ

Gibt es einen OpenAI-kompatiblen Endpunkt für Qwen Image txt2img?

Nein. Der /v3/async/qwen-image-txt2img-Endpunkt verwendet Novita AIs natives Async-Bild-API-Format, nicht das OpenAI-Bildgenerierungsformat. Wenn Sie eine OpenAI-kompatible Bildgenerierung benötigen, bietet Novita AI FLUX- und SDXL-Modelle über kompatible Endpunkte an – siehe die Novita AI-Dokumentation.

Was ist der Unterschied zwischen diesem Endpunkt und dem Qwen Image Edit-Endpunkt?

Dieser Endpunkt generiert Bilder nur aus einem Text-Prompt – es wird kein Eingabebild benötigt. Der Qwen Image Edit-Endpunkt nimmt ein vorhandenes Bild plus eine Textanweisung entgegen und modifiziert das Bild entsprechend. Verwenden Sie txt2img, wenn Sie von Grund auf neu erstellen; verwenden Sie edit, wenn Sie etwas in einem vorhandenen Bild ändern müssen.

Unterstützt das Modell andere Seitenverhältnisse als quadratisch?

Ja. Verwenden Sie den Parameter size, um Breite und Höhe unabhängig voneinander zwischen 256 und 1536 Pixeln pro Dimension festzulegen. Hohe Verhältnisse (z. B. 1024*1536) eignen sich gut für Hochkant-Inhalte; breite Verhältnisse (z. B. 1536*1024) passen zu Bannern und Thumbnails.

Wie erhalte ich konsistente Ergebnisse über mehrere Generierungen hinweg?

Es gibt keinen seed-Parameter am txt2img-Endpunkt. Jede Anfrage produziert ein anderes Ergebnis. Wenn Sie reproduzierbare Ausgaben benötigen, speichern Sie die Bild-URL sofort und bewahren Sie das Bild in Ihrem eigenen Speicher auf, anstatt es neu zu generieren.

Kann ich diese API in einem Batch-Job verwenden?

Ja. Senden Sie mehrere Generierungsanfragen und sammeln Sie die Task-IDs, dann pollieren Sie sie parallel. Jede Anfrage gibt ihre eigene task_id zurück, sodass Batch-Workflows unkompliziert sind – Sie müssen nicht warten, bis eine abgeschlossen ist, bevor Sie die nächste senden.

Empfohlene Artikel