Структурированные выходные данные ограничивают ответы Claude определённой схемой, обеспечивая корректный, анализируемый результат для последующей обработки. Доступны две дополняющие друг друга функции:
output_format): Получайте ответ Claude в определённом формате JSONstrict: true): Гарантируйте проверку схемы для имён инструментов и входных данныхЭти функции можно использовать независимо или вместе в одном запросе.
Структурированные выходные данные в настоящее время доступны как функция общедоступной бета-версии в Claude API для Claude Sonnet 4.5, Claude Opus 4.1, Claude Opus 4.5 и Claude Haiku 4.5.
Чтобы использовать эту функцию, установите заголовок бета-версии structured-outputs-2025-11-13.
Поделитесь отзывом, используя эту форму.
Без структурированных выходных данных 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" \
-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
}
}
}'Формат ответа: Корректный JSON, соответствующий вашей схеме в response.content[0].text
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Определите вашу JSON схему
Создайте JSON схему, которая описывает структуру, которой должен следовать Claude. Схема использует стандартный формат JSON Schema с некоторыми ограничениями (см. ограничения JSON Schema).
Добавьте параметр output_format
Включите параметр output_format в ваш запрос API с type: "json_schema" и определением вашей схемы.
Включите заголовок бета-версии
Добавьте заголовок anthropic-beta: structured-outputs-2025-11-13 в ваш запрос.
Проанализируйте ответ
Ответ Claude будет корректным JSON, соответствующим вашей схеме, возвращённым в response.content[0].text.
Python и TypeScript SDK предоставляют вспомогательные функции, которые облегчают работу с JSON выходными данными, включая преобразование схемы, автоматическую проверку и интеграцию с популярными библиотеками схем.
Для разработчиков Python и TypeScript вы можете использовать знакомые инструменты определения схемы, такие как Pydantic и Zod, вместо написания необработанных JSON схем.
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.beta.messages, а не на client.messages.
Python: вспомогательная функция transform_schema()
Для случаев, когда вам нужно вручную преобразовать схемы перед отправкой, или когда вы хотите изменить схему, созданную Pydantic. В отличие от client.beta.messages.parse(), которая автоматически преобразует предоставленные схемы, это даёт вам преобразованную схему, чтобы вы могли дополнительно её настроить.
Python и TypeScript SDK автоматически преобразуют схемы с неподдерживаемыми функциями:
minimum, maximum, minLength, maxLength)additionalProperties: false ко всем объектамЭто означает, что Claude получает упрощённую схему, но ваш код по-прежнему применяет все ограничения через проверку.
Пример: Поле Pydantic с minimum: 100 становится простым целым числом в отправляемой схеме, но описание обновляется на "Должно быть не менее 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" \
-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.content[x].input
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}Гарантии:
input строго следуют input_schemaname всегда корректно (из предоставленных инструментов или серверных инструментов)Определите схему вашего инструмента
Создайте JSON схему для input_schema вашего инструмента. Схема использует стандартный формат JSON Schema с некоторыми ограничениями (см. ограничения JSON Schema).
Добавьте strict: true
Установите "strict": true как свойство верхнего уровня в определении вашего инструмента, рядом с name, description и input_schema.
Включите заголовок бета-версии
Добавьте заголовок anthropic-beta: structured-outputs-2025-11-13 в ваш запрос.
Обработайте вызовы инструментов
Когда Claude использует инструмент, поле input в блоке tool_use будет строго следовать вашему input_schema, и name всегда будет корректным.
JSON выходные данные и строгое использование инструментов решают разные проблемы и могут использоваться вместе:
При объединении Claude может вызывать инструменты с гарантированно корректными параметрами И возвращать структурированные ответы JSON. Это полезно для рабочих процессов агентов, где вам нужны как надёжные вызовы инструментов, так и структурированные финальные выходные данные.
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
}
}]
)Структурированные выходные данные используют ограниченную выборку с скомпилированными артефактами грамматики. Это вводит некоторые характеристики производительности, о которых следует знать:
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:
"Too many recursive definitions in schema"
"Schema is too complex"
strict: trueДля постоянных проблем с корректными схемами свяжитесь с поддержкой с определением вашей схемы.
Работает с:
output_format) и строгое использование инструментов (strict: true) вместе в одном запросеНесовместимо с:
output_format.Область действия грамматики: Грамматики применяются только к прямому выходу Claude, а не к вызовам инструментов, результатам инструментов или тегам мышления (при использовании Extended Thinking). Состояние грамматики сбрасывается между разделами, позволяя Claude свободно думать, при этом всё ещё производя структурированный выход в финальном ответе.