Control API 참고자료
SimpliGen이 머신에서 실행하는 로컬 HTTP API로, 사용자 정의 통합을 구축하고 헤드리스 생성을 실행할 수 있습니다.
SimpliGen은 앱이 열려 있는 동안 머신에서 작은 HTTP Control API를 실행합니다. 이것은 MCP 서버가 통신하는 것과 같은 API로, 앱을 트레이로 최소화한 상태에서도 자신의 스크립트, 서비스 또는 에이전트로 SimpliGen을 제어할 수 있도록 직접 노출됩니다.
MCP vs Control API
AI 에이전트(Claude, Codex 등)가 SimpliGen을 사용하기를 원하면, MCP 서버를 설정하세요. 이 API를 래핑합니다. 사용자 정의 통합을 어떤 언어로든 작성할 때 Control API를 직접 사용하세요.
기본 URL 및 검색
서버는 루프백 전용으로 바인딩되며 기본값은:
http://127.0.0.1:48199해당 포트가 사용 중이면 SimpliGen은 OS 할당 포트로 폴백합니다. 현재 포트(및 API 버전)는 항상 앱의 사용자 데이터 디렉토리의 검색 파일에 기록됩니다:
# Windows
%APPDATA%\simpligen\agent-api.json
# macOS
~/Library/Application Support/simpligen/agent-api.json
# Linux
~/.config/simpligen/agent-api.json{ "port": 48199, "version": 1 }48199를 하드코딩하는 대신 이 파일을 읽어 라이브 포트를 찾으세요.
요구사항
Control API는 앱이 열려 있고 머신이 에이전트 액세스 권한이 있을 때만 실행됩니다(라이선스의 일부입니다). 요청은 Host 헤더가 루프백 별칭일 때만 제공됩니다. 그 외는 403 forbidden_host를 반환합니다(DNS 리바인딩 방지).
인증
GET /health를 제외한 모든 엔드포인트는 Authorization 헤더의 페어링 토큰이 필요합니다:
Authorization: Bearer sg-agent-xxxxxxxx...설정 → 에이전트 연결에서 토큰을 생성하세요(에이전트 연결 참고). 원시 토큰은 한 번만 표시되며, 해시만 저장됩니다. 각 토큰은 선택적 사용량 상한을 클라우드 생성에 대해 포함할 수 있습니다. 앱에서 토큰을 취소하면 즉시 적용됩니다.
누락되거나 잘못된 토큰은 401 unauthorized를 반환합니다.
규칙
- 요청: JSON 본문(
Content-Type: application/json), 최대 50MB. - 응답: 항상 JSON.
- 오류: 2xx가 아닌 응답은
{ "errorCode": "...", "message": "..." }형태입니다. - ID: 프리셋은
presetId(선택적packId)로 주소 지정되고, 작업은jobId로 주소 지정됩니다.
최소 인증된 호출:
TOKEN="sg-agent-..."
curl -s http://127.0.0.1:48199/status -H "Authorization: Bearer $TOKEN"Health
GET /health
생존성 프로브. 인증 필요 없음.
{ "ok": true, "name": "simpligen", "version": 1 }기능
GET /capabilities
생성할 수 있는 모든 프리셋을 나열합니다. (preset, mediaType)당 한 항목으로, 입력, 옵션, 로컬 준비 상태 및 클라우드 적격/비용을 포함합니다.
{
"capabilities": [
{
"packId": "local-core-pack",
"presetId": "z-image-turbo",
"mediaType": "image",
"name": "Z-Image Turbo",
"description": "Ultra-fast, high-quality images in seconds",
"apiProvider": null,
"inputs": {
"acceptsPrompt": true,
"requiresPrompt": true,
"requiresImage": false,
"acceptsReferenceImages": null,
"acceptsVideo": false,
"acceptsAudio": false,
"acceptsReferenceVideos": false,
"acceptsReferenceAudios": false,
"supportsLoras": true
},
"options": {
"steps": null,
"cfg": null,
"duration": null,
"resolution": null,
"aspectRatio": ["1:1", "3:4", "4:3", "9:16", "16:9"]
},
"cloudAliasTo": null,
"localReady": true,
"cloudEligible": true,
"cloudCost": 4
}
]
}| 필드 | 의미 |
|---|---|
localReady | 모든 모델 파일이 설치됨. 프리셋이 지금 로컬에서 실행 가능합니다. |
cloudEligible | 프리셋이 SimpliGen Cloud에서 실행할 수 있습니다. |
cloudCost | 클라우드 실행의 대략적인 크레딧 비용(적격이 아니면 null). |
apiProvider | 외부 API 프리셋(예: OpenAI, Google)의 경우 null이 아닙니다. Control API는 이러한 프리셋을 디스패치할 수 없습니다. |
inputs / options | 프리셋이 허용하는 것과 POST /generate에 전달할 수 있는 옵션 범위/종횡비. steps/cfg는 고급 제어를 노출하는 프리셋에서만 null이 아닙니다. |
promptFamily | 이 프리셋의 프롬프팅 가이드 계열(예: z-image) 또는 선언되지 않은 경우 null. GET /prompt-guide/:presetId는 가이드를 반환합니다. |
inputs.requiresPrompt | 기본 제공되는 지시사항이 있는 프리셋(자르기, 머리 또는 의상 교체, 업스케일)의 경우 false: 빈 prompt는 유효하고, 보내는 모든 텍스트는 추가 노트로 추가됩니다. |
상태
GET /status
{
"engineRunning": true,
"engineVersion": "v0.26.0",
"cloudConnected": true,
"creditBalance": 1280,
"activeProject": { "id": "default", "name": "My Project" },
"characters": { "enabled": true, "base": 1, "edit": 1, "i2v": 1, "enhancePresets": 2 }
}POST /engine/start
로컬 엔진이 아직 실행 중이 아닐 때 시작합니다. 본문을 받지 않습니다.
{ "engineRunning": true, "engineVersion": "v0.37.0", "engineStarting": false }콜드 부팅은 요청이 대기하는 것보다 오래 걸립니다. 그런 경우 응답은 202이고 engineStarting: true이며 엔진은 계속 부팅되므로 engineRunning이 true가 될 때까지 GET /status를 폴링하세요.
이미 실행 중인 엔진 시작은 200과 alreadyRunning: true를 반환하며 아무것도 변경하지 않습니다. 엔진이 설치되지 않은 경우 응답은 409 engine_not_installed입니다. 설치하는 것은 멀티 기가바이트 다운로드이며 앱의 작업으로 유지됩니다. 엔진이 실행을 거부하는 머신은 409 engine_unsupported_hardware를 답변하며, 재시도해도 해결되지 않습니다.
POST /engine/stop
로컬 엔진을 중지하고 VRAM을 해제합니다. 클라우드 생성은 영향을 받지 않습니다. 이미 꺼진 엔진을 중지하면 성공합니다.
POST /engine/restart
멈춘 엔진을 위해 또는 사용자 정의 노드가 설치되거나 제거된 후 다시 중지하고 시작합니다. 시작과 동일한 202 동작입니다.
프로젝트
프로젝트는 생성을 보유하는 컨테이너입니다.
GET /projects
{ "projects": [ { "id": "default", "name": "My Project", "slug": "my-project" } ] }POST /projects
{ "name": "Campaign assets" }201을 반환하고 { "project": { ... } }를 반환합니다. name은 필수입니다(그렇지 않으면 400 invalid_options).
업로드
입력(소스 이미지, 참조 이미지, 소스 비디오)은 로컬 경로로 전달되지 않습니다. 먼저 바이트를 업로드하고 반환된 핸들을 POST /generate에 전달하세요.
POST /uploads
{ "filename": "ref.png", "dataBase64": "<base64 of the file bytes>" }{ "handle": "a1b2c3d4.png", "sizeBytes": 51234 }최대 업로드는 100MB입니다(413 asset_too_large). 지원하지 않는 확장자는 400 unsupported_file_type을 반환합니다.
생성
POST /generate
생성을 큐에 넣고 jobId로 즉시 반환합니다. GET /jobs/:id를 폴링하여 결과를 얻으세요(작업 참고).
{
"presetId": "z-image-turbo",
"packId": "local-core-pack",
"mediaType": "image",
"prompt": "a red fox in the snow, cinematic",
"backend": "auto",
"project": "default",
"image": "a1b2c3d4.png",
"referenceImages": [{ "handle": "e5f6.png", "label": "style" }],
"loras": [
{ "name": "RoomLora", "weight": 0.85 },
{ "name": "Mia", "weight": 0.75 }
],
"options": { "aspectRatio": "16:9", "steps": 8, "negativePrompt": "blurry, watermark" }
}| 필드 | 필수 | 참고 |
|---|---|---|
presetId | 예 | GET /capabilities에서. |
mediaType | 예 | "image" 또는 "video". |
packId | 아니오 | 지정된 경우 프리셋의 팩과 일치해야 합니다. |
prompt | 조건부 | 프리셋이 inputs.requiresPrompt: false를 보고하지 않는 한 필수. 이러한 프리셋은 기본 제공되는 지시사항이 있습니다: ""를 보내 그대로 실행하거나 추가 노트를 전달할 텍스트를 추가하세요. |
backend | 아니오 | "auto"(기본값), "local" 또는 "cloud". Auto는 설치된 경우 로컬을 선호하고, 그렇지 않으면 연결된 경우 클라우드를 선호합니다. |
image | 조건부 | 업로드 핸들. 이미지-X 프리셋(inputs.requiresImage)에 필수. |
video | 조건부 | 업로드 핸들(비디오 입력 프리셋의 경우). |
referenceImages | 조건부 | 참조 이미지 프리셋의 핸들 또는 { handle, label } 배열. |
audio | 조건부 | 업로드 핸들(오디오 기반 프리셋의 경우, 립싱크, 오디오-비디오). 프리셋이 acceptsAudio를 보고할 때 필수입니다. 그렇지 않으면 작업이 needs_audio로 거부됩니다. |
audioStartSeconds | 아니오 | 트랙에서 시작 위치(초). options에서도 수락됩니다. |
referenceVideos | 조건부 | 참조 클립 프리셋의 핸들 또는 { handle, soundtrackMode, durationSeconds } 배열. |
referenceAudios | 조건부 | 참조 사운드 프리셋의 핸들 또는 { handle, durationSeconds } 배열. |
loras | 아니오 | inputs.supportsLoras가 true인 프리셋에 적용할 { name, weight } 배열. name은 GET /loras의 LoRA 표시 이름(또는 파일명)과 일치합니다. weight는 LoRA의 기본 강도로 기본 설정됩니다. 알 수 없는 이름은 400 unknown_lora를 반환합니다. 지금은 로컬 백엔드만 해당합니다. |
project | 아니오 | 프로젝트 id 또는 slug. 활성 프로젝트로 기본 설정됩니다. |
options.aspectRatio | 아니오 | 프리셋의 지원되는 비율 중 하나여야 합니다. |
options.steps / options.cfg | 아니오 | 프리셋의 공표된 범위 내. |
options.negativePrompt | 아니오 | 추가 부정항(UI의 고급 옵션 부정). 최상위 레벨 negativePrompt로도 수락됩니다. 가산적: 프리셋의 기본 부정항은 항상 적용되고 사용자 항은 그 뒤에 추가됩니다(, ). 아무것도 보내지 않으면 프리셋 기본값을 사용합니다. SimpliGen Cloud 실행에서는 추가 항이 전송되지 않으며 프리셋의 기본 부정항이 그대로 사용됩니다. |
options.durationSeconds | 아니오 | 비디오 지속 시간. |
options.resolution | 아니오 | 해상도 계층 레이블. |
{ "jobId": "gen_abc123", "backend": "local", "status": "queued" }클라우드 작업의 경우 응답에는 "cloudCost": <credits>도 포함됩니다.
백엔드
외부 API 프리셋(apiProvider가 null이 아닌 경우, 예: GPT Image 2, Veo)은 여기서 디스패치할 수 없으며 400 unsupported_backend를 얻습니다. 로컬 또는 SimpliGen Cloud 프리셋을 사용하세요. 클라우드는 연결된 계정이 필요합니다(400 cloud_not_connected). 로컬은 모델이 설치되어야 합니다(400 preset_not_installed). 먼저 준비하세요.
GET /loras
에이전트가 POST /generate의 loras 배열에 전달할 내용을 검색할 수 있도록 사용자가 설치한 LoRA를 나열합니다. name(표시 이름)으로 일치시킵니다.
{
"loras": [
{ "name": "RoomLora", "filename": "RoomLora_000002400.safetensors", "baseModel": "flux", "triggerWords": "a room", "defaultStrength": 0.9 },
{ "name": "Mia", "filename": "mia_v2.safetensors", "baseModel": "flux", "triggerWords": "mia", "defaultStrength": 1.0 }
]
}프리셋의 기본 모델(baseModel)에 맞는 LoRA를 전달하고 프롬프트에서 자신의 트리거 단어를 사용하여 활성화되도록 하세요.
프롬프트 가이드
GET /prompt-guide/:presetId
프리셋의 프롬프팅 가이드를 반환합니다: 모델이 프롬프트를 읽는 방법, 선호하는 구조 및 길이, 카메라 및 모션 표현, 부정항, 문자를 표현하는 방법, 작동 예제. POST /generate의 prompt를 작성하기 전에 이를 읽으세요. 가이드는 SimpliGen에서 제공되고 캐시되므로 오프라인에서도 열린 각 가이드의 마지막 복사본에서도 작동합니다.
{
"presetId": "z-image-turbo",
"family": "z-image",
"familyName": "Z-Image",
"version": 1,
"generic": false,
"text": "# Z-Image prompting guide ...\n\n## Negative prompts in SimpliGen\n...\n\n## Notes for this preset\n\n..."
}| 필드 | 의미 |
|---|---|
family / familyName | 가이드 계열이 프리셋이 해석되는 대상과 그것의 표시 이름(GET /capabilities의 promptFamily 참고). |
version | 이 계열의 가이드 버전. |
generic | 이 프리셋에 대한 모델 특정 가이드가 없을 때 true. text는 이를 명백히 표시하고 일반적인 조언만 제공합니다. |
text | Markdown의 계열 가이드와 모든 가이드가 공유하는 ## Negative prompts in SimpliGen 섹션이 뒤따릅니다. 프리셋이 자신의 노트를 가지면 ## Notes for this preset 섹션이 추가됩니다. |
| HTTP | errorCode | 언제 |
|---|---|---|
| 404 | unknown_preset | 해당 id의 프리셋이 없습니다. |
| 503 | guides_unavailable | 가이드를 로드할 수 없고 캐시된 복사본이 없습니다: "Prompt guides could not be loaded. Check the internet connection and try again." |
작업
GET /jobs/:id
{
"job": {
"jobId": "gen_abc123",
"status": "completed",
"backend": "local",
"mediaType": "image",
"presetId": "z-image-turbo",
"projectId": "default",
"resultUrl": "local-file:///C:/Users/you/.../output.png",
"resultPath": "C:/Users/you/.../output.png",
"errorMessage": null,
"createdAt": "2026-06-25T20:00:00.000Z",
"completedAt": "2026-06-25T20:00:08.000Z"
}
}status는 queued, processing, completed, failed 중 하나입니다. 성공 시 resultPath는 디코드된 로컬 파일 경로입니다. 실패 시 errorMessage는 이유를 설명합니다. 알 수 없는 id는 404 job_not_found를 반환합니다.
GET /jobs
가장 최근의 25개 작업을 { "jobs": [ ...job... ] }로 반환합니다.
POST /jobs/:id/cancel
대기 중이거나 실행 중인 작업을 취소합니다. { "jobId", "status", "note?" }를 반환합니다. 이미 진행 중인 클라우드 작업은 여전히 서버에서 완료될 수 있습니다(note에서 표시됨).
프리셋 준비
로컬 프리셋은 첫 사용 시 모델 파일을 다운로드합니다. 미리 준비할 수 있습니다.
POST /presets/prepare
{ "presetId": "z-image-turbo", "mediaType": "image" }200 { "status": "already_installed" } 또는 202 { "status": "started" }를 반환합니다(다운로드는 백그라운드에서 실행).
GET /presets/prepare
진행 중인 다운로드를 반환합니다: { "downloads": [ ... ] }. 이것을 폴링하거나 GET /capabilities(localReady 관찰)를 폴링합니다. 프리셋이 준비될 때까지.
캐릭터
Character Studio도 스크립트 가능합니다. 캐릭터는 로컬 전용입니다(클라우드는 거부됨). 개념은 캐릭터를 참고하세요.
| 엔드포인트 | 목적 |
|---|---|
GET /characters | 캐릭터 나열. |
GET /characters/:id | 한 캐릭터 가져오기. |
GET /character-presets | 설치된 캐릭터 프리셋(기본/편집/i2v). |
GET /character-features | 사용 가능한 정체성/모양 기능 옵션. |
POST /characters | 캐릭터 생성(mode: "generate"를 설명에서 또는 "upload"를 업로드된 기본 이미지 핸들에서). |
POST /characters/:id/generate-image | 캐릭터의 이미지 생성({ prompt, aspect?, count?, presetId? }). |
POST /characters/:id/generate-frame | 단일 비디오 시작 프레임 생성. |
POST /characters/:id/animate | 캐릭터를 비디오로 애니메이션. |
POST /characters/:id/preset | 캐릭터의 기본 프리셋 설정. |
POST /characters/:id/enhance | 캐릭터 에셋 업스케일 또는 개선. 원본을 target: "base", jobId(이전 생성) 또는 handle(POST /uploads에서)과 정확히 하나로 이름을 지정합니다. 선택적: mediaType, presetId, scale, keepResolution, applyAsBase. |
모든 생성 엔드포인트는 GET /jobs/:id를 통해 폴링하는 jobId를 반환합니다. POST /generate와 정확히 동일합니다.
레시피
팩 및 프리셋에서 다단계 레시피(흐름)를 작성하세요. 구성 요소를 검색하고, 고급 사양에서 구성한 다음 선택적으로 게시하세요.
| 엔드포인트 | 목적 |
|---|---|
GET /recipe-blocks | 진입점과 단계로 사용 가능한 모든 프리셋, 포트 계약 포함. |
POST /recipes/validate | spec(구성+유효성 검사) 또는 config의 드라이 런, 저장 없음. validation을 반환합니다. |
POST /recipes | spec에서 구성하고 초안 저장. { recipeId, valid, errors, config }를 반환합니다. |
GET /recipes | 이 디바이스의 모든 레시피(Store에서 설치되거나 여기서 작성)를 입력(key, kind, label, required, options)과 단계 수로 나열합니다. |
GET /recipes/:id | 하나의 레시피, 전체 구성, 입력 및 readiness(각 단계: 실행하는 프리셋과 로컬로 설치되었는지 여부). |
POST /recipes/:id/run | 레시피 실행. 본문: { inputs: { key: value }, engine?: "local" | "cloud" | "auto" }. Subject 입력은 문자 또는 제품 id를 받고, 이미지/비디오/오디오 입력은 업로드 핸들을 받으며, 다른 모든 것은 일반 값을 받습니다. { runId, status: "running", engine, steps, cloudCost? }를 반환합니다. 클라우드 실행은 선불 가격이고 토큰의 사용량 상한에 계산됩니다. |
GET /recipes/:id/runs | 레시피의 최근 실행, 최신 우선. |
GET /recipe-runs/:id | 실행 상태: status(running, completed, failed, cancelled), steps(각각 상태, 작업 id 및 결과 경로) 및 마지막 미디어 단계가 완료되면 resultPath. |
POST /recipe-runs/:id/cancel | 실행 중지. 추가 단계는 시작되지 않습니다. 로컬 진행 중인 단계는 중단됩니다. |
POST /recipes/:id/publish | Creator Marketplace에 제출(연결된 계정 필요). |
제품 및 주체
레시피의 subject 입력은 문자 또는 제품을 받습니다. 제품은 다른 주체 유형입니다: 기본 사진이 있는 명명된 것으로, Product Studio 및 UGC 레시피에서 사용됩니다.
| 엔드포인트 | 목적 |
|---|---|
GET /subjects | 레시피가 받을 수 있는 모든 주체: 문자 및 제품(id, type, name, status). |
GET /products | 제품 나열. |
GET /products/:id | 하나의 제품 가져오기. |
POST /products | 업로드된 사진에서 제품 생성: { name, image: <upload handle>, description?, category? }. 설명 및 카테고리는 레시피 프롬프트에 짜여집니다. { productId, product }를 반환합니다. |
DELETE /products/:id | 제품 및 그 사진 제거. |
spec은 고급 설명입니다. 앱이 자동으로 포트, 단계간 미디어 체인 및 단계당 프롬프트 입력을 연결한 다음 검증합니다.
{
"spec": {
"name": "Product to spinning video",
"category": "product",
"steps": [
{ "preset": "krea2-pack:krea2-turbo" },
{ "preset": "wan-2.2-video-pack:wan-2.2-i2v" }
]
}
}{
"recipeId": "b1f2…",
"valid": true,
"errors": [],
"config": { "blocks": [ "…" ], "inputs": [ "…" ], "output": { "from": "n2.video" } }
}구성 및 저장에는 작성자 계정이 필요하지 않습니다. POST /recipes/:id/publish는 연결된 계정이 필요하고 사용자가 앱에서 연결할 때까지 not_connected를 반환합니다(needsConnect: true 포함). 같은 초안이 그 후 변경되지 않고 게시됩니다. 레시피가 사용하는 모든 프리셋은 배포 가능한 자사 팩에 속해야 합니다.
Video Studio
필름은 Video Studio 문서입니다: 오디오 트랙 위에 타임라인에서 클립(렌더할 샷). 모든 편집 경로는 { change, timeline }을 답변합니다: 무엇이 변경되었는지, 그리고 그 후의 필름의 타임라인(GET /films/:id가 답변하는 동일한 모양). 필름이 스튜디오에서 열려 있으면 변경이 라이브로 표시되고 Ctrl+Z로 취소됩니다. 닫힌 필름은 편집되고 저장됩니다.
클립은 경로에서 id, 이름 또는 숫자(타임라인에서의 순서, 가장 빨리 우선)로 이름이 지정됩니다. 시간은 초 또는 필름에 속도가 있으면 막대입니다: 위치는 3, { "seconds": 3 } 또는 { "bar": 5 }(막대 1은 첫 다운비트)이고, 길이는 5, { "seconds": 5 } 또는 { "bars": 2 }입니다.
| 경로 | 무엇을 합니다 |
|---|---|
GET /films?projectId= | 프로젝트의 필름(기본: 현재). |
POST /films | 필름 생성: name, 선택적 projectId, aspect(16:9, 9:16, 1:1), quality(480p, 720p, 1080p), renderOn(local, cloud), presets({ t2v, i2v, r2v }). 타임라인을 답변합니다. |
GET /films/:id | 타임라인. |
PATCH /films/:id | 필름 설정: aspect, quality, hires2x, renderOn, presets, subject, cast(이름 또는 id), location(이름, id 또는 null). |
POST /films/:id/tracks | 트랙 추가: upload(POST /uploads의 핸들), kind(singing, music, dialogue, effects), name, at. |
PATCH /films/:id/tracks/:track | at, muted, volume(0~1). |
POST /films/:id/tempo | 가장 긴 뮤트되지 않은 트랙에서 속도 감지 또는 track. { bpm, offset, track, timeline }을 답변합니다. |
POST /films/:id/clips | 클립 추가: at, length, name, lane. |
PATCH /films/:id/clips/:clip | shots(각각 { prompt, seconds, line, speaker, framing }), cast, location(필름의 "none" 드롭, "film" 다시 상속), link(fresh, continue, motion. none과 frame도 수락됨, fresh와 continue), hears([{ track, on }]), preset. |
POST /films/:id/clips/:clip/move | at, lane. |
POST /films/:id/clips/:clip/trim | length, trimIn(클립이 촬영 내에서 시작하는 위치. 0은 촬영의 시작). |
DELETE /films/:id/clips/:clip | 클립 제거. |
POST /films/:id/plan | 초안 배치(아래). |
POST /films/:id/fades | target(클립 또는 트랙), fadeIn, fadeOut. |
POST /films/:id/markers | at, name. |
POST /films/:id/export-range | from과 to(둘 다 필요) 또는 clear: true. |
POST /films/:id/renders | clips("stale", 기본값 또는 목록) 렌더링. 202를 답변하고 { started, held, credits } 즉시 또는 아무것도 렌더링할 필요가 없을 때 note가 있는 200. |
GET /films/:id/clips/:clip/takes | 클립의 테이크, 최신 우선. |
POST /films/:id/clips/:clip/take | generationId: 해당 테이크가 클립이 표시하는 것을 만듭니다. |
POST /films/:id/export | 필름을 이음. 201을 답변하고 { path, resultUrl, blanks }. |
초안 배치
POST /films/:id/plan
{
"mode": "append",
"cast": ["Kai", "Mira"],
"location": "Rooftop",
"clips": [
{ "bars": 2, "shots": [{ "prompt": "@Kai looks over the city", "framing": "wide" }] },
{ "bars": 2, "link": "continue",
"shots": [{ "prompt": "@Kai sings to camera", "line": "Neon rain", "speaker": "Kai", "framing": "close-up" }] },
{ "bars": 3, "location": "Neon Street", "cast": ["Mira"],
"shots": [{ "prompt": "@Mira walks through the rain", "seconds": 4 }, { "prompt": "she turns", "seconds": 3 }] }
]
}계획은 전체적으로 먼저 확인됩니다. 문제가 있는 계획은 400 invalid_plan을 답변하고 details.problems의 모든 문제(예: clip 2: ...처럼 클립이 앞에 붙음)를 답변하고 아무것도 변경하지 않습니다. mode: "replace"는 모든 클립을 바꾸고 클립이 테이크를 가질 때 거부됩니다. "discardTakes": true 제외.
렌더 및 사용량 상한
클라우드 렌더는 큐에 넣기 전에 가격이 책정되고 토큰의 사용량 상한에 계산됩니다: 상한 초과는 402 exceeds_spend_cap을 답변하고, 알 수 없는 가격은 503 cost_unknown을 답변합니다. 이전 클립에서 계속되는 클립은 한 번에 하나씩 렌더링되고 각각은 시작되는 테이크 후에 렌더링됩니다. 호출은 즉시 답변하고 GET /films/:id는 각 클립의 take: none, rendering, current, edited, longer, unknown(아직 알 수 없음) 또는 imported(가져온 비디오, 절대 렌더링 없음)을 표시합니다.
위치
| 경로 | 무엇을 합니다 |
|---|---|
GET /locations | 라이브러리의 위치: id, name, description, hasPicture. |
POST /locations | 그 사진에서 위치 생성: name, description 및 upload(핸들) 또는 fromJob(완료된 이미지 작업). |
사용량 상한
토큰이 사용량 상한을 가지면 클라우드 생성은 디스패치 전에 가격이 책정되고 남은 허용치를 초과하면 거부됩니다(402 exceeds_spend_cap). 비용을 확인할 수 없으면(클라우드 상태 사용 불가), 상한 토큰은 503 cost_unknown으로 닫히지 않습니다. 로컬 생성은 항상 크레딧 비용이 없습니다.
완전한 흐름
BASE=http://127.0.0.1:48199
AUTH="Authorization: Bearer sg-agent-..."
# 1. Pick a ready preset
curl -s $BASE/capabilities -H "$AUTH"
# 2. Generate
JOB=$(curl -s $BASE/generate -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"presetId":"z-image-turbo","mediaType":"image","prompt":"a red fox in the snow","options":{"aspectRatio":"16:9"}}' \
| jq -r .jobId)
# 3. Poll until done, then read resultPath
curl -s $BASE/jobs/$JOB -H "$AUTH" | jq '.job | {status, resultPath, errorMessage}'오류 코드
| HTTP | errorCode | 언제 |
|---|---|---|
| 400 | invalid_json | 본문이 유효한 JSON이 아닙니다. |
| 400 | invalid_options | 필수 필드가 누락되었거나 형식이 잘못되었습니다. |
| 400 | invalid_preset | 프리셋/팩/mediaType 불일치. |
| 400 | needs_* | 필수 입력(프롬프트, 이미지, 참조)이 누락되었습니다. |
| 400 | invalid_handle | 입력이 유효한 업로드 핸들이 아닙니다. |
| 400 | unsupported_backend | 프리셋이 외부 API에서 실행됩니다. |
| 400 | preset_not_installed | 로컬 백엔드가 선택되었지만 모델이 설치되지 않았습니다. |
| 400 | cloud_not_connected | 클라우드 백엔드가 선택되었지만 계정이 연결되지 않았습니다. |
| 400 | invalid_plan | 필름 계획에 문제가 있습니다. details.problems는 모두를 나열합니다. |
| 400 | no_tempo | 필름이 속도를 가지기 전에 막대에서의 시간. 먼저 속도를 감지하세요. |
| 400 | no_audio | 속도가 오디오 트랙이 없는 필름에 요청되었습니다. |
| 400 | no_pulse | 트랙에서 일정한 비트를 감지할 수 없습니다. |
| 401 | unauthorized | 누락되었거나 잘못된 토큰. |
| 402 | exceeds_spend_cap | 클라우드 비용이 토큰의 사용량 상한을 초과합니다. |
| 402 | exceeds_balance | 클라우드 잔액이 렌더를 커버하지 않습니다. |
| 403 | forbidden_host | 루프백이 아닌 Host 헤더. |
| 403 | studio_not_installed | Video Studio가 이 컴퓨터에 설치되지 않았습니다. |
| 404 | not_found / invalid_preset / job_not_found | 알 수 없는 경로, 프리셋 또는 작업. |
| 404 | unknown_preset | 프리셋이 아닌 id로 GET /prompt-guide/:presetId. |
| 404 | film_not_found | 해당 id의 필름이 없습니다. |
| 404 | clip_not_found | 해당 id, 이름 또는 숫자의 클립이 없습니다. |
| 404 | track_not_found | 해당 이름 또는 id의 트랙이 없습니다. |
| 404 | cast_not_found | 라이브러리에서 해당 이름 또는 id의 문자가 없습니다. |
| 404 | location_not_found | 해당 이름 또는 id의 위치가 없거나 아직 사진이 없습니다. |
| 409 | clips_not_ready | 렌더가 여전히 필요한 클립을 위해 내보내기가 요청되었습니다. details.clips가 이름을 지정합니다. |
| 413 | asset_too_large | 100MB 초과 업로드. |
| 503 | guides_unavailable | 프롬프트 가이드를 로드할 수 없고 캐시되지 않았습니다. |
| 503 | cost_unknown | 상한 토큰. 클라우드 비용을 확인할 수 없습니다. |
| 503 | studio_busy | SimpliGen 창에 도달할 수 없거나 시간 내에 응답하지 않았습니다. 타임아웃된 경우 변경이 여전히 생성될 수 있습니다: 다시 시도하기 전에 필름을 읽으세요. |
| 500 | internal_error | 예기치 않은 서버 오류. |