Output terstruktur membatasi respons Claude untuk mengikuti skema tertentu, memastikan output yang valid dan dapat diurai untuk pemrosesan hilir. Dua fitur yang saling melengkapi tersedia:
output_format): Dapatkan respons Claude dalam format JSON tertentustrict: true): Jamin validasi skema pada nama alat dan inputFitur-fitur ini dapat digunakan secara independen atau bersama-sama dalam permintaan yang sama.
Output terstruktur saat ini tersedia sebagai fitur beta publik di Claude API untuk Claude Sonnet 4.5, Claude Opus 4.1, Claude Opus 4.5, dan Claude Haiku 4.5.
Untuk menggunakan fitur ini, atur header beta structured-outputs-2025-11-13.
Bagikan umpan balik menggunakan formulir ini.
Tanpa output terstruktur, Claude dapat menghasilkan respons JSON yang tidak terbentuk dengan baik atau input alat yang tidak valid yang merusak aplikasi Anda. Bahkan dengan prompt yang hati-hati, Anda mungkin mengalami:
Output terstruktur menjamin respons yang sesuai dengan skema melalui decoding terbatas:
JSON.parse()Output JSON mengontrol format respons Claude, memastikan Claude mengembalikan JSON yang valid sesuai dengan skema Anda. Gunakan output JSON ketika Anda perlu:
Format respons: JSON yang valid sesuai dengan skema Anda di response.content[0].text
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Tentukan skema JSON Anda
Buat skema JSON yang mendeskripsikan struktur yang ingin Anda ikuti oleh Claude. Skema menggunakan format JSON Schema standar dengan beberapa batasan (lihat batasan JSON Schema).
Tambahkan parameter output_format
Sertakan parameter output_format dalam permintaan API Anda dengan type: "json_schema" dan definisi skema Anda.
Sertakan header beta
Tambahkan header anthropic-beta: structured-outputs-2025-11-13 ke permintaan Anda.
Urai respons
Respons Claude akan berupa JSON yang valid sesuai dengan skema Anda, dikembalikan di response.content[0].text.
SDK Python dan TypeScript menyediakan pembantu yang memudahkan bekerja dengan output JSON, termasuk transformasi skema, validasi otomatis, dan integrasi dengan perpustakaan skema populer.
Untuk pengembang Python dan TypeScript, Anda dapat menggunakan alat definisi skema yang familiar seperti Pydantic dan Zod alih-alih menulis skema JSON mentah.
Python: client.beta.messages.parse() (Direkomendasikan)
Metode parse() secara otomatis mengubah model Pydantic Anda, memvalidasi respons, dan mengembalikan atribut parsed_output.
Metode parse() tersedia di client.beta.messages, bukan client.messages.
Python: pembantu transform_schema()
Untuk ketika Anda perlu secara manual mengubah skema sebelum mengirim, atau ketika Anda ingin memodifikasi skema yang dihasilkan Pydantic. Tidak seperti client.beta.messages.parse(), yang mengubah skema yang disediakan secara otomatis, ini memberi Anda skema yang diubah sehingga Anda dapat menyesuaikannya lebih lanjut.
SDK Python dan TypeScript secara otomatis mengubah skema dengan fitur yang tidak didukung:
minimum, maximum, minLength, maxLength)additionalProperties: false ke semua objekIni berarti Claude menerima skema yang disederhanakan, tetapi kode Anda masih memberlakukan semua batasan melalui validasi.
Contoh: Bidang Pydantic dengan minimum: 100 menjadi integer biasa dalam skema yang dikirim, tetapi deskripsi diperbarui menjadi "Harus minimal 100", dan SDK memvalidasi respons terhadap batasan asli.
Penggunaan alat ketat memvalidasi parameter alat, memastikan Claude memanggil fungsi Anda dengan argumen yang diketik dengan benar. Gunakan penggunaan alat ketat ketika Anda perlu:
Membangun sistem agen yang andal memerlukan kepatuhan skema yang dijamin. Tanpa mode ketat, Claude mungkin mengembalikan tipe yang tidak kompatibel ("2" alih-alih 2) atau bidang yang diperlukan hilang, merusak fungsi Anda dan menyebabkan kesalahan runtime.
Penggunaan alat ketat menjamin parameter yang aman tipe:
Misalnya, anggaplah sistem pemesanan memerlukan passengers: int. Tanpa mode ketat, Claude mungkin memberikan passengers: "two" atau passengers: "2". Dengan strict: true, respons akan selalu berisi passengers: 2.
Format respons: Blok penggunaan alat dengan input yang divalidasi di response.content[x].input
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}Jaminan:
input alat ketat mengikuti input_schemaname alat selalu valid (dari alat yang disediakan atau alat server)Tentukan skema alat Anda
Buat skema JSON untuk input_schema alat Anda. Skema menggunakan format JSON Schema standar dengan beberapa batasan (lihat batasan JSON Schema).
Tambahkan strict: true
Atur "strict": true sebagai properti tingkat atas dalam definisi alat Anda, bersama dengan name, description, dan input_schema.
Sertakan header beta
Tambahkan header anthropic-beta: structured-outputs-2025-11-13 ke permintaan Anda.
Tangani panggilan alat
Ketika Claude menggunakan alat, bidang input dalam blok tool_use akan ketat mengikuti input_schema Anda, dan name akan selalu valid.
Output JSON dan penggunaan alat ketat menyelesaikan masalah yang berbeda dan dapat digunakan bersama-sama:
Ketika digabungkan, Claude dapat memanggil alat dengan parameter yang dijamin-valid DAN mengembalikan respons JSON terstruktur. Ini berguna untuk alur kerja agen di mana Anda memerlukan panggilan alat yang andal dan output akhir yang terstruktur.
Output terstruktur menggunakan sampling terbatas dengan artefak tata bahasa yang dikompilasi. Ini memperkenalkan beberapa karakteristik kinerja yang perlu diperhatikan:
name atau description tidak membatalkan cacheSaat menggunakan output terstruktur, Claude secara otomatis menerima prompt sistem tambahan yang menjelaskan format output yang diharapkan. Ini berarti:
output_format akan membatalkan cache prompt apa pun untuk utas percakapan ituOutput terstruktur mendukung JSON Schema standar dengan beberapa batasan. Baik output JSON maupun penggunaan alat ketat berbagi batasan ini.
SDK Python dan TypeScript dapat secara otomatis mengubah skema dengan fitur yang tidak didukung dengan menghapusnya dan menambahkan batasan ke deskripsi bidang. Lihat metode khusus SDK untuk detail.
Meskipun output terstruktur menjamin kepatuhan skema dalam sebagian besar kasus, ada skenario di mana output mungkin tidak sesuai dengan skema Anda:
Penolakan (stop_reason: "refusal")
Claude mempertahankan properti keamanan dan kegunaannya bahkan saat menggunakan output terstruktur. Jika Claude menolak permintaan karena alasan keamanan:
stop_reason: "refusal"Batas token tercapai (stop_reason: "max_tokens")
Jika respons dipotong karena mencapai batas max_tokens:
stop_reason: "max_tokens"max_tokens yang lebih tinggi untuk mendapatkan output terstruktur yang lengkapJika skema Anda menggunakan fitur yang tidak didukung atau terlalu kompleks, Anda akan menerima kesalahan 400:
"Terlalu banyak definisi rekursif dalam skema"
"Skema terlalu kompleks"
strict: trueUntuk masalah persisten dengan skema yang valid, hubungi dukungan dengan definisi skema Anda.
Bekerja dengan:
output_format) dan penggunaan alat ketat (strict: true) bersama-sama dalam permintaan yang samaTidak kompatibel dengan:
output_format.Cakupan tata bahasa: Tata bahasa hanya berlaku untuk output langsung Claude, bukan untuk panggilan penggunaan alat, hasil alat, atau tag pemikiran (saat menggunakan Extended Thinking). Status tata bahasa direset antar bagian, memungkinkan Claude berpikir bebas sambil tetap menghasilkan output terstruktur dalam respons akhir.
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
}
}]
)