FLUX Kontext APIの代替:GPT Image 2で写真を指示どおりに編集
マスクなしの指示編集。リクエストのコード、2026年10月28日に3段階で回した連続編集、そして各ステップで残ったものを書きます。
このページの内容
FLUX Kontext APIは、1リクエストにつきプロンプト1つと画像1枚を渡すと、編集後の写真を返します。BFLのページはFLUX.1 Kontextを前世代のモデルと呼び、新しい案件にはFLUX.2を勧めています(2026年10月28日確認)。GPT-Image 2 が受け取る入力も同じ2つです。2026年10月28日に3段階で続けて編集したところ、カフェのテーブル、カップ、観葉植物、窓枠、そして前のステップの変更がすべて残りました。
指示ベースの編集とは
写真と「赤い自転車をマットブラックに変えて」のような一文を送ると、その箇所だけが変わった新しい写真が返ってきます。BFLはKontextを、複雑なワークフローもファインチューニングも要らず、簡単なテキストプロンプトで画像を編集する仕組みだと説明しています(docs.bfl.ai/kontext/kontext_image_editing、2026年10月28日確認)。
コードの書き方はBFLの3つの数字で決まります。入力は20 MBまたは20メガピクセルまで、出力は約1 MP、結果のリンクは10分で切れます。結果は届いた時点ですぐ保存してください。
指示は2つの部分でできています。変える内容と、変えないものの一覧です。
OmniaKeyのGPT-Image 2も、同じ2つの入力で編集タスクを受け付けます。モデルページにはテキストから画像と画像編集の両方が載り、品質はlow、medium、highの3段階です(omniakey.com/gpt-image-2、2026年10月28日確認)。FLUX系のモデルは動かしていないので、以下はすべて自分たちで回した4回の編集とそのコードです。
リクエストの形
編集は https://api.omniakey.com/v1/media/tasks へのPOST 1回です。model に gpt-image-2、type に image、operation に edit を入れ、指示文は input.prompt、元の写真はMIMEタイプ付きのBase64で input.image に入れます(docs.omniakey.com/en/media/image、2026-10-28確認)。呼び出すとHTTP 202とタスクIDが返ります。ステータスが queued か processing の間は GET /v1/media/tasks/{task_id} をポーリングし、完了したタスクの assets[0].url を取ります。
細かい点で2回リトライが増えました。Pythonの既定のUser-AgentでPOSTするとHTTP 403が返り、User-Agentを設定してから通りました(2026年10月28日)。Base64は1 MiBのリクエスト上限に含まれるので、エンコードの前に写真を縮小してください。
結果は署名付きリンクの向こうにあるPNGで、リンクは約1時間で失効し、ファイルは24時間残ります。ダウンロードしたら、指定したサイズを信じずに実際の幅と高さを読んでください。
import base64
import json
import os
import time
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def edit_image(source_path, prompt, out_path, size="1024x1536", quality="medium"):
with open(source_path, "rb") as f:
image = base64.b64encode(f.read()).decode()
body = {
"model": "gpt-image-2",
"type": "image",
"operation": "edit",
"input": {"prompt": prompt, "image": {"data": image, "mime_type": "image/jpeg"}},
"parameters": {"size": size, "quality": quality},
}
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
for _ in range(150):
time.sleep(4)
state = request("GET", f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # signed link: valid for about an hour, so download now
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=120) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
if __name__ == "__main__":
task = edit_image(
"cafe-base.jpg",
"Change the red bicycle to a matte black bicycle with a brown wicker basket on the front. Keep everything else exactly the same: the wooden table, the coffee cup, the plant, the window frame and the bright daylight. Photorealistic, no text, no logos.",
"cafe-step1.png",
size="1536x1024",
)
print("task", task)
実行時はsize 1536x1024、quality mediumを使いました。ドキュメントではGPT Imageの n は1でなければならないので、関数では省略しています。ファイル末尾のサンプル呼び出しが、このあとの連続編集の1ステップ目です。
3回続けて編集する
各ステップは前の結果を入力にするので、3ステップは3つのタスクと3回のダウンロードになります。ベース写真は窓際のカフェテーブルで、白いカップとソーサー、歩道の赤い自転車、窓台の鉢植え、1536x1024、medium品質です。
- ステップ1:「Change the red bicycle to a matte black bicycle with a brown wicker basket on the front. Keep everything else exactly the same: the wooden table, the coffee cup, the plant, the window frame and the bright daylight. Photorealistic, no text, no logos.」結果は、前かご付きのマットブラックの自転車。テーブル、カップ、鉢植え、窓枠はそのままです。
- ステップ2、ステップ1の結果から:「Make it evening outside: the sky is dark blue and the street lamps are on. The cafe interior lights are warm yellow. Keep the table, the cup, the plant, the black bicycle and the window frame exactly the same. Photorealistic, no text, no logos.」結果は、濃い青の空に灯り始めた街灯、店内は暖かい黄色の光。黒い自転車と前かごは残りました。
- ステップ3、ステップ2の結果から:「Replace the coffee in the white cup with a clear glass of iced tea with a lemon slice on the rim. Keep everything else exactly the same. Photorealistic, no text, no logos.」結果は、コーヒーの代わりにレモンスライスを添えたアイスティー。夕方の情景はそのままです。

4枚とも gpt-image-2 が作った合成シーンです。Generated with GPT-Image 2 via the OmniaKey API on October 28, 2026, size 1536x1024, quality medium.
元の写真から1回だけ編集する
編集はすべて連続で行う必要はありません。この例はベース写真から始めて、窓台の1か所だけを入れ替えます。「Remove the potted plant from the windowsill and place a stack of three old hardcover books there. Keep everything else exactly the same: the table, the cup, the red bicycle and the daylight. Photorealistic, no text, no logos.」
窓台には古いハードカバーが3冊積まれ、鉢植えは消え、赤い自転車は赤いままでした。一文で2か所が変わり、どちらも画面に現れています。

残ったもの、変わったもの
テーブル、カップ、鉢植え、窓枠は3ステップすべてを通り抜け、黒い自転車と前かごは夕方の光の中でも残り、前のステップの変更は次の1枚にも写っていました。光が動いたのはステップ2の1回だけで、そこは指示文がそう求めていた箇所です。
レモンスライスは指示どおりグラスの縁に載り、アイスティーはソーサーの上に残りました。各指示は1回ずつしか回していないので、1枚が1サンプルです。
効いた指示の書き方
4つの指示から使える編集が4つ出てきました。共通する型があります。
- 一文につき変更は1つ、そのあとに残すものの一覧。ステップ1は自転車を変え、テーブル、カップ、鉢植え、窓を変えない対象として名指ししています。
- 残すものの一覧は毎回書き直し、直前の変更も含めます。ステップ2は "the black bicycle" と書き、ステップ3は夕方をそのまま残しました。
- 新しいものがどこに入るかを、古いものと同じ文で言います。実際の言い方は "place a stack of three old hardcover books there" です。
- 素材と色は具体的に書きます。「マットブラック」「茶色の籐かご」「暖かい黄色」「透明なグラス」。
- 最後に "Photorealistic, no text, no logos" で締めます。連続編集の指示はどれもこの形で終わっています。
文の順番と編集の言い回しは、GPT Image 2のプロンプトガイドで組み立て方を説明しています。衣装の差し替えはバーチャル試着のガイド、物を消す作業は物体除去のガイドで扱っています。
どちらを選ぶか
| FLUX.1 Kontext | GPT-Image 2 編集 | |
|---|---|---|
| 1リクエストの入力 | プロンプト1つ、画像1枚 | プロンプト1つ、画像1枚 |
| 元画像の上限 | 20 MBまたは20メガピクセル | リクエスト1 MiB(Base64込み) |
| 出力サイズ | 約1 MP | 指定したサイズ、PNG |
| 結果リンク | 10分 | 約1時間 |
| モデルの状況 | BFLいわく前世代 | OmniaKeyで利用可能 |
FLUXのパイプラインがすでに本番で動いていて、当分この呼び出し方を続けたいならKontextです。サイズを自分で決めたい、リンクを取るのに1時間ほしいならGPT-Image 2です。BFLは新しい案件をFLUX.2へ向けているので、新規プロジェクトは見直すいい機会になります。
料金は、OpenAIの価格ページ(2026-10-28確認)ではgpt-image-2を100万トークン単位で課金します。画像入力が$8.00、画像出力が$30.00、キャッシュされた画像入力が$2.00、バッチは通常料金の半額です。1枚あたりの行はなく、画像生成ガイドに1枚分を計算するツールがあります。
よくある質問
FLUX Kontext APIは何をするものですか?
テキストの指示で写真を編集します。1リクエストにつきプロンプト1つと入力画像1枚です(BFL、2026-10-28確認)。BFLのページの表現は "edits images using simple text prompts" です。
FLUX Kontextは今も現役ですか?
BFLはFLUX.1 Kontextを前世代のモデルと呼び、新しいプロジェクトにはFLUX.2を勧めています(2026-10-28確認)。
テキストだけでAPIから写真を編集できますか?
できます。GPT-Image 2の編集エンドポイントに写真1枚と指示1つを送れば、新しい写真が返ります。2026年10月28日にはこの方法で4回編集しました。
編集は連続して実行できますか?
できます。1ステップにつき1タスクで、前の結果を次の元画像として渡します。3ステップの連続編集では、夕方の光と飲み物の差し替えをまたいで、前の変更が残りました。
結果のリンクはどのくらい持ちますか?
OmniaKeyでは約1時間で、ファイルは24時間保持されます(docs.omniakey.com、2026-10-28確認)。タスクが成功したらすぐPNGをダウンロードし、実際の寸法を読んでください。
OmniaKeyは上のタスクの流れでGPT-Image 2の編集を提供しています。現在の料金は料金ページにあります。
この記事で紹介しているモデル
関連記事
GPT Image 2 プロンプトガイド:構成・例文・実際の生成画像
8 つのプロンプトと 9 枚の実画像。GPT Image 2 が正確に再現した点、勝手に足した点、直し方をまとめます。
バーチャル試着 API:GPT Image 2 で服を着せ替える
写真 1 枚とプロンプト 1 つで服を変えられます。リクエストのコード、2026 年 10 月 28 日に実行した 3 回の着せ替え、そして結果がどこでずれるかを示します。
物体削除API:GPT Image 2で写真から人物やゴミ箱を消す
物体ごとに一文を送るだけで、3つの削除はすべてうまくいきました。実行したコード、原寸の結果、まだ任せきれない部分を紹介します。
