As saídas estruturadas restringem as respostas do Claude para seguir um esquema específico, garantindo saídas válidas e analisáveis para processamento posterior. Dois recursos complementares estão disponíveis:
output_config.format): Obtenha a resposta do Claude em um formato JSON específicostrict: true): Garanta validação de esquema em nomes de ferramentas e entradasEsses recursos podem ser usados de forma independente ou juntos na mesma requisição.
As saídas estruturadas estão geralmente disponíveis na API Claude e no Amazon Bedrock para Claude Opus 4.6, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.5 e Claude Haiku 4.5. As saídas estruturadas permanecem em beta público no 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.
Migrando do beta? O parâmetro output_format foi movido para output_config.format, e os cabeçalhos beta não são mais necessários. O antigo cabeçalho beta (structured-outputs-2025-11-13) e o parâmetro output_format continuarão funcionando por um período de transição. Veja os exemplos de código abaixo para o formato atualizado da API.
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:
As saídas estruturadas garantem respostas em conformidade com o esquema por meio de decodificação restrita:
JSON.parse()As saídas JSON controlam o formato de resposta do Claude, garantindo que ele retorne JSON válido correspondente ao seu esquema. Use saídas JSON quando precisar:
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
}
}
}
}'Formato de resposta: JSON válido correspondente ao seu esquema em response.content[0].text
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Defina seu esquema JSON
Crie um esquema JSON que descreva a estrutura que você deseja que o Claude siga. O esquema usa o formato padrão JSON Schema com algumas limitações (veja Limitações do JSON Schema).
Adicione o parâmetro output_config.format
Inclua o parâmetro output_config.format em sua requisição de API com type: "json_schema" e a definição do seu esquema.
Analise a resposta
A resposta do Claude será um JSON válido correspondente ao seu esquema, retornado em response.content[0].text.
Os SDKs fornecem auxiliares que facilitam o trabalho com saídas JSON, incluindo transformação de esquema, validação automática e integração com bibliotecas de esquema populares.
Os métodos auxiliares do SDK (como .parse() e integração com Pydantic/Zod) ainda aceitam output_format como parâmetro de conveniência. O SDK lida com a tradução para output_config.format internamente. Os exemplos abaixo mostram a sintaxe auxiliar do SDK.
Em vez de escrever esquemas JSON brutos, você pode usar ferramentas familiares de definição de esquema em sua linguagem:
client.messages.parse()zodOutputFormat()outputFormat(Class<T>)Anthropic::BaseModel com 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)Cada SDK fornece auxiliares que facilitam o trabalho com saídas estruturadas. Consulte as páginas individuais de cada SDK para detalhes completos.
Os SDKs Python e TypeScript transformam automaticamente esquemas com recursos não suportados:
minimum, maximum, minLength, maxLength)additionalProperties: false a todos os objetosIsso significa que Claude recebe um esquema simplificado, mas seu código ainda aplica todas as restrições por meio de validação.
Exemplo: Um campo Pydantic com minimum: 100 torna-se um inteiro simples no esquema enviado, mas a descrição é atualizada para "Deve ser pelo menos 100", e o SDK valida a resposta contra a restrição original.
O uso estrito de ferramentas valida os parâmetros das ferramentas, garantindo que Claude chame suas funções com argumentos corretamente tipados. Use o uso estrito de ferramentas quando precisar:
Construir sistemas agênticos confiáveis requer conformidade garantida com o esquema. Sem o modo estrito, Claude pode retornar tipos incompatíveis ("2" em vez de 2) ou campos obrigatórios ausentes, quebrando suas funções e causando erros em tempo de execução.
O uso estrito de ferramentas garante parâmetros com segurança de tipos:
Por exemplo, suponha que um sistema de reservas precise de passengers: int. Sem o modo estrito, Claude pode fornecer passengers: "two" ou passengers: "2". Com strict: true, a resposta sempre conterá 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
}
}]
}'Formato de resposta: Blocos de uso de ferramenta com entradas validadas em response.content[x].input
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}Garantias:
input da ferramenta segue estritamente o input_schemaname da ferramenta é sempre válido (das ferramentas fornecidas ou ferramentas do servidor)Defina seu esquema de ferramenta
Crie um esquema JSON para o input_schema da sua ferramenta. O esquema usa o formato JSON Schema padrão com algumas limitações (consulte Limitações do JSON Schema).
Adicione strict: true
Defina "strict": true como uma propriedade de nível superior na definição da sua ferramenta, ao lado de name, description e input_schema.
Lide com chamadas de ferramentas
Quando Claude usar a ferramenta, o campo input no bloco tool_use seguirá estritamente seu input_schema, e o name sempre será válido.
Saídas JSON e uso estrito de ferramentas resolvem problemas diferentes e podem ser usados juntos:
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 onde você precisa tanto de chamadas de ferramentas confiáveis quanto de saídas finais estruturadas.
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 outputs: structured response format
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,
},
}
},
# 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,
},
}
],
)As saídas estruturadas usam amostragem restrita com artefatos de gramática compilados. Isso introduz algumas características de desempenho a serem consideradas:
name ou description não invalida o cacheAo usar saídas estruturadas, o Claude recebe automaticamente um prompt de sistema adicional explicando o formato de saída esperado. Isso significa que:
output_config.format invalidará qualquer cache de prompt para aquele thread de conversaAs saídas estruturadas suportam JSON Schema padrão com algumas limitações. Tanto as saídas JSON quanto o uso estrito de ferramentas compartilham essas limitações.
Os SDKs Python e TypeScript podem transformar automaticamente esquemas com funcionalidades não suportadas, removendo-as e adicionando restrições às descrições dos campos. Consulte métodos específicos do SDK para detalhes.
Ao usar saídas estruturadas, as propriedades em objetos mantêm sua ordem definida no seu esquema, com uma ressalva importante: as propriedades obrigatórias aparecem primeiro, seguidas pelas propriedades opcionais.
Por exemplo, dado este esquema:
{
"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ório, na ordem do esquema)email (obrigatório, na ordem do esquema)notes (opcional, na ordem do esquema)age (opcional, na ordem do esquema)Isso significa que a saída pode parecer com:
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}Se a ordem das propriedades na saída for importante para sua aplicação, certifique-se de que todas as propriedades estejam marcadas como obrigatórias, ou leve em conta essa reordenação em sua lógica de análise.
Embora as saídas estruturadas garantam conformidade com o esquema na maioria dos casos, há cenários em que a saída pode não corresponder ao seu esquema:
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 solicitação por razões de segurança:
stop_reason: "refusal"Limite de tokens atingido (stop_reason: "max_tokens")
Se a resposta for interrompida por atingir o limite de max_tokens:
stop_reason: "max_tokens"max_tokens para obter a saída estruturada completaAs saídas estruturadas funcionam compilando seus esquemas JSON em uma gramática que restringe a saída do Claude. Esquemas 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.
Os seguintes limites se aplicam a todas as requisições com output_config.format ou strict: true:
| Limite | Valor | Descrição |
|---|---|---|
| Ferramentas estritamente por requisição | 20 | Número máximo de ferramentas com strict: true. Ferramentas não estritamente não contam para este limite. |
| Parâmetros opcionais | 24 | Total de parâmetros opcionais em todos os esquemas de ferramentas estritamente e esquemas de saída JSON. Cada parâmetro não listado em required conta para este limite. |
| Parâmetros com tipos de união | 16 | Total de parâmetros que usam anyOf ou arrays de tipo (ex.: "type": ["string", "null"]) em todos os esquemas estritamente. Estes são especialmente caros porque criam custo de compilação exponencial. |
Esses limites se aplicam ao total combinado em todos os esquemas estritamente em uma única requisição. Por exemplo, se você tiver 4 ferramentas estritamente com 6 parâmetros opcionais cada, você atingirá o limite de 24 parâmetros mesmo que nenhuma ferramenta individual pareça complexa.
Além dos limites explícitos acima, há limites internos adicionais no tamanho da gramática compilada. Esses limites existem porque a complexidade do esquema não se reduz a uma única dimensão: funcionalidades como parâmetros opcionais, tipos de 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 de seus esquemas excede o que pode ser compilado eficientemente, mesmo que cada limite individual acima seja satisfeito. Como última medida de segurança, a API também impõe um tempo limite de compilação de 180 segundos. Esquemas que passam em todas as verificações explícitas, mas produzem gramáticas compiladas muito grandes, podem atingir esse tempo limite.
Se você estiver atingindo limites de complexidade, tente estas estratégias em ordem:
Marque apenas ferramentas críticas como estritamente. Se você tiver muitas ferramentas, reserve-o para ferramentas onde violações de esquema causam problemas reais, e confie na aderência natural do Claude para ferramentas mais simples.
Reduza parâmetros opcionais. Torne os parâmetros required onde 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 onde possível.
Divida em múltiplas requisições. Se você tiver muitas ferramentas estritamente, considere dividi-las em requisições separadas ou sub-agentes.
Para problemas persistentes com esquemas válidos, entre em contato com o suporte com a definição do seu esquema.
Prompts e respostas são processados com ZDR ao usar saídas estruturadas. No entanto, o próprio esquema JSON é 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.
Para elegibilidade de ZDR em todas as funcionalidades, consulte API e Retenção de Dados.
Funciona com:
output_config.format) e uso estrito de ferramentas (strict: true) juntos na mesma requisiçãoIncompatível com:
output_config.format.Escopo da gramática: As gramáticas se aplicam apenas à saída direta do Claude, não a chamadas de uso de ferramentas, resultados de ferramentas ou tags de pensamento (ao usar Pensamento Estendido). O estado da gramática é redefinido entre seções, permitindo que o Claude pense livremente enquanto ainda produz saída estruturada na resposta final.
Was this page helpful?