Novita AI 上の Qwen Image テキストから画像生成 API は、20B パラメータの Qwen Image モデルを使用してテキストプロンプトから画像を生成します。このモデルは、精密な編集タスクを可能にする Qwen Image Edit API と同じ基盤です。このクイックスタートでは、生成リクエストの送信、タスク ID の取得、完了までのポーリング、画像 URL の取得まで、完全な非同期ワークフローを説明します。エンドポイントは POST https://api.novita.ai/v3/async/qwen-image-txt2img です。
このクイックスタートを利用するタイミング
以下のような場面でこのガイドを活用してください:
POST /v3/async/qwen-image-txt2imgを使用して、英語または中国語で高品質なテキストレンダリングを備えた画像をテキストプロンプトから生成する場合。- 画像内のテキストの可読性が重要なポスター、グラフィックアセット、イラストコンテンツを作成するパイプラインを構築する場合。
- ローカルの GPU インフラで 20B モデルを実行する代わりに、ホスト型 API に対して迅速にプロトタイピングを行う場合。
Qwen Image モデルは、読みやすくスタイル設定されたテキストが埋め込まれた画像(ポスター、看板、製品モックアップ、カバーグラフィックなど)の生成に特に優れています。ゼロから生成するのではなく、既存の画像を編集するユースケースの場合は、代わりに Qwen Image Edit API を参照してください。Qwen Image モデルの機能とベンチマークの詳細については、Novita AI の Qwen Image 発表記事 でアーキテクチャとベンチマーク結果を詳しく説明しています。
ステップ 1:Novita API キーを取得する
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 の全画像生成エンドポイントに共通する 2 ステップの非同期パターンに従います。生成呼び出しは task_id のみを返し、タスクが完了するまで別途結果エンドポイントをポーリングします。
料金は画像 1 枚あたり $0.02 で、Qwen Image Edit エンドポイントと同じです。コスト見積もりを作成する前に、Novita AI 料金ページ で最新のレートを確認してください。
ステップ 3:最初のリクエストを送信する
prompt とオプションの size を指定して、生成エンドポイントに POST リクエストを送信します:
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:結果をポーリングする
task_id をクエリパラメータとして、タスク結果エンドポイントに GET リクエストを送信します:
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 の例
完全なワークフローのための 2 コマンドパターン:
# Step 1: Submit generation request
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"
# Step 2: Poll until complete
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 |
ピクセル単位の幅 × 高さ。W*H の形式で指定します。各ディメンションは 256~1536 です。 |
サイズオプションの推奨例:
| ユースケース | 推奨サイズ |
|---|---|
| 正方形(SNS、プロフィール) | 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 <key> の形式で、Bearer の後にスペースがあることを確認してください。Novita AI コンソール でキーが有効であることを確認してください。
400 Bad Request(size 関連):size パラメータの区切り文字は *(例:1024*1024)を使用してください。x、×、JSON 配列は使用しないでください。各ディメンションは 256 から 1536 の間である必要があります。
TASK_STATUS_FAILED(理由なし):通常、コンテンツフィルタリングをトリガーするプロンプトが原因です。プロンプトを簡略化して再試行してください。露骨な暴力、性的コンテンツ、またはセーフティフィルターに一致する可能性のあるコンテンツを含むプロンプトは避けてください。
画像 URL の有効期限切れ(URL に対して 403 または 404):image_url_ttl フィールドで URL の有効期間がわかります。ポーリングが成功したらすぐに画像をダウンロードするか、独自のオブジェクトストレージに保存してください。
ポーリングが遅い:生成時間はサーバーの負荷によって異なります。2 秒間隔でのポーリング開始が妥当です。10 秒経過してもタスクが TASK_STATUS_QUEUED の場合はポーリングを続けてください。ピーク時の使用ではキューの深さが増加する可能性があります。
FAQ
Qwen Image txt2img 用の OpenAI 互換エンドポイントはありますか?
いいえ。/v3/async/qwen-image-txt2img エンドポイントは、OpenAI の画像生成フォーマットではなく、Novita AI のネイティブ非同期画像 API を使用しています。OpenAI 互換の画像生成が必要な場合、Novita AI は互換性のあるエンドポイントを通じて FLUX および SDXL モデルを提供しています。Novita AI ドキュメント を参照してください。
このエンドポイントと Qwen Image Edit エンドポイントの違いは何ですか?
このエンドポイントはテキストプロンプトのみから画像を生成します。入力画像は不要です。Qwen Image Edit エンドポイント は、既存の画像とテキストによる指示を受け取り、それに応じて画像を変更します。ゼロから作成する場合は txt2img を、既存の画像を変更する必要がある場合は edit を使用してください。
モデルは正方形以外のアスペクト比に対応していますか?
はい。size パラメータを使用して、各ディメンションを 256 から 1536 ピクセルの範囲で独立して幅と高さを設定できます。縦長の比率(例:1024*1536)はポートレートコンテンツに、横長の比率(例:1536*1024)はバナーやサムネイルに適しています。
複数の生成で一貫した結果を得るにはどうすればよいですか?
txt2img エンドポイントには seed パラメータはありません。リクエストごとに異なる結果が生成されます。再現可能な出力が必要な場合は、画像 URL をすぐに保存し、再生成するのではなく、画像を独自のストレージに保存してください。
この API をバッチジョブで使用できますか?
はい。複数の生成リクエストを送信してタスク ID を収集し、それらを並行してポーリングできます。各リクエストは独自の task_id を返すため、バッチワークフローは簡単です。1 つが完了するのを待ってから次のリクエストを送信する必要はありません。
