Output terstruktur membatasi respons Claude untuk mengikuti skema tertentu, memastikan output yang valid dan dapat diurai untuk pemrosesan hilir. Gunakan output JSON (output_format) untuk respons data terstruktur, atau penggunaan alat ketat (strict: true) untuk validasi skema yang dijamin pada nama alat dan input.
Output terstruktur saat ini tersedia sebagai fitur beta publik di Claude API untuk Claude Sonnet 4.5 dan Claude Opus 4.1.
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 salah bentuk 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()Pilih mode yang tepat untuk kasus penggunaan Anda:
| Gunakan output JSON ketika | Gunakan penggunaan alat ketat ketika |
|---|---|
| Anda memerlukan respons Claude dalam format tertentu | Anda memerlukan parameter yang divalidasi dan nama alat untuk panggilan alat |
| Mengekstrak data dari gambar atau teks | Membangun alur kerja agen |
| Menghasilkan laporan terstruktur | Memastikan panggilan fungsi yang aman tipe |
| Memformat respons API | Alat kompleks dengan banyak dan/atau properti bersarang |
Membangun sistem agen yang andal memerlukan kepatuhan skema yang dijamin. Parameter alat yang tidak valid merusak fungsi dan alur kerja Anda. Claude mungkin mengembalikan tipe yang tidak kompatibel ("2" bukan 2) atau bidang yang hilang, 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, Anda dijamin passengers: 2.
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.
Output JSON saja
Pembantu SDK (Pydantic, Zod, parse()) hanya bekerja dengan output JSON (output_format).
Pembantu ini mengubah dan memvalidasi output Claude untuk Anda. Penggunaan alat ketat memvalidasi input Claude ke alat Anda, yang menggunakan bidang input_schema yang ada dalam definisi alat.
Untuk penggunaan alat ketat, tentukan input_schema Anda langsung dalam definisi alat dengan strict: true.
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 secara otomatis mengubah skema yang disediakan, 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 setidaknya 100", dan SDK memvalidasi respons terhadap batasan asli.
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 prompt cache 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 keselamatan dan kegunaannya bahkan saat menggunakan output terstruktur. Jika Claude menolak permintaan karena alasan keselamatan:
stop_reason: "refusal"Batas token tercapai (stop_reason: "max_tokens")
Jika respons terpotong 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 berkelanjutan dengan skema yang valid, hubungi dukungan dengan definisi skema Anda.
Bekerja dengan:
output_format) dan penggunaan alat ketat (strict: true) bersama 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 disetel ulang antar bagian, memungkinkan Claude berpikir bebas sambil tetap menghasilkan output terstruktur dalam respons akhir.
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)