빠른 시작
YouTube는 이 단계에서 변경되지 않습니다.AI 분류는 내부 속성 후보를 저장할 뿐입니다. 실제 재생목록 변경은 규칙 계산, 미리보기, 사용자 승인, 적용 단계를 거칩니다.
요청 JSON
앱의 exporter가 생성하는 형식입니다. 사용자는 이 구조를 직접 편집할 필요가 없습니다.
값을 결정하는 기준instructions.allowedAttributes는 AI가 사용할 수 있는 속성 키를 제한하고, instructions.userClassificationCriteria는 문자열 속성에 어떤 값을 사용할지 정하는 사용자 기준입니다. AI는 두 값을 가장 먼저 확인하고 사용자 기준을 최우선으로 적용해야 합니다.
{
"format": "youtube-music-organizer-classification-request",
"schemaVersion": 1,
"createdAtMillis": 1799708400000,
"instructions": {
"task": "Classify each track only when evidence is sufficient. Use UNKNOWN by omitting uncertain attributes.",
"allowedAttributes": [
"contentType",
"longForm",
"mood",
"scene",
"source",
"style",
"vcScope",
"voice",
"voicebank"
],
"requiredOutputFormat": "youtube-music-organizer-classification-pack",
"requiredSchemaVersion": 1,
"confidenceRange": "0.0..1.0",
"minimumAcceptedConfidence": 0.9,
"doNotInventYoutubeIds": true,
"userClassificationCriteria": "동인 음악은 확인 가능한 서클·앨범·원작 근거가 있을 때만 scene=doujin으로 분류",
"outputExample": {
"format": "youtube-music-organizer-classification-pack",
"schemaVersion": 1,
"packVersion": "user-1",
"classifications": [
{
"youtubeId": "copy from tracks",
"attributes": {
"scene": "doujin",
"source": "touhou"
},
"confidence": 0.95,
"evidence": [
"short evidence"
]
}
]
}
},
"tracks": [
{
"youtubeId": "fake-uni-song",
"title": "Into the UNIverse",
"artistChannel": "Sample Producer",
"durationSeconds": 226,
"currentPlaylists": [
"UNI"
],
"note": "동인음악인지 확인"
}
]
}
요청 최상위 키
| 키 | 타입 | 출력 여부 | 설명 | 값/예시 |
|---|---|---|---|---|
format | string | 항상 | 요청 파일 식별자 | youtube-music-organizer-classification-request |
schemaVersion | integer | 항상 | 요청 스키마 버전 | 1 |
createdAtMillis | integer | 항상 | 생성 시각, Unix epoch 밀리초 | 1799708400000 |
instructions | object | 항상 | AI가 지켜야 할 출력 규칙과 앱 설정 | 아래 지침 객체 |
tracks | array | 항상 | 분류 요청 곡 목록. 최소 1곡 | 곡 객체 배열 |
instructions 하위 키
| 키 | 타입 | 출력 여부 | 설명 | 값/예시 |
|---|---|---|---|---|
task | string | 항상 | 근거가 충분한 속성만 분류하라는 기본 작업 지침 | Classify each track... |
allowedAttributes | string[] | 항상 | 결과 attributes에서 사용할 수 있는 키의 전체 목록 | 현재 9개 허용 키 |
requiredOutputFormat | string | 항상 | 결과 파일의 필수 format | youtube-music-organizer-classification-pack |
requiredSchemaVersion | integer | 항상 | 결과 파일의 필수 스키마 버전 | 1 |
confidenceRange | string | 항상 | confidence 허용 범위를 표현한 지침 | 0.0..1.0 |
minimumAcceptedConfidence | number | 항상 | RuleEngine이 자동으로 사용할 최소 confidence | 0.9 |
doNotInventYoutubeIds | boolean | 항상 | 요청에 없는 ID 생성 금지 | true |
userClassificationCriteria | string | 항상 | 사용자가 앱에서 설정한 분류 기준. 비어 있을 수 있으며, 값이 있으면 일반 예시보다 우선 | scene=doujin은 확인 가능한 근거가 있을 때만... |
outputExample | object | 항상 | 현재 앱이 요구하는 결과 객체 예시 | classification pack 예시 |
tracks[] 키
| 키 | 타입 | 출력 여부 | 설명 | 예시 |
|---|---|---|---|---|
youtubeId | string | 항상 | 원본 YouTube 영상 식별자. 결과에 그대로 복사 | fake-uni-song |
title | string | 항상 | 곡/영상 제목 | Into the UNIverse |
artistChannel | string | 항상 | 아티스트 또는 채널 | Sample Producer |
durationSeconds | integer | 항상 | 길이(초) | 226 |
currentPlaylists | string[] | 항상 | 현재 포함된 실제 YouTube 재생목록 | ["UNI"] |
note | string | 항상 | 사용자가 입력한 곡별 메모. 없으면 빈 문자열 | 동인음악인지 확인 |
결과 JSON
앱의 importer가 읽는 전체 형식입니다. 실제 파일에는 JSON 앞뒤의 설명이나 Markdown 코드 펜스를 넣지 마세요.
{
"format": "youtube-music-organizer-classification-pack",
"schemaVersion": 1,
"packVersion": "docs-example-1",
"classifications": [
{
"youtubeId": "fake-uni-song",
"attributes": {
"voice": "vocal_synth",
"voicebank": "UNI",
"scene": "doujin",
"style": "electronic",
"source": "original",
"mood": "bright",
"contentType": "song",
"vcScope": true,
"longForm": false
},
"confidence": 0.95,
"evidence": [
"사용자 메모와 곡 메타데이터를 함께 확인"
]
}
]
}
결과 최상위 키
| 키 | 타입 | 필수 | 검증 규칙 | 예시 |
|---|---|---|---|---|
format | string | 필수 | 고정 문자열과 정확히 일치 | youtube-music-organizer-classification-pack |
schemaVersion | integer | 필수 | 1만 지원 | 1 |
packVersion | string | 필수 | 공백이 아니며 100자 이하 | personal-2026-09-14-1 |
classifications | array | 필수 | 1~20,000개 결과 객체 | 아래 객체 배열 |
classifications[] 키
| 키 | 타입 | 필수 | 검증 규칙 | 예시 |
|---|---|---|---|---|
youtubeId | string | 필수 | 1~128자. 요청 값을 변경하지 않고 복사 | fake-uni-song |
attributes | object | 필수 | 허용 키만 사용하며 비어 있지 않아야 함 | {"scene":"doujin"} |
confidence | number | 필수 | 0.0~1.0의 유한한 숫자 | 0.95 |
evidence | string[] | 선택 | 생략 시 빈 배열. 최대 20개, 각 500자 이하 | ["사용자 메모와 메타데이터가 일치"] |
속성/허용 값
현재 validator는 아래 9개 키만 허용합니다. 문자열 속성은 고정 enum이 아니며 사용자의 분류 기준을 따르는 200자 이하 값입니다. 근거가 부족하면 UNKNOWN을 쓰지 말고 해당 키를 생략하세요.
| 키 | 타입 | 의미 | 예시 값 |
|---|---|---|---|
voice | string | 보컬 유형 | vocal_synth, human, instrumental |
voicebank | string | 보이스뱅크 또는 음성 캐릭터 | Hatsune Miku, UNI |
scene | string | 제작·유통 장면 | doujin, commercial, indie |
style | string | 음악 스타일 | electronic, rock, denpa |
source | string | 원작·프랜차이즈 또는 출처 | touhou, original |
mood | string | 분위기 | bright, dark |
contentType | string | 콘텐츠 형태 | song, mix, album, ost, clip |
vcScope | boolean | VC 관리 범위 포함 여부 | true |
longForm | boolean | 긴 형식 콘텐츠 여부 | false |
예시 값은 고정 enum이 아닙니다. 문자열 값은 요청 파일의 userClassificationCriteria를 우선해 정하고, 비어 있지 않은 경우에만 저장합니다. 공식 결과 파일에서 vcScope와 longForm은 따옴표 없는 JSON boolean만 사용합니다.
검증 규칙
- 결과 파일은 JSON 객체 하나여야 합니다. 설명문과
```json코드 펜스를 포함하지 않습니다. format,schemaVersion,packVersion,classifications이름을 바꾸거나 삭제하지 않습니다.- 원본
youtubeId를 그대로 사용하고, 요청에 없는 곡을 임의로 추가하지 않습니다. confidence는 문자열이 아니라0.0~1.0숫자로 작성합니다.- 허용되지 않은 속성 키를 만들지 않습니다. 문자열 속성은 200자 이하, boolean 속성은 true/false만 사용합니다.
- 확실하지 않은 속성은 생략합니다. 한 결과의
attributes가 완전히 비어 있으면 그 곡 결과 자체를 제외합니다. - 결과 파일은 10MB 이하, 분류 결과는 최대 20,000곡, 근거는 곡당 최대 20개입니다.
자동 사용 기준: confidence ≥ 0.90. 0.90 미만 결과도 가져오지만 RuleEngine에는 즉시 사용하지 않고 사용자 검토 대상으로 남깁니다. 사용자가 승인하면 신뢰도 1.0으로 저장됩니다.
AI 분류 지침
- 곡 하나에 여러 속성이 동시에 존재할 수 있습니다. 속성 하나만 고르는 단일 분류 문제가 아닙니다.
- 태그/내부 속성과 실제 YouTube 재생목록은 다른 개념입니다. 분류 결과 JSON에는 재생목록 변경을 넣지 않습니다.
currentPlaylists는 중요한 힌트지만 절대적인 정답은 아닙니다.- 사용자 메모와
userClassificationCriteria를 우선합니다. - 확실하지 않으면 억지로 추측하지 않고 해당 속성을 생략하며 confidence를 과장하지 않습니다.
longForm이나 Minor III 같은 관리 개념을 일반 음악 장르와 혼동하지 않습니다. Minor III는 속성이 아니라 사용자 재생목록 이름일 수 있습니다.- 한 곡은 여러 재생목록에 중복 배치될 수 있습니다.
- AI가 기존 YouTube 재생목록에서 곡을 자동 제거한다고 가정하지 않습니다. 자동 제거는 이 앱의 기본 동작이 아닙니다.
규칙 제작 지침
현재 앱은 규칙 JSON 가져오기를 지원하지 않습니다. AI가 규칙을 제안할 때는 아래 실제 Rule Builder 항목만 사용하고, 사용자가 앱 화면에 입력할 수 있는 형태로 설명해야 합니다.
조건 모델
| 구분 | 실제 지원 값 | 설명 |
|---|---|---|
| 조건 결합 | ALL, ANY | 모든 조건 만족 / 하나라도 만족 |
| field | YOUTUBE_ID, TITLE, ARTIST, CHANNEL, ALBUM, DURATION, CURRENT_PLAYLIST, ATTRIBUTE | 제목, 아티스트/채널, 앨범, 초 단위 길이, 현재 재생목록, 내부 속성 |
| operator | EQUALS, CONTAINS, STARTS_WITH, REGEX, GREATER_OR_EQUAL, LESS_OR_EQUAL, IN_PLAYLIST | 같음, 포함, 시작함, 정규식, 이상, 이하, 재생목록에 있음 |
| 속성 조건 값 | ATTRIBUTE_KEY=value | 예: SCENE=doujin. 키는 위 9개 AttributeKey의 대문자 이름 사용 |
실행 모델
| action | 대상 | 동작 |
|---|---|---|
ADD_PLAYLIST | 실제 재생목록 이름 | 재생목록 추가 추천 |
BLOCK_PLAYLIST | 실제 재생목록 이름 | 해당 재생목록 추가 차단 |
SUGGEST_REMOVE | 실제 재생목록 이름 | 제거를 추천하며 자동 제거하지 않음 |
EXCLUDE | 제외 사유 | Organizer 정리 대상에서 제외 |
LONG_FORM | 없음 | LONG_FORM=true 속성 설정 |
SET_ATTRIBUTE | AttributeKey + 값 | 내부 속성 설정 |
지원되는 규칙 예시
사용자 직접 규칙은 자동 분류 추론보다 우선합니다. 같은 우선순위에서는 차단 결과가 추가 결과보다 우선합니다.
AI에게 이 지침을 함께 전달하세요
앱에서 만든 요청 파일을 첨부한 뒤 아래 내용을 함께 보냅니다.
오류 해결
| 앱 메시지 | 확인할 내용 |
|---|---|
| JSON 형식이 아닙니다 | 코드 펜스와 설명문을 제거하고 {부터 }까지의 JSON 객체만 저장합니다. |
| 분류 결과 파일이 아닙니다 | format 고정 문자열을 확인합니다. |
| 지원하지 않는 스키마 버전입니다 | schemaVersion을 숫자 1로 설정합니다. |
| packVersion이 필요합니다 | 100자 이하의 비어 있지 않은 버전 문자열을 넣습니다. |
| confidence가 잘못됐습니다 | 따옴표 없는 0.0~1.0 숫자인지 확인합니다. |
| 알 수 없는 속성이 있습니다 | 속성 키를 이 문서의 9개 허용 키로 제한합니다. |
| 사용할 속성이 없습니다 | 근거 있는 속성을 하나 이상 넣거나 해당 곡 결과를 배열에서 제거합니다. |
| 파일이 너무 큽니다 | 결과 파일을 10MB 이하로 나눕니다. |