「structured outputs」(構造化出力)は、Claudeの応答を特定のスキーマに従うように制約し、下流の処理のために有効で解析可能な出力を保証します。構造化出力は、2つの補完的な機能を提供します。
output_config.format):Claudeの応答を特定のJSON形式で取得しますstrict: true):ツール名と入力に対するスキーマ検証を保証しますこれらの機能は、独立して使用することも、同じリクエスト内で組み合わせて使用することもできます。
構造化出力は、Claude APIにおいてClaude Fable 5、Claude Mythos 5、Claude Opus 4.8、Claude Mythos Preview、Claude Opus 4.7、Claude Opus 4.6、Claude Sonnet 4.6、Claude Sonnet 4.5、Claude Opus 4.5、Claude Haiku 4.5で一般提供されています。Amazon Bedrockでは、構造化出力はClaude Opus 4.6、Claude Sonnet 4.6、Claude Sonnet 4.5、Claude Opus 4.5、Claude Haiku 4.5で一般提供されており、Claude Opus 4.7とClaude Mythos PreviewはClaude in Amazon Bedrock(Messages-API Bedrockエンドポイント)を通じて利用可能です。構造化出力はClaude Platform on AWSで利用可能であり、Microsoft Foundryではベータ版として利用可能です。Vertex AIでは、構造化出力はClaude Fable 5、Claude Mythos 5、Claude Opus 4.8、Claude Mythos Preview、Claude Opus 4.7、Claude Opus 4.6、Claude Sonnet 4.6、Claude Sonnet 4.5、Claude Opus 4.5、Claude Haiku 4.5で一般提供されています。
この機能は、限定的な技術的保持を伴うZero Data Retention(ZDR)の対象となります。保持される内容とその理由の詳細については、データ保持セクションを参照してください。
ベータ版から移行する場合: output_formatパラメータはoutput_config.formatに移動し、ベータヘッダーは不要になりました。古いベータヘッダー(structured-outputs-2025-11-13)とoutput_formatパラメータは、移行期間中は引き続き動作します。更新されたAPIの形式については、以下のコード例を参照してください。
構造化出力を使用しない場合、Claudeは不正な形式のJSON応答や無効なツール入力を生成し、アプリケーションを破壊する可能性があります。慎重にプロンプトを作成しても、次のような問題が発生することがあります。
構造化出力は、制約付きデコーディングによってスキーマに準拠した応答を保証します。
JSON.parse()エラーが発生しませんJSON出力はClaudeの応答形式を制御し、Claudeがスキーマに一致する有効なJSONを返すことを保証します。次のような場合にJSON出力を使用します。
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
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,
},
}
},
)
print(response.content[0].text)応答形式: response.content[0].textにスキーマに一致する有効なJSONが含まれます
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}JSONスキーマを定義する
Claudeに従わせたい構造を記述するJSONスキーマを作成します。スキーマは、いくつかの制限付きで標準のJSON Schema形式を使用します(JSON Schemaの制限を参照)。
output_config.formatパラメータを追加する
APIリクエストにoutput_config.formatパラメータを含め、type: "json_schema"とスキーマ定義を指定します。
応答を解析する
Claudeの応答は、スキーマに一致する有効なJSONとしてresponse.content[0].textに返されます。
SDKは、スキーマ変換、自動検証、一般的なスキーマライブラリとの統合など、JSON出力の操作を容易にするヘルパーを提供します。
Python SDKのclient.messages.parse()は、便宜上のパラメータとして引き続きoutput_formatを受け付け、内部でoutput_config.formatに変換します。他のSDKではoutput_configを直接指定する必要があります。以下の例は、SDKヘルパーの構文を示しています。
生のJSONスキーマを記述する代わりに、各言語で馴染みのあるスキーマ定義ツールを使用できます。
client.messages.parse()zodOutputFormat()、または型付きJSON SchemaリテラルとjsonSchemaOutputFormat()outputConfig(Class<T>)による自動スキーマ導出を使用したプレーンなJavaクラスAnthropic::BaseModelクラスとoutput_config: {format: Model}StructuredOutputModelを実装したクラスとoutputConfig: ['format' => MyClass::class]Create<T>()オーバーロードを使用したプレーンなC#クラス(スキーマを自動的に導出)output_configを通じた生のJSONスキーマoutput_configを通じて渡される生のJSONスキーマfrom pydantic import BaseModel
from anthropic import Anthropic
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
demo_requested: bool
client = Anthropic()
response = client.messages.parse(
model="claude-opus-4-8",
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)各SDKは、構造化出力の操作を容易にするヘルパーを提供します。詳細については、各SDKのページを参照してください。
Python、TypeScript、Ruby、PHPのSDKは、サポートされていない機能を持つスキーマを自動的に変換します。C#とGoのSDKは、スキーマがネイティブ型から導出される場合(C#ではCreate<T>()、Goベータ APIでは構造体リフレクションまたはBetaJSONSchemaOutputFormat())に同じ変換を適用します。変換ステップは次のとおりです。
minimum、maximum、minLength、maxLength)additionalProperties: falseを追加**これは、Claudeが簡略化されたスキーマを受け取る一方で、コードは検証を通じてすべての制約を引き続き強制することを意味します。
例: minimum: 100を持つPydanticフィールドは、送信されるスキーマではプレーンな整数になりますが、SDKは説明を「100以上である必要があります」に更新し、元の制約に対して応答を検証します。
文法制約付きサンプリングによってツール入力にJSON Schema準拠を強制する方法については、厳密なツール使用を参照してください。
JSON出力と厳密なツール使用は異なる問題を解決し、連携して動作します。
組み合わせると、Claudeは保証された有効なパラメータでツールを呼び出し、かつ構造化されたJSON応答を返すことができます。これは、信頼性の高いツール呼び出しと構造化された最終出力の両方が必要なエージェントワークフローに役立ちます。
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Help me plan a trip to Paris departing May 15, 2026",
}
],
# 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,
},
}
],
)
print(response)構造化出力は、コンパイルされた文法アーティファクトを使用した制約付きサンプリングを使用します。これにより、注意すべきパフォーマンス特性がいくつか生じます。
nameまたはdescriptionフィールドのみの変更ではキャッシュは無効化されません構造化出力を使用する場合、Claudeは期待される出力形式を説明する追加のシステムプロンプトを自動的に受け取ります。これは次のことを意味します。
output_config.formatパラメータを変更すると、その会話スレッドのプロンプトキャッシュが無効化されます構造化出力は、いくつかの制限付きで標準のJSON Schemaをサポートしています。JSON出力と厳密なツール使用の両方がこれらの制限を共有します。
Python、TypeScript、Ruby、PHPのSDKは、サポートされていない機能を持つスキーマを自動的に変換し、それらを削除してフィールドの説明に制約を追加できます。C#とGoのSDKは、スキーマがネイティブ型から導出される場合に同じことを行います。詳細については、SDK固有のメソッドを参照してください。
構造化出力を使用する場合、オブジェクト内のプロパティはスキーマで定義された順序を維持しますが、1つの重要な注意点があります。必須プロパティが最初に表示され、その後にオプションプロパティが続きます。
例えば、次のスキーマの場合:
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}出力のプロパティ順序は次のようになります。
name(必須、スキーマ順)email(必須、スキーマ順)notes(オプション、スキーマ順)age(オプション、スキーマ順)つまり、出力は次のようになる可能性があります。
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}出力のプロパティ順序がアプリケーションにとって重要な場合は、すべてのプロパティを必須としてマークするか、解析ロジックでこの並べ替えを考慮してください。
構造化出力はほとんどの場合スキーマ準拠を保証しますが、出力がスキーマと一致しないシナリオがあります。
拒否(stop_reason: "refusal")
Claudeは、構造化出力を使用している場合でも、安全性と有用性の特性を維持します。Claudeが安全上の理由でリクエストを拒否した場合:
stop_reason: "refusal"が含まれますトークン制限に到達(stop_reason: "max_tokens")
max_tokens制限に達して応答が途中で切れた場合:
stop_reason: "max_tokens"が含まれますmax_tokens値でリトライしてください構造化出力は、JSONスキーマをClaudeの出力を制約する文法にコンパイルすることで動作します。より複雑なスキーマは、コンパイルに時間がかかるより大きな文法を生成します。過度なコンパイル時間を防ぐため、APIはいくつかの複雑さの制限を強制します。
次の制限は、output_config.formatまたはstrict: trueを含むすべてのリクエストに適用されます。
| 制限 | 値 | 説明 |
|---|---|---|
| リクエストあたりの厳密なツール数 | 20 | strict: trueを持つツールの最大数。非厳密なツールはこの制限にカウントされません。 |
| オプションパラメータ | 24 | すべての厳密なツールスキーマとJSON出力スキーマ全体でのオプションパラメータの合計。requiredにリストされていない各パラメータがこの制限にカウントされます。 |
| ユニオン型を持つパラメータ | 16 | すべての厳密なスキーマ全体でanyOfまたは型配列(例:"type": ["string", "null"])を使用するパラメータの合計。これらは指数関数的なコンパイルコストを生じさせるため、特にコストが高くなります。 |
これらの制限は、単一のリクエスト内のすべての厳密なスキーマの合計に適用されます。例えば、それぞれ6つのオプションパラメータを持つ4つの厳密なツールがある場合、個々のツールは複雑に見えなくても、24パラメータの制限に達します。
前述の表の明示的な制限に加えて、コンパイルされた文法サイズに対する追加の内部制限があります。これらの制限が存在するのは、スキーマの複雑さが単一の次元に還元されないためです。オプションパラメータ、ユニオン型、ネストされたオブジェクト、ツール数などの機能は相互に作用し、コンパイルされた文法を不釣り合いに大きくする可能性があります。
これらの制限を超えると、「Schema is too complex for compilation.」というメッセージを含む400エラーが返されます。これらのエラーは、前述の表の各個別の制限が満たされていても、スキーマの複雑さの合計が効率的にコンパイルできる範囲を超えていることを意味します。最終的な安全策として、APIは180秒のコンパイルタイムアウトも強制します。すべての明示的なチェックを通過しても非常に大きなコンパイル済み文法を生成するスキーマは、このタイムアウトに達する可能性があります。
複雑さの制限に達している場合は、次の戦略を順番に試してください。
重要なツールのみを厳密としてマークする。 多くのツールがある場合、スキーマ違反が実際の問題を引き起こすツールにのみ予約し、より単純なツールについてはClaudeの自然な準拠に依存します。
オプションパラメータを減らす。 可能な限りパラメータをrequiredにします。各オプションパラメータは、文法の状態空間の一部をおおよそ2倍にします。パラメータに常に妥当なデフォルト値がある場合は、それを必須にしてClaudeにそのデフォルト値を明示的に提供させることを検討してください。
ネストされた構造を簡素化する。 オプションフィールドを持つ深くネストされたオブジェクトは複雑さを増大させます。可能な限り構造をフラット化してください。
複数のリクエストに分割する。 多くの厳密なツールがある場合は、それらを別々のリクエストまたはサブエージェントに分割することを検討してください。
有効なスキーマで問題が継続する場合は、スキーマ定義を添えてサポートにお問い合わせください。
構造化出力を使用する場合、プロンプトと応答はZDRで処理されます。ただし、JSONスキーマ自体は最適化のために最終使用から最大24時間一時的にキャッシュされます。API応答を超えてプロンプトや応答データは保持されません。
構造化出力はHIPAA適格ですが、JSONスキーマ定義にPHIを含めてはいけません。APIはJSONスキーマを文法にコンパイルし、メッセージコンテンツとは別にキャッシュします。これらのキャッシュされたスキーマは、プロンプトや応答と同じPHI保護を受けません。スキーマのプロパティ名、enum値、const値、またはpattern正規表現にPHIを含めないでください。PHIは、HIPAAセーフガードの下で保護されるメッセージコンテンツ(プロンプトと応答)にのみ含めるべきです。
すべての機能におけるZDRとHIPAA適格性については、APIとデータ保持を参照してください。
互換性あり:
output_config.format)と厳密なツール使用(strict: true)を組み合わせて使用互換性なし:
output_config.formatで引用が有効になっている場合、400エラーを返します。文法のスコープ: 文法はClaudeの直接出力にのみ適用され、ツール使用呼び出し、ツール結果、または思考タグ(拡張思考を使用する場合)には適用されません。文法の状態はセクション間でリセットされるため、Claudeは自由に思考しながら、最終応答で構造化出力を生成できます。
Was this page helpful?