Classic/VPC環境で利用できます。
Structured Outputsをサポートして、目的の JSON Schema形式の出力結果を生成できる v3 Chat Completionsを説明します。
リクエスト
リクエスト形式を説明します。リクエスト形式は次の通りです。
| メソッド | URI |
|---|---|
| POST | /v3/chat-completions/{modelName} |
リクエストヘッダ
リクエストヘッダの説明は次の通りです。
| ヘッダ | 必須の有無 | 説明 |
|---|---|---|
Authorization |
Required | 認証用 APIキー<例> Bearer nv-************ |
X-NCP-CLOVASTUDIO-REQUEST-ID |
Optional | リクエスト ID |
Content-Type |
Required | リクエストデータの形式
|
Accept |
Conditional | レスポンスデータの形式
|
レスポンス結果は基本的に JSON形式で返されますが、Acceptをtext/event-streamに指定するとレスポンス結果をストリーム形式で返します。
リクエストパスパラメータ
リクエストパスパラメータの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
modelName |
Enum | Required | モデル名
|
Structured Outputsは HCX-007モデルでのみ使用できます。
リクエストボディ
リクエストボディの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
messages |
Array | Required | 会話メッセージ |
topP |
Double | Optional | 生成トークン候補群を累積確率に基づいてサンプリング
|
topK |
Integer | Optional | 生成トークン候補群から確率の高いトークン K個を候補に指定してサンプリング
|
maxCompletionTokens |
Integer | Optional | 最大トークン生成数
|
temperature |
Double | Optional | 生成トークンに対する多様性の程度(設定値が高いほど多様な文章を生成)
|
repetitionPenalty |
Double | Optional | 同じトークンを生成することに対するペナルティの程度(設定値が高いほど同じ結果値を繰り返し生成する確率は下がる)
|
stop |
Array | Optional | トークン生成停止文字
|
seed |
Integer | Optional | モデルの繰り返し実行時、結果値の一貫性レベルを調整
|
thinking |
Object | Optional | 推論モデルの設定情報 |
thinking.effort |
String | Optional | 推論の有無と思考の深さを設定
|
responseFormat |
Object | Optional | モデルが出力する回答形式 |
responseFormat.type |
String | Required | 回答形式タイプ
|
responseFormat.schema |
Object | Required | 回答形式のスキーマ
|
includeAiFilters |
Boolean | Optional | AIフィルタ(生成された結果値に対する罵倒、蔑み/差別/嫌悪、セクハラ/わいせつなどカテゴリ別に当てはまる程度)結果を表示するか
|
messages
messagesの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
role |
Enum | Required | 会話メッセージのロール
|
content |
String | Required | 会話メッセージ内容
|
サポートする JSON Schema
サポートする JSON Schemaの説明は次の通りです。
- タイプ
string,number,boolean,integer,object,array
- 制限キーワード(Validation Keyword)
- 文字列 (
string)format: 定義された形式のいずれかであること- <例>
"date-time": "2025-06-30T14:00:00Z", "date": "2025-06-30", "time": "14:30:00", "duration": "P3Y6M4DT12H30M5S", "email": "user@example.com", "hostname": "example.com", "ipv4": "192.***.***.***", "ipv6": "2001:****::1", "uuid": "123e4567-e89b-12d3-a456-426614174000"
- 数字 (
number、integer)minimum: 最小値 (以上)maximum: 最大値 (以下)
- 配列 (
array)minItems: 最小アイテム数maxItems: 最大アイテム数items: 配列項目スキーマの定義
- オブジェクト (
object)properties: フィールドスキーマの定義required: 必須フィールドリスト
- Enumと複合スキーマ
enum: 既に定義されている値リストのいずれかであることanyOf: 並べられたスキーマのうち1つ以上を満たすこと
- 文字列 (
一部フィールドの入力時、下記の内容をご確認ください。
role:systemの会話メッセージは、リクエストごとに1つだけ含めることができます。- Structured Outputsと推論、または Function callingは、同時にリクエストできません。
- Structured Outputsは JSON schemaの一部だけサポートします。
pattern(Validation Keyword)はサポートしません。
リクエスト例
リクエストのサンプルコードは次の通りです。
curl --location --request POST 'https://clovastudio.stream.ntruss.com/v3/chat-completions/HCX-007' \
--header 'Authorization: Bearer {CLOVA Studio API Key}' \
--header 'X-NCP-CLOVASTUDIO-REQUEST-ID: {Request ID}' \
--header 'Content-Type: application/json' \
--data '{
"messages": [
{
"role": "system",
"content": "- あらかじめ定義した JSON Schema形式に合わせて回答する AIアシスタントです。"
},
{
"role": "user",
"content": "今日の最高気温は32度、最低気温は15度、降水確率は30%です。"
}
],
"topP": 0.8,
"topK": 0,
"maxCompletionTokens": 100,
"temperature": 0.5,
"repetitionPenalty": 1.1,
"thinking": {"effort": "none"},
"stop": [],
"responseFormat": {
"type" : "json",
"schema": {
"type": "object",
"properties": {
"temp_high_c": {
"type": "number",
"description": "最高気温(摂氏)"
},
"temp_low_c": {
"type": "number",
"description": "最低気温(摂氏)"
},
"precipitation_percent": {
"type": "number",
"description": "降水確率(%)",
"minimum": 0,
"maximum": 100
}
},
"required": [
"temp_high_c",
"temp_low_c",
"precipitation_percent"
]
}
}
}'
レスポンス
レスポンス形式を説明します。
レスポンスヘッダ
レスポンスヘッダの説明は次の通りです。
| ヘッダ | 必須の有無 | 説明 |
|---|---|---|
Content-Type |
- | レスポンスデータの形式
|
レスポンスボディ
レスポンスボディの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
status |
Object | - | レスポンスステータス |
result |
Object | - | レスポンス結果 |
result.created |
Integer | - | レスポンスの日付
|
result.usage |
Object | - | トークン使用量 |
result.usage.completionTokens |
Integer | - | 生成トークン数 |
result.usage.promptTokens |
Integer | - | 入力(プロンプト)トークン数 |
result.usage.totalTokens |
Integer | - | トークンの総数
|
result.message |
Object | - | 会話メッセージ |
result.message.role |
Enum | - | 会話メッセージのロール
|
result.message.content |
String | - | 会話メッセージの内容 |
result.finishReason |
String | - | トークン生成停止の理由(通常、最後のイベントで渡す)
|
result.seed |
Integer | - | 入力 seed値(0を入力したか、未入力の場合はランダムな値を返す) |
result.aiFilter |
Array | - | AIフィルタの結果 |
aiFilter
aiFilterの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
groupName |
String | - | AIフィルタのカテゴリ
|
name |
String | - | AIフィルタの詳細カテゴリ
|
score |
String | - | AIフィルタスコア
|
result |
String | - | AIフィルタは正常に動作しているか
|
AI Filterは最大500文字まで分析できます。ただし、分析対象テキストに異常な形式、絵文字、記号などが多い場合、正常に分析されないことがあります。
レスポンス例
レスポンスのサンプルコードは次の通りです。
成功
呼び出しに成功した場合のレスポンスのサンプルコードは次の通りです。
{
"status": {
"code": "20000",
"message": "OK"
},
"result": {
"message": {
"role": "assistant",
"content": "{\n \"temp_high_c\": 32,\n \"temp_low_c\": 15,\n \"precipitation_percent\": 30\n}"
},
"finishReason": "stop",
"created": 1754315742,
"seed": 965671181,
"usage": {
"promptTokens": 39,
"completionTokens": 31,
"totalTokens": 70
},
"aiFilter": [
{
"groupName": "curse",
"name": "insult",
"score": "1",
"result": "OK"
},
{
"groupName": "curse",
"name": "discrimination",
"score": "1",
"result": "OK"
},
{
"groupName": "unsafeContents",
"name": "sexualHarassment",
"score": "2",
"result": "OK"
}
]
}
}
失敗
呼び出しに失敗した場合のレスポンスのサンプルコードは次の通りです。
レスポンスストリーム
生成されるトークンを1つずつ出力するようにトークンストリーミングを使用できます。トークンストリーミング形式を説明します。
レスポンスヘッダ
レスポンスヘッダの説明は次の通りです。
| ヘッダ | 必須の有無 | 説明 |
|---|---|---|
Accept |
- | レスポンスデータの形式
|
レスポンスボディ
レスポンスボディの説明は次の通りです。
StreamingChatCompletionsTokenEvent
StreamingChatCompletionsTokenEventの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
created |
Integer | - | レスポンスタイムのタイムスタンプ |
usage |
Object | - | トークン使用量 |
usage.promptTokens |
Integer | - | 入力(プロンプト)トークン数 |
usage.completionTokens |
Integer | - | 生成トークン数 |
message |
Object | - | 会話メッセージ |
message.role |
Enum | - | 会話メッセージのロール
|
message.content |
String | - | 会話メッセージの内容 |
finishReason |
String | - | トークン生成停止の理由(通常、最後のイベントで渡す)
|
StreamingChatCompletionsResultEvent
StreamingChatCompletionsResultEventの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
created |
Integer | - | レスポンスタイムのタイムスタンプ |
usage |
Object | - | トークン使用量 |
usage.promptTokens |
Integer | - | 入力(プロンプト)トークン数 |
usage.completionTokens |
Integer | - | 生成トークン数 |
usage.totalTokens |
Integer | - | トークンの総数
|
message |
Object | - | 会話メッセージ |
message.role |
Enum | - | 会話メッセージのロール
|
message.content |
String | - | 会話メッセージの内容 |
finishReason |
String | - | トークン生成停止の理由(通常、最後のイベントで渡す)
|
aiFilter |
Array | - | AIフィルタの結果 |
ErrorEvent
ErrorEventの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
status |
Object | - | レスポンスステータス |
status.code |
Object | - | レスポンスステータスコード |
status.message |
Object | - | レスポンスステータスメッセージ |
SignalEvent
SignalEventの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
data |
String | - | 渡すシグナルデータ情報 |
レスポンス例
レスポンスのサンプルコードは次の通りです。
成功
呼び出しに成功した場合のレスポンスのサンプルコードは次の通りです。
id: aabdfe-dfgwr-edf-hpqwd-f3asd-g
event: token
data: {"message": {"role": "assistant", "content": "{\n"},"finishReason": null, "created": 1744710905, "seed": 3284419119, "usage": null}
id: aabdfe-dfgwr-edf-hpqwd-f2asd-g
event: token
data: {"message": {"role": "assistant", "content": " "},"finishReason": null, "created": 1744710905, "seed": 3284419119, "usage": null}
...
id: aabdfe-dfgwr-edf-hpqwd-f1asd-g
event: result
data: {"message": {"role": "assistant", "content": "{\n \"temp_high_c\": 32,\n \"temp_low_c\": 15,\n \"precipitation_percent\": 30\n}"}, "finishReason": "stop", "created": 1744710905, "seed": 3284419119, "usage": {"promptTokens": 20, "completionTokens": 5, "totalTokens": 25}}
失敗
呼び出しに失敗した場合のレスポンスのサンプルコードは次の通りです。