構造化された出力は、Claude の応答を特定のスキーマに従うように制限し、ダウンストリーム処理のための有効で解析可能な出力を保証します。構造化データレスポンスには JSON 出力 (output_format) を使用するか、ツール名と入力の保証されたスキーマ検証には 厳密なツール使用 (strict: true) を使用してください。
構造化された出力は現在、Claude Sonnet 4.5 および Claude Opus 4.1 の Claude API でパブリックベータ機能として利用可能です。
この機能を使用するには、ベータヘッダー structured-outputs-2025-11-13 を設定してください。
構造化された出力がない場合、Claude は不正な形式の JSON レスポンスまたは無効なツール入力を生成し、アプリケーションを破壊する可能性があります。注意深いプロンプティングでも、以下に遭遇する可能性があります:
構造化された出力は、制約付きデコーディングを通じてスキーマ準拠のレスポンスを保証します:
JSON.parse() エラーはもうありませんユースケースに適したモードを選択してください:
| JSON 出力を使用する場合 | 厳密なツール使用を使用する場合 |
|---|---|
| Claude のレスポンスが特定の形式である必要がある場合 | ツール呼び出しの検証済みパラメータとツール名が必要な場合 |
| 画像またはテキストからのデータ抽出 | エージェンティックワークフローの構築 |
| 構造化されたレポートの生成 | 型安全な関数呼び出しの確保 |
| API レスポンスのフォーマット | 多くの、および/またはネストされたプロパティを持つ複雑なツール |
信頼性の高いエージェンティックシステムの構築には、保証されたスキーマ準拠が必要です。無効なツールパラメータは関数とワークフローを破壊します。Claude は互換性のない型("2" の代わりに 2)または欠落フィールドを返す可能性があり、ランタイムエラーが発生します。
厳密なツール使用は型安全なパラメータを保証します:
例えば、予約システムが passengers: int を必要とするとします。厳密モードがない場合、Claude は passengers: "two" または passengers: "2" を提供する可能性があります。strict: true を使用すると、passengers: 2 が保証されます。
Python と TypeScript SDK は、スキーマ変換、自動検証、および一般的なスキーマライブラリとの統合を含む、JSON 出力の操作を容易にするヘルパーを提供します。
Python と TypeScript 開発者は、生の JSON スキーマを記述する代わりに、Pydantic や Zod などの使い慣れたスキーマ定義ツールを使用できます。
JSON 出力のみ
SDK ヘルパー(Pydantic、Zod、parse())は JSON 出力(output_format)でのみ機能します。
これらのヘルパーは Claude の出力をあなたに変換して検証します。厳密なツール使用は Claude の入力をツールに検証し、ツール定義の既存の input_schema フィールドを使用します。
厳密なツール使用の場合、ツール定義で strict: true を使用して input_schema を直接定義します。
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)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 は元の制約に対してレスポンスを検証します。
構造化された出力は、コンパイルされた文法アーティファクトを使用した制約付きサンプリングを使用します。これにより、認識する必要があるいくつかのパフォーマンス特性が導入されます:
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 で引用が有効な場合、400 エラーを返します。文法スコープ: 文法は Claude の直接出力にのみ適用され、ツール使用呼び出し、ツール結果、または思考タグ(拡張思考を使用する場合)には適用されません。文法状態はセクション間でリセットされ、Claude が自由に考えることができながら、最終レスポンスで構造化された出力を生成できます。