Prompt Engineering para Executivos · Capítulo 11 de 28 · 13 min
Receber JSON no formato combinado em toda chamada de API
Declare o esquema JSON na chamada da API em modo estrito, deixe o modelo raciocinar antes de preencher os campos e valide no código o que o esquema não cobre.
Este capítulo faz parte do curso gratuito Prompt Engineering para Executivos.
Para receber JSON que outro sistema consome sem conferência manual, declare o esquema na chamada da API em modo estrito, deixe o modelo raciocinar antes de preencher os campos e valide no código o que o esquema não cobre. Vale para quem liga IA a CRM, ERP ou planilha, e a ação de hoje é migrar um fluxo.
Pedir "responda só em JSON" no prompt funciona na demonstração, com cinco exemplos escolhidos por quem a montou. Em produção chegam milhares de mensagens por mês que ninguém escolheu, e aparecem a vírgula sobrando, o campo que falta, o valor em reais escrito como texto e a categoria que ninguém combinou. Só o primeiro desses erros dispara exceção no sistema; os outros entram na base e aparecem na conciliação do mês seguinte.
JSON é o formato de texto que sistemas usam para trocar dados, parecido com um formulário de campos nomeados. Entre 2024 e 2026, Anthropic, OpenAI, Google e xAI passaram a aceitar a descrição desse formulário dentro da própria chamada, e a geração fica restrita a ela. Com isso, o formato sai do texto do pedido e vai para a configuração, onde a obediência do modelo deixa de decidir.
Saída estruturada (structured outputs) é o recurso em que a aplicação envia um JSON Schema, o molde que lista campos, tipos, obrigatórios e valores permitidos. A plataforma aplica decodificação restrita: a cada pedaço de texto gerado, o modelo só pode escolher o que o molde aceita, como um formulário que recusa letra no campo de CPF. JSON inválido, campo a mais e categoria fora da lista deixam de ser possíveis. Quando a OpenAI lançou o recurso, em agosto de 2024, mediu 100% de aderência a esquemas complexos, contra menos de 40% do gpt-4-0613 guiado só pelo prompt.
Na Anthropic, o recurso está em disponibilidade geral, sem cabeçalho beta, em duas formas que se combinam. O JSON da resposta vai em output_config.format com o tipo json_schema; cada ferramenta (função que o modelo pode chamar) ganha strict: true na definição. O parâmetro antigo output_format está depreciado. O pré-preenchimento (prefill, começar a resposta do assistente com uma chave aberta para forçar JSON) devolve erro 400 desde a geração 4.6, e o substituto indicado é o próprio esquema.
Modo JSON é a opção mais antiga, ainda oferecida pela OpenAI e pela xAI com o nome json_object: entrega JSON sintaticamente válido sem conferir os campos. A diferença decide propostas de fornecedor. O modo JSON garante um JSON qualquer; o modo estrito garante o seu esquema. Nenhum dos dois confere a verdade do conteúdo, porque um valor pode obedecer ao contrato e ter vindo da linha errada do e-mail.
Pedir JSON no texto ou declarar o esquema estrito
Responda só em JSON, escrito no prompt
Pedir no texto
- A regra do que é válido mora em dois lugares que se desencontram: o prompt e o código que consome.
- Campo faltando, tipo trocado e categoria nova passam sem exceção.
- Cada JSON quebrado vira nova chamada cobrada, com nova chance de quebrar.
- Prefill com chave aberta para forçar o formato devolve erro 400 no Claude.
Esquema em output_config.format, text.format ou response_format
Esquema estrito
- Um arquivo só, versionado, que produto e dados leem juntos.
- Obrigatórios, tipos e listas fechadas entram no contrato da geração.
- O parser recebe JSON válido sem retentativa por sintaxe.
- O prompt volta a cuidar do conteúdo: o que extrair e de onde.
Os quatro fornecedores partem do mesmo JSON Schema e aceitam pedaços diferentes dele. Um esquema com mínimo numérico passa no Gemini e é recusado no Claude; um esquema com campo opcional passa no Claude e precisa de ajuste na OpenAI, que exige todos os campos na lista de obrigatórios. O desenho que viaja entre os quatro marca tudo como obrigatório, representa a ausência com null e deixa faixas e tamanhos para o código.
Como fica em cada modelo
| Modelo | O que muda | Cuidado |
|---|---|---|
| Claude (Anthropic) | output_config.format com json_schema na resposta e strict: true nas ferramentas, em disponibilidade geral; output_format depreciado; prefill devolve 400 | Sem esquema recursivo, mínimo, máximo ou tamanho de texto; additionalProperties em false; até 20 ferramentas strict, 24 campos opcionais e 16 uniões de tipo por chamada |
| OpenAI (GPT) | text.format com json_schema e strict: true na Responses API; response_format no Chat Completions; strict também nas funções | Todo campo em required, com opcional virando união com null; até 5.000 propriedades, 10 níveis e 1.000 valores de enum; recusa chega em refusal e corte em status incomplete |
| Gemini (Google) | response_format com mime_type application/json e schema; aceita mínimo, máximo, minItems e recursão | Esquema muito grande ou aninhado pode ser recusado, sem número oficial; esquema junto com Google Search e outras ferramentas embutidas só na série Gemini 3 |
| Grok (xAI) | response_format com json_schema e strict: true; json_object para JSON livre; nas ferramentas, strict vem ligado | Texto até 2.048 caracteres, listas até 256 itens, objetos até 64 propriedades; not, if/then/else e allOf múltiplo só em melhor esforço; com ferramentas, só a família Grok 4 |
| Modelos abertos (DeepSeek, Qwen) | DeepSeek aceita JSON output e chamada de função; no Qwen de pesos abertos, o recurso depende do servidor de inferência | Sem limite de esquema documentado: valide toda resposta no código antes de gravar |
No Claude, tool_choice any ou tool (forçar uma ferramenta) devolve 400 no Fable 5.1, Opus 5.5 e Sonnet 5.5: use auto com strict: true ou a saída estruturada.
Fonte: Anthropic, OpenAI, Google e xAI, páginas de structured outputs lidas em 13/10/2026
Raciocinar antes de formatar
Restrição de formato cobra um preço quando a tarefa pede raciocínio. No estudo "Let Me Speak Freely?" (Tam et al., EMNLP 2024), o acerto em problemas de matemática do GSM8K caiu 17% no LLaMA-3-8B e 24% no Gemini-1.5-Flash quando a resposta saía em modo JSON em vez de texto livre. A equipe da .txt refez o teste com decodificação restrita de verdade e o mesmo prompt nas duas condições, e a queda sumiu: 0,77 sem estrutura contra 0,78 com estrutura.
As duas leituras apontam para a ordem de geração: quando o esquema põe o campo da resposta antes de qualquer espaço para pensar, o modelo decide antes de raciocinar. A correção é de ordem. Deixe o modelo pensar primeiro, pelo raciocínio nativo (effort no Claude, reasoning.effort na OpenAI, thinking_level no Gemini) ou por um campo de evidências posto antes dos campos de decisão. Como o texto sai em sequência, o campo que vem primeiro no esquema é escrito primeiro, e a ordem das propriedades passa a ser instrução.
O que a evidência mede sobre formato e raciocínio
100%
aderência ao esquema com strict
OpenAI, gpt-4o-2024-08-06, evals de esquemas complexos, ago/2024
< 40%
aderência só com instrução no prompt
OpenAI, gpt-4-0613, mesmos evals
-24%
acerto no GSM8K em modo JSON
Gemini-1.5-Flash contra texto livre, Tam et al., 2024
0,77 x 0,78
GSM8K sem e com estrutura
Réplica da .txt com decodificação restrita e prompts iguais
Fonte: OpenAI (06/08/2024); Tam et al., arXiv 2408.02442; .txt, Say What You Mean
O mesmo desenho de esquema resolve trabalhos de áreas diferentes. O padrão se repete: lista fechada para o que vira filtro ou relatório, null para o que pode faltar, evidência literal antes da decisão e validação no código para faixa de valor e data.
Onde o esquema estrito paga a conta
1 de 3Jurídico: cláusulas de contrato
Extrair prazo de vigência, multa rescisória, índice de reajuste e foro de 300 contratos de fornecedor. Multa como número ou null, índice em lista fechada (IPCA, IGP-M, outro) e o trecho literal da cláusula antes de cada valor, para o advogado conferir.
Atendimento: triagem de chamados
Classificar mensagens de clientes em seis categorias fechadas, com um campo verdadeiro ou falso de escalonar quando houver menção a órgão regulador ou ação judicial. A sétima categoria inventada deixa de existir e o painel do trimestre continua comparável.
Finanças: reembolso por nota fiscal
Ler a nota enviada pelo funcionário e devolver valor como número, data no formato AAAA-MM-DD, CNPJ do emissor e categoria de despesa. O esquema impede valor como texto; o teto por categoria e a data dentro do mês ficam na validação do código.
Extrair lead de e-mail para o CRM
O caso mais comum em marketing e vendas é o texto solto que precisa virar registro com campos. O guia abaixo usa um e-mail fictício e um esquema que roda igual no Claude e, com o invólucro trocado, na OpenAI.
Guia prático: extração de lead em JSON, do texto solto ao CRM
Seis passos, cerca de 30 minutos no Playground do fornecedor ou num script de teste.
Passo 1: Liste os campos que o CRM aceita
Nome, empresa, cargo, e-mail, telefone, cidade, interesse, número de pessoas, prazo, orçamento e origem, com o mesmo nome do campo no CRM.
Deu certo quando: Cada propriedade do esquema tem um campo de destino no CRM.
Erro comum: Criar campo que ninguém lê e que só aumenta o custo de saída.
Passo 2: Feche as listas e marque o que pode faltar
Interesse, prazo e origem viram enum. Tudo que pode não estar no texto ganha a união com null e continua obrigatório.
Deu certo quando: Lead sem orçamento chega com orçamento null.
Erro comum: Campo de texto livre para interesse, que volta com quarenta grafias.
Passo 3: Ponha as evidências antes das decisões
O primeiro campo do esquema recebe trechos literais do e-mail; interesse, prazo e origem vêm depois.
Deu certo quando: Cada classificação tem um trecho que a sustenta.
Erro comum: Deixar o campo de evidência no fim, quando a decisão já saiu.
Passo 4: Declare o esquema na chamada
Claude: output_config.format. OpenAI: text.format com name e strict. Gemini e Grok: response_format.
Deu certo quando: Toda resposta é JSON válido no esquema, sem texto antes ou depois.
Erro comum: Colar o esquema só no prompt e achar que a garantia está ligada.
Passo 5: Trate corte e recusa como falha
Resposta interrompida por limite de tokens ou recusada não vai para o CRM, mesmo que pareça completa.
Deu certo quando: A integração registra a falha e refaz a chamada.
Erro comum: Gravar registro pela metade porque o parser aceitou o trecho.
Passo 6: Valide no código e confira uma amostra
Telefone com 10 ou 11 dígitos, pessoas acima de zero, enum comparado sem diferenciar maiúsculas. Confira dez leads por semana contra o e-mail.
Deu certo quando: Os erros achados viram casos de teste da extração.
Erro comum: Medir só a taxa de JSON válido e chamar isso de qualidade.
No fim você tem: Leads que chegam ao CRM com campos padronizados, null onde falta dado, evidência para cada classificação e uma rotina semanal de conferência.
{
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"evidencias": {
"type": "array",
"items": { "type": "string" },
"description": "De um a três trechos literais do e-mail que sustentam interesse, prazo e origem."
},
"nome": { "type": "string" },
"empresa": { "anyOf": [{ "type": "string" }, { "type": "null" }] },
"cargo": { "anyOf": [{ "type": "string" }, { "type": "null" }] },
"email": { "anyOf": [{ "type": "string" }, { "type": "null" }] },
"telefone": {
"anyOf": [{ "type": "string" }, { "type": "null" }],
"description": "Somente dígitos, com DDD."
},
"cidade": { "anyOf": [{ "type": "string" }, { "type": "null" }] },
"interesse": {
"type": "string",
"enum": ["treinamento_equipe", "consultoria", "curso_individual", "nao_informado", "nao_e_lead"]
},
"pessoas_a_treinar": { "anyOf": [{ "type": "integer" }, { "type": "null" }] },
"prazo_de_compra": {
"type": "string",
"enum": ["imediato", "ate_30_dias", "ate_90_dias", "sem_prazo", "nao_informado"]
},
"orcamento_mensal_reais": { "anyOf": [{ "type": "number" }, { "type": "null" }] },
"origem_declarada": {
"type": "string",
"enum": ["instagram", "google", "indicacao", "evento", "outro", "nao_informado"]
}
},
"required": [
"evidencias", "nome", "empresa", "cargo", "email", "telefone", "cidade",
"interesse", "pessoas_a_treinar", "prazo_de_compra",
"orcamento_mensal_reais", "origem_declarada"
],
"additionalProperties": false
}
}
}
}{
"evidencias": [
"Queremos treinar seis pessoas do atendimento a usar IA",
"pensamos em começar na primeira semana de novembro",
"Vi o anúncio de vocês no Instagram"
],
"nome": "Maria Aparecida Gonçalves",
"empresa": "Ótica Visão Clara",
"cargo": "coordenadora de marketing",
"email": "maria.goncalves@oticavisaoclara.com.br",
"telefone": "19998765432",
"cidade": "Campinas",
"interesse": "treinamento_equipe",
"pessoas_a_treinar": 6,
"prazo_de_compra": "ate_30_dias",
"orcamento_mensal_reais": null,
"origem_declarada": "instagram"
}Três campos mostram o esquema fazendo o trabalho. O orçamento chega null porque o e-mail diz que ainda não foi fechado, e a regra dois impede o número plausível inventado. O prazo exige conta: a primeira semana de novembro fica a menos de 30 dias de 13/10/2026, e a evidência copiada antes da decisão deixa a conta à vista de quem confere. O telefone sai só com dígitos, pronto para o discador.
Para levar o mesmo esquema à OpenAI, troque o invólucro por text.format com type json_schema, um name como lead_crm e strict: true; como todos os campos já estão em required e a ausência é null, nada mais muda. No Playground do Claude Console, o modelo Extrair dados estruturados já vem com o formato de saída por esquema ligado.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Os erros que sobram depois do esquema ligado são de conteúdo e de operação, e aparecem justamente porque o painel de JSON válido fica verde.
JSON válido no esquema ainda pode estar errado
O esquema cuida da forma; avaliação e validação no código cuidam do conteúdo.
- Modo JSON (json_object) entrega JSON qualquer, sem conferir os seus campos.
- Campo obrigatório sem opção null força o modelo a preencher algo plausível.
- Mínimo, máximo e tamanho de texto não valem no Claude: confira no código.
- Enum do Claude pode vir com maiúsculas trocadas: compare sem diferenciar caixa.
- Resposta cortada por limite de tokens não entra na base, mesmo parecendo inteira.
O teste: Rode 20 entradas reais e confira cinco contra o texto de origem, campo a campo.
alexandrecaramaschi.com/educacao/frontends-com-vibecoding
Faça hoje
Escolha o fluxo em que a resposta da IA entra direto num sistema e que ainda depende de "responda só em JSON" no prompt. Em 30 minutos, escreva o esquema com as evidências antes das decisões, declare-o na chamada do fornecedor que você usa e rode as últimas 20 entradas reais. Deu certo quando as 20 respostas passam pelo parser sem retentativa e a conferência de cinco delas contra o texto original não encontra campo inventado.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoSkills de IA com Vibecoding e Terminalsugerido pelo grafo3 capítulos de “Prompt Engineering para Executivos” usam conceitos apresentados em “Skills de IA com Vibecoding e Terminal”.
- CursoVídeo com IA: Claude Code, Codex e ElevenLabssugerido pelo grafo3 capítulos de “Prompt Engineering para Executivos” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoMCP para quem decidesugerido pelo grafo2 capítulos de “Prompt Engineering para Executivos” usam conceitos apresentados em “MCP para quem decide”.
Depois, siga para
- CursoAgentes de IA Autônomos: Do Conceito à Produção
- CursoLLM FinOps: o custo da IA para quem assina o orçamentosugerido pelo grafo5 capítulos de “LLM FinOps: o custo da IA para quem assina o orçamento” usam conceitos apresentados em “Prompt Engineering para Executivos”.
- CursoRLM 2027sugerido pelo grafo2 capítulos de “RLM 2027” usam conceitos apresentados em “Prompt Engineering para Executivos”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Saúde Mental para Autistas em IAQual assistente aguenta ser prótese de função executivaExaminar conexões de Qual assistente aguenta ser prótese de função executiva
- RLM 2027Montar o laço gerar, avaliar e selecionar com um conjunto seladoExaminar conexões de Montar o laço gerar, avaliar e selecionar com um conjunto selado
Voltar ao capítulo anterior: Decidir quando o exemplo ajuda e quando atrapalha o modelo
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Capítulos vizinhos em Prompt Engineering para Executivos
- 09Escrever um prompt de sistema que a empresa consegue auditar
- 10Decidir quando o exemplo ajuda e quando atrapalha o modelo
- 11Receber JSON no formato combinado em toda chamada de API
- 12Escrever ferramentas e prompts para agentes com limites claros
- 13Montar a estratégia de marketing com oito prompts prontos