Definindo um JSON Schema para output_config.format
output_config.format só garante uma resposta válida em termos de schema se o schema que você fornece estiver bem formado.
Esta página cobre exatamente como escrever esse schema: os dois campos que todo objeto precisa, como construí-lo manualmente versus gerá-lo a partir de um modelo Pydantic, e como aninhamento, arrays e enums se encaixam.
Resumo
O schema que você passa para output_config.format é um JSON Schema padrão, com duas convenções que a API Claude exige em cada objeto: um array required listando cada propriedade e additionalProperties: false.
Acertar esses dois em cada objeto aninhado é a fonte mais comum de erros de schema.
Você pode escrever o schema como um dicionário Python simples ou gerá-lo automaticamente a partir de um BaseModel Pydantic com .model_json_schema().
Ambas as abordagens produzem o mesmo formato de comunicação; Pydantic apenas economiza o trabalho de manter um dicionário e um tipo analisado em sincronia manualmente.
Nem toda palavra-chave JSON Schema é suportada, então um schema que parece razoável ainda pode ser rejeitado ou ignorado silenciosamente em algumas partes - veja a referência de tipos de campo e restrições para a lista completa.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
from anthropic import Anthropic
client = Anthropic()
schema = {
"type": "object",
"properties": {
"title": {"type": "string"},
"priority": {"type": "string", "enum": ["low", "medium", "high"]},
},
"required": ["title", "priority"],
"additionalProperties": False,
}
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
output_config={"format": {"type": "json_schema", "schema": schema}},
messages=[{"role": "user", "content": "Resuma este relatório de bug como um ticket."}],
)Quando usar isso:
- Qualquer vez que o código downstream for analisar a resposta do Claude como dados em vez de exibi-la como texto.
- Extrair um conjunto fixo de campos de entrada não estruturada (e-mails, tickets, texto de formulário).
- Tarefas de classificação onde a resposta deve ser um de um conjunto conhecido de rótulos.
- Sempre que você estiver contando com a instrução "por favor, retorne apenas JSON" na sua prompt.
Exemplo de Trabalho
from pydantic import BaseModel, Field
from anthropic import Anthropic
class BugReport(BaseModel):
title: str = Field(description="Um resumo curto e de uma linha do bug")
priority: str = Field(description="Um de: low, medium, high")
steps_to_reproduce: list[str] = Field(description="Lista ordenada de passos para reproduzir")
affected_component: str
client = Anthropic()
response = client.messages.parse(
model="claude-sonnet-5",
max_tokens=1024,
output_config={
"format": {"type": "json_schema", "schema": BugReport.model_json_schema()}
},
messages=[{
"role": "user",
"content": (
"Transforme isto em um relatório de bug: A página de checkout falha quando um usuário "
"aplica um código de desconto com caracteres especiais. Acontece sempre "
"no módulo de pagamentos. Faça login, adicione um item ao carrinho, aplique um código como "
"'SAVE#10', clique em checkout. Isso bloqueia todas as compras, então é alta prioridade."
),
}],
)
report: BugReport = response.parsed_output
print(report.title)
print(report.priority)
for step in report.steps_to_reproduce:
print("-", step)O que isso demonstra:
Field(description=...)em um modelo Pydantic se torna adescriptiondo JSON Schema que o modelo lê ao decidir o que colocar em cada campo.list[str]se torna automaticamente umarrayde itensstring- nenhum schema de array manual é necessário.response.parsed_outputretorna uma instância real deBugReport, não um dicionário, então o acesso a atributos e verificadores de tipo funcionam.- O schema e o tipo de tempo de execução são definidos exatamente uma vez, em uma única classe.
Análise Profunda
Como Funciona
output_config.formatrecebe um wrappertype: "json_schema"em torno do seu objetoschema; o schema em si é um documento JSON Schema padrão.- A API restringe a geração de tokens para que a resposta só possa ser texto que valide contra o schema que você forneceu - ela não valida depois do fato, ela restringe durante a geração.
requiredinforma à API que cada propriedade listada deve estar presente na resposta; omitir uma propriedade derequireda torna opcional, o que raramente é o que você quer para uma extração fixa.additionalProperties: falsefecha o objeto - sem ele, a API (e qualquer validador rigoroso que você adicione por cima) não pode garantir que o modelo não adicionará campos extras e não solicitados.- Tanto
requiredquantoadditionalProperties: falsesão necessários em todo objeto do schema, incluindo objetos aninhados - defini-los apenas no nível superior não se aplica em cascata.
Construindo o Schema Manualmente vs. com Pydantic
| Abordagem | O que você escreve | O que você obtém |
|---|---|---|
| Dicionário escrito à mão | Um dict Python simples que corresponde à sintaxe JSON Schema | Controle total, mas você mantém o schema e qualquer tipo downstream separadamente |
Pydantic model_json_schema() | Uma subclasse BaseModel com campos tipados | Schema gerado automaticamente; response.parsed_output retorna uma instância do seu modelo |
Schemas escritos à mão são úteis para formas muito simples e únicas, ou quando você não quer uma dependência Pydantic. Para qualquer coisa com mais de dois ou três campos, um modelo Pydantic mantém o schema e o tipo de dados da sua aplicação de se separarem à medida que a forma evolui.
Objetos Aninhados e Arrays
from pydantic import BaseModel
class LineItem(BaseModel):
sku: str
quantity: int
class Order(BaseModel):
customer_name: str
items: list[LineItem]
# Order.model_json_schema() produz um objeto de nível superior com uma propriedade de array "items"
# onde a palavra-chave "items" aponta para o schema do objeto LineItem aninhado -
# cada nível ainda precisa de seu próprio required + additionalProperties: false, que
# Pydantic gera automaticamente para você.- O aninhamento é suportado através da composição comum do JSON Schema (
properties,items,$ref/$def), que é exatamente o que Pydantic emite para modelos aninhados. - Mantenha o aninhamento raso. Dois ou três níveis de profundidade são confiáveis; estruturas muito profundas ou recursivas não são suportadas - veja a referência de tipos de campo.
- Todo objeto em cada nível ainda precisa de sua própria lista
requiredeadditionalProperties: false; Pydantic lida com isso corretamente por conta própria, mas se você escrever schemas aninhados manualmente, adicione ambos a cada objeto aninhado você mesmo.
Notas Python
from pydantic import BaseModel
class Ticket(BaseModel):
subject: str
urgency: str
schema = Ticket.model_json_schema()
print(schema["required"]) # ['subject', 'urgency']
print(schema["additionalProperties"]) # Falsemodel_json_schema()do Pydantic definerequiredeadditionalProperties: falseautomaticamente para umBaseModelpadrão sem campos opcionais - esta é uma razão para preferi-lo a escrever o dicionário manualmente.- Um campo tipado como
Optional[str]ou com um valor padrão é excluído derequiredpelo Pydantic - se você quiser que todos os campos sejam obrigatórios na resposta, evite padrões eOptionalem campos que importam. response.parsed_outputdeclient.messages.parse(...)é tipado como uma instância do modelo que você passou, então IDEs e verificadores de tipo entendem a forma sem anotação extra.
Parâmetros e Valores de Retorno
| Campo | Tipo | Descrição |
|---|---|---|
output_config.format.type | str | Sempre "json_schema" para este recurso. |
output_config.format.schema | dict | O documento JSON Schema descrevendo a forma de resposta exigida. |
schema.required | list[str] | Todos os nomes de propriedades que devem estar presentes na resposta, por objeto. |
schema.additionalProperties | bool | Deve ser False em todo objeto do schema. |
Armadilhas
- Esquecer
additionalProperties: falseem um objeto aninhado. Definir isso apenas no nível superior deixa os objetos internos abertos. Correção: verifique se todo objeto aninhado no schema também carregaadditionalProperties: false- se você estiver escrevendo schemas manualmente, é fácil esquecer isso em um campo profundamente aninhado. - Listar um campo em
propertiesmas não emrequired. O campo se torna opcional, então o modelo pode omiti-lo, e seu código precisa verificar defensivamente sua presença. Correção: inclua todo campo que você realmente precisa emrequired, e torne os campos opcionais apenas quando a resposta genuinamente pode não tê-los. - Assumir que toda palavra-chave JSON Schema funciona. Coisas como restrições de intervalo numérico ou certas palavras-chave de composição complexas não são aplicadas pela API. Correção: verifique a referência de tipos de campo e restrições antes de projetar um schema além de tipos básicos,
enume aninhamento simples. - Reutilizar um modelo Pydantic com campos
Optionalpara uma tarefa de extração "precisa ter tudo". Campos opcionais/com valor padrão saem derequiredautomaticamente, o que enfraquece a garantia que você realmente queria. Correção: mantenha os campos não opcionais sem padrão quando todos os valores devem estar presentes na resposta. - Tratar uma resposta válida em termos de schema como dados garantidos corretos. O schema impõe a forma, não a precisão - um campo
priority: "high"ainda pode ser válido em termos de schema e factualmente incorreto. Correção: mantenha sua própria validação ou etapa de revisão para correção, independente da conformidade do schema. - Escrever um schema excessivamente profundo ou recursivo. Schemas recursivos (um objeto referenciando a si mesmo) não são suportados, e aninhamento muito profundo aumenta a chance de um construto não suportado se infiltrar. Correção: achate a forma sempre que possível, ou divida uma extração profundamente aninhada em duas chamadas sequenciais.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Dicionário de schema escrito à mão | A forma é pequena, fixa e você não quer uma dependência Pydantic | A forma tem mais do que alguns campos ou evolui com frequência |
Pydantic model_json_schema() | Você já tem (ou quer) uma classe Python tipada para os dados | Você precisa do schema em um contexto não Python e não pode compartilhar o modelo |
Ferramenta rigorosa input_schema (strict: true) | Você quer restringir os parâmetros de uma chamada de ferramenta em vez da resposta final da mensagem | Você está restringindo a resposta de texto geral do assistente, não a invocação de uma ferramenta |
| Apenas instruções JSON baseadas em prompt | Prototipagem rápida onde a saída ocasionalmente malformada é aceitável | Qualquer pipeline de produção que analisa a resposta programaticamente |
FAQs
Eu tenho que escrever required e additionalProperties manualmente toda vez?
- Não se você usar Pydantic -
model_json_schema()define ambos automaticamente para umBaseModelsem campos opcionais. - Se você escrever o schema manualmente como um dicionário, sim, você deve adicionar ambos explicitamente em cada objeto, incluindo os aninhados.
O que acontece se eu esquecer additionalProperties: false?
- O objeto fica "aberto", o que significa que a garantia de aplicação em torno de quais campos exatamente podem aparecer é mais fraca do que o pretendido.
- Sempre defina explicitamente como
Falseem cada objeto do schema.
Um campo pode ser opcional no meu schema?
- Sim - simplesmente omita-o de
requirede o modelo pode incluí-lo ou não. - Para tarefas de extração onde você realmente precisa que todos os campos sejam preenchidos, mantenha tudo em
requiredem vez de tornar os campos opcionais por hábito.
Como expresso "um destes valores fixos" no schema?
{"type": "string", "enum": ["low", "medium", "high"]}enumé um construto bem suportado e é a maneira padrão de restringir um campo a um conjunto fixo de valores.
Posso aninhar objetos e arrays dentro do schema?
- Sim -
propertiespara objetos aninhados eitemspara arrays funcionam, e Pydantic gera isso automaticamente para modelos aninhados e camposlist[...]. - Mantenha o aninhamento raso (dois a três níveis); estruturas muito profundas ou recursivas não são suportadas.
model_json_schema() funciona com campos que têm valores padrão?
- Funciona, mas um campo com um valor padrão (ou tipado como
Optional) é excluído derequiredpelo Pydantic. - Se você precisar que todos os campos sejam garantidamente presentes, evite padrões e a tipagem
Optionalnesses campos.
Um JSON Schema para output_config.format é o mesmo que um schema para uso de ferramentas?
- Eles usam a mesma sintaxe JSON Schema e a mesma convenção
required/additionalProperties: false. - A diferença é o que eles restringem:
output_config.formatrestringe toda a resposta da mensagem; oinput_schemade uma ferramenta (comstrict: true) restringe os parâmetros de uma única chamada de ferramenta.
Uma palavra-chave de schema não suportada causará um erro?
- O comportamento varia por construto - algumas restrições não suportadas simplesmente não são aplicadas em vez de serem rejeitadas imediatamente.
- Verifique a referência de tipos de campo e restrições em vez de assumir que uma palavra-chave funciona porque é um JSON Schema válido em geral.
Devo validar a resposta analisada novamente depois de recebê-la?
- O schema impõe a estrutura, não a correção factual, então se os próprios valores importam (não apenas sua forma), mantenha sua própria validação ou etapa de revisão.
- Isso é separado - e não substitui - a garantia de forma da API.
Qual é o schema válido mínimo que posso passar para output_config.format?
{
"type": "object",
"properties": {"answer": {"type": "string"}},
"required": ["answer"],
"additionalProperties": False,
}- Esta é a forma bem formada menor: um objeto, uma propriedade de string obrigatória, fechada para extras.
Posso gerar o schema a partir de um dataclass em vez de Pydantic?
BaseModeldo Pydantic é o caminho de conveniência comum porque.model_json_schema()produz o schema diretamente.- Um
dataclasssimples não tem isso integrado - você escreveria o schema de dicionário manualmente se não quiser uma dependência Pydantic.
Relacionados
- Noções Básicas de Saídas Estruturadas - solicite uma resposta de schema JSON e analise-a com client.messages.parse.
- Validando e Analisando Respostas Estruturadas em Python - o que acontece com este schema depois que você solicita uma resposta com ele.
- Referência de Tipos de Campo e Restrições de Saída Estruturada - a lista completa de construtos de schema suportados e não suportados referenciados nesta página.
- Lidando com Saída JSON Malformada ou Truncada - o que fazer quando um schema bem formado ainda volta incompleto.
Versões da Stack: Escrito contra a linha de modelos Claude atual em ~junho de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (o padrão) e Claude Haiku 4.5 - e o SDK oficial
anthropicpara Python (última versão 0.x). Nomes de modelos, versões de SDK e preços mudam rapidamente - verifique os detalhes atuais em platform.claude.com/docs antes de confiar neles.