FLUX Kontext API 대안: GPT Image 2로 이미지 편집하기
마스크 없는 지시문 편집. 요청 코드, 2026년 10월 28일에 3단계로 돌린 연쇄 편집, 각 단계가 지켜낸 것을 담았습니다.
이 페이지 목차
FLUX Kontext API는 요청 한 번에 프롬프트 하나와 이미지 한 장을 받아 편집된 사진을 돌려줍니다. BFL 페이지는 FLUX.1 Kontext를 이전 세대 모델이라고 부르고 새 프로젝트에는 FLUX.2를 권합니다(2026년 10월 28일 확인). GPT-Image 2도 입력은 같은 두 가지입니다. 2026년 10월 28일에 3단계로 연달아 편집한 결과, 카페 테이블과 컵, 화분, 창틀, 그리고 앞 단계의 변경이 모두 남았습니다.
지시문 기반 편집이란
사진과 "빨간 자전거를 무광 검정으로 바꿔 줘" 같은 문장 하나를 보내면, 그 부분만 바뀐 새 사진이 돌아옵니다. BFL은 Kontext를 복잡한 워크플로나 미세 조정 없이 간단한 텍스트 프롬프트로 이미지를 편집하는 방식이라고 설명합니다(docs.bfl.ai/kontext/kontext_image_editing, 2026년 10월 28일 확인).
코드 작성은 BFL이 밝힌 세 숫자가 정합니다. 입력은 최대 20 MB 또는 20메가픽셀, 출력은 약 1 MP, 결과 링크는 10분 뒤 만료됩니다. 결과는 받는 즉시 내려받으십시오.
지시문은 두 부분으로 되어 있습니다. 바꿀 내용과 그대로 둘 것의 목록입니다.
OmniaKey의 GPT-Image 2도 같은 두 입력으로 편집 작업을 받습니다. 모델 페이지에는 텍스트에서 이미지로, 이미지 편집이 모두 올라 있고 품질은 low, medium, high 세 단계입니다(omniakey.com/gpt-image-2, 2026년 10월 28일 확인). FLUX 계열 모델은 돌려 보지 않았으므로, 아래 내용은 직접 돌린 4번의 편집과 그 코드입니다.
요청 방법
편집은 https://api.omniakey.com/v1/media/tasks로 보내는 POST 한 번입니다. 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을 가져옵니다.
세부 사항 두 가지 때문에 재시도가 한 번 늘었습니다. 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." 결과는 커피 자리에 레몬 한 조각을 얹은 아이스티이고, 저녁 장면은 그대로입니다.

네 장 모두 gpt-image-2가 만든 합성 장면입니다. Generated with GPT-Image 2 via the OmniaKey API on October 28, 2026, size 1536x1024, quality medium.
원본에서 한 번만 편집하기
편집을 꼭 연달아 할 필요는 없습니다. 이번에는 기본 사진에서 시작해 창턱 한 곳만 바꿉니다. "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."
창턱에는 오래된 양장본 세 권이 쌓였고, 화분은 사라졌고, 빨간 자전거는 빨간 채로 남았습니다. 문장 하나가 두 곳을 바꿨고, 둘 다 화면에 나타났습니다.

무엇이 남고 무엇이 바뀌었나
테이블, 컵, 화분, 창틀은 세 단계를 모두 통과했고, 검정 자전거와 바구니는 저녁 조명 속에서도 남았으며, 앞 단계의 변경은 다음 장면에도 그대로 있었습니다. 빛이 움직인 것은 2단계 한 번뿐이고, 지시문이 그것을 요청한 지점입니다.
레몬 조각은 지시문대로 잔 테두리에 얹혔고 아이스티는 받침 위에 남았습니다. 지시문마다 한 번씩만 돌렸으므로 한 장이 한 표본입니다.
통한 지시문의 공통점
지시문 네 개에서 쓸 만한 편집 네 개가 나왔습니다. 공통된 형식이 있습니다.
- 문장 하나에 변경 하나, 그 뒤에 그대로 둘 것의 목록. 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 편집 | |
|---|---|---|
| 요청당 입력 | 프롬프트 하나, 이미지 한 장 | 프롬프트 하나, 이미지 한 장 |
| 원본 상한 | 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이고 배치는 표준 요율의 절반입니다. 장당 요금 행은 없고, 이미지 생성 가이드에 한 장을 계산하는 도구가 있습니다.
자주 묻는 질문
FLUX Kontext API는 무엇을 하나요?
텍스트 지시로 사진을 편집합니다. 요청마다 프롬프트 하나와 입력 이미지 한 장을 받습니다(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 편집 엔드포인트에 사진 한 장과 지시문 하나를 보내면 새 사진이 돌아옵니다. 2026년 10월 28일에 이 방식으로 네 번 편집했습니다.
편집을 연달아 할 수 있나요?
됩니다. 단계마다 작업 하나를 쓰고, 각 결과를 다음 원본 사진으로 넣습니다. 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로 옷 갈아입히기
사진 한 장과 프롬프트 하나면 옷을 바꿀 수 있습니다. 요청 코드, 2026년 10월 28일에 실행한 세 번의 교체, 결과가 어디서 어긋나는지 정리했습니다.
객체 제거 API: GPT Image 2로 사진 속 원치 않는 객체 지우기
객체마다 문장 하나면 세 번의 제거가 모두 성공했습니다. 실행한 코드, 원본 크기 결과, 아직 맡기기 어려운 부분을 소개합니다.
