---
title: "스킬셋"
slug: "clovastudio-generateskillsetfinalanswer"
tags: ["CLOVA Studio"]
updated: 2026-04-23T08:55:44Z
published: 2026-04-23T09:02:20Z
---

> ## Documentation Index
> Fetch the complete documentation index at: https://api.ncloud-docs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 스킬셋

<p class="platform-info type-classic-vpc">Classic/VPC 환경에서 이용 가능합니다.</p>

특정 스킬셋의 API를 호출하여 적절한 답변을 생성합니다.

## 요청<a name="요청"></a>
요청 형식을 설명합니다. 요청 형식은 다음과 같습니다. 

| 메서드 | URI |
| --- | --- |
| POST | /v1/skillsets/{skillset-id}/versions/{version}/final-answer |

### 요청 헤더<a name="요청헤더"></a>
CLOVA Studio API에서 공통으로 사용하는 헤더에 대한 정보는 [CLOVA Studio 요청 헤더](/docs/ai-naver-clovastudio-summary#요청헤더)를 참조해 주십시오.

### 요청 경로 파라미터<a name="요청경로파라미터"></a>

요청 경로 파라미터에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| `skillset-id` | String | Required | 스킬셋 아이디 |
| `version` | Integer | Required | 스킬셋 버전<ul><li>1 ≤ `version`</li></ul> |

### 요청 바디<a name="요청바디"></a>

요청 바디에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| `query` | String | Required | 질의 내용 |
| `tokenStream` | Boolean | Optional | 답변 생성 시 토큰 스트리밍 사용 여부<ul><li>`false` \| `true`<ul><li>`false`: 사용 안 함</li><li>`true`: 사용</li></ul></li></ul> |
| `chatHistory` | Array | Optional | 답변 생성 이력: [chatHistory](#chatHistory) |
| `requestOverride` | Object | Optional | 모든 API에 적용할 호출 옵션 |
| `requestOverride.baseOperation` | Object | Optional | 모든 API에 적용할 호출 옵션 정보 |
| `requestOverride.baseOperation.header` | Object | Optional | 모든 API에 적용할 요청 헤더 |
| `requestOverride.baseOperation.query` | Object | Optional | 모든 API에 적용할 요청 쿼리 파라미터 |
| `requestOverride.baseOperation.requestBody` | Object | Optional | 모든 API에 적용할 요청 바디<ul><li>GET 메서드 API인 경우 미적용</li></ul> |
| `requestOverride.operations` | Array | Optional | 특정 API에 적용할 호출 옵션: [operations](#operations) |

#### `chatHistory` <a name="chatHistory"></a>
`chatHistory`에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| `role` | Enum | Required | 대화 메시지 역할<ul><li>`user` \| `assistant`<ul><li>`user`: 사용자의 발화 또는 질문</li><li>`assistant`: 모델의 답변</li></ul></li></ul> |
| `content` | String | Required | 대화 메시지 내용 |

#### `operations` <a name="operations"></a>
`operations`에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| `operationId` | String | Conditional | 특정 API의 오퍼레이션 아이디<ul><li>`operations`를 입력할 경우 필수 입</li></ul> |
| `header` | Object | Optional | 특정 API에 적용할 요청 헤더 |
| `query` | Object | Optional | 특정 API에 적용할 요청 쿼리 파라미터 |
| `requestBody` | Object | Optional | 특정 API에 적용할 요청 바디<ul><li>GET 메서드 API인 경우 미적용</li></ul> |

### 요청 예시<a name="요청예시"></a>

요청 예시는 다음과 같습니다. 

```shell
curl --location --request POST 'https://clovastudio.stream.ntruss.com/v1/skillsets/{skillset-id}/versions/{version}/final-answer' \
--header 'Authorization: Bearer {API Key}' \
--header 'X-NCP-CLOVASTUDIO-REQUEST-ID: {Request ID}' \
--header 'Content-Type: application/json' \
--data '{  
    "query": "내일 날씨는 어때?",
    "tokenStream": true,
    "chatHistory": [
        {
            "role": "user",
            "content": "오늘 서울 날씨 어때?"
         },
        {
            "role": "assistant",
            "content": "폭풍전야입니다."
         }
     ],
     "requestOverride": {
        "baseOperation": {
            "query": {
                "appid": "appid-11223344"
                }
            }
        }
    }'
```

## 응답<a name="응답"></a>

응답 형식을 설명합니다.

### 응답 헤더<a name="응답헤더1"></a>

응답 헤더에 대한 설명은 다음과 같습니다.

| 헤더 | 필수 여부 | 설명 |
| --- | --- | --- |
| `Content-Type` | - | 응답 데이터의 형식<ul><li>`application/json`</li></ul> |

### 응답 바디<a name="응답바디1"></a>

응답 바디에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| `status` | Object | -  | [응답 상태](/docs/ai-naver-clovastudio-summary#응답) |
| `result` | Object | - | 응답 결과 |
| `result.finalAnswer` | String | - | 모델의 최종 실행 결과<ul><li>마지막까지 실행되지 않으면 빈 문자열 반환</li></ul> |
| `result.tokenCount` | Integer | - | 답변 생성 시 측정된 토큰 수 |
| `result.useTask` | Boolean | - | 호출한 모델의 학습 여부<ul><li>`false` \| `true`<ul><li>`false`: 학습하지 않음</li><li>`true`: 학습 완료</li></ul></li></ul> |
| `result.apiResult` | Array | - | 호출한 API 결과: [apiResult](#apiResult) |

#### `apiResult` <a name="apiResult"></a>
`apiResult`에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| `url` | String | - | 답변 과정에서 호출한 API URL |
| `requestBody` | String | - | 답변 과정에서 호출한 API 요청 바디 |
| `responseBody` | String | - | 답변 과정에서 호출한 API 응답 바디 |
| `apiOrder` | Integer | - | API 호출 결과에 상관없이 응답 순서를 고정하기 위한 정렬 기준 |
| `operationId` | String | - | 답변 과정에서 호출한 API Spec의 오퍼레이션 아이디 |
| `nameForHuman` | String | - | 답변 과정에서 호출한 API가 등록된 스킬의 이름 |

### 응답 예시<a name="응답예시1"></a>

응답 예시는 다음과 같습니다.

#### 성공<a name="성공1"></a>

호출이 성공한 경우의 응답 예시는 다음과 같습니다.

```json
{
  "status": {
    "code": "20000",
    "message": "OK"
  },
  "result": {
    "finalAnswer": "내일 서울 날씨는 맑음이며, 온도는 약 27도 정도로 예상됩니다.",
    "tokenCount": 1032,
    "apiResult": [
      {
        "url": "http://example.com?numOfRows=1&location=서울&date=20240530",
        "requestBody": "string",
        "responseBody": "string",
        "apiOrder": 1,
        "operationId": "weatherAPI",
        "nameForHuman": "WeatherSkill"
      }
    ]
  }
}
```

#### 실패<a name="실패1"></a>

호출이 실패한 경우의 응답 예시는 다음과 같습니다.
* [클라이언트 공통 오류 문제(4xx)](/docs/clovastudio-troubleshoot-c4xx) 
* [클라이언트 스킬 오류 문제(4xx)](/docs/clovastudio-troubleshoot-s4xx) 
* [서버 공통 오류 문제(5xx)](/docs/clovastudio-troubleshoot-c5xx) 
* [서버 스킬 오류 문제(5xx)](/docs/clovastudio-troubleshoot-s5xx) 

## 응답 스트림<a name="응답스트림"></a>

생성되는 토큰을 하나씩 출력하도록 토큰 스트리밍을 사용할 수 있습니다. 토큰 스트리밍 형식을 설명합니다.

### 응답 헤더<a name="응답헤더2"></a>

응답 헤더에 대한 설명은 다음과 같습니다.

| 필드 | 필수 여부 | 설명 |
| --- | --- | --- |
| `Accept` | - | 응답 데이터의 형식<ul><li>`text/event-stream`</li></ul> |

### 응답 바디<a name="응답바디2"></a>

응답 바디에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수여부 | 설명 |
| --- | --- | --- | --- |
| `selectedSkill` | Object | - | 선택된 스킬 이름<ul><li>Planning event에서만 표시</li></ul> |
| `finalAnswer` | String | - | 모델의 최종 실행 결과<ul><li>마지막까지 실행되지 않으면 빈 문자열 반환</li><li>FinalAnswer event에서만 표시</li></ul> |
| `tokenCount` | Integer | - | 이벤트에서 사용된 토큰 수 |
| `apiResult` | Object | - | 답변 과정에서 호출한 API 결과<ul><li>FinalAnswer event에서만 표시</li></ul> |
| `apiResult.url` | String | - | 답변 과정에서 호출한 API URL |
| `apiResult.requestBody` | String | - | 답변 과정에서 호출한 API 요청 바디 |
| `apiResult.responseBody` | String | - | 답변 과정에서 호출한 API 응답 바디 |
| `apiResult.apiOrder` | Integer | - | API 호출 결과에 상관없이 응답 순서를 고정하기 위한 정렬 기준 |
| `apiResult.operationId` | String | - | 답변 과정에서 호출한 API Spec의 오퍼레이션 아이디 |
| `apiResult.nameForHuman` | String | - | 답변 과정에서 호출한 API가 등록된 스킬의 이름 |

#### Token Event<a name="TokenEvent"></a>

TokenEvent에 대한 설명은 다음과 같습니다.

| 필드 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| `probs` | Array | - | 응답 후보 토큰의 목록 및 각 토큰의 확률값 |
| `stopReason` | String | - | 결괏값 생성 중단의 이유(일반적으로 마지막 이벤트에 전달)<ul><li>`length` \| `end_token` \| `stop_before`<ul><li>`length`: 길이 제한</li><li>`end_token`: 토큰 수 제한</li><li>`stop_before`: 답변 생성 중 `stopBefore` 설정값 출현</li></ul></li></ul> |
| `text` | String | - | 완전한 텍스트 페어 |

### 응답 예시<a name="응답예시2"></a>

응답 예시는 다음과 같습니다. 

#### 성공<a name="성공2"></a>

호출이 성공한 경우의 응답 예시는 다음과 같습니다.

``` shell
id: aabdfe-dfgwr-edf-hpqwd-f2asd-g
event: planning
data: {"selectedSkill": {["nameForHuman":"호텔 검색"]}, "tokenCount": 432}
id: aabdfe-dfgwr-edf-hpqwd-f1asd-g
event: cot
data: {"apiResult": [{"url": "https://example.com/search_reviews_get?keyword=지하철역 접근성 좋은", "requestBody": "keyword=지하철역 접근성 좋은", "responseBody": "[{\"review_id\": 5,
\"review_date\": \"20230809\", \"reviewer\": \"ClaudeCalder\", \"rating\": 4.0, \"content\": \"사우나,
수영장 등 부대시설이 없어서 아쉬웠지만 가격이 저렴해서 좋았어요. 근처에 지하철역도 있고 편의점도 있어서 접근성이
좋아요. 잠시 머물기엔 딱 입니다.\", \"hotel_name\": \"Movenpick Hotel\", \"address\": \"서울 광진구
워커힐로 120\", \"room_name\": \"City View\", \"good_cnt\": 9, \"bad_cnt\": 0, \"rating_service\":
3.0, \"rating_clean\": 4.0, \"rating_room\": 4.0}]", "apiOrder": 1}], "tokenCount": 2401 }
id: aabdfe-dfgwr-edf-hpqwd-f2asd-g
event: finalAnswer
data: {"finalAnswer": "서울에서 지하철역 접근성 좋은 호텔은 Movenpick Hotel이며, 서울 광진구 워커힐로 120에
위치해 있습니다.", "apiResult": [{"url": "https://example.com/search_reviews_get?keyword=지하철역 접근성 좋은", "requestBody": "keyword=지하철역 접근성 좋은", "responseBody":
"[{\"review_id\": 5, \"review_date\": \"20230809\", \"reviewer\": \"ClaudeCalder\", \"rating\": 4.0,
\"content\": \"사우나, 수영장 등 부대시설이 없어서 아쉬웠지만 가격이 저렴해서 좋았어요. 근처에 지하철역도 있고
편의점도 있어서 접근성이 좋아요. 잠시 머물기엔 딱입니다.\", \"hotel_name\": \"Movenpick Hotel\",
\"address\": \"서울 광진구 워커힐로 120\", \"room_name\": \"City View\", \"good_cnt\": 9, \"bad_cnt\":
0, \"rating_service\": 3.0, \"rating_clean\": 4.0, \"rating_room\": 4.0}]", "apiOrder": 1}],
"tokenCount": 214 }
...
```

#### 실패<a name="실패2"></a>

호출이 실패한 경우의 응답 예시는 다음과 같습니다.
* [클라이언트 공통 오류 문제(4xx)](/docs/clovastudio-troubleshoot-c4xx) 
* [클라이언트 스킬 오류 문제(4xx)](/docs/clovastudio-troubleshoot-s4xx) 
* [서버 공통 오류 문제(5xx)](/docs/clovastudio-troubleshoot-c5xx) 
* [서버 스킬 오류 문제(5xx)](/docs/clovastudio-troubleshoot-s5xx)
