구조화된 출력은 Claude의 응답을 특정 스키마를 따르도록 제한하여, 다운스트림 처리를 위한 유효하고 파싱 가능한 출력을 보장합니다. 두 가지 상호 보완적인 기능을 사용할 수 있습니다:
output_config.format): Claude의 응답을 특정 JSON 형식으로 받기strict: true): 도구 이름과 입력에 대한 스키마 검증 보장output_format 매개변수가 output_config.format으로 이동되었습니다. 이전 output_format 매개변수는 일시적으로 계속 작동하지만 더 이상 사용되지 않으며 향후 API 버전에서 제거될 예정입니다. 코드를 output_config: {format: {...}}를 사용하도록 업데이트하세요.
이러한 기능은 동일한 요청에서 독립적으로 또는 함께 사용할 수 있습니다.
구조화된 출력은 Claude API와 Amazon Bedrock에서 Claude Opus 4.6, Claude Sonnet 4.5, Claude Opus 4.5, Claude Haiku 4.5에 대해 정식 출시되었습니다. 구조화된 출력은 Microsoft Foundry에서 공개 베타로 유지됩니다.
베타에서 마이그레이션하시나요? output_format 매개변수가 output_config.format으로 이동되었으며, 베타 헤더는 더 이상 필요하지 않습니다. 이전 베타 헤더(structured-outputs-2025-11-13)와 output_format 매개변수는 전환 기간 동안 계속 작동합니다. 업데이트된 API 형태는 아래 코드 예제를 참조하세요.
구조화된 출력 없이는 Claude가 잘못된 형식의 JSON 응답이나 유효하지 않은 도구 입력을 생성하여 애플리케이션을 중단시킬 수 있습니다. 신중한 프롬프팅을 하더라도 다음과 같은 문제가 발생할 수 있습니다:
구조화된 출력은 제한된 디코딩을 통해 스키마 준수 응답을 보장합니다:
JSON.parse() 오류 없음JSON 출력은 Claude의 응답 형식을 제어하여, Claude가 스키마와 일치하는 유효한 JSON을 반환하도록 보장합니다. 다음이 필요할 때 JSON 출력을 사용하세요:
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
}
}
}
}'응답 형식: response.content[0].text에서 스키마와 일치하는 유효한 JSON
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}JSON 스키마 정의
Claude가 따르길 원하는 구조를 설명하는 JSON 스키마를 생성합니다. 스키마는 일부 제한 사항이 있는 표준 JSON Schema 형식을 사용합니다(JSON 스키마 제한 사항 참조).
output_config.format 매개변수 추가
API 요청에 type: "json_schema"와 스키마 정의를 포함한 output_config.format 매개변수를 포함합니다.
응답 파싱
Claude의 응답은 response.content[0].text에 반환되는 스키마와 일치하는 유효한 JSON이 됩니다.
Python과 TypeScript SDK는 스키마 변환, 자동 검증, 인기 있는 스키마 라이브러리와의 통합을 포함하여 JSON 출력 작업을 더 쉽게 만드는 헬퍼를 제공합니다.
SDK 헬퍼 메서드(.parse() 및 Pydantic/Zod 통합 등)는 편의 매개변수로 output_format을 여전히 허용합니다. SDK가 내부적으로 output_config.format으로의 변환을 처리합니다. 아래 예제는 SDK 헬퍼 구문을 보여줍니다.
Python과 TypeScript 개발자의 경우, 원시 JSON 스키마를 작성하는 대신 Pydantic과 Zod 같은 익숙한 스키마 정의 도구를 사용할 수 있습니다.
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()
# .create() 사용 시 - transform_schema() 필요
response = client.messages.create(
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": transform_schema(ContactInfo),
}
}
)
print(response.content[0].text)
# .parse() 사용 시 - Pydantic 모델을 직접 전달 가능
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)Python: client.messages.parse() (권장)
parse() 메서드는 Pydantic 모델을 자동으로 변환하고, 응답을 검증하며, parsed_output 속성을 반환합니다.
Python: transform_schema() 헬퍼
전송 전에 스키마를 수동으로 변환해야 하거나, Pydantic이 생성한 스키마를 수정하고 싶을 때 사용합니다. 제공된 스키마를 자동으로 변환하는 client.messages.parse()와 달리, 이 함수는 변환된 스키마를 반환하여 추가 커스터마이징이 가능합니다.
Python과 TypeScript SDK 모두 지원되지 않는 기능이 있는 스키마를 자동으로 변환합니다:
minimum, maximum, minLength, maxLength)additionalProperties: false 추가이는 Claude가 단순화된 스키마를 받지만, 코드에서는 검증을 통해 모든 제약 조건을 여전히 적용한다는 것을 의미합니다.
예시: minimum: 100이 있는 Pydantic 필드는 전송되는 스키마에서 일반 정수가 되지만, 설명이 "Must be at least 100"으로 업데이트되고, SDK는 원본 제약 조건에 대해 응답을 검증합니다.
엄격한 도구 사용은 도구 매개변수를 검증하여, Claude가 올바른 타입의 인수로 함수를 호출하도록 보장합니다. 다음이 필요할 때 엄격한 도구 사용을 사용하세요:
신뢰할 수 있는 에이전트 시스템을 구축하려면 스키마 준수가 보장되어야 합니다. 엄격 모드 없이는 Claude가 호환되지 않는 타입(2 대신 "2")이나 누락된 필수 필드를 반환하여 함수를 중단시키고 런타임 오류를 발생시킬 수 있습니다.
엄격한 도구 사용은 타입 안전 매개변수를 보장합니다:
예를 들어, 예약 시스템에 passengers: int가 필요하다고 가정합니다. 엄격 모드 없이는 Claude가 passengers: "two" 또는 passengers: "2"를 제공할 수 있습니다. strict: true를 사용하면 응답에 항상 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
}
}]
}'응답 형식: response.content[x].input에서 검증된 입력이 포함된 도구 사용 블록
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}보장 사항:
input이 input_schema를 엄격히 따름name이 항상 유효함 (제공된 도구 또는 서버 도구에서)도구 스키마 정의
도구의 input_schema에 대한 JSON 스키마를 생성합니다. 스키마는 일부 제한 사항이 있는 표준 JSON Schema 형식을 사용합니다(JSON 스키마 제한 사항 참조).
strict: true 추가
도구 정의에서 name, description, input_schema와 함께 최상위 속성으로 "strict": true를 설정합니다.
도구 호출 처리
Claude가 도구를 사용할 때, tool_use 블록의 input 필드는 input_schema를 엄격히 따르며, name은 항상 유효합니다.
JSON 출력과 엄격한 도구 사용은 서로 다른 문제를 해결하며 함께 사용할 수 있습니다:
결합하면, Claude는 보장된 유효한 매개변수로 도구를 호출하고 구조화된 JSON 응답을 반환할 수 있습니다. 이는 신뢰할 수 있는 도구 호출과 구조화된 최종 출력이 모두 필요한 에이전트 워크플로우에 유용합니다.
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"}],
# 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
}
}]
)구조화된 출력은 컴파일된 문법 아티팩트를 사용한 제한된 샘플링을 사용합니다. 이로 인해 알아야 할 몇 가지 성능 특성이 있습니다:
name 또는 description 필드만 변경하는 것은 캐시를 무효화하지 않습니다구조화된 출력을 사용할 때, Claude는 예상 출력 형식을 설명하는 추가 시스템 프롬프트를 자동으로 받습니다. 이는 다음을 의미합니다:
output_config.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 오류를 받게 됩니다:
"Too many recursive definitions in schema"
"Schema is too complex"
strict: true로 표시된 도구 수를 줄이세요유효한 스키마에 대한 지속적인 문제가 있는 경우, 스키마 정의와 함께 지원팀에 문의하세요.
호환되는 기능:
output_config.format)과 엄격한 도구 사용(strict: true)을 함께 사용호환되지 않는 기능:
output_config.format과 함께 인용이 활성화되면 400 오류를 반환합니다.문법 범위: 문법은 Claude의 직접 출력에만 적용되며, 도구 사용 호출, 도구 결과 또는 사고 태그(확장된 사고 사용 시)에는 적용되지 않습니다. 문법 상태는 섹션 간에 재설정되어, Claude가 자유롭게 사고하면서도 최종 응답에서 구조화된 출력을 생성할 수 있습니다.
Was this page helpful?