n8nでGPT Image 2.5:ノードとHTTPの使い分け
n8nのOpenAIノードは品質high・1024系サイズまで。xhigh・2K以上・使用量の記録が要るならHTTP RequestとConvert to Fileで組みます。
目次

n8nからGPT Image 2.5を呼ぶ方法は2つあります。OpenAIノードの「Generate an Image」「Edit Image」でモデルIDを指定する方法と、HTTP RequestノードでImage APIを直接呼ぶ方法です。品質はhighまで、サイズは1024x1024・1024x1536・1536x1024のどれか、出力はPNGでよく、使用量を記録しなくて構わないなら、OpenAIノードで足ります。xhighやmax、2K・4Kや任意の縦横比、透過背景の新規生成、使用量(usage)の記録のどれかが必要なら、HTTP Requestに切り替えます。
モデルIDはgpt-image-2.5-flareとgpt-image-2.5-sunburstの2つで、gpt-image-2.5というIDはありません(OpenAIのモデルページ)。OpenAI互換の中継APIを使う場合は、そのAPIが画像をどんな形で返すかによって、後ろにつなぐノードが変わります。
OpenAIノードで足りるか、HTTP Requestに切り替えるか
OpenAIノードで設定できる項目は、ノードに組み込まれた選択肢で決まります。GPT Image 2.5はAPIとしてはquality low/medium/high/xhigh/max/auto(既定はauto)を受け付け、サイズも条件を満たせば自由に指定できますが、ノードの選択肢はそれより狭くなっています。
下の表の内容は、n8nの公開ソースコード(master、2026年9月25日時点)にある設定定義に基づきます。Generate an Imageの該当ファイルは2026年5月20日から変わっておらず、2026年9月24日公開のn8n@2.40.6も同じ動きになるはずですが、手元のバージョンでは次の段落の方法で確かめてください。
| 必要なこと | Generate an Image | Edit Image | HTTP Request |
|---|---|---|---|
| 2.5のモデルIDを指定 | ノードのtypeVersion 2.2以上 | typeVersion 2.3以上 | 可能 |
| quality | high/medium/low | auto/high/medium/low | xhigh・maxを含む全値 |
| サイズ | 1024x1024、1024x1536、1536x1024 | 256・512・1024の正方形、1024x1536、1536x1024、auto | 2K・4K、任意の縦横比 |
| 透過背景 | 設定項目なし | Backgroundで指定可 | backgroundで指定可 |
| 出力形式 | PNGのみ(項目なし) | png/jpeg/webp | png/jpeg/webp |
| 参照画像の複数指定・マスク | — | 可能 | Form-Dataで可能 |
| 使用量(usage) | 捨てられる | 捨てられる | 応答に残る |
| 画像の受け取り | b64_jsonだけをデコード | b64_jsonをデコード | どの形でも受けて後段で処理 |
判断はこうなります。
- OpenAIノードのままでよい:1024系の3サイズで、品質はhighまで、PNGで足り、1枚ごとの使用量を残す必要がない場合。Generate an Imageは結果をそのまま画像ファイル(バイナリデータ)として出すので、ノード数がいちばん少なく済みます。
- HTTP Requestに切り替える:xhigh・max・auto(Generateの場合)を使いたい、2048x1152のような2Kサイズや4K、1:3〜3:1の縦長・横長を作りたい、透過背景で新規生成したい、生成時点でjpeg・webpにしたい、使用量を記録して費用を把握したい、のどれかに当てはまる場合。
- 中継APIがURLやジョブ方式で返す場合:OpenAIノードは
b64_jsonしかデコードしないため、HTTP Requestで受けてダウンロードやポーリングを後ろに足します(詳しくは後述)。
手元のノードで確かめるには、OpenAIノードのOptionsで「Add Option」からQualityとResolutionを追加し、選択肢を開きます。QualityがHigh・Medium・Lowの3つしかなければ、表のとおりxhighとmaxには届きません。モデル欄に「From List」と「ID」の切り替えがなく、DALL·EとGPT Image 1しか選べない場合は、ノードのtypeVersionが古いままです。typeVersionはn8n本体のバージョンとは別の番号で、ノードを選択してコピーし、テキストエディタに貼り付けると"typeVersion"の値が見えます。古い場合はノードを新しく追加し直します。
もう一つ、Generate an ImageでQualityをOptionsに追加しなかった場合、ソースコード上はqualityがリクエストに含まれないため、API側の既定値autoが使われます。autoではモデルが品質を選ぶので、同じプロンプトでも1枚ごとの消費トークンが変わることがあります。費用をそろえたいならQualityを明示します。
認証情報とモデルID:OpenAI直接と中継APIの違い
n8nのOpenAI認証情報(Credentials)には、API Key、Organization ID(任意)、Base URL(既定はhttps://api.openai.com/v1)、Add Custom Headerの欄があります。ノードは「Base URL+エンドポイント」に送るので、OpenAI互換の中継APIに向けるときはBase URLを書き換えるだけで済みます。Organization IDを入れるべきかどうかは、OpenAI API Key と Organization ID: 2026年に本当に必要なもので判断できます。
モデル欄を「From List」にすると、n8nはBase URLの/modelsを呼び、IDにdall-eかgpt-imageを含むモデルだけを一覧に出します。2.5の2つのIDはgpt-imageを含むので、/modelsが返していれば一覧に出ます。一覧にない場合は「ID」に切り替えてgpt-image-2.5-flareなどを手入力します。Generate an Imageは一覧モードの初期値がgpt-image-1-miniなので、変え忘れると別のモデルで生成されます。
OpenAIを直接使う場合、GPT Image系のモデルは開発者コンソールで組織の本人確認(API Organization Verification)を済ませないと使えないことがあります。403が返る、あるいはモデルが使えないと言われるときは、キーより先にここを確認します。
中継APIを使う場合は、Base URLのほかに2点を確かめます。
- モデルIDがOpenAIと同じか。事業者によっては両モデルを1つの独自IDにまとめていたり、回数課金用に別名を付けていたりします。一覧に出ないIDを推測で入れるのではなく、その事業者のドキュメントにあるIDをID欄に入れます。
- 画像をどの形で返すか。次の節の表で、自分のAPIがどれに当たるかを見ます。
一例として、LaoZhang APIの場合はBase URLがhttps://api.laozhang.ai/v1で、公式転送のルートはOpenAIと同じgpt-image-2.5-flare/gpt-image-2.5-sunburstをトークン課金で使えます(Sora2OfficialグループはOpenAIと同じ単価)。1回ごとの定額で使う-vip付きのIDもあり、2026年9月16日に一時停止したあと9月22日に再開していますが、こちらはマスクに対応していません。gpt-image-2.5-webはFlareとSunburstを選べません。返り値が前置き付きのBase64や期限付きURLになる場合があるので、次の節の処理を入れておきます(LaoZhangのGPT Image 2.5ドキュメント)。
注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。
画像の返り方で決まるn8nのつなぎ方
HTTPステータスが200でも、画像がファイルになっているとは限りません。APIが返す形は大きく4つあり、それぞれ後ろにつなぐノードが違います。
| 返り値の形 | 見分け方 | n8nでのつなぎ方 |
|---|---|---|
| 素のBase64 | data[].b64_jsonがiVBOR…のように始まる。OpenAIのImage APIはこの形 | OpenAIノードでそのまま使える。HTTP RequestならEdit Fields→Convert to File |
前置き付き・末尾の=が欠けたBase64 | data:image/png;base64,で始まる、または長さが4の倍数でない | Codeノードで前置きを外し=を補ってからConvert to File |
| 期限付きURL | data[].urlにURLが入る | もう1つのHTTP Request(Response Format:File)ですぐにダウンロード |
| ジョブ投入+状態確認 | 最初の応答がタスクIDだけ | Wait→状態確認のHTTP Request→IFで繰り返し、完了後にURLをダウンロード |
OpenAIノードは応答のdata[].b64_jsonをバイナリに変換する処理しか持っていないため、URLやジョブ方式で返すAPIでは画像を作れません(ソースコードからの推論で、実際の失敗の仕方は事業者によって異なります)。ジョブ方式の例としては、HiAPIのn8n向け手順が、タスクIDを受け取ってから5秒おきに最大36回状態を確認し、完了後に結果のURLを受け取る構成を紹介しています。この手順でもファイルの保存は別工程として扱われています。
期限付きURLは時間がたつと開けなくなるので、応答を受けたワークフローの中ですぐダウンロードし、URLそのものを保存先に残すだけで終わらせないようにします。
HTTP Requestで生成して画像ファイルにする手順
ここではOpenAIを直接呼び、2Kの横長画像を1枚作ってPNGファイルにするところまでを組みます。中継APIでもURLとキーを差し替えれば同じ形で動きます。
1. HTTP Requestノード
- Method:
POST - URL:
https://api.openai.com/v1/images/generations - ヘッダー:
AuthorizationにBearer <APIキー>。キーはワークフローに直接書かず、認証情報として保存します - Send Body:JSON
{
"model": "gpt-image-2.5-flare",
"prompt": "木のデスクに置いた白いマグカップ、やわらかな自然光、余白の多い構図",
"size": "2048x1152",
"quality": "high",
"output_format": "png",
"n": 1
}前のノードからプロンプトを受け取るときは、"prompt": {{ JSON.stringify($json.prompt) }}のように書くと、プロンプト内の引用符や改行でJSONが壊れません。gpt-image系ではresponse_formatを送る必要はなく、中継APIによってはパラメータエラーになります。
サイズは幅・高さとも16の倍数、縦横比は1:3〜3:1、長辺3840px以下、総ピクセル数655,360〜8,294,400の範囲なら指定できます。2048x1152は16:9で約236万ピクセルなので条件内です。2560x1440を超える解像度はOpenAIが「experimental」としているので、4Kは仕上がりを見てから本番に回します。透過背景にするなら"background": "transparent"を加え、出力形式をpngかwebpにします(OpenAIの画像生成ガイド)。4Kのサイズ指定と保存後の寸法確認は、GPT Image 2向けですがGPT Image 2 4K APIガイド:3840x2160を生成・保存・検証するの手順がそのまま参考になります。
2. 使用量を先に記録する
応答にはdataと並んでusageが入り、input_tokens、output_tokens、total_tokens、input_tokens_details(テキストと画像の内訳)が読めます。GPT Image 2.5はトークン課金で、FlareとSunburstの単価は同じでも、モデルや品質によって1枚あたりの消費トークンは変わります。1枚の費用は、このusageから計算するしかありません。単価と1枚あたりの目安はGPT Image 2.5 Sunburstの料金:公式単価と1回$0.03のAPIを比較にあります。
この記録は、次のConvert to Fileより前に済ませます。Convert to Fileの出力はJSONが空になり、画像ファイルだけが残るためです。HTTP Requestの出力をGoogle スプレッドシートやData Tableなどの記録用ノードにも分岐させ、{{ $json.usage.total_tokens }}などを書き込んでおきます。
3. Edit FieldsでBase64を取り出す
Edit Fieldsで新しいフィールドimage_base64を作り、値に{{ $json.data[0].b64_json }}を入れます。
4. Convert to Fileでファイルにする
操作は「Move Base64 String to File」を選びます。Base64 Input Fieldにはimage_base64というフィールド名を入れ、Base64の中身や式は入れません。Put Output File in Fieldは既定のdataのままでよく、OptionsでFile Name(例:mug-2048x1152.png)とMIME Type(image/png)を設定すると、後ろの保存先で扱いやすくなります。

図のConvert to File欄は簡略化した表記で、実際の画面の項目名はBase64 Input FieldとPut Output File in Fieldです。
HTTP RequestのOptionsで「Include Response Headers and Status」をオンにしている場合は、応答の本文がbodyの下に入るので、式は{{ $json.body.data[0].b64_json }}、使用量は{{ $json.body.usage }}になります。
中継APIの返り値を整えるCodeノード
前置き付きのBase64やURLを返すAPIでは、手順3のEdit Fieldsの代わりにCodeノード(JavaScript)を置きます。次のコードは、前置きと空白を取り除いて末尾の=を補い、nが2以上のときは1枚ずつ別のアイテムに分けます。URLで返ってきたものはimage_urlに入れるので、IFノードで分岐させ、URL側はHTTP Request(Response Format:File)でダウンロードします。
const out = [];
for (const item of $input.all()) {
// Include Response Headers and Status がオンなら body の下にある
const res = item.json.body ?? item.json;
const usage = res.usage ?? null;
(res.data ?? []).forEach((entry, index) => {
if (entry.b64_json) {
let b64 = entry.b64_json;
if (b64.startsWith('data:')) b64 = b64.split(',')[1];
b64 = b64.replace(/\s/g, '');
b64 += '='.repeat((4 - (b64.length % 4)) % 4);
out.push({ json: { index, image_base64: b64, usage } });
} else if (entry.url) {
out.push({ json: { index, image_url: entry.url, usage } });
}
});
}
return out;usageをアイテムごとに持たせてあるので、記録用ノードはこのCodeノードの後ろに分岐させても構いません。Convert to Fileが前置き付きのBase64をそのまま受け付けるかは公開情報に記載がないため、前置きは変換前に外しておきます。
参照画像やマスクを使う編集
OpenAIノードのEdit Imageは、typeVersion 2.3以上ならモデル欄で2.5のIDを指定できます。Imagesに複数のバイナリフィールドを追加すると、それぞれがimage[]として送られます。Image Maskを指定すると、マスクは1枚目の画像に適用されます。品質はhighまで、サイズは長辺1536までなので、大きなサイズで編集したい場合はHTTP Requestを使います。
HTTP Requestで編集するときは、URLをhttps://api.openai.com/v1/images/editsにし、Send BodyをForm-Dataにします。パラメータの種類で「n8n Binary File」を選び、Nameにimage[]、Input Data Field Nameに手前のノードのバイナリフィールド名(既定ならdata)を入れます。参照画像が複数あるときは、同じimage[]のパラメータを枚数分追加します。model、prompt、size、qualityは通常のForm Dataとして並べます。
マスクについては、次の点を守ります。
- 元画像とマスクは形式とサイズをそろえ、マスクにはアルファチャンネルを持たせる
- マスクは目安として扱われ、モデルが境界どおりに塗り分けるとは限らない。OpenAIはGPT Imageのマスクを「プロンプトに基づく」と説明している
- ファイルサイズの上限は、OpenAIのガイド(50MB未満)とn8nノードのヒント(マスクPNGは4MB未満)で書き方が違う。使うAPIのドキュメントの値に合わせる
- Edit ImageのOptionsにあるInput Fidelityは、OpenAIが古いGPT Imageモデル向けとしてしか説明していないため、2.5では設定しない
中継APIでは、同時に送れる参照画像の数やマスク対応が事業者ごとに違います。たとえばLaoZhang APIの公式転送ルートは参照画像を最大16枚まで受け付けますが、-vip付きのモデルはマスクに対応していません。どちらのモデルが編集に向くかは、GPT Image 2.5 FlareとSunburstの違いが参考になります。
注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。
まとめて生成するときの間隔とタイムアウト
スプレッドシートの行ごとに画像を作るような一括処理では、OpenAIの利用枠(Usage Tier)ごとの1分あたりの画像枚数(IPM)が先に効きます。FlareとSunburstの既定の上限は同じで、1分に1枚ずつ送るならリクエストの間隔は「60,000 ÷ IPM」ミリ秒以上あればIPMを超えません。
| Tier | IPM | TPM | Batch Intervalの下限 |
|---|---|---|---|
| Tier 1 | 5 | 100,000 | 12,000ms |
| Tier 2 | 20 | 250,000 | 3,000ms |
| Tier 3 | 50 | 800,000 | 1,200ms |
| Tier 4 | 150 | 3,000,000 | 400ms |
| Tier 5 | 250 | 8,000,000 | 240ms |
IPMとTPMはOpenAIのモデルページの既定値、Batch Intervalはそこから計算した値です。HTTP RequestのOptionsでBatchingを追加し、Items per Batchを1、Batch Intervalを表の値以上にします。この計算は1リクエスト1枚(n: 1)で、同じ組織のキーをほかで使っていない場合の話です。ほかのワークフローも同じキーを使うなら、そのぶん間隔を広げます。大きなサイズや高品質では1枚あたりのトークンが増えるので、TPMの上限に先に当たることもあります。中継APIにはそれぞれ別の制限があるので、その事業者の値で計算し直します。
タイムアウトについて、OpenAIは複雑なプロンプトの処理に最大2分程度かかることがあると書いています。n8nのHTTP RequestのTimeoutは、サーバーが応答ヘッダーを返し始めるまでの待ち時間(ミリ秒)です。生成に2分近くかかる可能性がある以上、それより短い値では生成中のリクエストを打ち切るおそれがあります。120,000ms(2分)に余裕を足した値を目安に設定します。
再試行してよいエラーと止めるべきエラー
ノードのSettingsにある「Retry On Fail」をオンにすると、エラーの種類を問わず同じリクエストを繰り返します。レート制限なら再試行で通りますが、内容の問題で断られたリクエストは何度送っても通りません。HTTP RequestのOptionsで「Never Error」と「Include Response Headers and Status」をオンにし、IFノードでステータスコードとerrorの中身を見て分岐させると、区別して扱えます。
| 状況 | 見分け方 | 対応 |
|---|---|---|
| レート制限 | 429、レート制限超過のエラー | 間隔を空けて再試行し、Batch Intervalを見直す |
| サーバー側の一時的な障害 | 5xx | 間隔を空けて再試行 |
| クォータ・残高不足 | クォータ超過・残高不足のエラー | 自動で再試行しない。支払いや利用上限を確認する |
| 内容による拒否 | image_generation_user_error、error.codeがmoderation_blocked | 自動で再試行しない。プロンプトや入力画像を直す |
| 組織の認証が必要 | 403、モデルが使えないという応答 | 再試行しない。Organization Verificationを確認する |
| タイムアウト | n8n側で応答が途中で切れた | すぐ再送しない。先にAPI側のログを確認する |
moderation_blockedの応答には、入力と出力のどちらで止まったかを示すmoderation_details.moderation_stageと大まかなカテゴリが含まれることがあるので、ログに残しておくと直すべき箇所が分かります。OpenAIの推奨どおり、ステータスとエラーの種類に加えてリクエストIDも記録しておきます。
タイムアウトは「生成されなかった」という証拠にはなりません。LaoZhang APIは、クライアント側でタイムアウトや切断が起きてもサーバー側の生成は止まらず、完了すれば課金されると明記しています。OpenAIがこの場合をどう課金するかは公開情報に記載がありません。どちらにしても、再送する前に呼び出しログを見て、生成済みでないかを確かめます。
注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。
生成・ファイル・配信を分けて確認する
画像ワークフローが「成功」と表示されても、見るべき段階は3つあります。どこで止まったかを段階ごとに見れば、直す場所がすぐ分かります。

図の応答例は一般的なAPIの形で、OpenAIのGPT Image 2.5はdata[0].b64_jsonとusageを返します。
- API応答:ステータスが200で、
dataにb64_jsonかurlが入っているか。直接呼んだ場合はusageも入っているか。 - 画像ファイル:Convert to Fileやダウンロードの出力にバイナリがあり、MIME TypeとFile Nameが意図どおりか。n8nの画面でプレビューし、実際に開けるか。開けない場合はBase64の前置きや
=の欠けを疑います。 - 保存・配信:Google ドライブやメールなどの保存先ノードが、正しいバイナリフィールド名(既定は
data)を参照しているか。届いたファイルを開き、寸法がsizeで指定した値と合っているか。
よくある食い違いは次のとおりです。
- ワークフローは成功したのにファイルがない:Convert to FileのBase64 Input Fieldにフィールド名ではなく値や式を入れている、またはOpenAIノードのPut Output in Fieldで既定の
dataを別名に変え、後ろのノードがdataを探している。 - OpenAIノードで使用量が0や空になる:n8nのOpenAIノードは画像の操作で
usageを捨てています。n8n 2.38.6、typeVersion 2.3、gpt-image-2.5-flareで再現したという報告がissue #38482にあり、2026年9月25日時点で未解決です。式やCodeノードでは取り戻せないので、使用量が要るならHTTP Requestで呼びます。記録されていなくても、課金されていないわけではありません。 - 画像がざらつく、色むらが出る:ワークフローではなく生成結果の問題です。GPT Image 2.5 のざらつき・市松模様の対処法で原因を切り分けます。
よくある質問
n8nを最新版にすればOpenAIノードでxhighや4Kを選べますか?
2026年9月25日時点の公開ソースコードでは選べません。Generate an Imageの設定を定義するファイルは2026年5月20日から変わっておらず、QualityはHigh・Medium・Low、サイズは1024系の3種類のままです。更新後はOptionsのQualityの選択肢を開き、増えていなければHTTP Requestを使います。
GPT Image 2から移行すると、ワークフローのどこを変えますか?
OpenAIノードでもHTTP Requestでも、モデルIDをgpt-image-2.5-flareかgpt-image-2.5-sunburstに変えるのが基本です。Edit ImageでInput Fidelityを設定していた場合は外します。移行するかどうかの判断材料はGPT Image 2.5とGPT Image 2:移るか残るかにあります。
n8nではなくComfyUIで使う場合も同じ設定ですか?
モデルIDやサイズの条件はAPI側の仕様なので共通ですが、ComfyUIではノードの構成も設定できる項目もn8nとは異なります。手順はComfyUIでGPT Image 2.5を使う方法と料金にあります。
参考資料5
本文で参照している外部ページを、登場順に並べています。最終更新日:2026年9月25日。
参考資料5
本文で参照している外部ページを、登場順に並べています。最終更新日:2026年9月25日。
- 1.OpenAIのモデルページdevelopers.openai.com/api/docs/models/gpt-image-2.5-flare
- 2.API Organization Verificationhelp.openai.com/en/articles/10910291-api-organization-verification
- 3.n8n向け手順hiapi.ai/en/blog/gpt-image-2-n8n-workflow
- 4.OpenAIの画像生成ガイドdevelopers.openai.com/api/docs/guides/image-generation
- 5.issue #38482github.com/n8n-io/n8n/issues/38482





