Nodaro 문서
문서노드 레퍼런스모델템플릿AI 에이전트(MCP)개발자셀프 호스팅리서치비교
REST API

크리처

REST API로 동물과 크리처를 만들고 관리합니다. 대표 이미지와 앵글, 포즈, 변형, 모션 클립을 생성하고 크리처에 보이스를 지정할 수 있습니다.

크리처 API는 반려동물, 드래곤, 마스코트처럼 모습이 고정된 동물과 인간이 아닌 존재를 관리합니다. 크리처에는 승인된 대표 이미지, 작성된 설명, 변형 이미지가 있으며, 이미지 노드와 동영상 노드가 이를 재사용하므로 크리처가 모든 샷에서 같은 모습으로 나옵니다. 크리처는 오브젝트처럼 작동하며, 자유 텍스트 species, 이름이 붙은 보드, 선택 사항인 보이스 세 가지가 추가됩니다.

이 라우트는 모든 에디션에서 작동하며 Bearer 토큰을 사용합니다. 개인 API 토큰(ndr_…), OAuth 앱 토큰(ndr_app_…), 또는 Community Edition에서는 세션 토큰을 보내세요. 인증을 참조하세요. CLI에는 크리처 명령이 없으므로 REST, SDK, MCP를 사용하세요.

엔드포인트

메서드경로설명
GET/v1/creatures내 크리처 목록을 가져옵니다.
GET/v1/creatures/:id크리처 하나를 진행 중인 작업과 함께 가져옵니다.
POST/v1/creatures크리처를 만듭니다. 본문에 id가 있으면 해당 크리처를 수정합니다.
DELETE/v1/creatures/:id크리처를 보관합니다. 보관한 크리처는 복원할 수 있습니다.
DELETE/v1/creatures/:id?permanent=true보관한 크리처와 그 파일을 영구 삭제합니다.
POST/v1/creatures/:id/restore보관한 크리처를 복원합니다.
POST/v1/generate-creature대표 이미지 후보를 1~10개 생성합니다.
POST/v1/generate-creature-asset앵글, 포즈, 변형, 사용자 지정 변형 중 하나를 생성합니다.
POST/v1/generate-creature-motion대표 이미지에 움직임을 입혀 모션 클립을 만듭니다.
POST/v1/creatures/:id/approve-main-image후보를 대표 이미지로 승인하고 크리처의 설명을 작성합니다.
POST/v1/creatures/:id/llm-caption현재 대표 이미지로 설명을 다시 작성합니다.

크리처에 담기는 정보

필드내용
id, name, description식별자, 표시 이름, 정체성 메모입니다.
species자유 텍스트입니다. 예: dragon, wolf, tabby cat. 대표 이미지 프롬프트의 주제가 됩니다.
category, style자유 텍스트 카테고리와 시각 스타일입니다. 스타일은 realistic, anime, 3d-pixar, illustration 중 하나입니다.
sourceImageUrl기준 대표 이미지로, 후보를 승인하면 설정됩니다.
canonicalDescription대표 이미지를 승인할 때 Nodaro가 작성하는 80~120단어 정도의 시각적 설명입니다.
styleLock변형을 대표 이미지에서 생성할지 여부입니다. 기본값은 true입니다.
angles, poses, variations, motionClips에셋 버킷입니다. 각 항목은 { name, url }이며, motionClips에는 동영상이 담깁니다.
boards이름이 붙은 보드를 최대 24개 담습니다. 보드는 모습이나 분위기마다 하나씩 만드는 촘촘한 레퍼런스 시트입니다.
voice크리처의 보이스 또는 null입니다.
referencePhotos최대 20장의 무드 보드 사진이며, 각각 { kind, url }입니다. kind는 front, side, detail, context, moodBoard, other 중 하나입니다.
pendingJobsGET /v1/creatures/:id에만 있습니다. 아직 실행 중인 변형 작업입니다.

크리처 목록과 읽기

GET /v1/creatures는 내 활성 크리처를 반환합니다. 오브젝트 목록과 같은 매개변수인 archived=true, projectId, q, 그리고 선택 사항인 limit(최대 500)과 cursor를 받습니다. q는 이름이나 설명에 그 단어가 모두 들어 있는 크리처만 남기며, 대소문자는 구분하지 않습니다. 캐릭터와 같은 검색입니다. limit이 없으면 전체 목록을 받습니다. limit이 있으면 한 페이지와 nextCursor를 받으며, nextCursor가 null이 될 때까지 다시 보내세요.

GET /v1/creatures/:id는 크리처 하나를 반환합니다. 보관된 크리처는 404 not_found를 반환합니다.

curl "https://app.nodaro.ai/v1/creatures?limit=50" \
  -H "Authorization: Bearer $NODARO_API_KEY"
import { createClient, StaticTokenAuth } from '@nodaro/sdk'

const client = createClient({
  baseUrl: 'https://app.nodaro.ai',
  auth: new StaticTokenAuth(process.env.NODARO_API_KEY!),
})

const { creatures, nextCursor } = await client.creatures.list({ limit: 50 })
const { creatures: archived } = await client.creatures.listArchived()

크리처 만들기 또는 수정

POST /v1/creatures는 본문에 id가 없으면 크리처를 만들고, 있으면 수정합니다. 만들 때는 nodeId와 name이 필요합니다. 캔버스 노드가 없으면 nodeId에 "scripted" 같은 아무 라벨이나 사용하세요. 만들면 { id }를, 수정하면 { id, updatedAt }을 반환합니다.

수정할 때는 보낸 필드만 기록됩니다. 에셋 버킷은 수정으로 기록되지 않지만, boards는 직접 설정할 수 있습니다. 교체하려면 전체 목록을 보내세요. expectedUpdatedAt을 보내면, 내가 읽은 뒤 누군가 크리처를 변경한 경우 수정이 409 concurrent_modification으로 거부됩니다.

curl -X POST https://app.nodaro.ai/v1/creatures \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "nodeId": "scripted",
    "name": "Ember",
    "species": "red dragon",
    "description": "Young dragon with copper scales and a chipped left horn",
    "style": "realistic"
  }'
const { id } = await client.creatures.create({
  nodeId: 'scripted',
  name: 'Ember',
  species: 'red dragon',
  description: 'Young dragon with copper scales and a chipped left horn',
  style: 'realistic',
})

await client.creatures.update(id, {
  voice: { voiceId: 'Callum', voiceName: 'Callum', traits: 'gravelly, slow', voiceType: 'premade' },
})

속성

타입

보드

보드는 한 가지 모습이나 분위기에 대한 크리처의 촘촘한 레퍼런스 시트입니다. 이미지 생성의 generate-image/creature-board 프리셋으로 보드를 만든 다음, 그 URL을 boards에 저장하세요. 프리셋과 레퍼런스 보드를 참조하세요.

대표 이미지와 변형 생성

POST /v1/generate-creature는 후보마다 작업을 하나씩 시작하고 jobIds를 반환합니다. 후보가 하나인 요청은 jobId도 반환합니다. attachToCreatureId를 보내고 count가 1이면, 작업이 완료될 때 결과가 대표 이미지가 됩니다. 후보가 여러 개이면 아무것도 연결되지 않으므로, 마음에 드는 후보를 승인하세요.

POST /v1/generate-creature-asset은 변형 하나를 생성하고 { jobId }를 반환합니다. assetType은 angles, poses, variations, custom 중 하나입니다. 결과를 버킷에 추가하려면 attachToCreatureId, attachToColumn(angles, poses, variations 중 하나), attachName을 보내세요. custom 변형은 열을 지정해야 합니다.

curl -X POST https://app.nodaro.ai/v1/generate-creature \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ember",
    "species": "red dragon",
    "count": 1,
    "attachToCreatureId": "0b8d6f4a-2c1e-4b9d-8f3a-7e5c1d9b3f2a"
  }'

curl -X POST https://app.nodaro.ai/v1/generate-creature-asset \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ember",
    "assetType": "poses",
    "variant": "wings spread",
    "attachToCreatureId": "0b8d6f4a-2c1e-4b9d-8f3a-7e5c1d9b3f2a",
    "attachToColumn": "poses",
    "attachName": "wings spread"
  }'
const { jobIds } = await client.creatures.generate({
  name: 'Ember',
  species: 'red dragon',
  count: 4,
})

await client.creatures.generateAsset({
  name: 'Ember',
  assetType: 'poses',
  variant: 'wings spread',
  attachToCreatureId: id,
  attachToColumn: 'poses',
  attachName: 'wings spread',
})
필드라우트설명
name둘 다필수입니다. 크리처 이름입니다.
species, description, category, style둘 다크리처의 정체성입니다.
count대표 이미지생성할 후보 수로, 1~10입니다. 기본값은 1입니다.
assetType, variant변형필수입니다. 변형의 종류와 이름입니다.
provider둘 다이미지 모델 id입니다. 생략하면 기본 모델을 사용합니다.
sourceImageUrl둘 다시작하거나 변형할 이미지입니다.
seedPromptHint둘 다프롬프트에 넣을 프롬프트 조각입니다. 예: 동물 피커에서 고른 값.

대표 이미지 애니메이션 만들기

POST /v1/generate-creature-motion은 크리처 이미지를 대기 루프, 어슬렁거리는 걸음, 공격 같은 클립으로 바꾸고 { jobId }를 반환합니다. sourceImageUrl은 필수입니다. attachToCreatureId와 attachName을 보내면 클립이 motionClips에 추가됩니다.

curl -X POST https://app.nodaro.ai/v1/generate-creature-motion \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ember",
    "motionPrompt": "slow idle breathing, tail sways, smoke curls from the nostrils",
    "sourceImageUrl": "https://cdn.nodaro.ai/creatures/ember-main.png",
    "attachToCreatureId": "0b8d6f4a-2c1e-4b9d-8f3a-7e5c1d9b3f2a",
    "attachName": "idle"
  }'
await client.creatures.generateMotion({
  name: 'Ember',
  motionPrompt: 'slow idle breathing, tail sways, smoke curls from the nostrils',
  sourceImageUrl: ember.sourceImageUrl!,
  provider: 'kling-turbo',
  duration: 5,
  attachToCreatureId: id,
  attachName: 'idle',
})
필드설명
name, motionPrompt, sourceImageUrl필수입니다. 크리처 이름, 움직임, 시작 프레임입니다.
providerkling-turbo(기본값), kling, kling-3.0, minimax, hailuo-2.3, wan-i2v, seedance, bytedance-lite 중 하나입니다.
duration클립 길이(초)입니다. 모델이 제공하는 길이여야 하며, 생략하면 모델의 기본값을 사용합니다.
aspectRatio1:1(기본값), 3:4, 16:9, 9:16, 4:3 중 하나입니다.
refineFromVideoUrl이미지에서 다시 시작하지 않고 새 프롬프트로 다듬을 기존 클립입니다.
attachToCreatureId, attachName크리처와 motionClips에 들어갈 클립 이름입니다.
모델개발사모드크레딧세부 정보
Kling 2.5 Turbo ProKuaishou이미지로 동영상 만들기, 텍스트로 동영상 만들기121부터더 빠른 Kling입니다. 더 낮은 비용으로 좋은 품질을 냅니다. 종료 프레임을 지원합니다.
Kling 2.6Kuaishou이미지로 동영상 만들기, 텍스트로 동영상 만들기152부터Kling 2.6 I2V입니다. 모션이 사실적이며 5초/10초 클립과 선택형 네이티브 오디오를 지원합니다.
Kling 3.0Kuaishou이미지로 동영상 만들기, 텍스트로 동영상 만들기297부터프리미엄 Kling 3.0입니다. 길이를 3~15초에서 조절할 수 있고, 네이티브 오디오와 720P/1080P를 지원합니다.
Hailuo 02 I2V ProMiniMax이미지로 동영상 만들기, 텍스트로 동영상 만들기158Hailuo 02 Pro입니다. 사실적인 모션이 뛰어나며 클립 길이는 5초로 고정됩니다. 종료 프레임을 지원합니다.
Hailuo 2.3 StandardMiniMax이미지로 동영상 만들기83부터더 저렴한 Hailuo 2.3 등급입니다. 기본 품질이 좋습니다.
Wan 2.6 I2VAlibaba이미지로 동영상 만들기193부터Wan 2.6의 이미지로 동영상 만들기 모델입니다. 720p/1080p에서 5/10/15초 클립을 만듭니다.
Bytedance Lite I2VBytedance이미지로 동영상 만들기, 텍스트로 동영상 만들기63종료 프레임을 지원하는 가장 저렴한 Bytedance 동영상 등급입니다.

seedance(Seedance 1.5 Pro)는 이전 모델입니다. 라우트는 여전히 이 값을 받지만, 모델 카탈로그(GET /v1/models)에 더 이상 나오지 않으므로 표에 행이 없습니다.

대표 이미지 승인

POST /v1/creatures/:id/approve-main-image에 { candidateJobId, expectedUpdatedAt? }을 보내면, 완료된 후보가 대표 이미지로 설정되고 같은 호출에서 canonicalDescription이 작성됩니다. 응답은 { sourceImageUrl, canonicalDescription }입니다. 설명을 작성하지 못해도 대표 이미지는 설정되며 설명은 비어 있습니다. 이때 SDK는 null을 반환합니다.

POST /v1/creatures/:id/llm-caption은 설명을 다시 작성하고 { canonicalDescription }을 반환합니다. 설명을 작성할 수 없으면 502를, 아직 대표 이미지가 없으면 400 main_image_required를 반환합니다. 두 라우트 모두 반복해서 호출해도 안전합니다. 승인은 무료입니다. llm-caption은 호출 1회에 8크레딧이 들며, 실패한 호출(502)은 환불됩니다.

curl -X POST https://app.nodaro.ai/v1/creatures/0b8d6f4a-2c1e-4b9d-8f3a-7e5c1d9b3f2a/approve-main-image \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "candidateJobId": "1c9e7a5b-3d2f-4c8e-9a4b-8f6d2e1a4c3b" }'
const ember = await client.creatures.get(id)
const approved = await client.creatures.approveMainImage(id, jobIds[0], ember.updatedAt)
if (approved.canonicalDescription === null) await client.creatures.recaption(id)

크리처 보관, 복원, 삭제

동작curlTypeScript SDK
보관DELETE /v1/creatures/:idclient.creatures.delete(id)
복원POST /v1/creatures/:id/restoreclient.creatures.restore(id)
영구 삭제DELETE /v1/creatures/:id?permanent=trueclient.creatures.permanentDelete(id)

보관은 { success: true, archived: true }를 반환하며, 반복해도 달라지는 것은 없습니다. 복원은 { id, name }을 반환하며, 같은 이름의 활성 크리처가 있으면 (restored) 접미사가 붙습니다. 영구 삭제는 보관된 크리처에만 작동하며(그렇지 않으면 400 not_archived), 크리처와 크리처가 참조하는 파일 중 내 파일을 모두 제거합니다. 다른 사용자의 생성 작업이 만든 파일이나, 다른 사용자의 업로드 폴더 또는 라이브러리에 있는 파일은 저장소에 남으며, 내 저장 용량에 포함된 적이 없습니다.

크리처가 말하게 하기

크리처 전용 라우트는 필요하지 않습니다. 크리처의 보이스로 음성을 만든 다음, 대표 이미지에 립싱크하세요.

음성 만들기

크리처의 voice.voiceId를 voice로 넣고, voice.ttsProvider와 voice.voiceType이 설정되어 있으면 함께 넣어 텍스트 음성 변환을 실행하세요.

대표 이미지 립싱크

크리처의 sourceImageUrl을 imageUrl로, 음성을 audioUrl로 넣어 립싱크를 실행하세요.

const speech = await client.nodes.runAndWait('text-to-speech', {
  text: 'I knocked the vase off the shelf. I regret nothing.',
  voice: ember.voice!.voiceId,
  provider: ember.voice!.ttsProvider,
  voiceType: ember.voice!.voiceType,
})

const clip = await client.nodes.runAndWait('lip-sync', {
  imageUrl: ember.sourceImageUrl!,
  audioUrl: speech.audioUrl,
  provider: 'kling-avatar',
})

nodes.runAndWait와 원시 POST /v1/<node-type> 라우트는 단일 노드 실행을 참조하세요.

크리처를 샷에 넣기

이미지 생성에서 크리처를 source: "wired-creature"인 구조화된 레퍼런스로 전달하세요. 크리처는 해부 구조, 무늬, 색을 유지하는 문구와 함께 자동으로 첨부됩니다. 프롬프트에서 크리처 이름을 부를 수도 있습니다. @ember:1을 입력하면 입력한 위치에 크리처가 배치됩니다. 역할로 이미지에서 무엇을 가져올지 고를 수 있습니다. 예: @ember:1:markings. 역할은 creature, anatomy, markings, pose, color, style입니다.

{
  "prompt": "a wide shot of @ember:1 landing on the castle wall",
  "connectedReferences": [
    { "id": "cr-1", "defaultName": "Ember", "source": "wired-creature", "url": "https://cdn.nodaro.ai/creatures/ember-main.png" }
  ]
}

워크플로에서는 대신 동물/크리처 에셋 노드를 이미지 노드나 동영상 노드에 연결하세요.

MCP에서 사용

도구설명
list_creatures, get_creature크리처를 찾고 변형 URL과 보이스를 읽습니다.
generate_creature대표 이미지(kind: "main") 또는 변형(kind: "asset")을 생성합니다.
approve_creature_main_image, recaption_creature대표 이미지를 승인하거나 설명을 다시 작성합니다.
generate_creature_motion대표 이미지 애니메이션을 만듭니다.

MCP 도구 레퍼런스를 참조하세요.

크레딧

Nodaro Cloud에서 대표 이미지 요청은 이미지 모델 가격에 count를 곱한 값이며, 첫 작업이 시작되기 전에 예약됩니다. 변형은 이미지 모델 가격이고, 모션 클립은 동영상 모델로 이미지에서 동영상을 만드는 가격입니다. 승인과 승인 시 작성되는 설명은 무료입니다. llm-caption은 호출 1회에 8크레딧이 들며, 실패한 호출은 환불됩니다.

오류

상태코드의미
400validation_error필드가 없거나 잘못되었거나, duration이 모델이 제공하는 길이가 아닙니다.
400not_archived보관되지 않은 크리처에 영구 삭제를 보냈습니다.
400main_image_required크리처에 대표 이미지가 생기기 전에 llm-caption을 호출했습니다.
401unauthorized토큰이 없거나, 잘못되었거나, 취소되었습니다.
402insufficient_creditsNodaro Cloud 전용입니다. 계정 잔액으로 예약 금액을 충당할 수 없습니다.
404not_found해당 id의 활성 크리처가 내 소유로 존재하지 않습니다.
409concurrent_modificationexpectedUpdatedAt이 더 이상 일치하지 않습니다. 크리처를 다시 읽고, 병합한 뒤 다시 시도하세요.
502—기준 설명을 작성하지 못했습니다. 다시 시도하세요.

자주 묻는 질문

크리처와 오브젝트는 어떻게 다른가요?

크리처는 동물이나 인간이 아닌 존재입니다. 자유 텍스트로 쓰는 종, 재질 대신 포즈 버킷, 이름이 붙은 보드, 선택 사항인 보이스가 있습니다. 그 밖에는 오브젝트처럼 작동하며, 만들기, 생성, 승인, 보관에 쓰는 라우트도 같습니다.

크리처가 말하게 하려면 어떻게 하나요?

크리처에 보이스를 지정하고, 그 보이스로 텍스트 음성 변환 노드에서 음성을 만든 다음, 크리처의 대표 이미지와 음성으로 립싱크를 실행하세요. 크리처 전용 라우트는 필요하지 않습니다.

크리처 애니메이션을 만들 수 있는 모델은 무엇인가요?

오브젝트와 같은 8가지 동영상 모델이며, 공급자 id는 kling-turbo(기본값), kling, kling-3.0, minimax, hailuo-2.3, wan-i2v, seedance, bytedance-lite입니다. 클립 1개의 가격은 해당 모델로 이미지에서 동영상을 만드는 가격입니다.

크리처용 CLI 명령이 있나요?

아니요. REST 라우트, TypeScript SDK(client.creatures), 또는 MCP의 크리처 도구를 사용하세요.

최종 업데이트

목차