GPT Image 2에 보낸 요청이 Unknown parameter: 'style'로 거절됐다면 요청 본문에서 style 키를 삭제하세요. vivid를 natural로 바꾸거나 값을 비우는 방식으로 해결할 문제가 아닙니다. OpenAI Images API에서 style은 DALL·E 3용 필드입니다. 원하는 그림의 분위기와 표현 방식은 prompt 문장에 넣으면 됩니다. 공식 이미지 생성 API 명세
우선 model과 prompt만 남긴 요청으로 좁혀 보세요. 설정 화면에서는 지웠는데 같은 오류가 난다면, 전송 직전 기본값이 다시 붙는지 확인해야 합니다. 생성에 성공한 뒤에는 data[0].b64_json을 파일로 저장하는 단계가 이어집니다. GPT Image의 공식 응답에서 이미지 URL을 기다리면 이 단계에서 다시 막힐 수 있습니다.
이 글은 OpenAI의 POST https://api.openai.com/v1/images/generations 직접 호출을 기준으로 합니다. 자동화 서비스나 중계 API를 쓰는 경우에는 실제 요청을 보내는 주소와 그 서비스의 응답 규격도 함께 확인하세요.
먼저 요청을 이렇게 줄이세요
예전 이미지 생성 예제에서 모델 이름만 바꿨다면 다음처럼 style이 남아 있을 수 있습니다.
json{ "model": "gpt-image-2", "prompt": "창가에 놓인 흰색 머그잔의 제품 사진", "style": "natural" }
수정할 것은 style의 값이 아니라 키의 존재 여부입니다. 요청을 아래처럼 바꿉니다.
json{ "model": "gpt-image-2", "prompt": "창가에 놓인 흰색 머그잔의 제품 사진. 부드러운 자연광과 절제된 색감으로 일상에서 촬영한 듯 자연스럽게 표현해 주세요." }
화풍을 구체적인 문장으로 옮기면 의도도 더 분명해집니다. 수채화라면 번지는 안료와 종이 질감, 제품 사진이라면 조명과 배경, 일러스트라면 선의 굵기와 색감을 설명할 수 있습니다. 다만 기존 style: "natural"과 결과가 정확히 같아진다는 뜻은 아닙니다. 새 모델에 원하는 모습을 직접 지시하는 방법입니다.
"style": null이나 "style": ""은 JSON에 키가 남아 있는 상태입니다. 서버나 도구에 따라 빈 값 처리 방식은 다를 수 있으므로, 이 오류를 고칠 때는 최종 요청에서 해당 키가 아예 빠졌는지 확인하는 편이 확실합니다.
설정을 비웠는데 style이 계속 전송된다면

입력 폼에 표시되는 값과 서버에 전달되는 JSON은 같지 않을 수 있습니다. 공통 설정, 저장된 자동화 모듈, SDK를 감싼 함수가 요청을 완성하는 과정에서 값을 추가할 수 있기 때문입니다. SDK의 공통 옵션 목록에 style이 보인다는 사실만으로 GPT Image 2가 이를 지원한다고 판단해서는 안 됩니다.
예를 들어 JavaScript에서 다음과 같이 기본 옵션을 합치면 화면에서 style을 입력하지 않아도 요청에 들어갑니다.
javascriptconst defaults = { style: "natural" }; const request = { ...defaults, model: "gpt-image-2", prompt: "부드러운 자연광으로 촬영한 흰색 머그잔", };
원인을 찾는 동안에는 허용할 항목을 명시해 새 요청 객체를 구성하는 편이 이해하기 쉽습니다.
javascriptconst request = { model: "gpt-image-2", prompt: "부드러운 자연광으로 촬영한 흰색 머그잔", }; console.log(Object.keys(request)); // ["model", "prompt"]
이 출력은 현재 객체에 어떤 키가 있는지 보여 줍니다. 이후 SDK나 자동화 모듈이 요청을 다시 조립한다면, 실행 내역 또는 전송 직전 기록에서도 확인해야 합니다. 문제를 공유할 때는 API 키와 비공개 프롬프트를 가리고 주소, 모델 ID, 필드 이름, 오류 원문만 남기세요.
자동화 도구에서는 다음 순서가 유용합니다.
- 실패한 실행의 입력과 오류 상세를 열어
style이 실제 요청에 포함됐는지 찾습니다. - 모듈의 고급 설정뿐 아니라 연결된 변수, 공통 기본값, 복제해 온 이전 설정을 확인합니다.
- 같은 제공자·모델·주소로 최소 요청을 보내는 HTTP 모듈과 비교할 수 있다면, 두 요청의 필드 차이를 확인합니다.
- 최소 요청은 통과하고 기존 모듈만 실패하면, 모듈이 추가하는 값과 직렬화 방식을 좁혀 봅니다.
Make 커뮤니티의 한 신고에서도 사용자가 스타일을 매핑하지 않았는데 같은 오류를 받았다고 설명했습니다. 이 사례는 화면의 빈칸만으로 판단하기 어렵다는 참고 자료입니다. 모든 현재 모듈의 결함을 뜻하지는 않으며, 그 대화의 후속 성공 사례는 GPT Image 1에 관한 것입니다. GPT Image 2에서 특정 버전으로 해결됐다는 근거로 삼을 수는 없습니다.
이전 예제의 옵션도 한 번에 정리하세요
style을 없앤 뒤 다른 옵션에서 다시 막힌다면 DALL·E용 설정이 더 남아 있는지 살펴보세요. 다만 원인을 확인하는 첫 요청에서는 아래 옵션을 모두 추가하기보다 model과 prompt로 시작하는 것이 좋습니다.
| 남아 있을 수 있는 설정 | GPT Image 요청에서 할 일 |
|---|---|
style: "vivid" 또는 "natural" | 키를 제거하고 시각적 의도를 prompt에 씁니다. |
quality: "hd" 또는 "standard" | 우선 생략합니다. 필요할 때 low, medium, high, auto 중에서 선택합니다. |
response_format: "url" | 제거합니다. GPT Image에서는 이 필드를 지원하지 않습니다. |
response_format: "b64_json" | 이 값도 보내지 않습니다. GPT Image는 원래 Base64 이미지 데이터를 반환합니다. |
| PNG·JPEG·WebP 선택 | output_format에 png, jpeg, webp 중 하나를 지정합니다. |
response_format과 output_format은 서로 다른 용도입니다. 전자는 과거 모델에서 URL과 Base64 반환을 선택할 때 쓰던 필드이고, 후자는 이미지 파일의 인코딩 형식을 정합니다. output_format: "webp"로 설정한다고 다운로드 URL이 생기지는 않습니다. 필드별 지원 범위
Python으로 요청하고 PNG 파일까지 저장하기
아래는 Python 3 표준 라이브러리만 사용하는 예제입니다. 환경변수 OPENAI_API_KEY가 설정돼 있어야 하며, 실행하면 실제 이미지 생성 요청을 보냅니다. 공식 예제의 요청·응답 구조를 바탕으로 작성했으며, 이 글에서 유료 API 호출 결과를 제시하는 코드는 아닙니다.
앞의 최소 요청에 output_format: "png"를 추가해 저장할 파일 형식을 명확히 했습니다. style과 response_format은 넣지 않습니다.
pythonimport base64 import json import os from pathlib import Path from urllib.error import HTTPError from urllib.request import Request, urlopen payload = { "model": "gpt-image-2", "prompt": ( "창가에 놓인 흰색 머그잔의 제품 사진. " "부드러운 자연광과 절제된 색감으로 표현해 주세요." ), "output_format": "png", } request = Request( "https://api.openai.com/v1/images/generations", data=json.dumps(payload).encode("utf-8"), headers={ "Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}", "Content-Type": "application/json", }, method="POST", ) try: with urlopen(request, timeout=180) as response: result = json.load(response) except HTTPError as error: detail = error.read().decode("utf-8", errors="replace") raise RuntimeError(f"HTTP {error.code}: {detail}") from error items = result.get("data") or [] image_base64 = items[0].get("b64_json") if items else None if not image_base64: raise RuntimeError("응답에 data[0].b64_json이 없습니다.") image_bytes = base64.b64decode(image_base64, validate=True) if not image_bytes.startswith(b"\x89PNG\r\n\x1a\n"): raise RuntimeError("PNG 형식이 아닙니다. 응답 형식을 확인하세요.") output = Path("mug.png") output.write_bytes(image_bytes) print(f"저장 완료: {output.resolve()}")
실행 후 mug.png를 이미지 뷰어로 열어 보세요. 코드의 PNG 시작 바이트 확인은 형식을 구분하는 간단한 검사이며, 파일 전체가 정상적으로 열리는지까지 보장하지는 않습니다. HTTP 성공, JSON 응답 수신, 이미지 바이트 저장, 실제 이미지 표시를 차례로 확인해야 작업이 끝납니다. 공식 이미지 생성 가이드
WebP가 필요하다면 요청의 output_format을 webp로 바꾸는 것과 함께 파일명을 mug.webp로 바꾸고 PNG 전용 검사도 해당 형식에 맞춰 수정해야 합니다. 확장자만 바꿔서는 이미지 형식이 변환되지 않습니다.
생성은 됐는데 이미지 링크가 없을 때

오류가 사라졌는데 다음 단계에서 “URL이 비어 있다”는 문제가 생기면 응답에서 data[0].url을 읽고 있는지 확인하세요. OpenAI GPT Image의 직접 응답은 Base64를 사용하므로, URL 입력을 요구하는 다음 단계와 바로 연결되지 않을 수 있습니다.
자동화 흐름에서는 b64_json을 바이너리 데이터로 디코딩한 다음, 파일을 받는 모듈에 전달하면 됩니다. 다음 서비스가 URL만 받는다면 디코딩한 파일을 접근 가능한 저장소에 업로드하고, 그 저장소가 반환한 URL을 전달해야 합니다. 필요한 것은 새로운 이미지 생성 요청이 아니라 결과를 전달하는 방식의 수정일 수 있습니다.
반면 제품이 자체적으로 링크를 만들어 주는 경우도 있습니다. 예를 들어 GPT Workspace의 한국어 GPT_IMAGE 문서는 수식이 이미지 링크를 반환하며 일부 이전 모델 이름을 매핑한다고 설명합니다. 이는 해당 서비스의 기능입니다. 그 수식에서 링크를 받았다는 경험을 OpenAI 직접 호출의 응답 구조에 그대로 적용하지 마세요.
오류가 남을 때 확인할 기준
최종 요청에서 style이 빠졌는데 오류 메시지가 여전히 그 필드를 가리킨다면, 방금 수정한 실행이 맞는지부터 확인하세요. 저장만 하고 이전 실행을 재시도했거나, 다른 분기에서 별도의 이미지 모듈을 호출했을 수 있습니다. 요청 주소와 모델 ID도 같은 기록에서 함께 확인해야 합니다.
동일한 잘못된 요청을 반복 전송해도 필드 문제는 해결되지 않습니다. SDK나 모듈 업데이트는 실제 전송 내용을 바꿀 때 도움이 될 수 있지만, 업데이트 자체가 해결의 증거는 아닙니다. 수정 뒤에는 전송된 요청에 style이 없는지, 반환된 이미지 파일이 열리는지를 기준으로 판단하세요.
기본 호출부터 다시 구성해야 한다면 GPT Image 2 API 사용법을 이어서 참고할 수 있습니다.



