Saídas estruturadas
Obtenha resultados JSON validados de fluxos de trabalho de agentes
As "structured outputs" (saídas estruturadas) restringem as respostas do Claude para que sigam um schema específico, garantindo uma saída válida e analisável para processamento posterior. As saídas estruturadas oferecem dois recursos complementares:
- Saídas JSON (
output_config.format): Obtenha a resposta do Claude em um formato JSON específico - Uso estrito de ferramentas (
strict: true): Garanta a validação de schema nos nomes e entradas das ferramentas
Você pode usar esses recursos de forma independente ou em conjunto na mesma requisição.
Por que usar saídas estruturadas
Sem saídas estruturadas, o Claude pode gerar respostas JSON malformadas ou entradas de ferramentas inválidas que quebram suas aplicações. Mesmo com prompts cuidadosos, você pode encontrar:
- Erros de análise devido a sintaxe JSON inválida
- Campos obrigatórios ausentes
- Tipos de dados inconsistentes
- Violações de schema que exigem tratamento de erros e novas tentativas
As saídas estruturadas garantem respostas em conformidade com o schema por meio de decodificação restrita:
- Sempre válidas: Sem mais erros de
JSON.parse() - Segurança de tipos: Tipos de campos e campos obrigatórios garantidos
- Confiáveis: Sem necessidade de novas tentativas por violações de schema
Saídas JSON
As saídas JSON controlam o formato de resposta do Claude, garantindo que o Claude retorne JSON válido correspondente ao seu schema. Use saídas JSON quando você precisar:
- Controlar o formato de resposta do Claude
- Extrair dados de imagens ou texto
- Gerar relatórios estruturados
- Formatar respostas de API
Início rápido
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith (john@example.com) 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"))Formato da resposta: JSON válido correspondente ao seu schema no bloco de conteúdo de texto da resposta
{
"name": "John Smith",
"email": "john@example.com",
"plan_interest": "Enterprise",
"demo_requested": true
}Como funciona
Defina seu schema JSON
Crie um schema JSON que descreva a estrutura que você deseja que o Claude siga. O schema usa o formato JSON Schema padrão com algumas limitações (consulte Limitações do JSON Schema).
Adicione o parâmetro output_config.format
Inclua o parâmetro
output_config.formatna sua requisição de API comtype: "json_schema"e a definição do seu schema.Analise a resposta
A resposta do Claude é um JSON válido correspondente ao seu schema, retornado no bloco de conteúdo de texto da resposta.
Trabalhando com saídas JSON nos SDKs
Os SDKs fornecem helpers que facilitam o trabalho com saídas JSON, incluindo transformação de schema, validação automática e integração com bibliotecas de schema populares.
Usando definições de schema nativas
Em vez de escrever schemas JSON brutos, você pode usar ferramentas de definição de schema familiares na sua linguagem:
- Python: Modelos Pydantic com
client.messages.parse() - TypeScript: Schemas Zod com
zodOutputFormat()ou literais JSON Schema tipados comjsonSchemaOutputFormat() - Java: Classes Java simples com derivação automática de schema por meio de
outputConfig(Class<T>) - Ruby: Classes
Anthropic::BaseModelcomoutput_config: {format: Model} - PHP: Classes que implementam
StructuredOutputModelcomoutputConfig: ['format' => MyClass::class] - C#: Classes C# simples com a sobrecarga genérica
Create<T>(), que deriva o schema automaticamente - Go: Structs Go refletidas automaticamente em schemas JSON na API beta, ou schemas JSON brutos por meio de
output_config - CLI: Schemas JSON brutos passados por meio de
output_config
from 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-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith (john@example.com) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm.",
}
],
output_format=ContactInfo,
)
print(response.parsed_output)Métodos específicos de cada SDK
Cada SDK fornece helpers que facilitam o trabalho com saídas estruturadas. Consulte as páginas individuais de cada SDK para obter todos os detalhes.
client.messages.parse() (Recomendado)
O método parse() transforma automaticamente seu modelo Pydantic, valida a resposta e retorna um atributo parsed_output.
from pydantic import BaseModel
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
response = client.messages.parse(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract contact info: John Smith, john@example.com, interested in the Pro plan",
}
],
output_format=ContactInfo,
)
# Acesse a saída analisada diretamente
contact = response.parsed_output
print(contact.name, contact.email)Helper transform_schema()
Para quando você precisa transformar schemas manualmente antes de enviá-los, ou quando deseja modificar um schema gerado pelo Pydantic. Diferentemente de client.messages.parse(), que transforma os schemas fornecidos automaticamente, este fornece o schema transformado para que você possa personalizá-lo ainda mais.
from anthropic import transform_schema
from pydantic import TypeAdapter
# Primeiro converta o modelo Pydantic em JSON schema e depois transforme
schema = TypeAdapter(ContactInfo).json_schema()
schema = transform_schema(schema)
# Modifique o schema, se necessário
schema["properties"]["custom_field"] = {"type": "string"}
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[{"role": "user", "content": "..."}],
output_config={
"format": {"type": "json_schema", "schema": schema},
},
)Como funciona a transformação do SDK
Os SDKs Python, TypeScript, Ruby e PHP transformam automaticamente schemas com recursos não suportados. Os SDKs C# e Go aplicam as mesmas transformações quando o schema é derivado de um tipo nativo (Create<T>() em C#; reflexão de struct ou BetaJSONSchemaOutputFormat() na API beta do Go). As etapas de transformação:
- Remover restrições não suportadas (por exemplo,
minimum,maximum,minLength,maxLength) - Atualizar descrições com informações de restrição (por exemplo, "Must be at least 100"), quando a restrição não é diretamente suportada pelas saídas estruturadas
- Adicionar
additionalProperties: falsea todos os objetos - Filtrar formatos de string apenas para a lista suportada
- Validar respostas em relação ao seu schema original (com todas as restrições)
Isso significa que o Claude recebe um schema simplificado, mas seu código ainda aplica todas as restrições por meio de validação.
Exemplo: Um campo Pydantic com minimum: 100 se torna um inteiro simples no schema enviado, mas o SDK atualiza a descrição para "Must be at least 100" e valida a resposta em relação à restrição original.
Casos de uso comuns
Extraia dados estruturados de texto não estruturado:
from pydantic import BaseModel
class Invoice(BaseModel):
invoice_number: str
date: str
total_amount: float
line_items: list[dict]
customer_name: str
client = anthropic.Anthropic()
invoice_text = "Invoice #12345, Date: 2024-01-15, Total: $500.00"
response = client.messages.parse(
model="claude-opus-5-5",
max_tokens=4096,
output_format=Invoice,
messages=[
{"role": "user", "content": f"Extract invoice data from: {invoice_text}"}
],
)
print(response.parsed_output)Classifique conteúdo com categorias estruturadas:
from pydantic import BaseModel
client = Anthropic()
class Classification(BaseModel):
category: str
confidence: float
tags: list[str]
sentiment: str
feedback_text = "Great product, but the delivery was slow."
response = client.messages.parse(
model="claude-opus-5-5",
max_tokens=1024,
output_format=Classification,
messages=[{"role": "user", "content": f"Classify this feedback: {feedback_text}"}],
)
print(response.parsed_output)Gere respostas prontas para API:
from pydantic import BaseModel
client = Anthropic()
class APIResponse(BaseModel):
status: str
data: dict
errors: list[dict] | None
metadata: dict
response = client.messages.parse(
model="claude-opus-5-5",
max_tokens=1024,
output_format=APIResponse,
messages=[{"role": "user", "content": "Process this request: ..."}],
)
print(response.parsed_output)Uso estrito de ferramentas
Para impor a conformidade com JSON Schema nas entradas de ferramentas com amostragem restrita por gramática, consulte Uso estrito de ferramentas.
Usando os dois recursos juntos
As saídas JSON e o uso estrito de ferramentas resolvem problemas diferentes e funcionam em conjunto:
- As saídas JSON controlam o formato de resposta do Claude (o que o Claude diz)
- O uso estrito de ferramentas valida os parâmetros das ferramentas (como o Claude chama suas funções)
Quando combinados, o Claude pode chamar ferramentas com parâmetros garantidamente válidos E retornar respostas JSON estruturadas. Isso é útil para fluxos de trabalho agênticos em que você precisa tanto de chamadas de ferramentas confiáveis quanto de saídas finais estruturadas.
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Help me plan a trip to Paris departing May 15, 2026",
}
],
# Saídas JSON: formato de resposta estruturado
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,
},
}
},
# Uso de ferramentas estrito: parâmetros de ferramenta garantidos
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)Considerações importantes
Compilação e cache de gramática
As saídas estruturadas usam amostragem restrita com artefatos de gramática compilados. Isso introduz algumas características de desempenho que você deve conhecer:
- Latência da primeira requisição: Na primeira vez que você usa um schema específico, há latência adicional enquanto a gramática é compilada
- Cache automático: As gramáticas compiladas são armazenadas em cache por 24 horas a partir do último uso, tornando as requisições subsequentes muito mais rápidas
- Invalidação do cache: O cache é invalidado se você alterar:
- A estrutura do schema JSON
- O conjunto de ferramentas na sua requisição (ao usar saídas estruturadas e uso de ferramentas juntos)
- Alterar apenas os campos
nameoudescriptionnão invalida o cache
Modificação do prompt e custos de tokens
Ao usar saídas estruturadas, o Claude recebe automaticamente um "system prompt" (prompt do sistema) adicional explicando o formato de saída esperado. Isso significa que:
- Sua contagem de tokens de entrada é ligeiramente maior
- O prompt injetado custa tokens como qualquer outro prompt do sistema
- Alterar o parâmetro
output_config.formatinvalidará qualquer cache de prompt para aquela thread de conversa
Limitações do JSON Schema
As saídas estruturadas suportam o JSON Schema padrão com algumas limitações. Tanto as saídas JSON quanto o uso estrito de ferramentas compartilham essas limitações.
- Todos os tipos básicos: object, array, string, integer, number, boolean, null
enum(somente strings, números, booleanos ou nulos - sem tipos complexos; consulte Saídas inválidas para uma ressalva sobre capitalização)constanyOfeallOf(com limitações -allOfcom$refnão é suportado)$ref,$defedefinitions($refexterno não é suportado)- Propriedade
defaultpara todos os tipos suportados requiredeadditionalProperties(deve ser definido comofalsepara objetos)- Formatos de string:
date-time,time,date,duration,email,hostname,uri,ipv4,ipv6,uuid minItemsde array (somente os valores 0 e 1 são suportados)
- Schemas recursivos
- Tipos complexos dentro de enums
$refexterno (por exemplo,'$ref': 'http://...')- Restrições numéricas (como
minimum,maximum,multipleOf) - Restrições de string (
minLength,maxLength) - Restrições de array além de
minItemsde 0 ou 1 additionalPropertiesdefinido como qualquer coisa diferente defalse
Se você usar um recurso não suportado, receberá um erro 400 com detalhes.
Recursos de regex suportados:
- Correspondência completa (
^...$) e correspondência parcial - Quantificadores:
*,+,?, casos simples de{n,m} - Classes de caracteres:
[],.,\d,\w,\s - Grupos:
(...)
NÃO suportados:
- Referências retroativas a grupos (por exemplo,
\1,\2) - Asserções lookahead/lookbehind (por exemplo,
(?=...),(?!...)) - Limites de palavra:
\b,\B - Quantificadores
{n,m}complexos com intervalos grandes
Padrões regex simples funcionam bem. Padrões complexos podem resultar em erros 400.
Ordenação de propriedades
Ao usar saídas estruturadas, as propriedades nos objetos mantêm a ordenação definida no seu schema, com uma ressalva importante: as propriedades obrigatórias aparecem primeiro, seguidas pelas propriedades opcionais.
Por exemplo, dado este schema:
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}A saída ordenará as propriedades como:
name(obrigatória, na ordem do schema)email(obrigatória, na ordem do schema)notes(opcional, na ordem do schema)age(opcional, na ordem do schema)
Isso significa que a saída pode ter esta aparência:
{
"name": "John Smith",
"email": "john@example.com",
"notes": "Interested in enterprise plan",
"age": 35
}Se a ordem das propriedades na saída for importante para sua aplicação, marque todas as propriedades como obrigatórias ou leve em conta essa reordenação na sua lógica de análise.
Saídas inválidas
Embora as saídas estruturadas garantam a conformidade com o schema na maioria dos casos, há cenários em que a saída pode não corresponder ao seu schema:
Recusas (stop_reason: "refusal")
O Claude mantém suas propriedades de segurança e utilidade mesmo ao usar saídas estruturadas. Se o Claude recusar uma requisição por motivos de segurança:
- A resposta tem
stop_reason: "refusal" - Você receberá um código de status 200
- Você será cobrado pelos tokens gerados
- A saída pode não corresponder ao seu schema porque a mensagem de recusa tem precedência sobre as restrições do schema
Limite de tokens atingido (stop_reason: "max_tokens")
Se a resposta for cortada por atingir o limite de max_tokens:
- A resposta tem
stop_reason: "max_tokens" - A saída pode estar incompleta e não corresponder ao seu schema
- Tente novamente com um valor de
max_tokensmaior para obter a saída estruturada completa
Capitalização de valores enum
As saídas estruturadas não garantem a capitalização de valores enum e const de string: o Claude pode retornar um valor que difere do seu schema apenas na capitalização, normalmente na primeira letra de uma palavra após um espaço. Por exemplo, dado este schema:
{
"type": "string",
"enum": ["Conversation Topic 1", "Conversation Topic 2", "Conversation topic 3"]
}A saída pode conter "Conversation Topic 3" ("T" maiúsculo) mesmo que esse valor exato não esteja no enum. A resposta é concluída normalmente, sem erro e sem stop_reason especial. Isso se aplica tanto às saídas JSON quanto ao uso estrito de ferramentas. Compare valores enum sem diferenciar maiúsculas de minúsculas e evite valores enum que difiram apenas na capitalização.
Limites de complexidade de schema
As saídas estruturadas funcionam compilando seus schemas JSON em uma gramática que restringe a saída do Claude. Schemas mais complexos produzem gramáticas maiores que levam mais tempo para compilar. Para proteger contra tempos de compilação excessivos, a API impõe vários limites de complexidade.
Limites explícitos
Os seguintes limites se aplicam a todas as requisições com output_config.format ou strict: true:
| Limite | Valor | Descrição |
|---|---|---|
| Ferramentas estritas por requisição | 20 | Número máximo de ferramentas com strict: true. Ferramentas não estritas não contam para esse limite. |
| Parâmetros opcionais | 24 | Total de parâmetros opcionais em todos os schemas de ferramentas estritas e schemas de saída JSON. Cada parâmetro não listado em required conta para esse limite. |
| Parâmetros com tipos união | 16 | Total de parâmetros que usam anyOf ou arrays de tipos (por exemplo, "type": ["string", "null"]) em todos os schemas estritos. Estes são especialmente custosos porque criam custo de compilação exponencial. |
Limites internos adicionais
Além dos limites explícitos na tabela anterior, existem limites internos adicionais sobre o tamanho da gramática compilada. Esses limites existem porque a complexidade do schema não se reduz a uma única dimensão: recursos como parâmetros opcionais, tipos união, objetos aninhados e número de ferramentas interagem entre si de maneiras que podem tornar a gramática compilada desproporcionalmente grande.
Quando esses limites são excedidos, você receberá um erro 400 com a mensagem "Schema is too complex for compilation." Esses erros significam que a complexidade combinada dos seus schemas excede o que pode ser compilado de forma eficiente, mesmo que cada limite individual na tabela anterior seja satisfeito. Como medida final de contenção, a API também impõe um tempo limite de compilação de 180 segundos. Schemas que passam em todas as verificações explícitas, mas produzem gramáticas compiladas muito grandes, podem atingir esse tempo limite.
Dicas para reduzir a complexidade do schema
Se você estiver atingindo os limites de complexidade, experimente estas estratégias em ordem:
-
Marque apenas as ferramentas críticas como estritas. Se você tiver muitas ferramentas, reserve isso para ferramentas em que violações de schema causam problemas reais e confie na aderência natural do Claude para ferramentas mais simples.
-
Reduza os parâmetros opcionais. Torne os parâmetros
requiredsempre que possível. Cada parâmetro opcional aproximadamente dobra uma parte do espaço de estados da gramática. Se um parâmetro sempre tem um padrão razoável, considere torná-lo obrigatório e fazer com que o Claude forneça esse padrão explicitamente. -
Simplifique estruturas aninhadas. Objetos profundamente aninhados com campos opcionais aumentam a complexidade. Achate as estruturas sempre que possível.
-
Divida em várias requisições. Se você tiver muitas ferramentas estritas, considere dividi-las em requisições separadas ou subagentes.
Para problemas persistentes com schemas válidos, entre em contato com o suporte com a definição do seu schema.
Retenção de dados
Os prompts e as respostas são processados com ZDR ao usar saídas estruturadas. No entanto, o schema JSON em si é temporariamente armazenado em cache por até 24 horas desde o último uso para fins de otimização. Nenhum dado de prompt ou resposta é retido além da resposta da API.
As saídas estruturadas são elegíveis para HIPAA, mas PHI não deve ser incluída nas definições de schema JSON. A API compila schemas JSON em gramáticas que são armazenadas em cache separadamente do conteúdo das mensagens, e esses schemas em cache não recebem as mesmas proteções de PHI que os prompts e as respostas. Não inclua PHI em nomes de propriedades do schema, valores enum, valores const ou expressões regulares pattern. PHI deve aparecer apenas no conteúdo das mensagens (prompts e respostas), onde é protegida pelas salvaguardas da HIPAA.
Para elegibilidade de ZDR e HIPAA em todos os recursos, consulte API e retenção de dados.
Compatibilidade de recursos
Funciona com:
- Processamento em lote: Processe saídas estruturadas em escala com 50% de desconto
- Contagem de tokens: Conte tokens sem compilação
- Streaming: Faça streaming de saídas estruturadas como respostas normais
- Uso combinado: Use saídas JSON (
output_config.format) e uso estrito de ferramentas (strict: true) juntos na mesma requisição
Incompatível com:
- Citações: As citações exigem intercalar blocos de citação com texto, o que conflita com as restrições estritas de schema JSON. Retorna erro 400 se as citações estiverem habilitadas com
output_config.format. - Preenchimento prévio de mensagens: Incompatível com saídas JSON
Próximos passos
Faça o Claude citar suas fontes ao responder perguntas sobre documentos fornecidos.
Imponha a conformidade com JSON Schema nas entradas de ferramentas do Claude com amostragem restrita por gramática.
Conecte o Claude a ferramentas e APIs externas. Saiba onde as ferramentas são executadas e como funciona o loop agêntico.
Saiba mais sobre a estrutura de preços da Anthropic para modelos e recursos.
Compatibility
- Supported models
- Fable 5 and 5.1
- Mythos 5, 5.1, and Preview
- Opus 4.5, 4.6, 4.7, 4.8, 5, and 5.5
- Sonnet 4.5, 4.6, and 5
- Haiku 4.5
- Supported platforms
- Claude API
- Claude Platform on AWS
- Amazon Bedrock1
- Google Cloud
- Microsoft Foundry
- No Amazon Bedrock, as saídas estruturadas estão disponíveis para Claude Opus 4.6, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.5 e Claude Haiku 4.5. ↩
Was this page helpful?