Recraft: Recraft V4 Pro
Recraft V4 Pro는 정교한 구도, 실사 표현, 일러스트레이션, 인쇄용 창작 작업을 위한 2K 래스터 이미지를 생성합니다. 텍스트 지시서, 선택 사항인 스타일 입력, 별도의 이미지 간 변환 작업을 제공하는 고해상도 V4 에디션입니다.
모델 소개
이 설명은 모델의 기능을 다룹니다. Ailoot에서 사용할 수 있는 입력, 출력 및 옵션은 아래에 선택한 메서드별로 표시됩니다.
Recraft V4 Pro는 Recraft V4 제품군의 고해상도 래스터 모델입니다. V4는 시각적 판단, 균형 잡힌 구도, 일관된 색상, 창작 지시의 세심한 해석에 초점을 맞춥니다. 제작사는 Pro를 더 미세한 디테일, 더 사실적인 복잡한 장면, 본격적인 제작용 이미지를 위한 모델로 소개합니다. 세밀한 일러스트레이션, 에디토리얼 이미지, 포스터 콘셉트 등 더 큰 래스터 결과물이 유용한 자료에 사용하세요. 이후 모델인 V4.1 및 SVG를 출력하는 V4 Pro Vector와는 구분됩니다.
정확한 제작사 코드는 recraftv4_pro입니다. 문서상 출력은 무손실 WebP 또는 PNG 형식의 2K 래스터이며, 정사각형은 2048 × 2048픽셀, 16:9는 2688 × 1536픽셀, 2:3은 1664 × 2560픽셀입니다. 다른 지원 비율에는 각각의 크기가 있습니다. 사용할 레이아웃의 종횡비나 정확한 허용 크기를 선택하세요. 임의의 픽셀 크기는 문서의 생성 규약에 포함되지 않습니다. 표준 V4는 더 작은 1K 래스터를 출력하고 벡터 모델에는 고정 픽셀 해상도가 없습니다.
V4는 탐색용 짧은 프롬프트나 결과를 통제하기 위한 구조화된 프롬프트를 해석할 수 있습니다. 구체적인 아트 디렉션을 위해 제작사 가이드는 대상과 환경에서 시작해 프레이밍, 속성, 공간 관계, 조명, 깊이, 분위기로 설명을 이어갑니다. 에디토리얼 제품 이미지라면 조각 같은 의자, 브러시드 메탈 표면, 측면 조명, 차분한 어두운 배경, 제목을 위한 물체 위쪽 여백이 있는 극적인 세로 사진을 요청할 수 있습니다. 이러한 관계를 명시하면 막연히 고급 이미지를 요청하는 것보다 원하는 구도가 더 명확해집니다.
이 제품군의 창작 범위에는 서사적 일러스트레이션, 실사 장면, 소재와 조명 단서를 활용한 입체적인 이미지가 포함됩니다. 3D처럼 보이는 결과도 편집 가능한 3D 장면이 아닌 이미지입니다. 그래픽 포스터에서는 배경, 일러스트레이션 또는 사진, 제목 위계, 보조 텍스트 등 시각적 레이어와 상호 작용을 지정하세요. V4는 읽기 쉬운 짧거나 중간 길이의 문구를 위한 모델로 소개되지만 완성된 철자와 위계는 모델 이름에서 추정하지 말고 실제로 확인해야 합니다.
현재 생성 자료는 최대 10,000자의 프롬프트, 출력 1~6개, 난수 시드, 선호 색상 및 배경색 설정을 허용합니다. 선택 사항인 사용자 지정 스타일이나 호환 참조 이미지는 flexible 또는 precise 매칭으로 외관을 안내할 수 있습니다. 모델은 이전 V3 설정인 negative_prompt, 큐레이션된 스타일, text_layout, artistic_level, no_text를 허용하지 않습니다. 긍정형 프롬프트에 원하는 최종 이미지를 설명하고 대상, 레이아웃, 색상 요구를 분명히 하세요. 참조 스타일 생성에는 PNG, JPG 또는 WebP 이미지 1~10개를 사용하며, 총용량은 64 MB 이하, 각 파일은 20 MB 미만이어야 합니다. 각 참조 이미지의 짧은 변은 최소 256픽셀, 긴 변은 최대 4,096픽셀, 해상도는 최대 16메가픽셀이어야 합니다. 이러한 참조 이미지와 호환 저장 스타일 중 하나만 사용하고 둘을 함께 사용하지 마세요.
Recraft는 V4의 별도 이미지 간 변환 작업을 문서화합니다. 기존 이미지와 프롬프트에 0~1의 strength 값을 결합해 변경 정도를 조절하며, 이 작업에서는 V4 사용자 지정 스타일 설정을 받지 않습니다. 제작사 이미지 입력 제한에 맞춰 원본을 준비하고 새 결과물에 이어갈 특성을 명시하세요. 큰 최종 자료는 사용할 크기에서 미세 디테일, 잘림, 글자를 확인하세요. Pro의 추가 래스터 디테일이 이러한 점검에 도움이 되지만 이미지 자체는 제공한 창작 지시서를 생성 방식으로 해석한 결과입니다. 이미지 간 변환에는 20 MB 미만, 최대 16메가픽셀, 각 변이 256~4,096픽셀인 PNG, JPG, WebP 또는 SVG를 제공해야 합니다.
Ailoot Ultra · 이미지 POST /v1/images/generations recraft/recraft-v4-pro
recraft/recraft-v4-pro시작하기
Recraft V4 Pro는 정교한 구도, 실사 표현, 일러스트레이션, 인쇄용 창작 작업을 위한 2K 래스터 이미지를 생성합니다. 텍스트 지시서, 선택 사항인 스타일 입력, 별도의 이미지 간 변환 작업을 제공하는 고해상도 V4 에디션입니다.
- 허용 입력
- 텍스트 · 이미지
- 결과
- 이미지
Ailoot에서 사용 가능 · 입력 및 메서드
Ailoot Ultra · 이미지 POST /v1/images/generations
- 입력
text,image- 출력
image- 출력 형식
- 이미지 파일
| 필드 | 유형 | 요건 | 값과 한도 | 기본값 |
|---|---|---|---|---|
필드model | 유형string | 요건필수 | 값과 한도 recraft/recraft-v4-pro | 기본값— |
필드prompt | 유형string | 요건필수 | 값과 한도 최소 길이: 1 | 기본값— |
필드n | 유형integer | 요건선택 사항 | 값과 한도 최솟값: 1 최댓값: 6 | 기본값— |
필드aspect_ratio | 유형string | 요건선택 사항 | 값과 한도 1:1, 4:3, 3:4, 16:9, 9:16, auto | 기본값— |
필드input_references | 유형array | 요건선택 사항 | 값과 한도 최소 항목 수: 0 최대 항목 수: 1 | 기본값— |
입력 자료 조합
텍스트로 이미지 생성 · 필수: prompt
메서드 매개변수와 수명 주기
| 매개변수 | 명세 |
|---|---|
매개변수content_type | 명세application/json |
매개변수required | 명세model, prompt |
매개변수material_types | 명세text, image |
매개변수optional_controls | 명세aspect_ratio, n, input_references |
매개변수exact_supported_parameters | 명세{"aspect_ratio":{"type":"enum","values":["1:1","4:3","3:4","16:9","9:16","auto"]},"n":{"type":"range","min":1,"max":6},"input_references":{"type":"range","min":0,"max":1}} |
매개변수reference_material_rule | 명세고객의 실제 이미지 참조 자료만 사용합니다. 공급자 엔드포인트 조건이 적용됩니다. |
메서드 별칭: /v1/images
수명 주기: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · 실제로 반환된 task_id 또는 미디어 라이브러리 기록
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
정확한 모델과 문서에 명시된 입력 필드를 사용하세요.
응답 전체, 모든 실제 출력 및 원래 반환된 ID를 보존하세요.
요금
최종 요금 계산 방식
표시된 요율은 생성 전 비용을 예상하는 데 사용됩니다. 최종 청구액은 최초 생성에 기록된 비용으로 계산됩니다. 측정된 출력 길이와 예상 수량은 최종 청구 수량이 아닙니다.
요금 정보는 요청 옵션을 추가하지 않습니다. 지원되는 매개변수는 선택한 메서드에 표시됩니다.
- 빠른 모드
- 미지정 빠른 모드를 선택한 경우
- Flex 모드
- 미지정 flex 모드를 선택한 경우
- 최대 추론 수준
- 미지정 최대 추론 수준에 default 조정값을 적용하는 경우
비교용 예상 요금
설정별 가격
각 요금을 표시된 조건과 대조하세요. 서로 대체되는 설정 묶음마다 하나의 요금만 적용하세요.
| 설정 | 요금표 | 예측 수량 | 과금 단위 | 요금 |
|---|---|---|---|---|
| 설정기본 토큰 요금 | 요금표기본 요금 | 예측 수량— | 과금 단위— | 요금 입력 · 입력 토큰 · 비교 전용 추정치 — / 1K 토큰 출력 · 출력 토큰 · 비교 전용 추정치 — / 1K 토큰 입력 · 캐시 읽기 · 비교 전용 추정치 — / 1K 토큰 입력 · 캐시 쓰기 · 비교 전용 추정치 — / 1K 토큰 입력 · 캐시 쓰기, 1시간 · 비교 전용 추정치 — / 1K 토큰 |
| 설정Ultra | 요금표— | 예측 수량— | 과금 단위출력 이미지당 | 요금 출력 · 이미지 출력 · 비교 전용 추정치 $0.5 출력 이미지당 |
| 설정예상 생성 비용 | 요금표— | 예측 수량1회 생성 예상치 | 과금 단위— | 요금 출력 · 예상 생성 비용 · 비교 전용 추정치 $0.5 생성 전 추정치 이 예상 금액은 추가 요금이나 생성 완료 시 적용되는 고정 요금이 아닙니다. |
Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. 금액 확보와 정산 방식 →
참조 요금 상세 정보
모델 수준의 참조 요금표는 메서드 선택, 견적 또는 요금을 변경하지 않습니다. 실제 과금에는 선택한 Ailoot 메서드 요금이 적용됩니다.
이미지 요금 설정
설정별 가격
| 설정 | 과금 조건 | 요금 |
|---|---|---|
| 설정출력 이미지 | 과금 조건요금 변형이 선언되어 있지 않습니다. | 요금 출력 · 출력 이미지 $0.5 이미지당 동등한 목록 항목들은 동일한 청구액을 설명합니다. 별도의 추가 요금을 부과하지 않습니다. |
요청 예제
Ailoot Ultra · 이미지
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p={'model': 'recraft/recraft-v4-pro', 'prompt': 'a red panda astronaut floating in space, studio lighting'}
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
request={'model': 'recraft/recraft-v4-pro', 'prompt': 'a red panda astronaut floating in space, studio lighting'}
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "recraft/recraft-v4-pro", "prompt": "a red panda astronaut floating in space, studio lighting"};
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
if(!encoded && uri.startsWith("data:image/")) {
const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
encoded=uri.slice(comma+1);
}
if(encoded) {
if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
raw=Buffer.from(encoded,"base64");
} else if(uri) {
const u=new URL(uri,"https://api.ailoot.ai");
if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
if(!response.ok) throw new Error("Image content download failed: "+response.status);
raw=Buffer.from(await response.arrayBuffer());
} else throw new Error("Image has neither bytes nor URL");
if(!raw.length) throw new Error("Empty image result");
const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
결과 수신 및 저장
Ailoot Ultra · 이미지
반환된 각 이미지를 다운로드하거나 Base64 내용을 저장하세요
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
완료된 결과 모두 보관
완료된 이미지를 모두 저장하세요. 반환된 각 URL에서 가져오거나 Base64 내용을 디코딩하세요.
모든 데이터 항목과 사용량 전체를 보존하세요. 실제로 반환된 모든 이미지의 소유권을 확보하고 저장하세요. URL이나 ID를 임의로 만들지 마세요.
원래 응답을 확인해야 할 경우
이미지 생성 또는 편집 결과를 확인해야 하는 경우 최초 operation_id/X-Client-Request-ID와 반환된 결과 정보를 보관하세요. 실제 task_id 또는 asset_id 값으로 미디어 라이브러리에서 기존의 소유한 결과를 복구하세요. 생성/편집 요청을 다시 제출하거나 operation_id로 폴링 URL을 구성하지 마세요.
응답 필드
| 필드 | 유형 |
|---|---|
필드created | 유형integer |
필드data[].url | 유형string |
필드data[].b64_json | 유형base64 string |
필드usage | 유형object |
별칭
모델 별칭
Ailoot Ultra recraft/recraft-v4-pro
메서드 경로 별칭
/v1/images
관련 호출용 ID
FAQ · Recraft: Recraft V4 Pro
- 어떤 입력과 결과를 사용할 수 있나요?
POST /v1/images/generations·recraft/recraft-v4-pro:text,image→image- 요청은 어떤 필드를 사용하나요?
POST /v1/images/generations·recraft/recraft-v4-pro:model,prompt,n,aspect_ratio,input_references- 어떤 제한이 적용되나요?
POST /v1/images/generations·recraft/recraft-v4-pro:n.minimum:1;n.maximum:6