構造化出力はClaudeの応答を特定のスキーマに従うように制約し、下流処理のための有効でパース可能な出力を保証します。2つの補完的な機能が利用可能です:
output_config.format):Claudeの応答を特定のJSON形式で取得strict: true):ツール名と入力のスキーマバリデーションを保証output_formatパラメータはoutput_config.formatに移動しました。古いoutput_formatパラメータは一時的にまだ動作しますが、非推奨であり、将来のAPIバージョンで削除されます。コードをoutput_config: {format: {...}}を使用するように更新してください。
これらの機能は、同じリクエスト内で独立して、または組み合わせて使用できます。
構造化出力は、Claude Opus 4.6、Claude Sonnet 4.5、Claude Opus 4.5、およびClaude Haiku 4.5のClaude APIおよびAmazon Bedrockで一般提供されています。構造化出力はMicrosoft Foundryではパブリックベータのままです。
ベータから移行する場合: output_formatパラメータはoutput_config.formatに移動し、ベータヘッダーは不要になりました。古いベータヘッダー(structured-outputs-2025-11-13)とoutput_formatパラメータは移行期間中引き続き動作します。更新されたAPIの形式については、以下のコード例を参照してください。
構造化出力がない場合、Claudeは不正なJSON応答や無効なツール入力を生成し、アプリケーションを壊す可能性があります。慎重なプロンプティングを行っても、以下のような問題に遭遇する可能性があります:
構造化出力は、制約付きデコーディングによりスキーマ準拠の応答を保証します:
JSON.parse()エラーがなくなりますJSON出力はClaudeの応答形式を制御し、Claudeがスキーマに一致する有効なJSONを返すことを保証します。以下の場合にJSON出力を使用します:
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm."
}
],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string"},
"plan_interest": {"type": "string"},
"demo_requested": {"type": "boolean"}
},
"required": ["name", "email", "plan_interest", "demo_requested"],
"additionalProperties": false
}
}
}
}'応答形式: response.content[0].text内のスキーマに一致する有効なJSON
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}JSONスキーマを定義する
Claudeに従わせたい構造を記述するJSONスキーマを作成します。スキーマは標準的なJSON Schema形式を使用しますが、いくつかの制限があります(JSONスキーマの制限を参照)。
output_config.formatパラメータを追加する
APIリクエストにoutput_config.formatパラメータを含め、type: "json_schema"とスキーマ定義を指定します。
応答をパースする
Claudeの応答はスキーマに一致する有効なJSONとなり、response.content[0].textで返されます。
PythonおよびTypeScript SDKは、スキーマ変換、自動バリデーション、人気のスキーマライブラリとの統合など、JSON出力をより簡単に扱うためのヘルパーを提供しています。
SDKヘルパーメソッド(.parse()やPydantic/Zod統合など)は、便利なパラメータとしてoutput_formatを引き続き受け付けます。SDKは内部的にoutput_config.formatへの変換を処理します。以下の例はSDKヘルパーの構文を示しています。
PythonおよびTypeScript開発者は、生のJSONスキーマを書く代わりに、PydanticやZodなどの馴染みのあるスキーマ定義ツールを使用できます。
from pydantic import BaseModel
from anthropic import Anthropic, transform_schema
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
demo_requested: bool
client = Anthropic()
# .create()の場合 - transform_schema()が必要
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm."
}
],
output_config={
"format": {
"type": "json_schema",
"schema": transform_schema(ContactInfo),
}
}
)
print(response.content[0].text)
# .parse()の場合 - Pydanticモデルを直接渡せる
response = client.messages.parse(
model="claude-opus-4-6",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm."
}
],
output_format=ContactInfo,
)
print(response.parsed_output)Python: client.messages.parse()(推奨)
parse()メソッドは、Pydanticモデルを自動的に変換し、応答をバリデーションし、parsed_output属性を返します。
Python: transform_schema()ヘルパー
送信前にスキーマを手動で変換する必要がある場合や、Pydanticで生成されたスキーマを変更したい場合に使用します。提供されたスキーマを自動的に変換するclient.messages.parse()とは異なり、変換されたスキーマが返されるため、さらにカスタマイズできます。
PythonおよびTypeScript SDKは、サポートされていない機能を持つスキーマを自動的に変換します:
minimum、maximum、minLength、maxLength)additionalProperties: falseを追加これは、Claudeが簡略化されたスキーマを受け取りますが、コードはバリデーションを通じてすべての制約を引き続き適用することを意味します。
例: minimum: 100を持つPydanticフィールドは、送信されるスキーマではプレーンな整数になりますが、説明は「100以上である必要があります」に更新され、SDKは元の制約に対して応答をバリデーションします。
厳密なツール使用はツールパラメータをバリデーションし、Claudeが正しい型の引数で関数を呼び出すことを保証します。以下の場合に厳密なツール使用を使用します:
信頼性の高いエージェントシステムを構築するには、スキーマ準拠の保証が必要です。厳密モードがない場合、Claudeは互換性のない型(2の代わりに"2")を返したり、必須フィールドが欠落したりして、関数が壊れてランタイムエラーが発生する可能性があります。
厳密なツール使用は型安全なパラメータを保証します:
例えば、予約システムがpassengers: intを必要とするとします。厳密モードがない場合、Claudeはpassengers: "two"やpassengers: "2"を提供する可能性があります。strict: trueを使用すると、応答には常にpassengers: 2が含まれます。
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "What is the weather in San Francisco?"}
],
"tools": [{
"name": "get_weather",
"description": "Get the current weather in a given location",
"strict": true,
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"],
"additionalProperties": false
}
}]
}'応答形式: response.content[x].input内のバリデーション済み入力を持つツール使用ブロック
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}保証:
inputはinput_schemaに厳密に従いますnameは常に有効です(提供されたツールまたはサーバーツールから)ツールスキーマを定義する
ツールのinput_schema用のJSONスキーマを作成します。スキーマは標準的なJSON Schema形式を使用しますが、いくつかの制限があります(JSONスキーマの制限を参照)。
strict: trueを追加する
ツール定義でname、description、input_schemaと並んで、トップレベルのプロパティとして"strict": trueを設定します。
ツール呼び出しを処理する
Claudeがツールを使用する際、tool_useブロックのinputフィールドはinput_schemaに厳密に従い、nameは常に有効です。
JSON出力と厳密なツール使用は異なる問題を解決し、組み合わせて使用できます:
組み合わせると、Claudeは保証された有効なパラメータでツールを呼び出し、かつ構造化されたJSON応答を返すことができます。これは、信頼性の高いツール呼び出しと構造化された最終出力の両方が必要なエージェントワークフローに有用です。
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Help me plan a trip to Paris for next month"}],
# JSON出力:構造化された応答形式
output_config={
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"summary": {"type": "string"},
"next_steps": {"type": "array", "items": {"type": "string"}}
},
"required": ["summary", "next_steps"],
"additionalProperties": False
}
}
},
# 厳密なツール使用:保証されたツールパラメータ
tools=[{
"name": "search_flights",
"strict": True,
"input_schema": {
"type": "object",
"properties": {
"destination": {"type": "string"},
"date": {"type": "string", "format": "date"}
},
"required": ["destination", "date"],
"additionalProperties": False
}
}]
)構造化出力は、コンパイルされた文法アーティファクトを使用した制約付きサンプリングを使用します。これにより、注意すべきいくつかのパフォーマンス特性が導入されます:
nameまたはdescriptionフィールドのみの変更ではキャッシュは無効化されません構造化出力を使用する場合、Claudeは期待される出力形式を説明する追加のシステムプロンプトを自動的に受け取ります。これは以下を意味します:
output_config.formatパラメータを変更すると、その会話スレッドのプロンプトキャッシュが無効化されます構造化出力は標準的なJSON Schemaをサポートしていますが、いくつかの制限があります。JSON出力と厳密なツール使用の両方がこれらの制限を共有しています。
PythonおよびTypeScript SDKは、サポートされていない機能を削除し、フィールドの説明に制約を追加することで、サポートされていない機能を持つスキーマを自動的に変換できます。詳細はSDK固有のメソッドを参照してください。
構造化出力はほとんどの場合スキーマ準拠を保証しますが、出力がスキーマに一致しない場合があるシナリオがあります:
拒否(stop_reason: "refusal")
Claudeは構造化出力を使用する場合でも、安全性と有用性の特性を維持します。Claudeが安全上の理由でリクエストを拒否した場合:
stop_reasonは"refusal"になりますトークン制限に到達(stop_reason: "max_tokens")
max_tokens制限に到達して応答が切り捨てられた場合:
stop_reasonは"max_tokens"になりますmax_tokens値でリトライしてくださいスキーマがサポートされていない機能を使用しているか、複雑すぎる場合、400エラーが返されます:
"Too many recursive definitions in schema"
"Schema is too complex"
strict: trueとしてマークされたツールの数を減らす有効なスキーマで問題が続く場合は、スキーマ定義を添えてサポートに連絡してください。
互換性あり:
output_config.format)と厳密なツール使用(strict: true)を一緒に使用互換性なし:
output_config.formatで引用が有効な場合、400エラーが返されます。文法のスコープ:文法はClaudeの直接出力にのみ適用され、ツール使用呼び出し、ツール結果、または思考タグ(拡張思考使用時)には適用されません。文法の状態はセクション間でリセットされるため、Claudeは自由に思考しながら、最終応答では構造化された出力を生成できます。
Was this page helpful?