Verificação documental: 23 de agosto de 2026. JSON Output consta como suportado em deepseek-v4-flash, deepseek-v4-pro e deepseek-v4-flash-vision-exp. O teste autenticado abaixo permanece datado de 29/07/2026, com V4 Flash textual, e não foi repetido nem recalculado.
Teste ao vivo: JSON válido e parseável
Testamos JSON Output em uma chamada autenticada e não streaming com V4 Flash, Thinking desativado e response_format: {"type":"json_object"}.

| Item | Resultado |
|---|---|
| HTTP | 200 |
| Latência observada | 325 ms |
| Conteúdo exato | {"status":"ok"} |
JSON.parse() | Concluído sem erro |
| Entrada / saída / total | 49 / 5 / 54 |
| Cache hit / miss | 0 / 49 |
O teste confirma apenas que esta chamada mínima retornou JSON sintaticamente válido. Não garante campos, tipos, enums, datas ou regras de negócio. Em produção, valide schema e trate
finish_reason="length"antes do parsing.
Uma chamada simples não mede estabilidade em volume, schemas complexos, streaming ou respostas longas. Nenhum raciocínio bruto foi publicado.
Compare com Tool Calls, Error Codes e a documentação oficial.
Aviso de independência: DeepSeek Português é um guia de terceiros e não representa a DeepSeek. Os links oficiais estão identificados ao final da página.
O DeepSeek JSON Output faz a resposta de Chat Completions chegar como uma string JSON válida. Para ativá-lo, envie response_format: {"type":"json_object"}, mencione a palavra json no prompt, forneça um exemplo do formato desejado e reserve max_tokens suficiente.
Limite essencial: JSON Output garante o formato JSON da resposta normal, mas não garante que campos, tipos, valores ou regras do seu negócio estejam corretos. Faça
JSON.parsee valide o objeto no servidor antes de salvar dados, chamar APIs ou executar ações.
Configuração mínima correta
- Use
POST https://api.deepseek.com/chat/completions. - Escolha
deepseek-v4-flashoudeepseek-v4-propara texto; usedeepseek-v4-flash-vision-expquando a entrada contiver imagem. - Defina
response_format.typecomojson_object. - Inclua a palavra
jsonna mensagem de sistema ou do usuário. - Mostre um exemplo do objeto JSON esperado.
- Defina
max_tokensde acordo com o tamanho esperado. - Confirme
finish_reason, trate conteúdo vazio, faça o parsing e valide o resultado.
Sem uma instrução explícita para produzir JSON, a referência da API alerta que o modelo pode gerar espaços em branco continuamente até atingir o limite de tokens, dando a impressão de que a chamada travou. Escrever apenas “responda de forma estruturada” não atende à orientação oficial: use literalmente json.
Modelos compatíveis e limites
| Model ID | JSON Output | Entrada | Contexto | Saída máxima | Thinking padrão |
|---|---|---|---|---|---|
deepseek-v4-flash | Sim | Texto | 1 milhão | 384 mil | Ativado |
deepseek-v4-pro | Sim | Texto | 1 milhão | 384 mil | Ativado |
deepseek-v4-flash-vision-exp | Sim | Texto e imagem | 1 milhão | 384 mil | Ativado |
Use Flash para extração textual em volume quando ele cumprir seus testes, Pro para tarefas mais ambíguas ou complexas e Vision Exp somente quando a extração depender de uma imagem. Os três aceitam Thinking e Non-Thinking; JSON Output continua exigindo parsing e validação local.
Em 29/07/2026, os aliases legados ainda responderam HTTP 200 nesta conta e retornaram V4 Flash, mas não apareceram em GET /models. Isso é compatibilidade residual observada, não garantia. Em projetos novos, use um dos três IDs explícitos atuais.
JSON a partir de uma imagem
O exemplo mantém response_format: {"type":"json_object"}, envia a imagem em uma mensagem user e usa o Vision Exp:
const response = await client.chat.completions.create({
model: "deepseek-v4-flash-vision-exp",
messages: [
{
role: "system",
content: `Retorne somente json válido.
Exemplo: {"titulo":"Relatório","total":1250.50,"confianca":"baixa"}`,
},
{
role: "user",
content: [
{
type: "text",
text: "Extraia o título e o total. Se não estiver legível, use null.",
},
{
type: "image_url",
image_url: {
url: "https://example.com/imagem-autorizada.png",
detail: "low",
},
},
],
},
],
response_format: { type: "json_object" },
thinking: { type: "disabled" },
max_tokens: 500,
});
As mesmas regras continuam valendo: inclua a palavra json, forneça exemplo, reserve saída suficiente, rejeite conteúdo vazio, verifique finish_reason, faça parsing e valide schema. JSON sintaticamente válido não prova que OCR, números ou interpretação visual estão corretos. Guarde evidência ou encaminhe para revisão humana quando o impacto for relevante.
Imagens são permitidas somente em mensagens user; system e assistant com imagem retornam erro 400. O Vision Exp aceita JPEG, PNG, GIF e WebP por URL, base64 ou file_id. A Files API aceita imagens para reutilização; não é upload genérico de PDF para extração.
Exemplo completo em Node.js
Instale o SDK com npm install openai. A chave deve ficar em variável de ambiente no backend; não a coloque no HTML, no JavaScript do navegador, em um aplicativo distribuído ou em um repositório.
import OpenAI from "openai"; const apiKey = process.env.DEEPSEEK_API_KEY; if (!apiKey) throw new Error("Defina DEEPSEEK_API_KEY no servidor."); const client = new OpenAI({ apiKey, baseURL: "https://api.deepseek.com", }); const systemPrompt = ` Extraia os dados do texto e retorne somente um objeto json. Não use Markdown e não acrescente explicações. Exemplo de json esperado: { "pedido_id": "PED-100", "cliente": "Ana", "itens": 2, "prioridade": "normal" } `; const response = await client.chat.completions.create({ model: "deepseek-v4-flash", messages: [ { role: "system", content: systemPrompt }, { role: "user", content: "Pedido PED-482, cliente Bruno, 3 itens, prioridade alta.", }, ], response_format: { type: "json_object" }, thinking: { type: "disabled" }, max_tokens: 500, }); const choice = response.choices[0]; if (!choice) throw new Error("A API não retornou uma choice."); if (choice.finish_reason === "length") { throw new Error("JSON truncado: aumente max_tokens ou reduza a entrada."); } if (choice.finish_reason !== "stop") { throw new Error(`Geração encerrada por: ${choice.finish_reason}`); } const raw = choice.message.content ?? ""; if (!raw.trim()) throw new Error("A API retornou conteúdo vazio."); let data; try { data = JSON.parse(raw); } catch (error) { throw new Error(`A resposta não pôde ser analisada como JSON: ${error.message}`); } function validarPedido(value) { if (!value || typeof value !== "object" || Array.isArray(value)) return false; return ( typeof value.pedido_id === "string" && typeof value.cliente === "string" && Number.isInteger(value.itens) && value.itens >= 0 && ["baixa", "normal", "alta"].includes(value.prioridade) ); } if (!validarPedido(data)) { throw new Error("JSON válido, mas incompatível com o schema do aplicativo."); } console.log(data); Este fluxo separa três verificações diferentes: encerramento da geração, sintaxe JSON e regras do aplicativo. Um objeto como {"pedido_id":123} pode ser JSON válido e ainda ser inadequado porque o ID deveria ser string e outros campos estão ausentes.
Exemplo equivalente em Python
import json import os from openai import OpenAI api_key = os.environ.get("DEEPSEEK_API_KEY") if not api_key: raise RuntimeError("Defina DEEPSEEK_API_KEY no servidor.") client = OpenAI( api_key=api_key, base_url="https://api.deepseek.com", ) system_prompt = """ Extraia título, idioma e número de palavras. Retorne somente um objeto json, sem Markdown. Exemplo de json: {"titulo":"Guia","idioma":"pt-BR","palavras":1200} """ response = client.chat.completions.create( model="deepseek-v4-flash", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": "Título: API segura; idioma pt-BR; 850 palavras."}, ], response_format={"type": "json_object"}, max_tokens=300, extra_body={"thinking": {"type": "disabled"}}, ) choice = response.choices[0] if choice.finish_reason == "length": raise RuntimeError("JSON truncado: ajuste max_tokens ou a entrada.") if choice.finish_reason != "stop": raise RuntimeError(f"Geração encerrada por: {choice.finish_reason}") raw = choice.message.content or "" if not raw.strip(): raise RuntimeError("A API retornou conteúdo vazio.") try: data = json.loads(raw) except json.JSONDecodeError as error: raise RuntimeError(f"JSON inválido ou incompleto: {error}") from error required = {"titulo": str, "idioma": str, "palavras": int} for field, expected_type in required.items(): if field not in data or not isinstance(data[field], expected_type): raise RuntimeError(f"Campo inválido ou ausente: {field}") print(data) Para schemas extensos, use uma biblioteca de validação mantida para seu ecossistema. Mesmo assim, mantenha validações de domínio — por exemplo, status permitidos, limites numéricos, IDs existentes e permissões do usuário.
Streaming de JSON sem quebrar o parser
Durante streaming, cada delta é apenas um fragmento: {, uma parte de uma string ou metade de um número não são documentos JSON completos. Acumule delta.content e faça JSON.parse somente depois do fim do stream.
const stream = await client.chat.completions.create({ model: "deepseek-v4-flash", messages: [ { role: "system", content: 'Retorne somente json. Exemplo: {"resumo":"...","tags":["..."]}', }, { role: "user", content: "Resuma: ..." }, ], response_format: { type: "json_object" }, thinking: { type: "disabled" }, max_tokens: 800, stream: true, }); let raw = ""; let finishReason = null; for await (const chunk of stream) { const choice = chunk.choices[0]; if (!choice) continue; raw += choice.delta?.content ?? ""; if (choice.finish_reason) finishReason = choice.finish_reason; } if (finishReason === "length") throw new Error("JSON truncado."); if (finishReason !== "stop") throw new Error(`Fim inesperado: ${finishReason}`); if (!raw.trim()) throw new Error("Conteúdo vazio."); const data = JSON.parse(raw); console.log(data); Se o stream for interrompido pela rede, descarte o buffer parcial ou aplique uma estratégia de retomada idempotente. Não tente “consertar” silenciosamente JSON cortado e depois gravá-lo como se fosse uma resposta confiável.
JSON vazio, truncado ou não analisável
| Sintoma | Causa provável | Tratamento |
|---|---|---|
| String vazia | O JSON Output pode ocasionalmente retornar conteúdo vazio | Ajuste o prompt e faça poucas tentativas com backoff; nunca aceite como objeto válido |
| Muitos espaços ou chamada “travada” | O prompt não instruiu explicitamente a saída em json | Inclua a palavra json e um exemplo |
finish_reason: "length" | Limite de saída ou contexto atingido | Aumente max_tokens dentro dos limites ou reduza entrada/formato |
JSON.parse falha | Conteúdo vazio, truncamento, stream parcial ou transformação da resposta | Não processe; registre o caso e gere novamente de forma controlada |
| JSON válido com valores errados | JSON mode não garante semântica ou regra de negócio | Valide schema, enums, intervalos, referências e permissões |
A documentação reconhece especificamente a possibilidade de conteúdo vazio e recomenda modificar o prompt. Um retry deve ser limitado, usar backoff com jitter e ter idempotency control quando a chamada participa de um fluxo de gravação. Não presuma que uma resposta vazia ou falha não gera custo; reconcilie o uso retornado e sua conta.
JSON Output, JSON Schema e tool calls não são a mesma coisa
| Recurso | O que entrega | O que não garante |
|---|---|---|
| JSON Output | Resposta do assistant como JSON sintaticamente válido via json_object | Conformidade com seu schema de negócio |
| Validação no backend | Regras de campos, tipos, enums e domínio definidas pela aplicação | Que os fatos extraídos pelo modelo sejam verdadeiros |
| Tool Calls | Pedido para sua aplicação executar uma função, com argumentos em JSON | Execução automática, permissão ou argumentos confiáveis |
| Tool Calls strict mode (Beta) | Argumentos aderentes ao JSON Schema suportado da função | Saída geral do assistant em um schema arbitrário ou correção semântica |
A documentação do JSON Output registra apenas response_format: {"type":"json_object"}; ela não documenta um tipo json_schema para a resposta geral. Se você encontrar exemplos de outros provedores com response_format.type: "json_schema", não os copie para a DeepSeek sem confirmação oficial.
Onde existe JSON Schema oficial: tool calls strict (Beta)
O uso documentado de JSON Schema estrito está separado em Tool Calls strict mode. Ele exige a base URL Beta https://api.deepseek.com/beta, strict: true em todas as funções e um schema aceito pelo servidor. Em objetos, todas as propriedades devem constar em required e additionalProperties deve ser false.
const betaClient = new OpenAI({ apiKey: process.env.DEEPSEEK_API_KEY, baseURL: "https://api.deepseek.com/beta", }); const tools = [{ type: "function", function: { name: "salvar_classificacao", description: "Salva uma classificação já validada pela aplicação.", strict: true, parameters: { type: "object", properties: { categoria: { type: "string", enum: ["suporte", "vendas", "financeiro"] }, urgente: { type: "boolean" }, }, required: ["categoria", "urgente"], additionalProperties: false, }, }, }]; Esse trecho apenas define a ferramenta; sua aplicação ainda precisa receber a tool call, validar autorização, executar a função e devolver o resultado. Como o modo é Beta e aceita um subconjunto de JSON Schema, confira a documentação antes de adotar cada keyword.
Prompts melhores para JSON Output
- Escreva “retorne somente um objeto json”, não apenas “estruture a resposta”.
- Inclua um exemplo pequeno com todas as chaves esperadas.
- Defina como representar valores ausentes:
null, string vazia ou omissão — e valide a escolha. - Liste enums permitidos e unidades, como centavos em vez de valor decimal ambíguo.
- Peça uma chave de evidência quando a extração precisar ser auditável.
- Delimite texto não confiável e instrua o modelo a tratá-lo como dados, não como comandos.
- Evite schemas gigantes em uma única chamada; divida o trabalho se isso melhorar testes e recuperação.
O exemplo no prompt melhora a aderência, mas continua sendo orientação probabilística. Sua camada de validação é o limite de confiança.
Checklist de produção
- Chave de API armazenada somente no servidor.
- ID explícito:
deepseek-v4-flashoudeepseek-v4-propara texto;deepseek-v4-flash-vision-expquando houver imagem. response_format.type: "json_object".- A palavra
jsone um exemplo no prompt. max_tokensdimensionado efinish_reasonverificado.- Conteúdo vazio rejeitado.
- Parsing com tratamento de exceção.
- Schema e regras de negócio validados.
- Dados factuais verificados quando a precisão importa.
- Retries limitados, backoff e operações idempotentes.
- Logs sem chaves, credenciais ou dados pessoais desnecessários.
Para diagnosticar respostas interrompidas, autenticação e falhas de capacidade, use DeepSeek error codes e DeepSeek não funciona: troubleshooting. Para integração completa, consulte OpenAI SDK com DeepSeek.
FAQ sobre DeepSeek JSON Output
Qual response_format devo usar?
Use {"type":"json_object"}. Também instrua o modelo a produzir json na mensagem de sistema ou do usuário.
JSON Output garante meu schema?
Não. Ele garante JSON sintaticamente válido em uma geração normal concluída, mas não a presença, o tipo ou o significado dos campos. Valide o objeto no backend.
Por que a resposta veio vazia?
A documentação oficial diz que JSON Output pode ocasionalmente retornar conteúdo vazio. Rejeite a resposta, ajuste o prompt e tente novamente com um limite controlado.
Posso analisar cada chunk do streaming?
Não como documento completo. Acumule os fragmentos e faça o parsing depois de receber o término com finish_reason: "stop".
Preciso ativar Thinking Mode para gerar JSON?
Não. JSON Output é um recurso separado. Para extração direta, Non-Thinking pode ser mais eficiente; para tarefas complexas, teste Thinking e compare qualidade, latência e tokens.
Tool call strict é o mesmo que JSON Output?
Não. Strict mode é um recurso Beta para argumentos de funções e exige a URL Beta e schemas compatíveis. JSON Output controla a mensagem JSON do assistant via response_format.
Vision Exp aceita JSON Output?
Sim. A tabela oficial marca JSON Output como suportado no deepseek-v4-flash-vision-exp. O recurso garante JSON válido quando a geração normal é concluída, mas não garante a correção da leitura visual, dos campos ou dos valores. Valide o objeto e trate conteúdo vazio ou truncado.
Fontes oficiais
- DeepSeek API Docs — JSON Output
- DeepSeek API Reference — Create Chat Completion
- DeepSeek API Docs — Vision
- DeepSeek API Docs — Tool Calls e strict mode
- DeepSeek API Docs — Models & Pricing
- DeepSeek API Reference — List Models
DeepSeek Português é um site independente, criado por terceiros, sem afiliação, endosso ou representação oficial da DeepSeek. Confirme modelos, parâmetros e limites na documentação oficial antes de decisões de produção.
