Output terstruktur membatasi respons Claude agar mengikuti skema tertentu, memastikan output yang valid dan dapat diurai untuk pemrosesan hilir. Dua fitur pelengkap tersedia:
output_config.format): Dapatkan respons Claude dalam format JSON tertentustrict: true): Jaminan validasi skema pada nama alat dan inputFitur-fitur ini dapat digunakan secara independen atau bersama-sama dalam permintaan yang sama.
Output terstruktur umumnya tersedia di Claude API dan Amazon Bedrock untuk Claude Opus 4.6, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.5, dan Claude Haiku 4.5. Output terstruktur tetap dalam beta publik di Microsoft Foundry.
This feature qualifies for Zero Data Retention (ZDR) with limited technical retention. See the Data retention section for details on what is retained and why.
Bermigrasi dari beta? Parameter output_format telah dipindahkan ke output_config.format, dan header beta tidak lagi diperlukan. Header beta lama (structured-outputs-2025-11-13) dan parameter output_format akan terus berfungsi selama periode transisi. Lihat contoh kode di bawah untuk bentuk API yang diperbarui.
Tanpa output terstruktur, Claude dapat menghasilkan respons JSON yang tidak valid atau input alat yang tidak valid yang merusak aplikasi Anda. Bahkan dengan prompt yang cermat, Anda mungkin mengalami:
Output terstruktur menjamin respons yang sesuai skema melalui decoding terbatas:
JSON.parse()Output JSON mengontrol format respons Claude, memastikan Claude mengembalikan JSON valid yang sesuai dengan skema Anda. Gunakan output JSON ketika Anda perlu:
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" \
-d '{
"model": "claude-opus-4-6",
"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
}
}
}
}'Format respons: JSON valid yang 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_config.format
Sertakan parameter output_config.format dalam permintaan API Anda dengan type: "json_schema" dan definisi skema Anda.
Urai respons
Respons Claude akan berupa JSON valid yang sesuai dengan skema Anda, dikembalikan dalam response.content[0].text.
SDK menyediakan helper yang memudahkan pengerjaan output JSON, termasuk transformasi skema, validasi otomatis, dan integrasi dengan library skema populer.
Metode helper SDK (seperti .parse() dan integrasi Pydantic/Zod) masih menerima output_format sebagai parameter kenyamanan. SDK menangani terjemahan ke output_config.format secara internal. Contoh di bawah ini menunjukkan sintaks helper SDK.
Alih-alih menulis skema JSON mentah, Anda dapat menggunakan alat definisi skema yang familiar dalam bahasa Anda:
client.messages.parse()zodOutputFormat()outputFormat(Class<T>)Anthropic::BaseModel dengan output_config: {format: Model}output_configfrom 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-6",
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)Setiap SDK menyediakan helper yang memudahkan pengerjaan structured outputs. Lihat halaman SDK individual untuk detail lengkap.
SDK Python dan TypeScript secara otomatis mentransformasi skema dengan fitur yang tidak didukung:
minimum, maximum, minLength, maxLength)additionalProperties: false ke semua objekIni berarti Claude menerima skema yang disederhanakan, tetapi kode Anda tetap menerapkan semua batasan melalui validasi.
Contoh: Field 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 tool yang ketat memvalidasi parameter tool, memastikan Claude memanggil fungsi Anda dengan argumen yang bertipe dengan benar. Gunakan penggunaan tool yang ketat ketika Anda perlu:
Membangun sistem agentic yang andal memerlukan jaminan kesesuaian skema. Tanpa mode ketat, Claude mungkin mengembalikan tipe yang tidak kompatibel ("2" alih-alih 2) atau field yang diperlukan hilang, merusak fungsi Anda dan menyebabkan kesalahan runtime.
Penggunaan tool yang ketat menjamin parameter yang type-safe:
Misalnya, anggaplah sistem pemesanan membutuhkan passengers: int. Tanpa mode ketat, Claude mungkin memberikan passengers: "two" atau passengers: "2". Dengan strict: true, respons akan selalu berisi passengers: 2.
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" \
-d '{
"model": "claude-opus-4-6",
"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
}
}]
}'Format respons: Blok penggunaan tool dengan input yang telah divalidasi di response.content[x].input
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}Jaminan:
input tool secara ketat mengikuti input_schemaname tool selalu valid (dari tool yang disediakan atau server tools)Definisikan skema tool Anda
Buat skema JSON untuk input_schema tool Anda. Skema menggunakan format JSON Schema standar dengan beberapa keterbatasan (lihat Keterbatasan JSON Schema).
Tambahkan strict: true
Tetapkan "strict": true sebagai properti tingkat atas dalam definisi tool Anda, bersama dengan name, description, dan input_schema.
Tangani pemanggilan tool
Ketika Claude menggunakan tool, field input dalam blok tool_use akan secara ketat mengikuti input_schema Anda, dan name akan selalu valid.
Output JSON dan penggunaan tool yang ketat memecahkan masalah yang berbeda dan dapat digunakan bersama-sama:
Ketika digabungkan, Claude dapat memanggil tool dengan parameter yang terjamin valid DAN mengembalikan respons JSON terstruktur. Ini berguna untuk alur kerja agentic di mana Anda membutuhkan panggilan tool yang andal sekaligus output akhir yang terstruktur.
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "Help me plan a trip to Paris for next month"}
],
# Output JSON: format respons terstruktur
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,
},
}
},
# Penggunaan tool yang ketat: parameter tool yang terjamin
tools=[
{
"name": "search_flights",
"strict": True,
"input_schema": {
"type": "object",
"properties": {
"destination": {"type": "string"},
"date": {"type": "string", "format": "date"},
},
"required": ["destination", "date"],
"additionalProperties": False,
},
}
],
)Output terstruktur menggunakan constrained sampling dengan artefak grammar yang dikompilasi. Ini memperkenalkan beberapa karakteristik performa yang perlu diperhatikan:
name atau description tidak menginvalidasi cacheSaat menggunakan output terstruktur, Claude secara otomatis menerima system prompt tambahan yang menjelaskan format output yang diharapkan. Ini berarti:
output_config.format akan menginvalidasi cache prompt mana pun untuk thread percakapan tersebutOutput terstruktur mendukung JSON Schema standar dengan beberapa keterbatasan. Baik output JSON maupun penggunaan tool yang ketat berbagi keterbatasan ini.
SDK Python dan TypeScript dapat secara otomatis mengubah skema dengan fitur yang tidak didukung dengan menghapusnya dan menambahkan batasan ke deskripsi field. Lihat metode khusus SDK untuk detailnya.
Saat menggunakan output terstruktur, properti dalam objek mempertahankan urutan yang ditentukan dari skema Anda, dengan satu catatan penting: properti yang diperlukan muncul pertama, diikuti oleh properti opsional.
Misalnya, dengan skema ini:
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}Output akan mengurutkan properti sebagai:
name (diperlukan, dalam urutan skema)email (diperlukan, dalam urutan skema)notes (opsional, dalam urutan skema)age (opsional, dalam urutan skema)Ini berarti output mungkin terlihat seperti:
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}Jika urutan properti dalam output penting untuk aplikasi Anda, pastikan semua properti ditandai sebagai required, atau pertimbangkan pengurutan ulang ini dalam logika parsing Anda.
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 terpotong karena mencapai batas max_tokens:
stop_reason: "max_tokens"max_tokens yang lebih tinggi untuk mendapatkan output terstruktur yang lengkapOutput terstruktur bekerja dengan mengompilasi skema JSON Anda menjadi grammar yang membatasi output Claude. Skema yang lebih kompleks menghasilkan grammar yang lebih besar yang membutuhkan waktu lebih lama untuk dikompilasi. Untuk melindungi dari waktu kompilasi yang berlebihan, API memberlakukan beberapa batas kompleksitas.
Batas berikut berlaku untuk semua permintaan dengan output_config.format atau strict: true:
| Batas | Nilai | Deskripsi |
|---|---|---|
| Tool ketat per permintaan | 20 | Jumlah maksimum tool dengan strict: true. Tool non-ketat tidak dihitung terhadap batas ini. |
| Parameter opsional | 24 | Total parameter opsional di semua skema tool ketat dan skema output JSON. Setiap parameter yang tidak tercantum dalam required dihitung terhadap batas ini. |
| Parameter dengan tipe union | 16 | Total parameter yang menggunakan anyOf atau array tipe (misalnya, "type": ["string", "null"]) di semua skema ketat. Ini sangat mahal karena menciptakan biaya kompilasi eksponensial. |
Batas ini berlaku untuk total gabungan di semua skema ketat dalam satu permintaan. Misalnya, jika Anda memiliki 4 tool ketat dengan masing-masing 6 parameter opsional, Anda akan mencapai batas 24 parameter meskipun tidak ada satu tool pun yang tampak kompleks.
Di luar batas eksplisit di atas, ada batas internal tambahan pada ukuran grammar yang dikompilasi. Batas ini ada karena kompleksitas skema tidak dapat direduksi menjadi satu dimensi: fitur seperti parameter opsional, tipe union, objek bersarang, dan jumlah tool berinteraksi satu sama lain dengan cara yang dapat membuat grammar yang dikompilasi menjadi sangat besar secara tidak proporsional.
Ketika batas ini terlampaui, Anda akan menerima error 400 dengan pesan "Schema is too complex for compilation." Error ini berarti kompleksitas gabungan skema Anda melebihi apa yang dapat dikompilasi secara efisien, bahkan jika setiap batas individual di atas terpenuhi. Sebagai langkah terakhir, API juga memberlakukan batas waktu kompilasi 180 detik. Skema yang melewati semua pemeriksaan eksplisit tetapi menghasilkan grammar yang dikompilasi sangat besar mungkin mencapai batas waktu ini.
Jika Anda mencapai batas kompleksitas, coba strategi berikut secara berurutan:
Tandai hanya tool kritis sebagai ketat. Jika Anda memiliki banyak tool, simpan untuk tool di mana pelanggaran skema menyebabkan masalah nyata, dan andalkan kepatuhan alami Claude untuk tool yang lebih sederhana.
Kurangi parameter opsional. Jadikan parameter required jika memungkinkan. Setiap parameter opsional kira-kira menggandakan sebagian ruang status grammar. Jika parameter selalu memiliki default yang wajar, pertimbangkan untuk menjadikannya required dan meminta Claude memberikan default tersebut secara eksplisit.
Sederhanakan struktur bersarang. Objek yang sangat bersarang dengan field opsional memperparah kompleksitas. Ratakan struktur jika memungkinkan.
Bagi menjadi beberapa permintaan. Jika Anda memiliki banyak tool ketat, pertimbangkan untuk membaginya ke permintaan atau sub-agen yang terpisah.
Untuk masalah persisten dengan skema yang valid, hubungi dukungan dengan definisi skema Anda.
Prompt dan respons diproses dengan ZDR saat menggunakan output terstruktur. Namun, skema JSON itu sendiri di-cache sementara hingga 24 jam sejak terakhir digunakan untuk tujuan optimasi. Tidak ada data prompt atau respons yang disimpan di luar respons API.
Untuk kelayakan ZDR di semua fitur, lihat API dan Retensi Data.
Bekerja dengan:
output_config.format) dan penggunaan tool yang ketat (strict: true) bersama-sama dalam permintaan yang samaTidak kompatibel dengan:
output_config.format.Cakupan grammar: Grammar hanya berlaku untuk output langsung Claude, bukan untuk panggilan penggunaan tool, hasil tool, atau tag thinking (saat menggunakan Extended Thinking). Status grammar direset di antara bagian, memungkinkan Claude berpikir dengan bebas sambil tetap menghasilkan output terstruktur dalam respons akhir.
Was this page helpful?