gpt-image-1 API 개요
OpenAI의gpt-image-1 이미지 생성 API는 텍스트-이미지 생성과 텍스트 안내를 통한 이미지-이미지 편집 기능을 모두 제공합니다.이 API를 사용하기 전에
pip install -U openai를 실행하여 최신 OpenAI 패키지가 설치되어 있는지 확인하십시오.
중요 참고 사항
- API 호출이 전송되면 생성 과정에서 중단이나 실패에 관계없이 요금이 부과됩니다
- 살아있는 예술가(예: “미야자키 하야오”, “신카이 마코토” 등)의 이름은
moderation_blocked오류를 유발하여 생성 실패를 초래합니다. 대신 “지브리” 또는 “밝은 현대 일본 애니메이션 스타일”과 같은 민감하지 않은 용어를 사용하여 이 문제를 해결할 수 있습니다. 노출이 심한 의상이나 선정적인 내용의 이미지에도 동일하게 적용됩니다. - 일반적으로 “아티스트”를 지명하는 것보다 “스타일”을 참조하는 것이 더 안전합니다. 예를 들어 “픽사”는 지원됩니다.
- 더 신뢰할 수 있는 접근 방식은 “반 고흐” 또는 “모나리자”와 같이 사망한 예술가 또는 해당 스타일을 사용하는 것입니다.
모델 및 가격
| 모델 | 품질 | 1024x1024 | 1024x1536 | 1536x1024 |
|---|---|---|---|---|
| gpt-image-1 | 낮음 | $0.011 | $0.016 | $0.016 |
| gpt-image-1 | 중간 | $0.042 | $0.063 | $0.063 |
| gpt-image-1 | 높음 | $0.167 | $0.25 | $0.25 |
참고: 입력 텍스트 토큰은 백만 토큰당 $5로 별도로 청구됩니다.
API 사용법
엔드포인트- 이미지 생성:
https://aihubmix.com/v1/images/generations - 이미지 편집:
https://aihubmix.com/v1/images/edits
from openai import OpenAI
import base64
import os
client = OpenAI(
api_key="AIHUBMIX_API_KEY", # AIHUBMIX 키 "sk-***"로 교체
base_url="https://aihubmix.com/v1"
)
prompt = """redesign poster of the movie [Black Swan], 3D cartoon, smooth render, bright tone, 2:3 portrait."""
result = client.images.generate(
model="gpt-image-1",
prompt=prompt,
n=1, # 생성할 이미지 수, 최대 10개
size="1024x1536", # 1024x1024 (정사각형), 1536x1024 (3:2 가로), 1024x1536 (2:3 세로), auto (기본값)
quality="high", # high, medium, low, auto (기본값)
moderation="low", # low, auto (기본값) - 업데이트된 openai 패키지 필요 📍
background="auto", # transparent, opaque, auto (기본값)
)
print(result.usage)
# 파일 이름 접두사 및 저장 디렉토리 정의
output_dir = "." # 다른 디렉토리를 지정할 수 있습니다
file_prefix = "image_gen"
# 출력 디렉토리가 있는지 확인
os.makedirs(output_dir, exist_ok=True)
# 반환된 모든 이미지 데이터 반복
for i, image_data in enumerate(result.data):
image_base64 = image_data.b64_json
if image_base64: # b64_json이 비어 있지 않은지 확인
image_bytes = base64.b64decode(image_base64)
# --- 파일 이름 충돌 로직 처리 ---
current_index = i
while True:
# 증분 카운터로 파일 이름 생성
file_name = f"{file_prefix}_{current_index}.png"
file_path = os.path.join(output_dir, file_name) # 전체 파일 경로 빌드
# 파일이 있는지 확인
if not os.path.exists(file_path):
break # 파일 이름 충돌 없음, 루프 종료
# 파일 이름 충돌, 카운터 증가
current_index += 1
# 고유한 file_path를 사용하여 파일에 이미지 저장
with open(file_path, "wb") as f:
f.write(image_bytes)
print(f"이미지가 다음 위치에 저장되었습니다: {file_path}")
else:
print(f"인덱스 {i}의 이미지 데이터가 비어 있어 저장을 건너뜁니다.")
from openai import OpenAI
import base64
import os
client = OpenAI(
api_key="AIHUBMIX_API_KEY", # AIHUBMIX 키 "sk-***"로 교체
base_url="https://aihubmix.com/v1"
)
prompt = """redesign poster of the movie [Black Swan], 3D cartoon, smooth render, bright tone, 2:3 portrait."""
result = client.images.edit(
model="gpt-image-1",
image=open("yourpath/edit.jpg", "rb"), # 여러 참조 이미지의 경우 [list,] 사용
n=2, # 생성할 이미지 수
prompt=prompt,
size="1024x1536", # 1024x1024 (정사각형), 1536x1024 (3:2 가로), 1024x1536 (2:3 세로), auto (기본값)
# moderation="low", # 편집은 조정 지원 안 함
quality="high" # high, medium, low, auto (기본값)
)
print(result.usage)
# 파일 이름 접두사 및 저장 디렉토리 정의
output_dir = "." # 다른 디렉토리를 지정할 수 있습니다
file_prefix = "image_edit" # 파일 이름 접두사 수정
# 출력 디렉토리가 있는지 확인
os.makedirs(output_dir, exist_ok=True)
# --- API에서 반환된 각 이미지 반복 ---
for i, image_item in enumerate(result.data):
image_base64 = image_item.b64_json
if image_base64 is None:
print(f"경고: 이미지 {i+1}에 base64 데이터가 없어 저장을 건너뜁니다.")
continue # b64_json 데이터가 없으면 다음 이미지로 건너뛰기
image_bytes = base64.b64decode(image_base64)
# --- 현재 이미지에 대해 충돌하지 않는 파일 이름 찾기 ---
current_index = 0 # 0부터 확인 시작 또는 전역적으로 증가하는 인덱스 유지
while True:
# 증분 카운터로 파일 이름 생성
file_name = f"{file_prefix}_{current_index}.png"
file_path = os.path.join(output_dir, file_name) # 전체 파일 경로 빌드
# 파일이 있는지 확인
if not os.path.exists(file_path):
break # 파일 이름 충돌 없음, 내부 루프 종료
# 파일 이름 충돌, 카운터 증가
current_index += 1
# 고유한 file_path를 사용하여 현재 이미지를 파일에 저장
try:
with open(file_path, "wb") as f:
f.write(image_bytes)
print(f"편집된 이미지 {i+1}이 다음 위치에 저장되었습니다: {file_path}")
except Exception as e:
print(f"이미지 {i+1} 저장 오류 ({file_path}): {e}")
출력 예시
Usage(input_tokens=150, input_tokens_details=UsageInputTokensDetails(image_tokens=0, text_tokens=150), output_tokens=6240, total_tokens=6390)
이미지가 다음 위치에 저장되었습니다: ./image_gen_14.png
Usage(input_tokens=992, input_tokens_details=UsageInputTokensDetails(image_tokens=646, text_tokens=346), output_tokens=12480, total_tokens=13472)
편집된 이미지 1이 다음 위치에 저장되었습니다: ./image_edit_1.png
편집된 이미지 2가 다음 위치에 저장되었습니다: ./image_edit_2.png
거부 시나리오
요청이 거부될 때의 오류 메시지:오류 코드: 400 - {'error': {'message': '안전 시스템의 결과로 요청이 거부되었습니다. 요청에 안전 시스템에서 허용하지 않는 콘텐츠가 포함될 수 있습니다.', 'type': 'user_error', 'param': None, 'code': 'moderation_blocked'}}
moderation_blocked 오류가 발생하지 않습니다.
따라서 시스템 거부 위험을 최소화하고 원활한 생성을 보장하기 위해 잠재적인 지적 재산권(IP) 또는 저작권 문제를 사전에 피하는 것이 좋습니다.
✍️ 주요 권장 사항:
- 저작권이 있는 캐릭터, 로고, 유명인 초상화 등을 직접 사용하지 마십시오.
- 대신 “스타일 영감”, “창의적인 재해석” 또는 “일반화된 설명”을 사용하는 것을 고려하십시오.
- 특정 요소를 참조하는 경우 공개 도메인에 속하는지 확인하십시오.
실용적인 팁
- 모든 언어를 지원합니다. 중국어 텍스트는 안정적으로 작동하지만 어떤 언어로든 많은 양의 텍스트를 생성하는 것은 권장하지 않습니다.
- size 매개변수는 명시적으로 size=“auto”를 전달하는 것을 지원하지 않습니다. auto가 기본값입니다.
- 가로 세로 비율은 프롬프트에서 지정하거나(2:3, 3:2, 1:1 지원) size 매개변수를 통해 설정할 수 있습니다.
moderation매개변수는 민감도를 제어하지만 “low”로 설정하더라도 요청이 여전히 거부될 수 있습니다(예: 비너스가 너무 노출이 심한 경우).- edits 엔드포인트는
moderation매개변수를 지원하지 않습니다. - 텍스트 설명과 참조 이미지를 결합하면 더 정확한 결과를 얻을 수 있습니다.
- 업로드된 이미지를 사전 처리로 압축하면 속도를 향상시킬 수 있습니다.
- 투명한 배경이 지원됩니다(수동으로 잘라낼 필요 없음). 프롬프트에 이 요구 사항을 추가하기만 하면 됩니다.