O que é Structured Output? Por que GPT, Gemini e Claude forçam JSON

Em 8 de setembro de 2026: o que é Structured Output, por que GPT, Gemini e Claude entregam JSON restrito por Schema, e como isso difere de JSON Mode e Tool Calling.

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ãoO que significa de fatoLeitura errada comum
Structured OutputDecodificação restrita da resposta final contra um JSON SchemaO modelo ficou mais inteligente, ou «ele sabe escrever JSON»
JSON SchemaO contrato de campos, tipos, required, enumsUm prompt mais longo
Decodificação restritaTokens ilegais são filtrados à medida que são geradosLimpeza com regex depois do fato
strict / restrição rígidaA API garante a forma num subconjunto mais estrito de SchemaOs 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:

CapacidadeO que garanteO que não garante
Prompt: «devolva JSON»Uma probabilidade maiorSintaxe, nomes de campo, listas required
JSON ModeO texto é JSON parseávelForma, tipos, enums
Structured OutputA resposta final bate com o SchemaVerdade semântica, ou que uma ferramenta rodou
Tool CallingArgumentos da ferramenta batem com um Schema e o Host os executaA 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.

  1. 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.
  2. 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.
  3. 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.
  4. JSON Schema já era o menor denominador comum. OpenAPI, inputSchema do 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.
  5. 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.

FornecedorEntradaOnde o Schema se encaixaO que observar em 2026
OpenAI (GPT-5.5 e afins)response_format no Chat Completions; text.format na Responses APItype: json_schema + strict: trueNo 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çãoresponseMimeType: 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 APItype: json_schema + schemaGA — 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

  1. 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.
  2. 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.
  3. Pegue a interseção de Schema entre fornecedores: objects achatados, additionalProperties: false, $ref raso, sem anyOf na raiz. O strict da OpenAI transforma «opcional» em anulável. Não mantenha três tabelas de campos que divergem.
  4. 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.
  5. 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.