Structured Outputs

Prev Next

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 リクエストデータの形式
  • application/json
Accept Conditional レスポンスデータの形式
  • text/event-stream
参考

レスポンス結果は基本的に JSON形式で返されますが、Accepttext/event-streamに指定するとレスポンス結果をストリーム形式で返します。

リクエストパスパラメータ

リクエストパスパラメータの説明は次の通りです。

フィールド タイプ 必須の有無 説明
modelName Enum Required モデル名
  • <例> HCX-007
参考

Structured Outputsは HCX-007モデルでのみ使用できます。

リクエストボディ

リクエストボディの説明は次の通りです。

フィールド タイプ 必須の有無 説明
messages Array Required 会話メッセージ
topP Double Optional 生成トークン候補群を累積確率に基づいてサンプリング
  • 0.00 < topP ≤ 1.00 (デフォルト: 0.80)
topK Integer Optional 生成トークン候補群から確率の高いトークン K個を候補に指定してサンプリング
  • 0 ≤ topK ≤ 128 (デフォルト: 0)
maxCompletionTokens Integer Optional 最大トークン生成数
  • 0 < maxCompletionTokens ≤ 32768 (デフォルト: 512)
temperature Double Optional 生成トークンに対する多様性の程度(設定値が高いほど多様な文章を生成)
  • 0.00 ≤ temperature ≤ 1.00 (デフォルト: 0.50)
repetitionPenalty Double Optional 同じトークンを生成することに対するペナルティの程度(設定値が高いほど同じ結果値を繰り返し生成する確率は下がる)
  • 0.0 < repetitionPenalty ≤ 2.0 (デフォルト: 1.1)
stop Array Optional トークン生成停止文字
  • [](デフォルト)
seed Integer Optional モデルの繰り返し実行時、結果値の一貫性レベルを調整
  • 0: 一貫性レベルをランダム適用 (デフォルト)
  • 1 ≤ seed ≤ 4294967295: 一貫して作成しようとする結果値のseedまたはユーザーが指定するseed
thinking Object Optional 推論モデルの設定情報
thinking.effort String Optional 推論の有無と思考の深さを設定
  • none (有効値)
  • Structured Outputsと同時に使用不可
responseFormat Object Optional モデルが出力する回答形式
responseFormat.type String Required 回答形式タイプ
  • json (有効値)
responseFormat.schema Object Required 回答形式のスキーマ
includeAiFilters Boolean Optional AIフィルタ(生成された結果値に対する罵倒、蔑み/差別/嫌悪、セクハラ/わいせつなどカテゴリ別に当てはまる程度)結果を表示するか
  • true | false (デフォルト)
    • true: 表示
    • false: 表示しない

messages

messagesの説明は次の通りです。

フィールド タイプ 必須の有無 説明
role Enum Required 会話メッセージのロール
  • system | user | assistant |
    • system: ロールを規定する指示文
    • user: ユーザーの発話または質問
    • assistant: ユーザーの発話/質問に対する回答
content String Required 会話メッセージ内容
  • テキスト入力(String)

サポートする 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"
        
    • 数字 (numberinteger)
      • 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 - レスポンスデータの形式
  • application/json

レスポンスボディ

レスポンスボディの説明は次の通りです。

フィールド タイプ 必須の有無 説明
status Object - レスポンスステータス
result Object - レスポンス結果
result.created Integer - レスポンスの日付
  • Unix timestamp miliseconds形式
result.usage Object - トークン使用量
result.usage.completionTokens Integer - 生成トークン数
result.usage.promptTokens Integer - 入力(プロンプト)トークン数
result.usage.totalTokens Integer - トークンの総数
  • 生成トークン数+入力トークン数
result.message Object - 会話メッセージ
result.message.role Enum - 会話メッセージのロール
  • system | user | assistant
    • system: ロールを規定する指示文
    • user: ユーザーの発話または質問
    • assistant: モデルの回答
result.message.content String - 会話メッセージの内容
result.finishReason String - トークン生成停止の理由(通常、最後のイベントで渡す)
  • length | stop
    • length: 長さ制限
    • stop: 返答生成中にstopに指定した文字が登場
    • tool_calls: モデルが正常にツール呼び出しを完了
result.seed Integer - 入力 seed値(0を入力したか、未入力の場合はランダムな値を返す)
result.aiFilter Array - AIフィルタの結果

aiFilter

aiFilterの説明は次の通りです。

フィールド タイプ 必須の有無 説明
groupName String - AIフィルタのカテゴリ
  • curse | unsafeContents
    • curse: 蔑み、差別、嫌悪および罵倒
    • unsafeContents: セクハラ、わいせつ
name String - AIフィルタの詳細カテゴリ
  • discrimination | insult | sexualHarassment
    • discrimination: 蔑み、差別、嫌悪
    • insult: 罵倒
    • sexualHarassment: セクハラ、わいせつ
score String - AIフィルタスコア
  • -1 | 0 | 1 | 2
    • -1: AIフィルタにエラー発生
    • 0: 会話メッセージに要注意/危険な表現を含む可能性が高い
    • 1: 会話メッセージに要注意/危険な表現を含む可能性がある
    • 2: 会話メッセージに要注意/危険な表現を含む可能性が低い
result String - AIフィルタは正常に動作しているか
  • OK | ERROR
    • OK: 正常に動作
    • ERROR: エラー発生
参考

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 - レスポンスデータの形式
  • text/event-stream

レスポンスボディ

レスポンスボディの説明は次の通りです。

StreamingChatCompletionsTokenEvent

StreamingChatCompletionsTokenEventの説明は次の通りです。

フィールド タイプ 必須の有無 説明
created Integer - レスポンスタイムのタイムスタンプ
usage Object - トークン使用量
usage.promptTokens Integer - 入力(プロンプト)トークン数
usage.completionTokens Integer - 生成トークン数
message Object - 会話メッセージ
message.role Enum - 会話メッセージのロール
  • user | assistant
    • user: ユーザーの発話または質問
    • assistant: モデルの返答
message.content String - 会話メッセージの内容
finishReason String - トークン生成停止の理由(通常、最後のイベントで渡す)
  • length | stop
    • length: 長さ制限
    • stop: 返答生成中にstopに指定した文字が登場

StreamingChatCompletionsResultEvent

StreamingChatCompletionsResultEventの説明は次の通りです。

フィールド タイプ 必須の有無 説明
created Integer - レスポンスタイムのタイムスタンプ
usage Object - トークン使用量
usage.promptTokens Integer - 入力(プロンプト)トークン数
usage.completionTokens Integer - 生成トークン数
usage.totalTokens Integer - トークンの総数
  • 生成トークン数+入力トークン数
message Object - 会話メッセージ
message.role Enum - 会話メッセージのロール
  • user | assistant
    • user: ユーザーの発話または質問
    • assistant: モデルの返答
message.content String - 会話メッセージの内容
finishReason String - トークン生成停止の理由(通常、最後のイベントで渡す)
  • length | stop
    • length: 長さ制限
    • stop: 返答生成中にstopに指定した文字が登場
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}}

失敗

呼び出しに失敗した場合のレスポンスのサンプルコードは次の通りです。