# GPT Image 2.5の使い方：Flare・Sunburstの違い、料金とAPI実装

> GPT Image 2.5の2モデルと旧GPT Image 2を比較。トークン料金とキャッシュの計算方法、Pythonでの画像生成・編集・PNG保存、品質とサイズの指定を解説します。

- Source: https://www.aifreeapi.com/ja/posts/gpt-image-2-5
- Language: ja
- Published: 2026-09-09
- Updated: 2026-09-09
- Publisher: AI Free API (https://www.aifreeapi.com)

GPT Image 2.5は、OpenAIが2026年9月8日に公開した画像生成・編集モデルです。APIでは、日常的な制作の速さを重視する **`gpt-image-2.5-flare`** と、編集精度を重視する **`gpt-image-2.5-sunburst`** を使い分けます。どちらも新規生成と既存画像の編集に対応し、Flareが生成専用、Sunburstが編集専用という分担ではありません。[OpenAIの発表](https://openai.com/index/introducing-chatgpt-images-2-5/)

初めて組み込むなら、まずFlareで必要な品質と待ち時間を確認し、変更したくない要素を残す編集が難しい場面でSunburstも比較すると判断しやすくなります。料金表のトークン単価は両モデルで同じですが、1枚あたりの費用まで同じとは限りません。

本記事の仕様・料金は2026年9月9日時点の公式資料に基づきます。速度や精度はOpenAIの説明として扱い、以下のAPIコードは実装例です。有料APIによる実測結果は掲載していません。

## FlareとSunburst、旧GPT Image 2をどう選ぶか

2.5で注目したいのは、単に絵を作る能力だけでなく、参照画像に合わせて仕上げたり、修正を重ねたりする作業です。OpenAIは参照画像への忠実度、狙った部分の編集、複数回にわたる編集の改善を説明しています。ただし、残すように指定した領域が画素単位で固定される保証ではありません。[公式発表の機能説明](https://openai.com/index/introducing-chatgpt-images-2-5/)

| 比較項目 | GPT Image 2.5 Flare | GPT Image 2.5 Sunburst | GPT Image 2 |
|---|---|---|---|
| APIモデルID | `gpt-image-2.5-flare` | `gpt-image-2.5-sunburst` | `gpt-image-2` |
| 選ぶときの軸 | 制作を素早く回したい | 編集の精度を優先したい | 既存実装の結果を比較基準にしたい |
| 新規生成・画像編集 | 両方に対応 | 両方に対応 | 両方に対応 |
| 品質指定 | `low`、`medium`、`high`、`xhigh`、`max`、`auto` | Flareと同じ | `low`、`medium`、`high`、`auto` |
| 速度についての公式説明 | GPT Image 2よりレイテンシが50%低い | 精度を重視する分、生成に時間がかかる | Flareの比較対象 |
| 標準APIのトークン単価 | 下記料金表 | Flareと同じ | 下記の入力・画像出力単価は2.5と同じ |

モデルの対応機能は[Flareのモデルページ](https://developers.openai.com/api/docs/models/gpt-image-2.5-flare)と[Sunburstのモデルページ](https://developers.openai.com/api/docs/models/gpt-image-2.5-sunburst)、品質指定は[画像出力の設定](https://developers.openai.com/api/docs/guides/image-generation#customize-image-output)で確認できます。「50%低い」は公式の比較であり、個々のリクエストが必ず半分の時間で終わるという意味ではありません。

たとえば、商品の見せ方を数案出す段階ならFlareを試す価値があります。一方、採用した構図を保ちながら、包材の色だけを変える仕上げではSunburstが比較候補になります。この使い分けは公式の位置づけから導いた提案で、両モデルの出力を本記事で評価した結果ではありません。

GPT Image 2からの移行では、モデル名を置き換えて動作するかに加え、実際に採用する画像が得られるかを見ます。同じ入力画像、指示、サイズ、共通の品質設定で比較し、待ち時間、修正回数、消費トークンを記録すると、変更の効果を捉えやすくなります。2.5専用の`xhigh`や`max`は、その比較を終えてから別条件として試せます。他社モデルも含めて選びたい場合は、[Nano Banana ProとGPT Image 2の比較](/ja/posts/nano-banana-pro-vs-gpt-image-2)が別の判断軸になります。

## 料金は「入力・キャッシュ・画像出力」を分けて計算する

OpenAI直契約の標準API料金は次のとおりです。単位は**100万トークンあたりの米ドル**で、画像1枚の価格ではありません。FlareとSunburstは同じ単価です。[OpenAI API料金表](https://developers.openai.com/api/docs/pricing)

| 課金対象 | 通常入力 | キャッシュ済み入力 | 出力 |
|---|---:|---:|---:|
| テキスト | $5.00 | $1.25 | 2.5のテキスト出力課金なし |
| 画像 | $8.00 | $2.00 | $30.00 |

生成する画像のサイズと品質、参照画像、編集の内容によってトークン使用量が変わるため、同じ単価でも請求額は変わります。GPT Image 2向けの「1枚あたり」の見積もりをそのまま2.5へ転用せず、公式の計算機では対象の2.5モデルを選び、実行後は使用量と請求記録を確認してください。[費用とレイテンシの説明](https://developers.openai.com/api/docs/guides/image-generation#cost-and-latency)

![テキストと画像の入力を通常分とキャッシュ済み分に分け、画像出力の費用と合わせる考え方](https://www.aifreeapi.com/posts/ja/gpt-image-2-5/img/token-cost-separation.webp)

### キャッシュ分は通常入力から差し引く

入力トークンの合計にキャッシュ済みのトークンが含まれている場合、その合計へ通常単価を掛けたうえでキャッシュ料金を足すと二重計上になります。通常入力とキャッシュ済み入力を、重ならない区分に分けます。

次は課金の仕組みを示す**仮の使用量**です。特定のサイズや品質の実測値ではありません。

| 区分 | トークン数 | 計算 | 費用 |
|---|---:|---|---:|
| 通常テキスト入力 | 800 | 800 × $5 / 1,000,000 | $0.0040 |
| キャッシュ済みテキスト入力 | 200 | 200 × $1.25 / 1,000,000 | $0.00025 |
| 通常画像入力 | 1,500 | 1,500 × $8 / 1,000,000 | $0.0120 |
| キャッシュ済み画像入力 | 500 | 500 × $2 / 1,000,000 | $0.0010 |
| 画像出力 | 2,000 | 2,000 × $30 / 1,000,000 | $0.0600 |
| 合計 | — | 各区分の合算 | **$0.07725** |

この例のテキスト入力合計は1,000、画像入力合計は2,000です。計算前にそれぞれキャッシュ分の200と500を引きます。Pythonで同じ計算を行うなら、次のように総入力とキャッシュ分を別々に受け取る形にできます。

```python
def image_request_cost_usd(
    text_total, text_cached, image_total, image_cached, image_output
):
    values = (text_total, text_cached, image_total, image_cached, image_output)
    if any(v < 0 for v in values):
        raise ValueError("Token counts must be non-negative")
    if text_cached > text_total or image_cached > image_total:
        raise ValueError("Cached input cannot exceed total input")
    return (
        (text_total - text_cached) * 5
        + text_cached * 1.25
        + (image_total - image_cached) * 8
        + image_cached * 2
        + image_output * 30
    ) / 1_000_000

print(image_request_cost_usd(1000, 200, 2000, 500, 2000))
# 0.07725
```

制作予算では、採用しなかった案や再編集も含めたAPI費用を、採用できた画像の数で割ると比較に使えます。これは公式の課金単位ではなく、制作側の費用管理です。Responses APIを使う場合は、この画像処理の費用に加えて、呼び出し元のモデルが使ったトークン料金も考慮します。

## Pythonで生成した画像をPNGに保存する

単発の生成・編集にはImages APIが扱いやすく、会話の中で画像を作る用途にはResponses APIが候補になります。まずは処理を追いやすいImages APIで、画像の保存まで確かめます。[公式APIガイド](https://developers.openai.com/api/docs/guides/image-generation)

実行環境にOpenAI Python SDKをインストールし、環境変数`OPENAI_API_KEY`へAPIキーを設定してください。キーをソースコードやブラウザ側のJavaScriptへ埋め込まず、サーバー側で実行します。

```bash
python -m pip install --upgrade openai
```

次を`generate_image.py`として保存します。陶器のマグカップを題材に、後で部分編集を試せる画像を作る例です。

```python
import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI(timeout=180.0, max_retries=0)

result = client.images.generate(
    model="gpt-image-2.5-flare",
    prompt=(
        "白い陶器のマグカップを木のテーブルに置いた商品写真。"
        "背景は淡いベージュ。左から柔らかい自然光。"
        "カップ全体と持ち手が見える構図。文字やロゴは入れない。"
    ),
    size="1536x1024",
    quality="medium",
    output_format="png",
    n=1,
)

if not result.data or not result.data[0].b64_json:
    raise RuntimeError("No image data returned")

image_bytes = base64.b64decode(result.data[0].b64_json, validate=True)
if not image_bytes.startswith(b"\x89PNG\r\n\x1a\n"):
    raise RuntimeError("The returned data is not a PNG file")

output = Path("generated-mug.png")
output.write_bytes(image_bytes)
print(f"Saved {output.resolve()} ({len(image_bytes)} bytes)")
if result.usage is not None:
    print(result.usage.model_dump_json(indent=2))
```

`python generate_image.py`を実行すると、成功時に`generated-mug.png`を保存します。HTTPリクエストが成功しただけで処理を終えず、`data[0].b64_json`にあるBase64データをバイト列へ戻すのが要点です。上のコードはPNGの先頭署名も確認しますが、画像全体を正常に表示できることまでは保証しません。保存後に画像ビューアーで開いて確認してください。

タイムアウトの180秒はこの例でのクライアント設定であり、サービスの応答時間の保証ではありません。また、自動再試行を無効にしているので、失敗時にはエラーの原因を見てから再実行できます。

![Images APIの返り値をBase64からデコードし、PNGファイルへ保存して開く流れ](https://www.aifreeapi.com/posts/ja/gpt-image-2-5/img/api-image-save.webp)

## Sunburstで元画像の一部を変更する

生成した`generated-mug.png`を使い、持ち手の色だけを変更します。編集指示では、**変える対象と維持したい要素を具体的に書く**と、期待する結果を比較しやすくなります。

```python
import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI(timeout=180.0, max_retries=0)
source = Path("generated-mug.png")

with source.open("rb") as reference:
    result = client.images.edit(
        model="gpt-image-2.5-sunburst",
        image=reference,
        prompt=(
            "マグカップの持ち手だけを落ち着いた青色に変更してください。"
            "カップ本体の白色、形、位置、テーブル、背景、光の向きは維持。"
            "文字や装飾を追加しないでください。"
        ),
        size="1536x1024",
        quality="high",
        output_format="png",
    )

if not result.data or not result.data[0].b64_json:
    raise RuntimeError("No edited image returned")

image_bytes = base64.b64decode(result.data[0].b64_json, validate=True)
if not image_bytes.startswith(b"\x89PNG\r\n\x1a\n"):
    raise RuntimeError("The returned data is not a PNG file")

output = Path("edited-mug.png")
output.write_bytes(image_bytes)
print(f"Saved {output.resolve()} ({len(image_bytes)} bytes)")
if result.usage is not None:
    print(result.usage.model_dump_json(indent=2))
```

これは文章で編集対象を指定する例です。元画像を上書きしないため、2枚を並べて、持ち手以外にも変更が入っていないか確認できます。変更範囲を画像で示したい場合は、Images APIのマスク編集も検討してください。ただし、マスクや「維持」という指示があっても、領域外の完全な固定を前提にした実装にはしないほうがよいでしょう。[画像編集と制約](https://developers.openai.com/api/docs/guides/image-generation#limitations)

### 会話型の実装ではモデルの指定場所が変わる

Responses APIでは、最上位の`model`に対応する会話モデルを指定し、画像モデルは`tools`内に置きます。最上位へ画像モデルIDをそのまま入れる形とは異なります。保存対象も`data[0].b64_json`ではなく、`output`内の`image_generation_call`にある`result`です。

```python
import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI(timeout=180.0, max_retries=0)
response = client.responses.create(
    model="gpt-6-astra",
    input="木のテーブルに白い陶器のマグカップを置いた商品写真を生成して。",
    tools=[{
        "type": "image_generation",
        "model": "gpt-image-2.5-flare",
        "output_format": "png",
    }],
)

images = [
    item.result for item in response.output
    if item.type == "image_generation_call" and item.result
]
if not images:
    raise RuntimeError("The response did not contain a generated image")

for index, encoded in enumerate(images, start=1):
    Path(f"conversation-image-{index}.png").write_bytes(
        base64.b64decode(encoded, validate=True)
    )
```

画像生成ツールの呼び出しと会話の履歴を扱う必要があるときに、この経路を選びます。単発の画像出力だけが目的なら、先のImages APIの例から始めれば十分です。[Responses APIでの画像生成](https://developers.openai.com/api/docs/guides/image-generation)

## 品質を上げる前に出力サイズを決める

`quality`と`size`は別の指定です。`quality="max"`にしても、画像が自動的に4Kサイズになるわけではありません。2.5の品質は`low`、`medium`、`high`、`xhigh`、`max`、`auto`から選び、既定は`auto`です。まず掲載先で必要な縦横比と大きさを決め、そのサイズで品質を調整すると比較しやすくなります。[出力設定の仕様](https://developers.openai.com/api/docs/guides/image-generation#customize-image-output)

扱いやすい推奨サイズは、正方形の`1024x1024`、横長の`1536x1024`、縦長の`1024x1536`です。カスタムサイズでは、縦横とも16の倍数、縦横比は1:3から3:1、各辺は3,840ピクセル以下、総画素数は655,360から8,294,400という条件があります。`2560x1440`を超える解像度は実験的な扱いです。

横長の16:9が必要なら`1536x864`は条件を満たします。同じ比率でも`1024x576`は総画素数が589,824となり、下限を満たしません。比率だけでサイズを決めないことが、設定エラーを減らすポイントです。

透過素材を作る場合は、`background="transparent"`と、`output_format="png"`または`"webp"`を組み合わせます。JPEGでは透過を保持できません。コード中の保存先の拡張子も出力形式に合わせて変更します。

## 導入時に確認しておきたいこと

ChatGPTで画像を作れることと、APIの利用条件は別です。ChatGPTのプラン料金にAPI利用料が含まれると考えず、API側のプロジェクト、請求設定、モデルへのアクセスを確認してください。アカウントによって組織認証が必要になる場合もあります。今回の発表だけで、すべてのアカウントの利用開始時期や無制限利用まで判断することはできません。[API利用の前提](https://developers.openai.com/api/docs/guides/image-generation)

生成が遅いときも、すぐに同じ要求を繰り返す前に、リクエストID、エラー内容、使用量を残します。複雑な指示には時間がかかることがあり、公式ガイドは最大2分程度かかる場合を説明しています。認証、利用枠、入力内容に関するエラーは、単に再送しても原因が解消しません。[既知の制約](https://developers.openai.com/api/docs/guides/image-generation#limitations)

制作での採用判断は、速く1枚返ることだけでは決まりません。必要な文字が読めるか、商品の形や人物の特徴が保たれているか、指定した配置が成立するかを確認します。まずFlareの同一条件で基準を作り、精密な編集だけSunburstでも試す。そのうえで採用枚数あたりの費用と作業時間を比較すると、2.5へ切り替える理由を具体的に説明できます。
