돌아가기 3단계 - 라벨링 설정
프로젝트에서 사용할 라벨링 유형을 선택하고, 분류 클래스 및 속성을 설정하는 단계입니다.

## 라벨링 유형 선택

라벨링 유형은 라벨링 방법을 지칭하며, 단독 또는 복합으로 선택하여 라벨링 작업을 진행할 수 있습니다.

:::note[어노테이터별 라벨링 유형]
사용 가능한 라벨링 유형은 프로젝트 생성 시 선택한 어노테이터 카테고리에 따라 다릅니다.
:::

## 어노테이터별 라벨링 유형 목록

각 어노테이터 카테고리별로 사용 가능한 라벨링 유형(API 값)은 다음과 같습니다.

| 어노테이터   | 사용 가능한 라벨링 유형                                                                                            |
| ------------ | ------------------------------------------------------------------------------------------------------------------ |
| **이미지**   | `annotationGroup`, `classification`, `bounding_box`, `polygon`, `polyline`, `keypoint`, `relation`, `segmentation` |
| **비디오**   | `annotationGroup`, `classification`, `segmentation`, `bounding_box`                                                |
| **오디오**   | `annotationGroup`, `classification`, `segmentation`                                                                |
| **PCD**      | `3d_bounding_box`, `3d_segmentation`                                                                               |
| **텍스트**   | `classification`, `relation`, `named_entity`                                                                       |
| **프롬프트** | `classification`, `prompt`, `answer`                                                                               |

## 프롬프트 어노테이터 추가 설정

프롬프트 어노테이터를 선택한 경우, LLM(대형 언어모델) 관련 추가 설정이 제공됩니다.

| 항목                   | 설명                                    |
| ---------------------- | --------------------------------------- |
| **LLM API 활성화**     | 대형 언어모델 API 사용 여부             |
| **LLM 모델 추가**      | Gemini, Mistral, ChatGPT 등 모델 선택   |
| **사전 맥락 프롬프트** | LLM에 제공할 사전 컨텍스트 설정         |
| **메타정보 토픽 키**   | 메타 데이터에서 토픽으로 사용할 키 입력 |

## 클래스 설정

클래스는 라벨링할 대상을 카테고리화하는 개념입니다. 선택한 각 라벨링 유형별로 클래스를 정의합니다.

| 항목          | 설명                       | 비고                        |
| ------------- | -------------------------- | --------------------------- |
| **색상**      | 어노테이터에서 표시할 색상 | 시각적 구분용               |
| **코드**      | 데이터베이스 저장용 명칭   | 영문/숫자만 가능, 변경 불가 |
| **이름**      | 어노테이터에 노출할 이름   | 작업자에게 표시             |
| **기본 여부** | 자동 선택 설정             | 기본 클래스 지정            |

:::caution[코드 변경 불가]
클래스 코드는 데이터베이스 저장에 사용되므로 한번 설정하면 변경할 수 없습니다. 영문과 숫자만 사용할 수 있습니다.
:::

## 속성 설정

각 클래스에 대해 속성을 추가하여 라벨링 시 추가 정보를 입력받을 수 있습니다.

| 항목          | 설명                     |
| ------------- | ------------------------ |
| **코드**      | 속성 식별용 코드         |
| **이름**      | 작업자에게 표시할 속성명 |
| **필수 여부** | 라벨링 시 필수 입력 여부 |
| **위젯 유형** | 입력 방식 선택           |

### 위젯 유형

| 위젯                       | 설명                      |
| -------------------------- | ------------------------- |
| **단일 선택 (Select box)** | 드롭다운에서 하나 선택    |
| **단일 선택 (Radio)**      | 라디오 버튼으로 하나 선택 |
| **다중 선택**              | 여러 개 동시 선택 가능    |
| **텍스트**                 | 자유 텍스트 입력          |

## 옵션 설정

단일 선택 및 다중 선택 위젯에는 옵션(선택지)을 추가합니다.

| 항목          | 설명                     |
| ------------- | ------------------------ |
| **색상**      | 옵션 표시 색상           |
| **코드**      | 옵션 식별용 코드         |
| **이름**      | 작업자에게 표시할 옵션명 |
| **기본 여부** | 자동 선택 설정           |

### 클래스-속성-옵션 구조 예시

```
자동차 (클래스)
└── 종류 (속성)
    ├── 승용차 (옵션)
    ├── 승합차 (옵션)
    └── 화물차 (옵션)
```

## 대표 속성

어노테이션의 색상, 모양, 라벨 표시 기준이 되는 속성을 대표 속성으로 설정할 수 있습니다.

## API 흐름

"다음 단계" 클릭 시 라벨링 설정 데이터를 `configuration` 객체로 변환하여 서버에 전송합니다.

### 1. 사용 가능한 라벨링 유형 조회 — `GET /projects/categories/`

페이지 진입 시 어노테이터 카테고리별 사용 가능한 라벨링 유형 목록을 조회합니다.

**Request**

```
GET /projects/categories/
```

**Response (200 OK)**

```json
{
  "image": {
    "annotation_types": [
      {
        "name": "bounding_box",
        "name_display": "바운딩박스",
        "smart_tools": [...]
      },
      {
        "name": "polygon",
        "name_display": "폴리곤",
        "smart_tools": []
      }
    ]
  },
  "video": { ... },
  "audio": { ... }
}
```

### 2. 단계별 데이터 검증 — `POST /projects/`

"다음 단계" 클릭 시 라벨링 설정을 `phase: 3`과 함께 `configuration` 객체로 전송합니다.

**Request**

```json
POST /projects/

{
  "phase": 3,
  "configuration": {
    "schema_type": "dm_schema",
    "classification": {
      "bounding_box": {
        "id": "uuid-1234",
        "representativeCodes": ["class"],
        "classification_schema": [
          {
            "id": "cls-001",
            "code": "car",
            "name": "자동차",
            "value": "#FF0000",
            "is_default": true,
            "customFields": {},
            "attributes": [
              {
                "code": "vehicle_type",
                "name": "종류",
                "widget": "select",
                "is_required": true,
                "options": [
                  {
                    "code": "sedan",
                    "name": "승용차",
                    "color": "#FF6B6B",
                    "is_default": true,
                    "customFields": {}
                  },
                  {
                    "code": "suv",
                    "name": "SUV",
                    "color": "#4ECDC4",
                    "is_default": false,
                    "customFields": {}
                  }
                ]
              }
            ]
          }
        ]
      },
      "classification": {
        "id": "uuid-5678",
        "representativeCodes": [],
        "classification_schema": [...]
      }
    }
  }
}
```

#### configuration 객체 구조

| 필드             | 타입     | 설명                                            |
| ---------------- | -------- | ----------------------------------------------- |
| `schema_type`    | `string` | 스키마 유형. `"dm_schema"` 또는 `"json_schema"` |
| `classification` | `object` | 라벨링 유형별 분류 설정. 키는 라벨링 유형 코드  |

#### classification 항목 구조 (라벨링 유형별)

| 필드                    | 타입       | 설명                |
| ----------------------- | ---------- | ------------------- |
| `id`                    | `string`   | 고유 식별자 (UUID)  |
| `representativeCodes`   | `string[]` | 대표 속성 코드 목록 |
| `classification_schema` | `array`    | 클래스 목록         |

#### classification_schema 항목 (클래스)

| 필드           | 타입      | 필수 | 설명                               |
| -------------- | --------- | ---- | ---------------------------------- |
| `id`           | `string`  | 필수 | 클래스 고유 식별자                 |
| `code`         | `string`  | 필수 | 클래스 코드 (영문/숫자, 변경 불가) |
| `name`         | `string`  | 필수 | 클래스 표시명                      |
| `value`        | `string`  | 필수 | 클래스 색상 (HEX)                  |
| `is_default`   | `boolean` | 필수 | 기본 클래스 여부                   |
| `customFields` | `object`  | 선택 | 커스텀 필드 (`shape` 등)           |
| `attributes`   | `array`   | 필수 | 속성 목록                          |

#### attributes 항목 (속성)

| 필드          | 타입      | 필수 | 설명                                                               |
| ------------- | --------- | ---- | ------------------------------------------------------------------ |
| `code`        | `string`  | 필수 | 속성 코드                                                          |
| `name`        | `string`  | 필수 | 속성 표시명                                                        |
| `widget`      | `string`  | 필수 | 위젯 유형. `"select"` \| `"radio"` \| `"multi_select"` \| `"text"` |
| `is_required` | `boolean` | 필수 | 필수 입력 여부                                                     |
| `options`     | `array`   | 필수 | 옵션 목록 (`text` 위젯의 경우 빈 배열)                             |

#### options 항목 (옵션)

| 필드           | 타입      | 필수 | 설명            |
| -------------- | --------- | ---- | --------------- |
| `code`         | `string`  | 필수 | 옵션 코드       |
| `name`         | `string`  | 필수 | 옵션 표시명     |
| `color`        | `string`  | 필수 | 옵션 색상 (HEX) |
| `is_default`   | `boolean` | 필수 | 기본 선택 여부  |
| `customFields` | `object`  | 선택 | 커스텀 필드     |

#### 프롬프트 어노테이터 추가 필드

프롬프트 카테고리의 경우 `configuration`에 아래 필드가 추가됩니다.

| 필드                 | 타입       | 설명                                             |
| -------------------- | ---------- | ------------------------------------------------ |
| `gptOptions`         | `string[]` | 활성화할 LLM 옵션 목록                           |
| `llmItems`           | `array`    | LLM 모델 설정 목록 (Gemini, Mistral, ChatGPT 등) |
| `priorContextPrompt` | `string`   | 사전 맥락 프롬프트                               |
| `topicKeyInMeta`     | `string`   | 메타정보 토픽 키                                 |

**Response (201 Created)**

검증 성공 시 configuration 데이터가 반환됩니다.

**Error Response (400 Bad Request)**

```json
{
  "configuration": ["유효하지 않은 설정입니다."]
}
```

### 3. 임시 저장 — `POST /drafts/`

검증 성공 후 이전 단계 데이터와 병합하여 Draft에 누적 저장합니다.

**Request**

```json
POST /drafts/

{
  "target": "CREATE",
  "data": {
    "phase": 3,
    "category": "image",
    "title": "자동차 객체 검출 프로젝트",
    "access_level": "public",
    "data_collection": 1,
    "configuration": {
      "schema_type": "dm_schema",
      "classification": { ... }
    }
  }
}
```

:::note[Draft 누적 저장]
1~2단계 데이터(title, access_level, data_collection 등)와 3단계 데이터(configuration)가 병합되어 저장됩니다.
:::

## 다음 단계로 이동

라벨링 설정을 완료한 후 **"다음 단계"** 버튼을 클릭하면 위 API 흐름을 거쳐 [작업 설정 단계](./workflow-setup)로 이동합니다.