시작하기
에이전트를 처음 설정한다면, 먼저 Youka CLI를 설치한 다음 Youka karaoke 스킬을 설치하세요:에이전트에 프롬프트 주기
CLI와 스킬을 설치한 뒤에는, 에이전트에 다음처럼 직접 작업을 지시할 수 있습니다:운영 규칙
항상 --json 사용
CLI에서는 항상
--json을 전달하세요. API에서는 항상 Accept: application/json을 설정하세요. 사람이 읽는 출력은 절대 파싱하지 마세요.항상 멱등성 키 전송
모든 쓰기 작업에는 안정적인 멱등성 키를 포함해야 하며, 타임아웃 이후 재시도하더라도 작업이 중복 생성되지 않고 원래 결과를 반환해야 합니다.
영속 상태를 다시 읽기
오래된 변경 응답을 신뢰하지 마세요. 종료(terminal)된 작업 이후에는 최종 상태를 얻기 위해 프로젝트 또는 익스포트를 다시 읽으세요.
백오프로 폴링
2–3초 간격으로 시작하세요. 긴 작업은 지수적으로 백오프하세요.
429 응답을 준수하세요.
출력 계약
--json 모드에서 모든 CLI 명령은 stdout에 정확히 하나의 엔벨로프를 출력합니다.
성공:
| Code | Meaning | Retry? |
|---|---|---|
0 | 성공. | N/A |
1 | 런타임 오류(네트워크, API, 렌더링). | error.retryable 확인. |
2 | 잘못된 입력(잘못된 플래그, 읽을 수 없는 페이로드). | 아니오 — 입력을 수정하세요. |
엔드-투-엔드 워크플로
정석(캐노니컬) 에이전트 워크플로는 다음과 같습니다: 프로젝트 생성, 대기, 익스포트, 결과 다운로드. 아래는 CLI와 SDK 구현을 모두 포함한 전체 패턴입니다.폴링 가이드
대부분의 쓰기 작업은 SDK에서 operation handle을 반환합니다.client.projects.wait(...) 및 client.exports.wait(...)를 우선 사용하고, 명시적으로 저수준 task 접근이 필요할 때만 client.tasks.*로 내려가세요.
| Job type | Recommended initial interval | Max wait |
|---|---|---|
| Project create (stems + lyrics sync) | 3 s | 15 min |
| Stem separation only | 3 s | 10 min |
| Lyrics sync only | 2 s | 5 min |
| Export render | 3 s | 30 min |
--wait가 폴링을 대신 처리합니다. SDK에서는 wait helper가 기본으로 2 s 간격을 사용하며 pollIntervalMs를 받습니다.
멱등성 키
모든 생성 및 업데이트 작업은 멱등성 키를 지원합니다. 규칙:- 논리적 변경(mutation) 단위로 안정적이고, 유일하며, 결정적인 키를 사용하세요. 좋음:
create-song-${sourceHash}. 나쁨: 재시도마다 새 UUID 생성. - 재시도에서는 동일한 키를 재사용하세요. 서버는 재전송을 인식하고 원래 결과를 반환합니다.
- 키는 계정 단위로 스코프되며 24시간 후 만료됩니다.
- 서버가
IDEMPOTENT_REPLAY_IN_PROGRESS(HTTP 202)를 반환하면 원래 요청이 아직 실행 중입니다. 기다린 다음 동일한 키로 재시도하세요.
오류 복구
error.code와 error.retryable을 기준으로 분기하세요. 흔한 케이스:
| Code | Cause | Action |
|---|---|---|
INVALID_REQUEST | 요청 바디가 스키마 검증에 실패했습니다. | 페이로드를 수정하세요. 재시도 없음. |
UNAUTHORIZED | API 키가 없거나 유효하지 않습니다. | 호출자에게 전달하세요. 재시도 없음. |
NOT_FOUND | 리소스가 없거나 접근 권한이 없습니다. | 재시도 없음. |
CONFLICT (409) | 버전 충돌 또는 멱등성 충돌. | 동일한 멱등성 키로 재시도하세요. |
TOO_MANY_REQUESTS (429) | 레이트 리밋. | Retry-After 또는 30 s 기준으로 백오프하세요. |
INTERNAL_SERVER_ERROR (500) | 일시적인 서버 장애. | 백오프와 함께 최대 3회 재시도하세요. |
IDEMPOTENT_REPLAY_IN_PROGRESS (202) | 이전 요청이 아직 실행 중입니다. | 기다렸다가 동일한 키로 재시도하세요. |
TASK_FAILED | 비동기 작업이 실패로 종료되었습니다. | error.task.error를 호출자에게 전달하세요. 재시도 없음. |
TASK_TIMED_OUT | 비동기 작업이 제한 시간을 초과했습니다. | 1회 재시도는 안전합니다. |
변경 가능한 필드 찾기
프리셋을 변경하기 전에 프리셋 스키마를 가져와서 모델이 유효한 필드와 값 타입을 알 수 있도록 하세요:youka project settings <id> --body ...를 통해 최소한의 업데이트 바디만 제출하는 방식을 권장합니다.
에이전트 세션당 한 번만 가져오고 결과를 캐시하세요.
병렬 에이전트
여러 에이전트가 동일 계정에 대해 동시에 실행될 때:- 멱등성 키를 에이전트 ID와 논리적 변경 둘 다에 스코프하세요:
agent-${agentId}-create-${sourceHash}. 이렇게 하면 한 에이전트의 재시도가 다른 에이전트의 새 요청과 충돌하는 것을 방지합니다. - 읽기 작업은 제한 없이 수행하세요 —
GET요청은 비용이 저렴하고 부작용이 없습니다. - 정렬된 익스포트 히스토리가 필요하다면 프로젝트별로
POST /projects/{projectId}/exports에 대해 단일 큐를 사용하세요. 그렇지 않으면 익스포트가 순서 없이 도착할 수 있습니다.
다음 단계
- CLI global options — 에이전트가 사용할 수 있는 모든 플래그
- SDK errors — 전체 오류 클래스 레퍼런스
- API async jobs — 폴링 계약
- API idempotency — 멱등성 계약
