Структурированные выходные данные ограничивают ответы Claude так, чтобы они соответствовали определённой схеме, гарантируя валидный, пригодный для разбора вывод для последующей обработки. Структурированные выходные данные предоставляют две взаимодополняющие возможности:
output_config.format): получение ответа Claude в определённом формате JSONstrict: true): гарантированная валидация схемы для имён инструментов и их входных данныхВы можете использовать эти возможности независимо друг от друга или вместе в одном запросе.
Без структурированных выходных данных Claude может генерировать некорректные JSON-ответы или недопустимые входные данные для инструментов, которые нарушают работу ваших приложений. Даже при тщательном составлении подсказок вы можете столкнуться со следующим:
Структурированные выходные данные гарантируют соответствие ответов схеме за счёт ограниченного декодирования:
JSON.parse()Вывод в формате JSON управляет форматом ответа Claude, гарантируя, что Claude возвращает валидный JSON, соответствующий вашей схеме. Используйте вывод в формате JSON, когда вам нужно:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-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_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,
},
}
},
)
print(next(block.text for block in response.content if block.type == "text"))Формат ответа: валидный JSON, соответствующий вашей схеме, в текстовом блоке содержимого ответа
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Определите вашу JSON-схему
Создайте JSON-схему, описывающую структуру, которой должен следовать Claude. Схема использует стандартный формат JSON Schema с некоторыми ограничениями (см. Ограничения JSON Schema).
Добавьте параметр output_config.format
Включите параметр output_config.format в ваш запрос к API с type: "json_schema" и определением вашей схемы.
Разберите ответ
Ответ Claude — это валидный JSON, соответствующий вашей схеме, возвращаемый в текстовом блоке содержимого ответа.
SDK предоставляют вспомогательные функции, упрощающие работу с выводом в формате JSON, включая преобразование схем, автоматическую валидацию и интеграцию с популярными библиотеками схем.
Вместо написания «сырых» JSON-схем вы можете использовать привычные инструменты определения схем на вашем языке:
client.messages.parse()zodOutputFormat() или типизированные литералы JSON Schema с jsonSchemaOutputFormat()outputConfig(Class<T>)Anthropic::BaseModel с output_config: {format: Model}StructuredOutputModel, с outputConfig: ['format' => MyClass::class]Create<T>(), которая выводит схему автоматическиoutput_configoutput_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-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=ContactInfo,
)
print(response.parsed_output)Каждый SDK предоставляет вспомогательные функции, упрощающие работу со структурированными выходными данными. Полные сведения см. на страницах отдельных SDK.
client.messages.parse() (рекомендуется)
Метод parse() автоматически преобразует вашу модель Pydantic, валидирует ответ и возвращает атрибут parsed_output.
from pydantic import BaseModel
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
response = client.messages.parse(
model="claude-opus-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract contact info: John Smith, [email protected], interested in the Pro plan",
}
],
output_format=ContactInfo,
)
# Прямой доступ к разобранному выводу
contact = response.parsed_output
print(contact.name, contact.email)Вспомогательная функция transform_schema()
Для случаев, когда вам нужно вручную преобразовать схемы перед отправкой или когда вы хотите изменить схему, сгенерированную Pydantic. В отличие от client.messages.parse(), который преобразует предоставленные схемы автоматически, эта функция даёт вам преобразованную схему, чтобы вы могли дополнительно её настроить.
from anthropic import transform_schema
from pydantic import TypeAdapter
# Сначала преобразуйте модель Pydantic в JSON-схему, затем трансформируйте
schema = TypeAdapter(ContactInfo).json_schema()
schema = transform_schema(schema)
# При необходимости измените схему
schema["properties"]["custom_field"] = {"type": "string"}
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "..."}],
output_config={
"format": {"type": "json_schema", "schema": schema},
},
)SDK для Python, TypeScript, Ruby и PHP автоматически преобразуют схемы с неподдерживаемыми возможностями. SDK для C# и Go применяют те же преобразования, когда схема выводится из нативного типа (Create<T>() в C#; рефлексия структур или BetaJSONSchemaOutputFormat() в бета-версии API для Go). Шаги преобразования:
minimum, maximum, minLength, maxLength)additionalProperties: false ко всем объектамЭто означает, что Claude получает упрощённую схему, но ваш код по-прежнему применяет все ограничения через валидацию.
Пример: поле Pydantic с minimum: 100 становится обычным целым числом в отправляемой схеме, но SDK обновляет описание до «Должно быть не менее 100» и валидирует ответ по исходному ограничению.
О применении соответствия JSON Schema к входным данным инструментов с помощью грамматически ограниченной выборки см. Строгое использование инструментов.
Вывод в формате JSON и строгое использование инструментов решают разные задачи и работают вместе:
При совместном использовании Claude может вызывать инструменты с гарантированно валидными параметрами И возвращать структурированные JSON-ответы. Это полезно для агентных рабочих процессов, где вам нужны как надёжные вызовы инструментов, так и структурированные итоговые выходные данные.
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Help me plan a trip to Paris departing May 15, 2026",
}
],
# Вывод в формате 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,
},
}
],
)
print(response)Структурированные выходные данные используют ограниченную выборку со скомпилированными грамматическими артефактами. Это вносит некоторые характеристики производительности, о которых следует знать:
name или description не инвалидирует кэшПри использовании структурированных выходных данных Claude автоматически получает дополнительную системную подсказку, объясняющую ожидаемый формат вывода. Это означает:
output_config.format инвалидирует любой кэш подсказок для этой ветки разговораСтруктурированные выходные данные поддерживают стандартный JSON Schema с некоторыми ограничениями. Эти ограничения общие для вывода в формате JSON и строгого использования инструментов.
При использовании структурированных выходных данных свойства в объектах сохраняют порядок, определённый в вашей схеме, с одной важной оговоркой: обязательные свойства идут первыми, за ними следуют необязательные свойства.
Например, для следующей схемы:
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}Вывод упорядочит свойства следующим образом:
name (обязательное, в порядке схемы)email (обязательное, в порядке схемы)notes (необязательное, в порядке схемы)age (необязательное, в порядке схемы)Это означает, что вывод может выглядеть так:
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}Если порядок свойств в выводе важен для вашего приложения, пометьте все свойства как обязательные или учтите это переупорядочивание в вашей логике разбора.
Хотя структурированные выходные данные гарантируют соответствие схеме в большинстве случаев, существуют сценарии, когда вывод может не соответствовать вашей схеме:
Отказы (stop_reason: "refusal")
Claude сохраняет свои свойства безопасности и полезности даже при использовании структурированных выходных данных. Если Claude отказывается выполнить запрос по соображениям безопасности:
stop_reason: "refusal"Достигнут лимит токенов (stop_reason: "max_tokens")
Если ответ обрезан из-за достижения лимита max_tokens:
stop_reason: "max_tokens"max_tokens, чтобы получить полный структурированный выводРегистр значений перечислений
Структурированные выходные данные не гарантируют регистр строковых значений enum и const: Claude может вернуть значение, отличающееся от вашей схемы только регистром, обычно в первой букве слова, следующего за пробелом. Например, для следующей схемы:
{
"type": "string",
"enum": ["Conversation Topic 1", "Conversation Topic 2", "Conversation topic 3"]
}Вывод может содержать "Conversation Topic 3" (заглавная «T»), хотя именно такого значения нет в перечислении. Ответ завершается нормально, без ошибки и без специального stop_reason. Это относится как к выводу в формате JSON, так и к строгому использованию инструментов. Сравнивайте значения перечислений без учёта регистра и избегайте значений перечислений, отличающихся только регистром.
Структурированные выходные данные работают путём компиляции ваших JSON-схем в грамматику, которая ограничивает вывод Claude. Более сложные схемы создают более крупные грамматики, компиляция которых занимает больше времени. Для защиты от чрезмерного времени компиляции API применяет несколько ограничений сложности.
Следующие ограничения применяются ко всем запросам с output_config.format или strict: true:
| Ограничение | Значение | Описание |
|---|---|---|
| Строгих инструментов на запрос | 20 | Максимальное количество инструментов с strict: true. Нестрогие инструменты не учитываются в этом лимите. |
| Необязательных параметров | 24 | Общее количество необязательных параметров во всех схемах строгих инструментов и схемах вывода JSON. Каждый параметр, не указанный в required, учитывается в этом лимите. |
| Параметров с типами-объединениями | 16 | Общее количество параметров, использующих anyOf или массивы типов (например, "type": ["string", "null"]) во всех строгих схемах. Они особенно затратны, поскольку создают экспоненциальную стоимость компиляции. |
Помимо явных ограничений в предыдущей таблице, существуют дополнительные внутренние ограничения на размер скомпилированной грамматики. Эти ограничения существуют потому, что сложность схемы не сводится к одному измерению: такие возможности, как необязательные параметры, типы-объединения, вложенные объекты и количество инструментов, взаимодействуют друг с другом таким образом, что скомпилированная грамматика может стать непропорционально большой.
При превышении этих ограничений вы получите ошибку 400 с сообщением «Schema is too complex for compilation». Такие ошибки означают, что совокупная сложность ваших схем превышает то, что может быть эффективно скомпилировано, даже если каждое отдельное ограничение из предыдущей таблицы соблюдено. В качестве последней защитной меры API также применяет тайм-аут компиляции в 180 секунд. Схемы, которые проходят все явные проверки, но создают очень большие скомпилированные грамматики, могут достичь этого тайм-аута.
Если вы достигаете ограничений сложности, попробуйте следующие стратегии по порядку:
Помечайте как строгие только критически важные инструменты. Если у вас много инструментов, зарезервируйте строгий режим для инструментов, где нарушения схемы вызывают реальные проблемы, и полагайтесь на естественное соблюдение схемы со стороны Claude для более простых инструментов.
Сократите количество необязательных параметров. Делайте параметры обязательными (required), где это возможно. Каждый необязательный параметр примерно удваивает часть пространства состояний грамматики. Если параметр всегда имеет разумное значение по умолчанию, рассмотрите возможность сделать его обязательным и позволить Claude явно предоставлять это значение по умолчанию.
Упростите вложенные структуры. Глубоко вложенные объекты с необязательными полями усугубляют сложность. Делайте структуры более плоскими, где это возможно.
Разделите на несколько запросов. Если у вас много строгих инструментов, рассмотрите возможность разделить их между отдельными запросами или подагентами.
При постоянных проблемах с валидными схемами обратитесь в поддержку, приложив определение вашей схемы.
Подсказки и ответы обрабатываются с ZDR при использовании структурированных выходных данных. Однако сама JSON-схема временно кэшируется на срок до 24 часов с момента последнего использования в целях оптимизации. Никакие данные подсказок или ответов не сохраняются после ответа API.
Структурированные выходные данные соответствуют требованиям HIPAA, но PHI не должна включаться в определения JSON-схем. API компилирует JSON-схемы в грамматики, которые кэшируются отдельно от содержимого сообщений, и эти кэшированные схемы не получают тех же защит PHI, что подсказки и ответы. Не включайте PHI в имена свойств схемы, значения enum, значения const или регулярные выражения pattern. PHI должна появляться только в содержимом сообщений (подсказках и ответах), где она защищена в соответствии с мерами безопасности HIPAA.
О соответствии требованиям ZDR и HIPAA для всех функций см. API и хранение данных.
Работает с:
output_config.format) и строгое использование инструментов (strict: true) вместе в одном запросеНесовместимо с:
output_config.format.Позвольте Claude ссылаться на источники при ответах на вопросы о предоставленных документах.
Применяйте соответствие JSON Schema к входным данным инструментов Claude с помощью грамматически ограниченной выборки.
Подключайте Claude к внешним инструментам и API. Узнайте, где выполняются инструменты и как работает агентный цикл.
Узнайте о структуре ценообразования Anthropic для моделей и функций.
| Supported models |
|
|---|---|
| Supported platforms |
Was this page helpful?