構造化された出力は、Claude の応答を特定のスキーマに従うように制限し、ダウンストリーム処理のための有効で解析可能な出力を保証します。2 つの補完的な機能が利用可能です:
output_format): Claude の応答を特定の JSON 形式で取得strict: true): ツール名と入力のスキーマ検証を保証これらの機能は、同じリクエスト内で独立して、または一緒に使用できます。
構造化された出力は現在、Claude API のパブリックベータ機能として、Claude Sonnet 4.5、Claude Opus 4.1、Claude Opus 4.5、および Claude Haiku 4.5 で利用可能です。
この機能を使用するには、ベータヘッダー structured-outputs-2025-11-13 を設定してください。
このフォームformを使用してフィードバックを共有してください。
構造化された出力がない場合、Claude は不正な形式の JSON 応答または無効なツール入力を生成し、アプリケーションを破壊する可能性があります。注意深いプロンプトを使用しても、以下の問題が発生する可能性があります:
構造化された出力は、制約付きデコーディングを通じてスキーマ準拠の応答を保証します:
JSON.parse() エラーはもうありませんJSON 出力は Claude の応答形式を制御し、Claude がスキーマに一致する有効な JSON を返すことを保証します。以下の場合に JSON 出力を使用してください:
応答形式: response.content[0].text のスキーマに一致する有効な JSON
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}JSON スキーマを定義する
Claude が従うべき構造を説明する JSON スキーマを作成します。スキーマは標準 JSON Schema 形式を使用していますが、いくつかの制限があります (JSON スキーマの制限を参照)。
output_format パラメータを追加する
API リクエストに output_format パラメータを含め、type: "json_schema" とスキーマ定義を指定します。
ベータヘッダーを含める
リクエストに anthropic-beta: structured-outputs-2025-11-13 ヘッダーを追加します。
応答を解析する
Claude の応答はスキーマに一致する有効な JSON となり、response.content[0].text で返されます。
Python および TypeScript SDK は、スキーマ変換、自動検証、および一般的なスキーマライブラリとの統合を含む、JSON 出力の操作を容易にするヘルパーを提供します。
Python および TypeScript 開発者の場合、生の JSON スキーマを記述する代わりに、Pydantic や Zod などの使い慣れたスキーマ定義ツールを使用できます。
Python: client.beta.messages.parse() (推奨)
parse() メソッドは Pydantic モデルを自動的に変換し、応答を検証し、parsed_output 属性を返します。
parse() メソッドは client.messages ではなく client.beta.messages で利用可能です。
Python: transform_schema() ヘルパー
スキーマを送信する前に手動で変換する必要がある場合、または Pydantic で生成されたスキーマを変更したい場合に使用します。client.beta.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 を含みます。
応答形式: 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 を追加する
ツール定義で "strict": true をトップレベルプロパティとして設定し、name、description、input_schema と並べて配置します。
ベータヘッダーを含める
リクエストに anthropic-beta: structured-outputs-2025-11-13 ヘッダーを追加します。
ツール呼び出しを処理する
Claude がツールを使用するとき、tool_use ブロック内の input フィールドは input_schema に厳密に従い、name は常に有効です。
JSON 出力と厳密なツール使用は異なる問題を解決し、一緒に使用できます:
組み合わせると、Claude は保証された有効なパラメータを持つツールを呼び出し、構造化された JSON 応答を返すことができます。これは、信頼性の高いツール呼び出しと構造化された最終出力の両方が必要なエージェンティックワークフローに役立ちます。
構造化された出力は、コンパイルされた文法アーティファクトを使用した制約付きサンプリングを使用します。これにより、認識する必要があるいくつかのパフォーマンス特性が導入されます:
name または description フィールドのみを変更してもキャッシュは無効化されません構造化された出力を使用する場合、Claude は自動的に予想される出力形式を説明する追加のシステムプロンプトを受け取ります。これは以下を意味します:
output_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 エラーが表示されます:
"スキーマ内の再帰定義が多すぎます"
"スキーマが複雑すぎます"
strict: true としてマークされたツールの数を減らします永続的な問題がある有効なスキーマについては、スキーマ定義を含めて サポートに連絡 してください。
動作:
output_format) と厳密なツール使用 (strict: true) を一緒に使用互換性なし:
output_format で引用が有効な場合、400 エラーを返します。文法スコープ: 文法は Claude の直接出力にのみ適用され、ツール使用呼び出し、ツール結果、または思考タグ (拡張思考 を使用する場合) には適用されません。文法状態はセクション間でリセットされ、Claude が自由に考えることができながら、最終応答で構造化された出力を生成できます。
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" \
-H "anthropic-beta: structured-outputs-2025-11-13" \
-d '{
"model": "claude-sonnet-4-5",
"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": {
"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
}
}
}'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()
# With .create() - requires transform_schema()
response = client.beta.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
betas=["structured-outputs-2025-11-13"],
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={
"type": "json_schema",
"schema": transform_schema(ContactInfo),
}
)
print(response.content[0].text)
# With .parse() - can pass Pydantic model directly
response = client.beta.messages.parse(
model="claude-sonnet-4-5",
max_tokens=1024,
betas=["structured-outputs-2025-11-13"],
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)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" \
-H "anthropic-beta: structured-outputs-2025-11-13" \
-d '{
"model": "claude-sonnet-4-5",
"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 = client.beta.messages.create(
model="claude-sonnet-4-5",
betas=["structured-outputs-2025-11-13"],
max_tokens=1024,
messages=[{"role": "user", "content": "Help me plan a trip to Paris for next month"}],
# JSON outputs: structured response format
output_format={
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"summary": {"type": "string"},
"next_steps": {"type": "array", "items": {"type": "string"}}
},
"required": ["summary", "next_steps"],
"additionalProperties": False
}
},
# Strict tool use: guaranteed tool parameters
tools=[{
"name": "search_flights",
"strict": True,
"input_schema": {
"type": "object",
"properties": {
"destination": {"type": "string"},
"date": {"type": "string", "format": "date"}
},
"required": ["destination", "date"],
"additionalProperties": False
}
}]
)