Skip to main content
Orux AIOruxAI

Orux AI / モデルノート

採用画像1枚あたりのコスト:リトライ込みで画像APIの予算を組む

画像生成の予算は表示価格ではなく採用画像1枚あたりのコストで組みましょう。6モデルの2026年11月時点のCredits価格、リトライの計算例、モデルを切り替えられる非同期Pythonクライアントを紹介します。

Orux AI公開 14 分で読めます
採用画像1枚あたりのコスト:リトライ込みで画像APIの予算を組む — 画像生成の予算は表示価格ではなく採用画像1枚あたりのコストで組みましょう。
目次

モデルページに載っている数字は、1 回の試行の価格です。アプリが実際にお金を払っているのは、採用された 1 枚の画像です。安いモデルが使える画像を出すのに 2 回かかり、少し高いモデルが 1 回で正解を出すなら、表示価格はほとんど意味を持ちません。このガイドでは、画像生成の予算を採用画像 1 枚あたりのコスト(cost per accepted image)で組む方法を、Orux AI の 6 モデルの現行価格で説明します。あわせて、これらのモデルを 1 つの小さな非同期クライアントの背後に置き、アプリを書き換えずにトラフィックを切り替える方法も紹介します。

以下の価格はすべて 2026-11-04 に Orux AI のモデルページから読み取ったものです。いくつかのモデルは 10 月の料金記事の数字より安くなっているため、古い表ではなくこの表を使ってください。1 Credit = $0.005。

表示価格が間違った単位である理由

Orux AI の画像リクエストは、成功した画像 1 枚ごとに課金されます。FAILED または EXPIRED で終わったタスクは課金されません。うまくいったものだけに払うように聞こえますが、「成功」とはモデルが画像を返したという意味であり、その画像が製品に合っているという意味ではありません。製品の色が違う、文字が崩れている、構図がぎこちない画像でも成功として扱われ、Credits が消費されます。

つまり、実際の予算式は 2 つの要素からなります。

  • 1 回の試行あたりの表示価格:モデルページで確認できます。
  • 採用画像 1 枚あたりの試行回数:プロンプト、審査基準、モデルによって変わり、自分で測る必要があります。

採用画像 1 枚あたりのコスト = 表示価格 × 採用画像 1 枚あたりの試行回数。

100 枚生成して 77 枚採用したなら、採用画像 1 枚あたりの試行回数は 100 ÷ 77 ≈ 1.3 です。この比率は画像予算で最も重要な数字ですが、記録している人はほとんどいません。

現行の表示価格(2026-11-04 確認)

モデル解像度1 枚あたりの表示価格米ドル換算参照画像備考
Nano Banana 2.11K / 2K / 4K2.281 Cr(1K)、2.667 Cr(2K・4K)$0.0114、$0.0133最大 10 枚アスペクト比の選択肢が最多、1:8 と 8:1 を含む
flux-2-pro1K のみ2.67 Cr$0.0134なし(テキストのみ)1:1 のみ
GPT Image 2.5 Sunburst1K / 2K / 4K2.667 Cr(全サイズ)$0.0133最大 16 枚4K も 1K と同価格
Wan2.7 Image1K / 2K4.333 Cr(参照 0〜9 枚)$0.0217最大 9 枚、追加料金なしアスペクト比 5 種類
Qwen Image 3.0 Pro1K / 2K6.667 Cr(1K)、13.33 Cr(2K)、参照なし$0.0333、$0.0667最大 3 枚、1 枚ごとに追加料金文字組みとポスター
Seedream 5.0 Pro1K / 2K7.5 Cr(1K)、15 Cr(2K)、参照なし$0.0375、$0.075最大 10 枚、1 枚ごとに追加料金商品写真、ポートレート

横にスワイプすると表全体を確認できます。

読み方:

  • 1 枚あたり約 2.3〜2.7 Credits のモデルが 3 つあります:Nano Banana 2.1、flux-2-pro、GPT Image 2.5 Sunburst。Wan2.7 Image は中間です。Qwen Image 3.0 Pro と Seedream 5.0 Pro は 1K でおよそ 2.5〜3.3 倍、2K ではさらに倍になります。
  • Nano Banana 2.1、GPT Image 2.5 Sunburst、Wan2.7 Image では参照画像は無料です。Qwen Image 3.0 Pro で参照 3 枚の 1K 画像は 8.267 Cr($0.0413)、Seedream 5.0 Pro で参照 10 枚の 1K 画像は 12.5 Cr($0.0625)です。編集中心のワークフローなら、参照なしの価格ではなくこれらの行を使ってください。
  • flux-2-pro は安いものの制約があります。Orux AI では現在 1K と 1:1 のみ対応で、参照画像は使えません。16:9 のバナーや編集が必要なら、どんなに安くても選択肢になりません。

計算例:採用画像 1 枚あたりのコスト

以下の試行回数は説明用の仮定であり、実測値ではありません。パイロット実行のあと、自分の数字に置き換えてください。

モデル(1K、参照なし)表示価格試行 1.0 回試行 1.3 回試行 2.0 回Seedream 5.0 Pro(1.0 回)との損益分岐点
Nano Banana 2.12.281 Cr2.281 Cr($0.0114)2.965 Cr($0.0148)4.562 Cr($0.0228)3.29 回
flux-2-pro2.67 Cr2.67 Cr($0.0134)3.471 Cr($0.0174)5.34 Cr($0.0267)2.81 回
GPT Image 2.5 Sunburst2.667 Cr2.667 Cr($0.0133)3.467 Cr($0.0173)5.334 Cr($0.0267)2.81 回
Wan2.7 Image4.333 Cr4.333 Cr($0.0217)5.633 Cr($0.0282)8.666 Cr($0.0433)1.73 回
Qwen Image 3.0 Pro6.667 Cr6.667 Cr($0.0333)8.667 Cr($0.0433)13.334 Cr($0.0667)1.12 回
Seedream 5.0 Pro7.5 Cr7.5 Cr($0.0375)9.75 Cr($0.0488)15 Cr($0.075)1.00

横にスワイプすると表全体を確認できます。

最後の列は実務的な問いに答えています。安いモデルは何回まで試行すれば、毎回 1 回で採用される Seedream 5.0 Pro と採用画像 1 枚あたりのコストが並ぶのか。Nano Banana 2.1 は約 3.3 回、Wan2.7 Image は約 1.7 回です。

具体的なシナリオを見てみましょう。パイロットで次の結果が出たとします。

  • モデル A:Nano Banana 2.1(1K)は、採用される商品画像 1 枚に 1.3 回の試行が必要。
  • モデル B:Seedream 5.0 Pro(1K)は 1.0 回。

採用画像 1,000 枚の場合:

  • モデル A:1,000 × 1.3 × 2.281 = 2,965 Credits($14.83)
  • モデル B:1,000 × 1.0 × 7.5 = 7,500 Credits($37.50)

試行が 30% 多くても、モデル A のコストは半分を大きく下回ります。順位が逆転するのは、安いモデルの比率が約 3.3 を超えたとき、あるいは不採用画像が Credits 以外のコストを生むときだけです。

後者は重要です。不採用画像はどれも確認に時間がかかり、ユーザー向けアプリではリトライのたびに待ち時間が増えます。すべての結果を人が審査するなら、審査時間は数 Credits をはるかに上回ることがあります。審査時間はチームごとに異なるため本記事では数値化しませんが、下のコードは試行を記録するので、自分で加味できます。

リトライ倍率が潜む 3 つの場所

採用画像 1 枚あたりの試行回数は、モデル品質とは無関係な理由でも増えます。

  1. 重複送信。 ワーカーがポーリング中にタイムアウトし、同じジョブを再送信すると、2 回分の成功に支払うことがあります。先に task_id を保存し、再送信ではなくポーリングを再開してください。
  2. 非対応パラメーター。 モデルが提供していないアスペクト比や解像度を指定すると送信前に拒否されます。費用はかかりませんが、パイプラインが止まります。モデルごとの制約を設定に持たせておけば(後述)、GPT Image 2.5 Sunburst から flux-2-pro に切り替えたときに、1:1 専用モデルへ 16:9 をこっそり送ることはありません。
  3. プロンプトのずれ。 別のモデル向けに調整したプロンプトをそのまま安いモデルに使うと、採用率が下がることがあります。実トラフィックを移す前に、自分のプロンプトで各モデルを再度パイロットしてください。

モデルページにある既存の公開サンプル

以下の 5 枚は、Orux AI の各モデルページに掲載されている既存の公開サンプルです。本記事のために生成したものではなく、品質テストでもありません。各モデルページに記載された出力の傾向を示すもので、プロンプトと設定はモデルページの記載どおりです。

Nano Banana 2.1 のモデルページ既存サンプル:日の出に雪山を映す高山湖
Nano Banana 2.1 のモデルページ既存サンプル:日の出に雪山を映す高山湖

*Nano Banana 2.1 モデルページの既存公開サンプル:「Still alpine lake perfectly reflecting snow-capped peaks and pine trees at sunrise」、1K、16:9。この設定の表示価格:2.281 Credits。*

flux-2-pro のモデルページ既存サンプル:トラバーチンの台座に置かれた、ドライパンパスを挿したマットな白い陶器の花瓶
flux-2-pro のモデルページ既存サンプル:トラバーチンの台座に置かれた、ドライパンパスを挿したマットな白い陶器の花瓶

*flux-2-pro モデルページの既存公開サンプル:陶器の花瓶のミニマルなスタジオ商品写真、1K、1:1(現在提供されている唯一のサイズ)。表示価格:2.67 Credits。*

GPT Image 2.5 Sunburst のモデルページ既存サンプル:段々庭園のある夕暮れの未来的な海岸都市
GPT Image 2.5 Sunburst のモデルページ既存サンプル:段々庭園のある夕暮れの未来的な海岸都市

*GPT Image 2.5 Sunburst モデルページの既存公開サンプル:夕暮れの未来的な海岸都市、1K、16:9。表示価格:どの解像度でも 2.667 Credits。*

Qwen Image 3.0 Pro のモデルページ既存サンプル:夕日の中、石造りの農家へ続くラベンダー畑
Qwen Image 3.0 Pro のモデルページ既存サンプル:夕日の中、石造りの農家へ続くラベンダー畑

*Qwen Image 3.0 Pro モデルページの既存公開サンプル:夕暮れのラベンダー畑、1K、16:9。表示価格:参照なしで 6.667 Credits。*

Seedream 5.0 Pro のモデルページ既存サンプル:雪に覆われた小屋の上に広がる緑と紫のオーロラ
Seedream 5.0 Pro のモデルページ既存サンプル:雪に覆われた小屋の上に広がる緑と紫のオーロラ

*Seedream 5.0 Pro モデルページの既存公開サンプル:雪の小屋の上のオーロラ、1K、16:9。表示価格:参照なしで 7.5 Credits。*

5 枚のうち 4 枚が 1K・16:9 であることに注目してください。これはまさに、1 つのクライアントでモデル間の A/B テストができる設定です。flux-2-pro は 1:1 しか出力できないため、この比較には加われません。

非同期クライアントは 1 つ、モデルは設定で

6 モデルはすべて同じ非同期エンドポイントを使います。POST https://orux.top/api/v1/tasks に model と input オブジェクトを送ると、HTTP 202 と task_id が返ります。その後、ステータスが SUCCESS、FAILED、EXPIRED のいずれかになるまで GET https://orux.top/api/v1/tasks/{id} をポーリングします。モデル間で変わるのは model 文字列と、許可される input の値だけなので、モデル選択はコードではなく設定に置くべきです。

次のスクリプトは 4 つのことを行います。各モデルの制約に対するリクエストの検証、送信とポーリング、結果の即時保存(結果リンクは一時的です)、そしてモデルごとに採用画像 1 枚あたりのコストを計算できる試行台帳の記録です。API キーを作成して ORUX_API_KEY としてエクスポートし、requests をインストールしてください。

Python
import json
import os
import sys
import time

import requests

BASE = "https://orux.top/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['ORUX_API_KEY']}"}

# List prices in Credits per successful image, read from model pages on 2026-11-04.
# Keys are (resolution, reference_count) where it matters; refs surcharges omitted
# for Qwen/Seedream except the no-reference rows, so keep image_urls empty for them here.
MODELS = {
    "nano-banana-2.1": {"res": {"1K": 2.281, "2K": 2.667, "4K": 2.667},
                        "ratios": {"1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "21:9"},
                        "max_refs": 10},
    "flux-2-pro": {"res": {"1K": 2.67}, "ratios": {"1:1"}, "max_refs": 0},
    "gpt-image-2.5-sunburst": {"res": {"1K": 2.667, "2K": 2.667, "4K": 2.667},
                               "ratios": {"1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "21:9"},
                               "max_refs": 16},
    "wan2.7-image": {"res": {"1K": 4.333, "2K": 4.333},
                     "ratios": {"1:1", "16:9", "9:16", "4:3", "3:4"}, "max_refs": 9},
    "qwen-image-3.0-pro": {"res": {"1K": 6.667, "2K": 13.33},
                           "ratios": {"1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"},
                           "max_refs": 0},   # refs add a surcharge; not modelled here
    "seedream-5.0-pro": {"res": {"1K": 7.5, "2K": 15.0},
                         "ratios": {"1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "21:9"},
                         "max_refs": 0},     # refs add a surcharge; not modelled here
}

# Switch models here (or via env var) without touching the rest of the code.
ACTIVE_MODEL = os.environ.get("ORUX_IMAGE_MODEL", "nano-banana-2.1")
LEDGER = "ledger.jsonl"


def build_input(prompt: str, resolution: str, aspect_ratio: str, refs=None) -> dict:
    spec = MODELS[ACTIVE_MODEL]
    refs = refs or []
    if resolution not in spec["res"]:
        raise ValueError(f"{ACTIVE_MODEL} has no {resolution}; options: {list(spec['res'])}")
    if aspect_ratio not in spec["ratios"]:
        raise ValueError(f"{ACTIVE_MODEL} does not accept {aspect_ratio}")
    if len(refs) > spec["max_refs"]:
        raise ValueError(f"{ACTIVE_MODEL}: too many reference images for this script")
    payload = {"prompt": prompt, "resolution": resolution, "aspect_ratio": aspect_ratio}
    if refs:
        payload["image_urls"] = refs
    return payload


def submit(payload: dict) -> str:
    r = requests.post(f"{BASE}/tasks", headers=HEADERS,
                      json={"model": ACTIVE_MODEL, "input": payload}, timeout=60)
    if r.status_code == 402:
        sys.exit("Insufficient balance: top up your Credits.")
    r.raise_for_status()
    return r.json()["task_id"]


def wait(task_id: str, max_wait: int = 900) -> dict:
    deadline = time.time() + max_wait
    while time.time() < deadline:
        time.sleep(5)
        r = requests.get(f"{BASE}/tasks/{task_id}", headers=HEADERS, timeout=30)
        r.raise_for_status()
        task = r.json()
        if task["status"] in ("SUCCESS", "FAILED", "EXPIRED"):
            return task
    raise TimeoutError(f"{task_id} still running: poll again later, do not resubmit")


def log(row: dict) -> None:
    with open(LEDGER, "a") as f:
        f.write(json.dumps(row) + "\n")


def generate_until_accepted(prompt, resolution="1K", aspect_ratio="1:1", max_attempts=3):
    payload = build_input(prompt, resolution, aspect_ratio)
    price = MODELS[ACTIVE_MODEL]["res"][resolution]
    for attempt in range(1, max_attempts + 1):
        task_id = submit(payload)
        log({"model": ACTIVE_MODEL, "task_id": task_id, "event": "submitted"})
        task = wait(task_id)
        if task["status"] != "SUCCESS":
            log({"model": ACTIVE_MODEL, "task_id": task_id, "event": task["status"], "credits": 0})
            continue
        urls = task.get("result") or []
        path = f"{task_id}.png"
        with open(path, "wb") as f:
            f.write(requests.get(urls[0], timeout=120).content)  # links expire: save now
        ok = input(f"Attempt {attempt}: review {path}. Accept? [y/N] ").strip().lower() == "y"
        log({"model": ACTIVE_MODEL, "task_id": task_id, "event": "accepted" if ok else "rejected",
             "credits": price})
        if ok:
            return path
    return None


def report() -> None:
    stats = {}
    with open(LEDGER) as f:
        for line in f:
            row = json.loads(line)
            s = stats.setdefault(row["model"], {"credits": 0.0, "accepted": 0, "attempts": 0})
            if row["event"] in ("accepted", "rejected"):
                s["attempts"] += 1
                s["credits"] += row["credits"]
                s["accepted"] += row["event"] == "accepted"
    for model, s in stats.items():
        if s["accepted"]:
            per = s["credits"] / s["accepted"]
            print(f"{model}: {s['attempts'] / s['accepted']:.2f} attempts/accepted, "
                  f"{per:.3f} Cr (${per * 0.005:.4f}) per accepted image")


if __name__ == "__main__":
    generate_until_accepted(
        "Minimalist studio product photograph of a matte white ceramic vase on a "
        "travertine plinth, soft window light, warm beige backdrop, no text.",
        resolution="1K", aspect_ratio="1:1")
    report()

同じ依頼で 2 つのモデルを比べるには、ORUX_IMAGE_MODEL=nano-banana-2.1 と ORUX_IMAGE_MODEL=gpt-image-2.5-sunburst でそれぞれ 1 回ずつ実行し、レポートを確認します。台帳は成功した画像だけを課金済みとして数えるため、Orux AI の課金方法と一致します。FAILED と EXPIRED のタスクは 0 Credits として記録されます。

設計についての補足:

  • 価格表はローカルの見積もりです。 課金ではなく予算のためのものです。価格は変わる可能性があるので、大量実行の前にモデルページを確認し、数字を更新してください。
  • Qwen Image 3.0 Pro と Seedream 5.0 Pro の参照画像追加料金は、意図的にモデル化していません。 これらのモデルで image_urls を使う場合は、モデルページで参照枚数ごとの価格を確認してください。
  • ポーリングは 5 秒ごとで十分です。 画像タスクは数分かかることがあるので、Web リクエスト内ではなくバックグラウンドワーカーで実行してください。
  • 手動の採用確認はプレースホルダーです。 本番では自動チェック、審査キュー、ユーザーの高評価などに置き換えられます。大事なのは、採用・不採用をすべて記録することです。

デフォルトとフォールバックの選び方

実際の試行比率がわかれば、選択はほぼ算数です。モデルページに基づく率直なトレードオフ:

  • Nano Banana 2.1 はこの中で 1K の表示価格が最も低く、参照画像は無料、アスペクト比の選択肢も最多です。大量の下書き用デフォルトとして妥当です。
  • GPT Image 2.5 Sunburst は 1K・2K・4K いずれも 2.667 Credits なので、このグループで 4K 出力を得る最も安い手段です。参照画像は最大 16 枚。
  • flux-2-pro は同じ価格帯ですが、テキストのみ・1K・1:1 です。正方形の素材専用と考えてください。
  • Wan2.7 Image は上の 3 つより試行あたりは高いものの、参照画像最大 9 枚まで一律料金なので、編集の多いパイプラインに向きます。
  • Qwen Image 3.0 Pro と Seedream 5.0 Pro は試行あたり最も高く、参照画像には追加料金がかかります。採用画像 1 枚あたりのコストで勝つのは、パイロットで安いモデルがあなたの用途(正確な文字が必要なポスターなど)ではるかに多くのリトライを要すると示されたときだけです。

妥当なパターンは、安いデフォルト、デフォルトが失敗し続けるジョブ用のプレミアムなフォールバック、そして表示価格と実測比率の月次見直しです。

FAQ

採用画像 1 枚あたりのコストとは何ですか?

採用画像 1 枚あたりのコストとは、1 回の試行の表示価格に、残す画像 1 枚を得るのに必要な平均試行回数を掛けたものです。1 枚 2.281 Credits のモデルで 1.3 回に 1 枚を採用するなら、採用画像 1 枚あたり約 2.965 Credits($0.0148)です。

Orux AI で失敗した画像タスクに Credits はかかりますか?

かかりません。画像タスクは SUCCESS で終わったときだけ課金され、FAILED または EXPIRED で終わったタスクは課金されません。ただし、成功したのに不採用にした画像は課金されます。だからこそ採用画像 1 枚あたりの試行回数が重要です。

この 6 モデルで、現在 1 枚あたり最も安いのはどれですか?

2026-11-04 時点で、このグループの最安は 1K の Nano Banana 2.1 で、1 枚 2.281 Credits($0.0114)です。flux-2-pro(2.67 Cr)と GPT Image 2.5 Sunburst(2.667 Cr)が僅差で続き、4K では GPT Image 2.5 Sunburst と Nano Banana 2.1 がどちらも 2.667 Credits です。

コードを変えずに画像モデルを切り替えられますか?

はい、モデル名とパラメーターの制約を設定に置いていれば可能です。ここでのモデルはすべて同じ POST /api/v1/tasks と GET /api/v1/tasks/{id} の流れを使い、違いは model 文字列と、許可される解像度・アスペクト比・参照枚数だけです。

採用画像 1 枚あたりの試行回数を見積もるには、テスト画像が何枚必要ですか?

まずは実際のプロンプトでモデルごとに数十枚のパイロットを行い、その後も本番で記録を続けてください。小さなパイロットでおおまかな比率がわかり、上のスクリプトの台帳が時間とともにそれを精緻にします。

高いモデルを使う価値があるのはどんなときですか?

安いモデルで実測したリトライ回数が損益分岐点を超えるとき、高いモデルを使う価値があります。1 回で採用される Seedream 5.0 Pro を基準にすると、Nano Banana 2.1 の損益分岐点は約 3.3 回、Wan2.7 Image は約 1.7 回です。

Orux AI で Nano Banana 2.1 を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開くOrux AI で flux-2-pro を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開くOrux AI で GPT Image 2.5 Sunburst を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開く

1 つの API でこれらのモデルを利用

チャット・画像・動画・音声モデルに対応した OpenAI 互換 API。Credits で従量課金です。