이 문서는 칼로(Karlo) REST API 사용 방법을 안내합니다.
2024년 2월 22일부터 칼로(Karlo) API에 사용되는 칼로 모델이 이미지 생성 품질이 강화된 버전 2.1로 상향되었습니다. 이전 버전 정보는 별도 문서에서 확인할 수 있습니다.
칼로(Karlo)의 각 API는 적용 가능한 모델 버전이 상이하며, version
으로 적용할 모델 버전을 선택할 수 있습니다. 이미지 생성 품질이 강화된 버전 2.1 사용을 권장합니다. 버전 2.1은 가로세로 최대 1280 픽셀(Pixel), 버전 2.0은 최대 640 픽셀 크기의 이미지를 생성할 수 있습니다.
아래 API별 적용 가능 모델 버전 목록을 참고합니다.
칼로(Karlo) API 요청 시 사용할 이미지는 다음 규격을 준수해야 합니다.
JPG
, PNG
, webp
권장칼로 API는 요청과 응답의 이미지 파일을 Base64 인코딩한 문자열 값으로 처리합니다.
image
파라미터에 이미지 파일 Base64 인코딩한 값 전달image
값을 Base64 디코딩 후 .PNG
파일로 저장해 사용아래는 이미지 Base64 인코딩 및 디코딩의 Python 예제입니다.
import io
import base64
from PIL import Image
# Base64 인코딩 함수
def imageToString(img):
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='PNG')
my_encoded_img = base64.encodebytes(img_byte_arr.getvalue()).decode('ascii')
return my_encoded_img
# Base64 디코딩 및 이미지 변환 함수
def stringToImage(base64_string, mode='RGBA'):
imgdata = base64.b64decode(str(base64_string))
img = Image.open(io.BytesIO(imgdata)).convert(mode)
return img
# 이미지 파일 불러오기
img = Image.open('my_image.png')
# 이미지를 Base64 인코딩하기
img_base64 = imageToString(img)
# Base64 인코딩된 값을 디코딩해 이미지로 변환하기
image = stringToImage(img_base64, mode='RGB')
메서드 | URL | 인증 방식 |
---|---|---|
POST |
https://api.kakaobrain.com/v2/inference/karlo/t2i |
REST API 키 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | - | - | - |
주어진 제시어에 따라 이미지를 생성합니다. 파라미터를 사용해 가로세로 최대 2048 픽셀 크기까지 확대할 수 있습니다.
REST API 키를 헤더에 담아 POST
로 요청합니다. 생성할 이미지를 묘사하는 제시어를 prompt
로 전달해야 합니다. 활용 가이드를 참고해 선택 파라미터를 사용하면 보다 정확하고 효율적인 이미지 생성 요청이 가능합니다.
칼로가 요청을 성공적으로 처리하면 생성된 이미지를 응답 본문의 JSON
객체에 담아 반환합니다. images
필드는 각각의 생성된 이미지 정보를 JSON
배열로 포함합니다.
요청 실패 시 응답 코드로 원인을 확인합니다.
이름 | 설명 | 필수 |
---|---|---|
Authorization | Authorization: KakaoAK ${REST_API_KEY} 인증 방식, REST API 키로 인증 요청 |
O |
Content-Type | Content-Type: application/json 요청 데이터 타입 |
O |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
version | String |
요청에 적용할 칼로 모델 버전, 다음 중 하나v2.1 : 버전 2.1v2.0 : 버전 2.0 |
O |
prompt | String |
이미지를 묘사하는 제시어, 영문만 지원 (최대: 2048자) |
O |
negative_prompt | String |
이미지 생성 시 제외할 요소를 묘사하는 부정 제시어, 영문만 지원 (최대: 2048자) |
X |
width | Integer |
이미지 가로 크기(단위: 픽셀) 적용 모델 버전( version )에 따라 값 상이, 아래 참고v2.1 : 8의 배수(권장: 1024, 최소: 768, 최대: 1280)v2.0 : 8의 배수(권장: 512, 최소: 384, 최대: 640) |
O |
height | Integer |
이미지 세로 (단위: 픽셀) 적용 모델 버전( version )에 따라 값 상이, 아래 참고v2.1 : 8의 배수(권장: 1024, 최소: 768, 최대: 1280)v2.0 : 8의 배수(권장: 512, 최소: 384, 최대: 640) |
O |
upscale | Boolean |
이미지 크기 확대 여부true : 확대false : 확대하지 않음 |
X |
scale | Integer |
확대 배율, 2 또는 4 중 하나 (기본값: 2) 비고: scale 값을 4로 지정하더라도 가로세로 최대 2048 픽셀 크기까지만 확대 가능 |
X |
image_format | String |
이미지 파일 형식, 다음 중 하나webp jpeg png (기본값: webp ) |
X |
image_quality | Integer |
이미지 저장 품질 (기본값: 70, 최소: 1, 최대: 100) |
X |
samples | Integer |
생성할 이미지 수 (기본값: 1, 최소: 1, 최대 8) |
X |
return_type | String |
응답의 이미지 파일 반환 형식, 다음 중 하나base64_string : 이미지 파일을 Base64 인코딩한 값url : 이미지 파일 URL(기본값: url ) |
X |
prior_num_inference_steps | Integer |
이미지 생성 과정의 노이즈 제거 단계 수 (기본값: 25, 최소: 10, 최대 100) |
X |
prior_guidance_scale | Double |
이미지 생성 과정의 노이즈 제거 척도 (기본값: 5.0, 최소: 1.0, 최대: 20.0) |
X |
num_inference_steps | Integer |
디코더를 통한 노이즈 제거 단계 수 (기본값: 50, 최소: 10, 최대: 100) |
X |
guidance_scale | Double |
디코더를 통한 노이즈 제거 척도 (기본값: 5.0, 최소: 1.0, 최대: 20.0) |
X |
scheduler | String |
디코더를 통한 노이즈 제거 단계에서 사용할 스케줄러(Scheduler) 적용 모델 버전( version )에 따라 값 상이, 아래 참고v2.1 : decoder_ddpm_v_prediction (기본값)v2.0 : decoder_ddim_v_prediction (기본값) 또는 decoder_ddpm_v_prediction 중 하나 |
X |
seed | Integer[] |
각 이미지 생성 작업에 사용할 시드(Seed) 값 생성할 이미지 수와 같은 길이의 배열이어야 함 0 이상 4,294,967,295 이하 숫자로 구성 파라미터 미사용 시 무작위(Random) 시드 값으로 이미지 생성 (기본값: null )비고: seed 를 포함한 모든 파라미터가 동일할 경우, 항상 같은 이미지 생성 |
X |
nsfw_checker | Boolean |
생성할 이미지에 대한 NSFW 검사 수행 여부true : 수행false : 수행하지 않음(기본값: false ) |
X |
face_refiner | FaceRefiner |
얼굴 형태 조정 기능 설정 파라미터 비고: 적용 모델 버전( version ) v2.0 에서만 사용 권장 |
X |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
bbox_size_threshold | Double |
얼굴 형태 조정 기능을 적용할 전체 이미지 대비 얼굴 영역의 비율, 실제 얼굴 영역이 설정 크기 이하인 경우만 기능 적용 (기본값: 1, 최소: 0(0%), 최대: 1(100%)) |
X |
bbox_filter_threshold | Double |
이미지가 사람의 얼굴인지 여부를 판단하는 임계값, 0 인 경우 기능 적용 안함(기본값: 1, 최소: 0, 최대: 1) |
X |
restoration_repeats | Double |
얼굴 형태 조정 기능 적용 횟수 (기본값: 2, 최소: 1, 최대: 10) |
X |
weight_sft | Double |
원본 이미지 반영 가중치, 높을수록 원본 이미지 유지 수준 높음 (기본값: 0.5, 최소: 0, 최대 1) |
X |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
id | String |
요청 처리 작업 ID | O |
model_version | String |
요청 처리 시 사용된 칼로 버전 | O |
images | Image[] |
생성된 이미지 정보를 담은 배열 | O |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
id | String |
이미지 ID | O |
seed | Integer |
이미지 생성 시 사용된 시드 값 재요청을 통해 같은 콘텐츠의 이미지를 다시 생성하는 데 사용 |
O |
image | String |
이미지 파일return_type 파라미터 값에 따라 이미지 파일을 Base64 인코딩한 값, 또는 이미지 파일 URL 제공이미지 파일 URL은 응답 시각으로부터 10분간 유효 |
O |
nsfw_content_detected | Boolean |
이미지의 NSFW 콘텐츠 포함 여부true : 포함false : 포함하지 않음비고: 미사용 시 null 반환 |
X |
nsfw_score | Double |
이미지의 NSFW 콘텐츠 포함 확률 비고: 미사용 시 null 반환 |
X |
# REST API 호출, 이미지 파일 처리에 필요한 라이브러리
import requests
import json
import urllib
from PIL import Image
# [내 애플리케이션] > [앱 키] 에서 확인한 REST API 키 값 입력
REST_API_KEY = '${REST_API_KEY}'
# 이미지 생성하기 요청
def t2i(prompt, negative_prompt):
r = requests.post(
'https://api.kakaobrain.com/v2/inference/karlo/t2i',
json = {
"version": "v2.1",
"prompt": prompt,
"negative_prompt": negative_prompt,
"height": 1024,
"width": 1024
},
headers = {
'Authorization': f'KakaoAK {REST_API_KEY}',
'Content-Type': 'application/json'
}
)
# 응답 JSON 형식으로 변환
response = json.loads(r.content)
return response
# 프롬프트에 사용할 제시어
prompt = "A photo of a cute tiny monster on the beach, daylight."
negative_prompt = ""
# 이미지 생성하기 REST API 호출
response = t2i(prompt, negative_prompt)
# 응답의 첫 번째 이미지 생성 결과 출력하기
result = Image.open(urllib.request.urlopen(response.get("images")[0].get("image")))
result.show()
curl -v -X POST "https://api.kakaobrain.com/v2/inference/karlo/t2i" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"version": "v2.1",
"prompt": "A photo of a cute tiny monster on the beach, daylight.",
"height": 1024,
"width": 1024
}'
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "3d6fb820-9845-4b3e-8d6d-7cfd01db5649",
"model_version": "${MODEL_VERSION}",
"images": [
{
"id": "a80108f8-b9c6-4bf4-aa38-957a38ced4a8",
"seed": 3878985944,
"image": "https://mk.kakaocdn.net/dna/karlo/image/..."
}
]
}
메서드 | URL | 인증 방식 |
---|---|---|
POST |
https://api.kakaobrain.com/v2/inference/karlo/variations |
REST API 키 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | - | - | - |
주어진 이미지의 내용을 이해하여 새로운 이미지를 생성합니다.
REST API 키를 헤더에 담아 POST
로 요청합니다. 활용 가이드를 참고해 선택 파라미터를 사용하면 보다 정확하고 효율적인 이미지 생성 요청이 가능합니다.
칼로가 요청을 성공적으로 처리하면 생성된 이미지를 응답 본문의 JSON
객체에 담아 반환합니다. images
필드는 각각의 생성된 이미지 정보를 JSON
객체로 포함합니다.
요청 실패 시 응답 코드로 원인을 확인합니다.
이름 | 설명 | 필수 |
---|---|---|
Authorization | Authorization: KakaoAK ${REST_API_KEY} 인증 방식, REST API 키로 인증 요청 |
O |
Content-Type | Content-Type: application/json 요청 데이터 타입 |
O |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
version | String |
요청에 적용할 칼로 모델 버전, 다음 중 하나v2.1 : 버전 2.1v2.0 : 버전 2.0 |
O |
image | String |
원본 이미지 파일을 Base64 인코딩한 값 | O |
width | Integer |
이미지 가로 크기(단위: 픽셀) 적용 모델 버전( version )에 따라 값 상이, 아래 참고v2.1 : 8의 배수(권장: 1024, 최소: 768, 최대: 1280)v2.0 : 8의 배수(권장: 512, 최소: 384, 최대: 640) |
O |
height | Integer |
이미지 세로 (단위: 픽셀) 적용 모델 버전( version )에 따라 값 상이, 아래 참고v2.1 : 8의 배수(권장: 1024, 최소: 768, 최대: 1280)v2.0 : 8의 배수(권장: 512, 최소: 384, 최대: 640) |
O |
upscale | Boolean |
이미지 크기 확대 여부true : 확대false : 확대하지 않음 |
X |
scale | Integer |
확대 배율, 2 또는 4 중 하나 (기본값: 2) 비고: scale 값을 4로 지정하더라도 가로세로 최대 2048 픽셀 크기까지만 확대 가능 |
X |
image_format | String |
이미지 파일 형식, 다음 중 하나webp jpeg png (기본값: webp ) |
X |
image_quality | Integer |
이미지 저장 품질 (기본값: 70, 최소: 1, 최대: 100) |
X |
samples | Integer |
생성할 이미지 수 (기본값: 1, 최소: 1, 최대 8) |
X |
return_type | String |
응답의 이미지 파일 반환 형식, 다음 중 하나base64_string : 이미지 파일을 Base64 인코딩한 값url : 이미지 파일 URL(기본값: url ) |
X |
num_inference_steps | Integer |
디코더를 통한 노이즈 제거 단계 수 (기본값: 50, 최소: 10, 최대: 100) |
X |
guidance_scale | Double |
디코더를 통한 노이즈 제거 척도 (기본값: 5.0, 최소: 1.0, 최대: 20.0) |
X |
scheduler | String |
디코더를 통한 노이즈 제거 단계에서 사용할 스케줄러(Scheduler) 적용 모델 버전( version )에 따라 값 상이, 아래 참고v2.1 : decoder_ddpm_v_prediction (기본값)v2.0 : decoder_ddim_v_prediction (기본값) 또는 decoder_ddpm_v_prediction 중 하나 |
X |
seed | Integer[] |
각 이미지 생성 작업에 사용할 시드(Seed) 값 생성할 이미지 수와 같은 길이의 배열이어야 함 0 이상 4,294,967,295 이하 숫자로 구성 파라미터 미사용 시 무작위(Random) 시드 값으로 이미지 생성 (기본값: null )비고: seed 를 포함한 모든 파라미터가 동일할 경우, 항상 같은 이미지 생성 |
X |
nsfw_checker | Boolean |
생성할 이미지에 대한 NSFW 검사 수행 여부true : 수행false : 수행하지 않음(기본값: false ) |
X |
face_refiner | FaceRefiner |
얼굴 형태 조정 기능 설정 파라미터 비고: 적용 모델 버전( version ) v2.0 에서만 사용 권장 |
X |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
id | String |
요청 처리 작업 ID | O |
model_version | String |
요청 처리 시 사용된 칼로 버전 | O |
images | Image[] |
생성된 이미지 정보를 담은 배열 | O |
# REST API 호출, 이미지 파일 처리에 필요한 라이브러리
import requests
import json
import io
import base64
import urllib
from PIL import Image
# [내 애플리케이션] > [앱 키] 에서 확인한 REST API 키 값 입력
REST_API_KEY = '${REST_API_KEY}'
# 이미지 변환하기
def variations(image):
r = requests.post(
'https://api.kakaobrain.com/v2/inference/karlo/variations',
json = {
'version': 'v2.1',
'image': image,
'height': 1024,
'width': 1024
},
headers = {
'Authorization': f'KakaoAK {REST_API_KEY}',
'Content-Type': 'application/json'
}
)
# 응답 JSON 형식으로 변환
response = json.loads(r.content)
return response
# Base64 인코딩
def imageToString(img):
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='PNG')
my_encoded_img = base64.encodebytes(img_byte_arr.getvalue()).decode('ascii')
return my_encoded_img
# 이미지 파일 불러오기
img = Image.open('original.png')
# 이미지를 Base64 인코딩하기
img_base64 = imageToString(img)
# 이미지 변환하기 REST API 호출
response = variations(img_base64)
print(response)
# 응답의 첫 번째 이미지 생성 결과 출력하기
result = Image.open(urllib.request.urlopen(response.get("images")[0].get("image")))
result.show()
curl -v -X POST "https://api.kakaobrain.com/v2/inference/karlo/variations" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"version": "v2.1",
"image": "iVBORw0KGgoAAAANSUhEUgA...",
"height": 1024,
"width": 1024
}'
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "6c0db22f-ecba-4d84-a817-b06e06a207da",
"model_version": "${MODEL_VERSION}",
"images": [
{
"id": "812702f0-3627-4a32-91cc-eaec50910156",
"image": "https://mk.kakaocdn.net/dna/karlo/image/...",
"seed": 2639508875
}
]
}
메서드 | URL | 인증 방식 |
---|---|---|
POST |
https://api.kakaobrain.com/v2/inference/karlo/inpainting |
REST API 키 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | - | - | - |
이미지의 선택 영역을 재구성하거나, 이미지 경계 밖으로 연속된 이미지를 생성합니다.
REST API 키를 헤더에 담아 POST
로 요청합니다. 편집할 이미지 파일, 편집할 영역이 표시된 이미지 파일, 편집할 이미지를 묘사하는 제시어를 파라미터로 전달해야 합니다. 활용 가이드를 참고해 선택 파라미터를 사용하면 보다 정확하고 효율적인 이미지 편집 요청이 가능합니다.
칼로가 요청을 성공적으로 처리하면 생성된 이미지를 응답 본문의 JSON
객체에 담아 반환합니다. images
필드는 각각의 편집된 이미지 정보를 JSON
배열로 포함합니다.
요청 실패 시 응답 코드로 원인을 확인합니다.
이름 | 설명 | 필수 |
---|---|---|
Authorization | Authorization: KakaoAK ${REST_API_KEY} 인증 방식, REST API 키로 인증 요청 |
O |
Content-Type | Content-Type: application/json 요청 데이터 타입 |
O |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
version | String |
요청에 적용할 칼로 모델 버전, 버전 2.0만 사용 가능(기본값: v2.0 ) |
X |
prompt | String |
이미지를 묘사하는 제시어, 영문만 지원 (최대: 2048자) |
O |
negative_prompt | String |
이미지 생성 시 제외할 요소를 묘사하는 부정 제시어, 영문만 지원 (최대: 2048자) |
X |
image | String |
편집할 이미지 파일을 Base64 인코딩한 값, 이미지 인코딩 및 디코딩 참고 이미지 크기는 가로세로 최대 1024 픽셀 이하여야 함 webp , png , jpeg , heic 형식의 이미지 파일 지원 |
O |
mask | String |
편집할 영역을 검정(RGB 또는 Grayscale 값 0 )으로 표시한 이미지를 Base64 인코딩한 값, 이미지 인코딩 및 디코딩 참고 |
O |
reference_image | String |
편집 영역 보정 시 참고할 이미지를 Base64 인코딩한 값, 이미지 크기는 가로세로 최대 1024 픽셀 이하여야 함webp , png , jpeg , heic 형식의 이미지 파일 지원 |
X |
upscale | Boolean |
이미지 크기 확대 여부true : 확대false : 확대하지 않음 |
X |
scale | Integer |
확대 배율, 2 또는 4 중 하나 (기본값: 2) 비고: scale 값을 4로 지정하더라도 가로세로 최대 2048 픽셀 크기까지만 확대 가능 |
X |
image_format | String |
이미지 파일 형식, 다음 중 하나webp jpeg png (기본값: webp ) |
X |
image_quality | Integer |
이미지 저장 품질 (기본값: 70, 최소: 1, 최대: 100) |
X |
samples | Integer |
생성할 이미지 수 (기본값: 1, 최소: 1, 최대 8) |
X |
return_type | String |
응답의 이미지 파일 반환 형식, 다음 중 하나base64_string : 이미지 파일을 Base64 인코딩한 값url : 이미지 파일 URL(기본값: url ) |
X |
prior_num_inference_steps | Integer |
이미지 생성 과정의 노이즈 제거 단계 수 (기본값: 25, 최소: 10, 최대 100) |
X |
prior_guidance_scale | Double |
이미지 생성 과정의 노이즈 제거 척도 (기본값: 5.0, 최소: 1.0, 최대: 20.0) |
X |
num_inference_steps | Integer |
디코더를 통한 노이즈 제거 단계 수 (기본값: 50, 최소: 10, 최대: 100) |
X |
guidance_scale | Double |
디코더를 통한 노이즈 제거 척도 (기본값: 5.0, 최소: 1.0, 최대: 20.0) |
X |
seed | Integer[] |
각 이미지 생성 작업에 사용할 시드(Seed) 값 생성할 이미지 수와 같은 길이의 배열이어야 함 0 이상 4,294,967,295 이하 숫자로 구성 파라미터 미사용 시 무작위(Random) 시드 값으로 이미지 생성 (기본값: null )비고: seed 를 포함한 모든 파라미터가 동일할 경우, 항상 같은 이미지 생성 |
X |
nsfw_checker | Boolean |
생성할 이미지에 대한 NSFW 검사 수행 여부true : 수행false : 수행하지 않음(기본값: false ) |
X |
face_refiner | FaceRefiner |
얼굴 형태 조정 기능 설정 파라미터 | X |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
id | String |
요청 처리 작업 ID | O |
model_version | String |
요청 처리 시 사용된 칼로 버전 | O |
images | Image[] |
생성된 이미지 정보를 담은 배열 | O |
# REST API 호출, 이미지 파일 처리에 필요한 라이브러리
import requests
import json
import io
import base64
import urllib
from PIL import Image
# [내 애플리케이션] > [앱 키] 에서 확인한 REST API 키 값 입력
REST_API_KEY = '${REST_API_KEY}'
# 이미지 변환하기
def inpainting(image, mask):
r = requests.post(
'https://api.kakaobrain.com/v2/inference/karlo/inpainting',
json = {
'image': image,
'mask': mask
},
headers = {
'Authorization': f'KakaoAK {REST_API_KEY}',
'Content-Type': 'application/json'
}
)
# 응답 JSON 형식으로 변환
response = json.loads(r.content)
return response
# Base64 인코딩
def imageToString(img):
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='PNG')
my_encoded_img = base64.encodebytes(img_byte_arr.getvalue()).decode('ascii')
return my_encoded_img
# 이미지 파일 불러오기
img = Image.open('image.png')
mask = Image.open('mask.png')
# 이미지를 Base64 인코딩하기
img_base64 = imageToString(img)
mask_base64 = imageToString(mask)
# 이미지 변환하기 REST API 호출
response = inpainting(img_base64,mask_base64)
print(response)
# 응답의 첫 번째 이미지 생성 결과 출력하기
result = Image.open(urllib.request.urlopen(response.get("images")[0].get("image")))
result.show()
curl -v -X POST "https://api.kakaobrain.com/v2/inference/karlo/variations" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"prompt": "tiger",
"image": "https://mk.kakaocdn.net/dn/karlo-dev/...",
"mask": "https://mk.kakaocdn.net/dn/karlo-dev/...",
"negative_prompt": "dog, human",
"samples": 1,
"prior_num_inference_steps": 25,
"prior_guidance_scale": 5,
"num_inference_steps": 50,
"guidance_scale": 5,
"seed": [0],
"nsfw_checker": true,
"upscale": false,
"scale": 2,
"face_refiner": {
"bbox_size_threshold": 1,
"bbox_filter_threshold": 0.5,
"restoration_repeats": 2,
"weight_sft": 0.5
},
"image_format": "webp",
"image_quality": 70
}'
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "3d6fb820-9845-4b3e-8d6d-7cfd01db5649",
"model_version": "${MODEL_VERSION}",
"images": [
{
"id": "a80108f8-b9c6-4bf4-aa38-957a38ced4a8",
"seed": 3878985944,
"image": "https://mk.kakaocdn.net/dna/karlo/image/..."
}
]
}