De cara: Structured Output não é o prompt «por favor, devolva JSON». É a API bloqueando tokens ilegais na decodificação com um JSON Schema, para que a resposta final possa ser parseada por um programa. GPT, Gemini e Claude tornaram isso um recurso de primeira classe não porque a frase fica bem num slide, mas porque agentes, extração e preenchimento de formulários precisam ligar o modelo a um pipeline. Prosa falha no JSON.parse. Falha ainda mais no schema de downstream.
Este artigo está datado de 8 de setembro de 2026. Os três já conseguem restringir o JSON final para o usuário ou o próximo serviço: OpenAI via response_format.json_schema (strict), Gemini via responseMimeType + responseJsonSchema, Claude via o GA output_config.format (o output_format antigo de beta ainda funciona na transição). Como preencher os campos, e como os subconjuntos diferem, já desmontamos em agosto. Este texto responde duas perguntas: o que é, e por que os três tiveram que lançar. Para o passo a passo, veja Do prompt ao Structured Output. Para OpenAI vs Gemini, veja a comparação das APIs de Structured Output.
O que é Structured Output
Structured Output significa: você entrega um JSON Schema, e a resposta final do modelo tem de ser JSON que bata com ele. A garantia acontece enquanto cada token é gerado, não depois de o modelo «tentar parecer JSON». Os nomes diferem: OpenAI diz Structured Outputs, Google diz Structured Output, a Anthropic escreve structured outputs / JSON outputs. O s a mais é branding. O trabalho é o mesmo.
Pense em compilador e verificador de tipos. Um prompt é um comentário — o modelo pode ouvir. Um schema é o sistema de tipos — um nome de campo errado, um required faltando, uma string onde deveria ser number nunca são emitidos. O que o seu programa recebe é um objeto, não prosa embrulhada numa cerca ```json.
| Expressão | O que significa de fato | Leitura errada comum |
|---|---|---|
| Structured Output | Decodificação restrita da resposta final contra um JSON Schema | O modelo ficou mais inteligente, ou «ele sabe escrever JSON» |
| JSON Schema | O contrato de campos, tipos, required, enums | Um prompt mais longo |
| Decodificação restrita | Tokens ilegais são filtrados à medida que são gerados | Limpeza com regex depois do fato |
| strict / restrição rígida | A API garante a forma num subconjunto mais estrito de Schema | Os fatos são verdadeiros e os números não são inventados |
Um Schema que os três leem costuma ser achatado: raiz object, properties / required explícitos, additionalProperties: false. No strict da OpenAI, «opcional» muitas vezes é anulável em vez de sair do required. Os subconjuntos não são idênticos; pegue a interseção primeiro.
{
"type": "object",
"additionalProperties": false,
"properties": {
"task": { "type": "string", "enum": ["extract", "classify", "summarize"] },
"ok": { "type": "boolean" },
"fields": {
"type": "object",
"additionalProperties": false,
"properties": {
"orderId": { "type": "string" },
"total": { "type": "number" },
"note": { "type": ["string", "null"] }
},
"required": ["orderId", "total", "note"]
}
},
"required": ["task", "ok", "fields"]
}
Não é JSON Mode, nem Tool Calling
Três nomes viram um só. Eles não estão na mesma camada:
| Capacidade | O que garante | O que não garante |
|---|---|---|
| Prompt: «devolva JSON» | Uma probabilidade maior | Sintaxe, nomes de campo, listas required |
| JSON Mode | O texto é JSON parseável | Forma, tipos, enums |
| Structured Output | A resposta final bate com o Schema | Verdade semântica, ou que uma ferramenta rodou |
| Tool Calling | Argumentos da ferramenta batem com um Schema e o Host os executa | A forma da resposta para o usuário |
JSON Mode só garante chaves que fecham e um JSON.parse bem-sucedido. O modelo ainda pode inventar order_id quando você pediu orderId, ou emitir o valor como string. Em produção, «parseia» não é «dá para inserir».
Tool Calling / Function Calling restringe a mão que pega a ferramenta, não a última frase para o usuário. Consultas de estoque, escrita de arquivos, tools/call do MCP ficam no Schema de ferramenta. Extrair e-mail, classificar um ticket, emitir JSON para uma API de downstream ficam no Structured Output. Um agente completo muitas vezes liga os dois — argumentos nas tools, a resposta final num Schema de saída. Para o empilhamento veja O que é o MCP e o fluxo de dados JSON do Agent.
Por que os três passaram a oferecer
Em 2023 ainda dava para apostar num prompt. Em 2026 um agente embute o modelo num loop: a saída cai num banco, na próxima ferramenta, ou no modelo de outro fornecedor. Os três laboratórios não combinaram um ciclo de imprensa. Eles bateram na mesma pressão de produto e no mesmo contrato — JSON Schema.
- O consumidor de downstream é um programa, não um leitor. Chat pode ser prosa. Um pipeline precisa de objetos. Uma vírgula faltando, um campo renomeado, e a fila de retentativas da madrugada enche. Os fornecedores preferem cortar caminhos ilegais no decoder a ver cada cliente escrever um reparador.
- Agentes tornaram a forma estável um requisito. Num loop de vários passos, o JSON da rodada anterior é a entrada desta. Um desvio e tudo depois está errado. Tool Calling responde «como estender a mão». Structured Output responde «como devolver a conclusão». Os dois precisam de Schema — veja se JSON Schema está virando o Contract do Agent.
- Os prompts provaram que não bastavam. «Só JSON, sem markdown» fica bem num bench, depois deixa cair campos, adiciona cercas e parafraseia enums quando o contexto é longo, as ferramentas reinserem, ou as línguas se misturam. A decodificação restrita transforma «às vezes» num 400 da API ou num erro de Schema retentável.
- JSON Schema já era o menor denominador comum. OpenAPI,
inputSchemado MCP, exports de Pydantic / Zod — tudo isso. Um IDL privado do lado do modelo forçaria o Host a traduzir duas vezes. Ligar a resposta final ao mesmo Schema é o que deixa a troca de fornecedor barata. - A corrida virou «isso entra em produção», não «isso conversa». Quando um fornecedor lançou restrição rígida, gateways, frameworks de agente e listas de compras escreveram isso como obrigatório. Os outros dois ou acompanham ou não entram no mesmo grafo. Em setembro de 2026, uma API flagship sem Structured Output é difícil de vender para quem insere linhas.
Por isso as datas se agrupam: a OpenAI tornou Structured Outputs GA em agosto de 2024; o Gemini dobrou MIME + Schema na config de geração; o Claude ainda estava num header beta no fim de 2025 e agora envia output_config.format como campo estável. Os nomes nunca bateram. A pressão, sim.
Como GPT, Gemini e Claude ligam isso
Alinhe o conceito. Não cole campos entre fornecedores. A tabela é o que você pode colocar num doc em 8 de setembro de 2026 — não um tutorial completo de SDK.
| Fornecedor | Entrada | Onde o Schema se encaixa | O que observar em 2026 |
|---|---|---|---|
| OpenAI (GPT-5.5 e afins) | response_format no Chat Completions; text.format na Responses API | type: json_schema + strict: true | No strict, todo object quer additionalProperties: false e as properties em geral entram todas em required; opcional vira anulável |
| Google (Gemini 3.7 Flash e afins) | MIME + Schema na config de geração | responseMimeType: application/json + responseJsonSchema (SDK costuma response_schema) | Sem interruptor chamado strict; o responseSchema antigo usava tipos OpenAPI em maiúsculas; o canal novo usa JSON Schema em minúsculas |
| Anthropic (Claude 4.6 / 4.8 e afins) | output_config.format na Messages API | type: json_schema + schema | GA — sem header structured-outputs-2025-11-13; o output_format antigo ainda funciona na transição. O strict: true do lado de ferramenta é Tool Calling, não a resposta final |
Os envelopes diferem. O corpo do Schema deve ser o mesmo arquivo. Trocar de modelo muda o envelope, não orderId e required. Um esboço Claude (campos da spec; troque pelo Schema de negócio):
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Extract orderId and total from the order text"}
],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"orderId": { "type": "string" },
"total": { "type": "number" }
},
"required": ["orderId", "total"]
}
}
}
}
A OpenAI coloca o mesmo schema em response_format.json_schema e liga o strict. O Gemini coloca em responseJsonSchema e declara o MIME type JSON. O lado a lado em Python completo ainda está em OpenAI vs Gemini. Superfícies de produto (ChatGPT / claude.ai / o app web do Gemini) nem sempre expõem a mesma restrição rígida. Escreva o SLA contra a API que você de fato chama.
O que a decodificação restrita realmente bloqueia
Sem Structured Output o modelo amostra o vocabulário inteiro e espera que o prompt o faça parecer JSON. Com Structured Output o decoder mantém um prefixo legal a partir do Schema: o próximo token só pode ser algo ainda válido — um ", orderId, true ou }. Caminhos ilegais ganham probabilidade zero.
Ela bloqueia a forma: vírgula sobrando, cercas de markdown, campos required faltando, deriva de tipo, chaves extras quando additionalProperties é false. Não bloqueia invenção: total é number e o número pode ser inventado; um valor legal de enum ainda pode ser o errado. Produção ainda passa o mesmo Schema por um validador; se falhar, você retenta, degrada ou vai para um humano. A decodificação restrita corta incidentes de parse, não alucinações.
Uma janela maior não muda isso. 1M tokens só alarga o que é visível; não restringe a forma da saída. Se você enfia um dump, ainda precisa de Schema — veja Janelas de contexto de 1M tokens.
O que fazer agora
- Escreva o Schema antes de escolher o modelo. Nomes de campo, listas required e enums são o contrato do produto. GPT / Gemini / Claude são backends intercambiáveis. Guarde o contrato no repositório, não no prompt.
- Extração, classificação, preenchimento de formulários → Structured Output. Efeitos colaterais → Tool Calling. Não finja que Structured Output já bateu na API de estoque. Reuso entre processos é quando você adiciona MCP.
- Pegue a interseção de Schema entre fornecedores: objects achatados,
additionalProperties: false,$refraso, semanyOfna raiz. O strict da OpenAI transforma «opcional» em anulável. Não mantenha três tabelas de campos que divergem. - A API passando não é a última checagem. Salve o Schema e dois ou três fixtures bons / ruins como JSON; valide e faça Diff neste site. Nada é enviado. Essa é a segunda porta depois da decodificação restrita.
- Devolva falhas como estrutura: se o parse ou o segundo validador falhar, devolva um objeto (qual campo, tipo esperado). Não despeje um stack cru no próximo turno.
FAQ
Structured Output é só «fazer o modelo devolver JSON»?
Não. Um prompt ou JSON Mode pode emitir texto JSON. Structured Output filtra tokens contra um JSON Schema na decodificação. Nomes de campo, tipos e listas required são impostos pela API, não pelo bom comportamento do modelo.
Por que GPT, Gemini e Claude lançaram isso — um fornecedor não basta?
Clientes querem failover multi-modelo e comparação de preço. Gateways e frameworks de agente já ligam «Schema entra, JSON sai». Um fornecedor sem restrição rígida não entra nesse pipeline. Pressão competitiva e necessidade de engenharia são o mesmo fato.
O Claude ainda precisa de uma ferramenta falsa para fingir Structured Output?
Não como caminho principal. Em 2026 a Messages API entrega saída JSON Schema via output_config.format. O strict no nível de ferramenta ainda cobre só argumentos de ferramenta. O header beta antigo e o output_format ficam numa janela de transição; código novo deve usar output_config.
Se Structured Output está ligado, eu ainda valido?
Sim. Garante forma e tipos, não valores verdadeiros nem regras de negócio. Rode o mesmo Schema de novo no app; se falhar, retente ou escale. No navegador, cheque fixtures primeiro com a caixa de ferramentas JSON.
Como escolho entre isso, MCP e Tool Calling?
Resposta final para um programa: Structured Output. Ação externa: Tool Calling. Ferramentas em outro processo, reutilizadas entre Hosts: MCP. Dá para empilhar os três. Não deixe uma camada se passar por outra.
Um único JSON Schema pode ir para os três do jeito que está?
O corpo pode ser compartilhado; o envelope da requisição, não. Um object achatado, sem propriedades extras, opcionais como anuláveis, ganha na maioria das vezes. O subconjunto strict da OpenAI é o mais apertado — passe por ele primeiro, depois entregue o mesmo arquivo ao Gemini / Claude, em vez de três Schemas que divergem.
Conclusão
Structured Output é o soquete das APIs flagship de 2026: a resposta final é decodificada contra um JSON Schema, então os programas param de apostar em chaves num prompt. GPT, Gemini e Claude lançaram porque agentes e extração escreveram «forma estável» nos testes de aceite, e JSON Schema era o contrato que os três já falavam. Não é JSON Mode. Não substitui Tool Calling nem MCP.
Troque o modelo, troque só os campos do envelope. Guarde nomes de campo e required no repositório, e valide amostras no local contra o mesmo Schema antes de ir ao ar. Como configurar cada API, e como isso se separa da camada de ferramentas, este site já cobre. Este artigo só deixa «o quê» e «por quê» inequívocos.