모델

Recraft: Recraft V3

Markdown · JSON

Recraft: Recraft V3

Recraft V3는 텍스트를 고려한 구도와 스타일 설정으로 사진, 일러스트레이션, 그래픽 레이아웃을 만듭니다. 별도의 래스터 및 SVG 변형은 포스터, 브랜드 이미지 세트, 아이콘 등 문구와 시각적 구조가 함께 작동해야 하는 디자인에 적합합니다.

모델 소개

이 설명은 모델의 기능을 다룹니다. Ailoot에서 사용할 수 있는 입력, 출력 및 옵션은 아래에 선택한 메서드별로 표시됩니다.

Recraft V3는 그래픽 디자인과 사진 및 일러스트레이션 장면을 위한 이미지 생성 모델입니다. 작성한 지시서가 대상, 배경 환경, 구도를 설명하면 결과는 이미지로 나옵니다. V3는 재학습 없이 예시 이미지의 스타일 일관성을 유지하면서 Recraft의 텍스트 렌더링과 실사 표현을 발전시킵니다.

구도의 일부로서의 텍스트

V3는 긴 문구와 중간 크기 글자를 포함해 이미지 내부의 텍스트를 다룹니다. Recraft는 이미지 생성 전에 단어와 위치를 정하는 레이아웃 단계를 설명합니다. 레이아웃은 지시서에서 자동으로 만들거나 Recraft 디자인 환경에서 수동으로 배치할 수 있습니다. 이를 통해 제목, 일러스트레이션, 보조 텍스트를 하나의 구도 안에서 연결할 수 있습니다. 제작사는 고정 픽셀 격자가 아니라 이미지에 대한 상대값으로 표현하는 명시적 텍스트 레이아웃 좌표도 문서화합니다. 각 텍스트 요소에는 단어 하나와 정규화 좌표의 모서리 점 네 개가 포함됩니다. (0, 0)은 왼쪽 위, (1, 1)은 오른쪽 아래입니다. 좌표가 이 범위를 넘어가면 해당 형태는 잘립니다. 명시적 텍스트 레이아웃의 단어는 문서의 문자 제한을 따라야 합니다.

포스터나 표지에서는 정확한 문구와 그 위계를 제공하세요. 어느 줄이 중심인지, 어디에 놓이는지, 그림이 이를 어떻게 뒷받침하는지 설명해야 합니다. 결과를 선택할 때 렌더링된 철자와 간격을 확인하세요.

스타일, 팔레트, 예술적 방향

V3는 큐레이션된 사진, 일러스트레이션, 엠블럼 스타일과 별도의 벡터 스타일 라이브러리를 포함합니다. 래스터 모델의 기본 스타일은 Recraft V3 Raw이고 벡터 변형의 기본값은 Vector art입니다. Photorealism은 사진 같은 외관을 지향하며, Illustration은 양식화된 질감, 음영, 더 복잡한 색상 전환을 수용합니다. 벡터 스타일은 형태, 제한된 팔레트, 평면 채우기 또는 단순한 그라데이션을 선호합니다.

사용자 지정 스타일은 참조 이미지, 기존 호환 스타일 또는 둘의 조합으로 만들 수 있습니다. 이미지 시리즈 전반에서 재사용할 시각적 방향을 제공합니다. 문서의 혼합 설정은 참조와 원본 스타일에 각각 별도의 가중치를 부여하며, 가중치 수는 소스 수와 일치해야 합니다. 명시된 두 혼합 정책은 PaletteMatch와 MaxWeight입니다. 제작사는 스타일 참조 이미지 최대 10개를 허용하고 V3에는 regular 스타일 매칭 모드를 사용합니다. 저장한 사용자 지정 스타일과 직접 제공한 스타일 참조는 대체 입력 방식이며, 사용자 지정 스타일은 생성에 사용하는 모델과 일치해야 합니다.

선호 색상과 배경색으로 팔레트를 안내합니다. 문서상 RGB 색상은 최대 10개이며 각 성분은 0~255입니다. 선택 사항인 상대 가중치는 0~1 범위로, 모든 색상에 제공하거나 모두 생략해야 하며 합계는 1을 넘을 수 없습니다. artistic level은 정적이고 깔끔한 처리의 0부터 더 역동적이고 독특한 구도의 5까지입니다. 네거티브 프롬프트는 원하지 않는 요소를 설명하며 별도의 no-text 설정은 내장 텍스트 레이아웃을 비활성화합니다. 재현성을 위한 난수 시드도 사용할 수 있습니다. 이러한 설정은 장면, 스타일, 시각적 레이아웃을 각각 조절하는 수단입니다.

래스터 이미지와 별도의 SVG 변형

Recraft는 두 가지 V3 변형을 문서화합니다. 래스터 모델은 무손실 WebP 또는 PNG를 생성하며 사진의 디테일, 음영, 질감이 있는 일러스트레이션에 적합합니다. Recraft V3 Vector는 고정 픽셀 해상도 없이 확대할 수 있는 패스와 도형으로 구성된 SVG를 생성합니다. 픽토그램, 로고 콘셉트, 배지, 정교한 벡터 아트워크에 적합합니다. 래스터를 벡터로 변환하는 것은 벡터 아트워크를 직접 생성하는 것과 별도의 작업입니다.

두 변형은 각각 고유한 정체성을 갖습니다. 벡터처럼 보이는 이미지와 실제 SVG 출력은 서로 다른 선택입니다. 공통된 V3 이름만으로 모든 작업이 같은 파일 형식을 반환한다고 여기지 말고 디자인 작업을 준비할 때 필요한 출력을 선택하세요.

기존 아트워크 편집과 마무리

Recraft V3 문서에는 이미지 간 변환, 인페인팅, 아웃페인팅, 배경 교체 또는 생성이 나열되어 있습니다. 이미지 간 변환은 기존 이미지와 새로운 지시서를 결합합니다. 인페인팅은 이미지와 크기가 맞는 마스크를 사용해 선택 영역을 다시 생성하고, 아웃페인팅은 원래 프레임 밖에 내용을 추가합니다. 배경 작업은 대상 주변을 다룹니다.

관련 도구에는 지우기, 배경 제거, 벡터화, 두 가지 업스케일링 방식도 포함됩니다. creative 업스케일링은 새 디테일을 도입할 수 있고 crisp 업스케일링은 기존 내용을 더 선명한 큰 이미지로 만드는 것을 지향합니다. 이들은 각각 입력과 결과가 다른 별도 작업이며 래스터 또는 벡터 모델 이름의 추가 의미가 아닙니다.

프롬프트, 크기, 원본 이미지 제한

제작사의 V3 생성 사양은 최대 1000자의 프롬프트와 요청당 이미지 1~6개를 허용합니다. 지원하는 종횡비는 14개로 1:1, 2:1, 1:2, 3:2, 2:3, 4:3, 3:4, 5:4, 4:5, 6:10, 14:10, 10:14, 16:9, 9:16입니다. 문서의 래스터 예시는 1024x1024, 1820x1024, 1024x1820을 포함합니다. 정확한 래스터 크기는 지원 목록에서 선택해야 하며 SVG는 고정 픽셀 크기 없이 종횡비를 사용합니다. 크기를 생략하면 제작사 시스템이 프롬프트에서 선택합니다.

이미지 입력 작업에서 제작사는 PNG, JPG, WebP와 해당 작업에서 허용되는 SVG를 제시합니다. 파일은 20 MB 미만, 16 MP 이하, 긴 변 최대 4096픽셀이어야 합니다. 짧은 변은 최소 256픽셀이며 crisp 업스케일링에는 32픽셀 예외가 있습니다. 마스크는 이미지 크기와 일치해야 하고 순수한 흑백을 사용합니다. 스타일 참조의 합계 용량 한도는 64 MB입니다.

Ailoot API 프로젝트에서는 정확한 문구, 물체 배치, 시각적 스타일, 원하는 구도를 담은 집중적인 이미지 지시서로 작업을 정리하세요. 포스터, 제품 장면, 아이콘 시리즈에는 서로 다른 지시서가 필요합니다. 각 결과물의 활용 방식을 정할 때 관련 V3 변형과 작업 간 차이를 유지하세요.

Ailoot Ultra · 이미지 POST /v1/images/generations recraft/recraft-v3

recraft/recraft-v3

Recraft /recraft/recraft-v3

시작하기

Recraft V3는 텍스트를 고려한 구도와 스타일 설정으로 사진, 일러스트레이션, 그래픽 레이아웃을 만듭니다. 별도의 래스터 및 SVG 변형은 포스터, 브랜드 이미지 세트, 아이콘 등 문구와 시각적 구조가 함께 작동해야 하는 디자인에 적합합니다.

허용 입력
텍스트 · 이미지
결과
이미지

Ailoot에서 사용 가능 · 입력 및 메서드

Ailoot Ultra · 이미지 POST /v1/images/generations
입력
text, image
출력
image
출력 형식
이미지 파일
필드유형요건값과 한도기본값
필드model유형string요건필수값과 한도
recraft/recraft-v3
기본값—
필드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.08 출력 이미지당
설정예상 생성 비용요금표—예측 수량1회 생성 예상치과금 단위—요금
출력 · 예상 생성 비용 · 비교 전용 추정치 $0.08 생성 전 추정치

이 예상 금액은 추가 요금이나 생성 완료 시 적용되는 고정 요금이 아닙니다.

Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. 금액 확보와 정산 방식 →

참조 요금 상세 정보

모델 수준의 참조 요금표는 메서드 선택, 견적 또는 요금을 변경하지 않습니다. 실제 과금에는 선택한 Ailoot 메서드 요금이 적용됩니다.

이미지 요금 설정

설정별 가격

설정과금 조건요금
설정출력 이미지과금 조건요금 변형이 선언되어 있지 않습니다.요금
출력 · 출력 이미지 $0.08 이미지당

동등한 목록 항목들은 동일한 청구액을 설명합니다. 별도의 추가 요금을 부과하지 않습니다.

요청 예제

Ailoot Ultra · 이미지

curlPython SDKNode.js SDK
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-v3', '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-v3', '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-v3", "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}/content
  • GET /v1/media/assets
  • GET /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-v3

메서드 경로 별칭

/v1/images

관련 호출용 ID

recraft/recraft-v3

FAQ · Recraft: Recraft V3
어떤 입력과 결과를 사용할 수 있나요?

POST /v1/images/generations · recraft/recraft-v3: text, image → image

요청은 어떤 필드를 사용하나요?

POST /v1/images/generations · recraft/recraft-v3: model, prompt, n, aspect_ratio, input_references

어떤 제한이 적용되나요?

POST /v1/images/generations · recraft/recraft-v3: n.minimum: 1; n.maximum: 6

자세히 보기

Claude Code, OpenCode, Hermes, 자체 앱에 Ailoot를 연결하세요.

회사와 그 프로젝트 포트폴리오

회사와 그 프로젝트 포트폴리오: 수백만 고객, 매월 수십억 규모의 매출.

할인받아 토큰을 구매하세요.

정기 작업에는 구독 할인, 토큰 구매에는 최대 50% 프로모션 코드.

구독
정기 요청에 맞는 할인 요금제를 선택하세요.
최대 50% 프로모션 코드
구매할 때 코드를 넣으면 진행 중 행사에 따라 가격을 다시 계산합니다.
이력의 지출
요청마다 모델, 토큰, 금액을 저장합니다.

구독 선택 · 모델 가격 보기

판매하는 제품에 API를 연결하세요.

Ailoot 공식 이용 조건과 라이선스 계약으로 SaaS, 앱, 봇에 사용하세요. 재판매에는 리셀러 라이선스를 요청하세요.

상업용 앱
서비스의 유료 기능에 텍스트, 이미지, 영상, 소리 생성을 넣으세요.
리셀러 라이선스
프로젝트 설명과 접근 구조를 보내 사용·재판매의 서면 조건을 요청하세요.
사이트의 문서
연결 전에 공식 이용 조건, 라이선스 계약, 데이터 처리 정책을 읽을 수 있습니다.

리셀러 라이선스 요청 · 공식 이용 조건과 라이선스 계약