Este artigo reúne as observações de uso e as armadilhas do deepseek-v4-pro-0813. No AIHubMix, o modelo está disponível pelas APIs Chat Completions, Responses e Messages compatível com Claude. Veja também: documentação oficial da API do DeepSeek.
As conclusões "Verificado" e as respostas de exemplo de cada seção vêm de chamadas reais feitas em 13/08/2026 pelas APIs do AIHubMix (Chat Completions / Responses / Messages). Os itens de especificação não marcados como "Verificado" vêm da documentação oficial do DeepSeek.
1. Posicionamento do Modelo e Especificações Resumidas
O V4 Pro é o nível topo de linha da geração V4 do DeepSeek (o leve deepseek-v4-flash é seu irmão). A linha de lançamento remonta ao DeepSeek-V4 Preview, em 24/04/2026, e 0813 é o rótulo de VERSÃO DO MODELO atribuído pelo DeepSeek à build atual. Além das especificações brutas, quatro pontos o diferenciam:
- Um modelo de fronteira esparso: 1,6T de parâmetros totais / 49B ativados (uma arquitetura MoE, ou mistura de especialistas, em que cada passagem de inferência ativa apenas um subconjunto de redes especialistas: os parâmetros totais determinam a capacidade de conhecimento, e os parâmetros ativados determinam o custo de computação por chamada). O model card lista a atenção híbrida CSA+HCA, mHC e o otimizador Muon.
- Pesos abertos sob MIT: o
deepseek-ai/DeepSeek-V4-Proé publicado no HuggingFace sob a licença MIT (uma das licenças de código aberto mais permissivas, que permite uso comercial e redistribuição de código fechado) e pode ser hospedado por conta própria. A licença MIT é incomum para um modelo desse porte. As notas de self-hosting do model card também sugerem uma janela de contexto de ≥384K tokens ao rodar no Think Max (o nível de thinking mais alto). Trata-se de orientação de implantação para self-hosting, e não de uma especificação da API hospedada. - Suporte a múltiplos protocolos é nativo, não tradução de terceiros: o próprio DeepSeek oferece uma API Chat no formato OpenAI, um endpoint compatível com Anthropic (
/anthropic, que mapeiaclaude-opus*para este modelo) e a API Responses (o DeepSeek descreve suporte nativo ao formato, com adaptações para o Codex). Ele também oferece completação FIM (fill-in-the-middle) como recurso Beta em um endpoint separado, que não faz parte das três APIs do AIHubMix. - Uma diferença de ~120× entre o preço de cache hit e cache miss: o mecanismo de preço publicado pelo DeepSeek é cache hit de US$ 0,003625/M contra cache miss de US$ 0,435/M (saída de US$ 0,87/M), e o cache é automático, sem nenhum parâmetro a configurar. Em cargas de trabalho que reutilizam prefixos longos (prompts de sistema, documentos extensos), essa diferença domina a conta. O preço de varejo real é o que a página do modelo mostra.
| Item | Valor |
|---|---|
| Nome do modelo no AIHubMix | deepseek-v4-pro-0813 |
| Janela de contexto | 1M tokens (1.000.000) |
| Saída máxima | A redação oficial é MAX OUTPUT MAXIMUM: 384K (a contagem exata de tokens e o padrão não são publicados) |
| Modalidades de entrada | Somente texto. A página de compatibilidade do Responses afirma explicitamente que entradas de imagem e arquivo não são suportadas; a página de Messages marca explicitamente os blocos type="image" como Not Supported; no Chat Completions, o content da mensagem do usuário aceita apenas string, sem partes de conteúdo multimodal |
| Modo de thinking | Híbrido (thinking / não-thinking), thinking ativado por padrão |
| Níveis de thinking | reasoning_effort aceita low / high / max, padrão high; medium e xhigh são mapeados para high por compatibilidade |
| APIs disponíveis | Chat Completions, Responses, Messages (compatível com Claude) |
Verificado: excedermax_tokensé rejeitado pela validação, em vez de ser truncado silenciosamente. Enviarmax_tokens=9999999retorna HTTP 400, e o corpo do erro indica o campo e informa o limite393216.
# max_tokens=9999999 -> HTTP 400
"...max_tokens... 393216"
❗ Imagens não geram erro, mas são descartadas: a redação oficial para a API Responses é "Image and file inputs are not supported (input_image parts do not cause an error, but are replaced with a placeholder text)". Ou seja, uma parteinput_imagenão faz a requisição falhar, mas é substituída por um texto de placeholder. No Chat Completions, ocontentda mensagem do usuário aceita apenas string, e no Messages os blocostype="image"são marcados como Not Supported. Ao montar um roteamento multimodal, nunca trate "nenhum erro" como prova de que o modelo de fato viu a imagem.
2. Como Desligar o Thinking? Três APIs, Três Formatos de Campo
O V4 Pro faz thinking por padrão: não envie parâmetro algum e a resposta virá com o conteúdo de thinking. Para desligá-lo, cada uma das três APIs usa um formato de campo diferente.
Chat Completions
Use o objeto thinking no nível superior.
from openai import OpenAI
client = OpenAI(
base_url="https://aihubmix.com/v1",
api_key="<AIHUBMIX_API_KEY>",
)
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "What is 2 + 2?"}],
extra_body={"thinking": {"type": "disabled"}},
)
# Thinking on (default): message.reasoning_content present, reasoning_tokens = 43
# Thinking off (disabled): reasoning_content absent, reasoning_tokens absent
Verificado: comthinking.type="disabled",message.reasoning_contenteusage.completion_tokens_details.reasoning_tokensdesaparecem juntos, o que confirma que a alternância surtiu efeito.
Responses
Não há chave separada no Responses; desligar o thinking significa definir o nível como none.
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="What is 2 + 2?",
reasoning={"effort": "none"},
)
# effort="none": usage.output_tokens_details.reasoning_tokens = 0
# output[0] is the message item directly (no reasoning item)
# effort unset : output always starts with a reasoning item
Verificado:reasoning.effort="none"é observavelmente diferente do nível padrão (os tokens de thinking caem para zero e o item de saídareasoningdesaparece), o que confirma que surtiu efeito.
Messages
Mesmo nome e mesmo formato do Chat Completions: o objeto thinking no nível superior.
from anthropic import Anthropic
client = Anthropic(
api_key="<AIHUBMIX_API_KEY>",
base_url="https://aihubmix.com",
)
response = client.messages.create(
model="deepseek-v4-pro-0813",
max_tokens=1024,
messages=[{"role": "user", "content": "What is 2 + 2?"}],
extra_body={"thinking": {"type": "disabled"}},
)
# Thinking on (default): content = [thinking block, text block]
# Thinking off (disabled): content = [text block]
Verificado: uma vez desativado, o blocothinkingdesaparece por completo e resta apenas o blocotext.
Sobre os níveis de thinking:lowemaxretornaram 200 no Chat Completions durante os testes (highé o padrão e se aplica quando o campo é omitido), mas as contagens de tokens de thinking não mostram diferença monotônica entre níveis para a mesma pergunta (pergunta fácil: low=43 / max=27; pergunta difícil: low=114 / max=92). Além disso, nada é ecoado na resposta: os níveis são aceitos, mas nenhum sinal distintivo é observável na resposta. No Responses, só o nívelnone(thinking desligado) pode ser confirmado pelo lado da resposta.
3. Por Que uma Conversa com Vários Turnos Retorna 400 de Repente? O Histórico de Thinking Deve Ser Devolvido Integralmente
Esta é a armadilha mais comum com este modelo: no modo thinking, uma conversa com vários turnos precisa devolver integralmente o conteúdo de thinking do turno anterior, ou a requisição é rejeitada. Não é degradação nem queda de qualidade, mas um HTTP 400 puro.
As três APIs carregam o mesmo conteúdo de thinking sob nomes de campo diferentes:
| API | Formato do passback | Corpo do erro quando ausente |
|---|---|---|
| Chat Completions | O campo reasoning_content na mensagem do assistente |
The `reasoning_content` in the thinking mode must be passed back to the API. |
| Responses | O item de saída com type="reasoning" no array input |
The `reasoning_text` in the thinking mode must be passed back to the API. |
| Messages | O bloco thinking dentro dos blocos de conteúdo do assistente |
The `content[].thinking` in the thinking mode must be passed back to the API. |
Verificado (condições de disparo): essa validação dispara de forma consistente em requisições com vários turnos que carregam tools (o modelo emite uma chamada de ferramenta e o resultado dela é enviado de volta). Em requisições simples com vários turnos, sem ferramentas, em que o modelo responde diretamente, a validação não disparou nesta rodada de testes e a requisição retornou 200. Em outras palavras, a orquestração de ferramentas (cargas de agentes / function calling) é onde você tem mais chance de esbarrar nesse erro, então trate o conteúdo de thinking como parte do estado da conversa que você persiste e reenvia.Chat Completions
# Multi-turn: pass the previous assistant message back verbatim, including reasoning_content
messages = [
{"role": "user", "content": "What is 1 + 1? Remember the result."},
{
"role": "assistant",
"content": "2",
"reasoning_content": "<reasoning_content from the previous response>",
},
{"role": "user", "content": "Add 1 to the result."},
]
# Dropping reasoning_content -> HTTP 400 invalid_request_error
Verificado: uma mensagem histórica do assistente sem reasoning_content retorna 400; ao incluí-lo de volta, a mesma requisição retorna 200 e continua corretamente.Responses
# Multi-turn: input = previous input + response.output (reasoning item included) + new message
input = previous_input + response.output + [
{"role": "user", "content": "Add 1 to the result."}
]
# Filtering out the type="reasoning" item -> HTTP 400
Verificado: basta reinserirresponse.outputexatamente como veio. Filtrar os itens de saída portype == "message"ao montar o histórico descarta o itemreasoninge dispara o 400. Esta é a forma mais comum de cair nessa armadilha.
Messages
# Multi-turn: pass response.content back verbatim as the assistant message
messages = [
{"role": "user", "content": "What's the weather in Paris?"},
{"role": "assistant", "content": response.content}, # thinking + tool_use blocks
{"role": "user", "content": [tool_result_block]},
]
# Stripping the thinking block -> HTTP 400
Verificado: remover o blocothinkingdo array de conteúdo retorna 400 (comerror.typeigual ainvalid_request_error).
4. Chamada de Ferramentas
Cada API declara ferramentas no formato do seu próprio protocolo; os formatos não são intercambiáveis.
Chat Completions
Formato aninhado (um objeto function envolvendo name / parameters). Um tool_choice com função nomeada força a chamada.
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "What's the weather in Paris?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather for a city",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
},
}],
tool_choice={"type": "function", "function": {"name": "get_weather"}},
)
# Observed: finish_reason "tool_calls", tool_calls[0].function.arguments = {"city": "Paris"}
❗ Verificado:tool_choice: "required"não pode ser usado com o thinking ativado. Ele retorna 400 comThinking mode does not support this tool_choice; desativar o thinking (thinking.type="disabled") faz a mesma requisição retornar 200. Quando você precisar de semântica de "deve chamar uma ferramenta", use umtool_choicecom função nomeada (como acima, que funciona com o thinking ativado), ou desligue o thinking primeiro e então userequired.
Responses
Formato plano (type / name / parameters no mesmo nível).
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="What's the weather in Paris?",
tools=[{
"type": "function",
"name": "get_weather",
"description": "Get weather for a city",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}],
)
# Observed output items: ["reasoning", "function_call"]; arguments = {"city": "Paris"}
Verificado: copiar o formato aninhado do Chat Completions (function: {...}) para o Responses retorna 400. Use o formato plano.tool_choice: "required"está sujeito à mesma restrição de modo thinking que no Chat.
Messages
Formato nativo da Anthropic (input_schema), com tool_choice: {"type": "any"} para forçar uma chamada.
response = client.messages.create(
model="deepseek-v4-pro-0813",
max_tokens=1024,
tools=[{
"name": "get_weather",
"description": "Get weather for a city",
"input_schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}],
tool_choice={"type": "any"},
messages=[{"role": "user", "content": "What's the weather in Paris?"}],
)
# Observed: content contains a tool_use block, name = get_weather, input = {"city": "Paris"}
❗ A chamada paralela de ferramentas não pode ser desativada, por decisão de design do próprio DeepSeek: a página oficial de compatibilidade com Anthropic afirma, na linha detool_choice, quedisable_parallel_tool_use is ignored, e a página do Responses diz o mesmo emparallel_tool_calls | Ignored (parallel tool calling is always enabled). Os testes confirmam: perguntar sobre duas cidades ao mesmo tempo comdisable_parallel_tool_use: trueainda retorna dois blocostool_use. Se você precisa de execução serial, processe apenas a primeira chamada ou enfileire as chamadas do lado do cliente.
Contagem de ferramentas e custo de contexto: enviar 200 definições de função em uma única requisição ainda retornou 200 com uma resposta normal e não acionou nenhuma validação de quantidade (observado neste caminho; contagens maiores não foram testadas). Porém, prompt_tokens dessa requisição chegou a 6.105 — as definições de ferramentas entram no contexto por completo e são cobradas. Quando há muitas ferramentas, reduza o conjunto de ferramentas por cenário em vez de declarar todas incondicionalmente.5. Saída estruturada
Chat Completions
response_format oferece suporte ao modo JSON.
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "Return {\"a\": 1} as JSON."}],
response_format={"type": "json_object"},
)
# Observed response content: {"a":1}
Verificado: a saída é JSON válido.
Responses
Declare um JSON Schema por meio de text.format, com suporte ao modo strict.
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="Return the number 1 under key a.",
text={
"format": {
"type": "json_schema",
"name": "extract",
"strict": True,
"schema": {"type": "object", "properties": {"a": {"type": "integer"}}, "required": ["a"]},
}
},
)
# Observed output text: {"a":1}
Verificado: a saída está em conformidade estrita com o schema fornecido.
Messages
O protocolo Messages (Anthropic) não tem equivalente a response_format / text.format. A solução alternativa usual é transportar o schema em uma ferramenta — declare uma ferramenta cujo input_schema seja o schema desejado, defina tool_choice: {"type": "any"} e leia o resultado estruturado a partir do input do bloco tool_use. Esta rodada de testes não verificou especificamente esse padrão; quando forem necessárias garantias rígidas de schema, prefira Chat Completions ou Responses.
6. Como ativar o cache de contexto? Não é preciso, ele é automático
O cache de contexto (prefixos idênticos são reutilizados, e a parte em cache é cobrada a uma taxa menor) está ativado por padrão e não exige parâmetros. Uma segunda requisição com o mesmo prefixo longo reporta o acerto em usage, sob um nome de campo que varia conforme a API. Para detalhes de cache e preços atuais, veja a página do modelo; para a estratégia de cache entre modelos e técnicas de taxa de acerto, veja as práticas de cache de prompt.
Chat Completions
# usage of the second call with an identical long prefix
"prompt_tokens_details": {"cached_tokens": 640} # first call: 0
Verificado: duas chamadas consecutivas com o mesmo prefixo longo no mesmo canal fizeram cached_tokens passar de 0 para 640.Responses
# usage of the second call with identical long instructions
"input_tokens_details": {"cached_tokens": 896} # first call: 0
Messages
# usage of a call whose long system prefix was already warmed
"cache_read_input_tokens": 896
Verificado: o prefixo acima foi aquecido por uma requisição Responses com conteúdo idêntico, e a primeira chamada Messages obteve 896 de acerto imediatamente — consistente com o cache sendo indexado pelo prefixo de conteúdo e compartilhado entre as superfícies de protocolo.
7. logprobs: Chat retorna dois canais
logprobs (probabilidades logarítmicas — o detalhe de confiança por token candidato do modelo) volta em formatos diferentes nas duas APIs, e o código de parsing precisa tratá-las separadamente.
Chat Completions
completion = client.chat.completions.create(
model="deepseek-v4-pro-0813",
messages=[{"role": "user", "content": "Say hi."}],
logprobs=True,
top_logprobs=2,
)
# Observed: choices[0].logprobs contains TWO arrays
# logprobs.content[] -> tokens of the final answer
# logprobs.reasoning_content[] -> tokens of the thinking text
❗ Verificado: Chat retorna probabilidades logarítmicas tanto paracontentquanto parareasoning_content. Código que lê apenaslogprobs.content, conforme o formato de resposta padrão da OpenAI, não gera erro, mas ignora silenciosamente o canal de raciocínio; se o seu código assume um único array emlogprobs, adicione antes uma verificação de formato.
Responses
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="Say hi.",
top_logprobs=3,
)
# Observed: logprobs only on the final message item
# output[-1].content[0].logprobs[] with logprob + top_logprobs details
Verificado: Responses anexa logprobs somente ao item de texto final — nenhum formato de dois canais como o visto em Chat.
Messages
O protocolo Messages (Anthropic) não tem campo equivalente. Para detalhes de probabilidade no nível de token, use Chat Completions ou Responses.
8. Quais APIs podem pesquisar na web?
A pesquisa na web aqui é uma ferramenta do lado do servidor (a recuperação é executada no servidor; o cliente nunca emite a requisição em si), e ela de fato é executada nas APIs Responses e Messages nos testes.
Responses
response = client.responses.create(
model="deepseek-v4-pro-0813",
input="What is the latest stable version of Python?",
tools=[{"type": "web_search"}],
)
# Observed output item sequence:
# ["reasoning", "web_search_call", "reasoning", "message"]
Verificado: um item web_search_call aparece na sequência de saída, o que significa que o servidor realmente executou uma recuperação.Messages
response = client.messages.create(
model="deepseek-v4-pro-0813",
max_tokens=1024,
tools=[{"type": "web_search_20250305", "name": "web_search"}],
messages=[{"role": "user", "content": "What is the latest stable version of Python?"}],
)
# Observed content block sequence:
# ["thinking", "server_tool_use", "web_search_tool_result", "thinking", "text"]
# usage.server_tool_use.web_search_requests = 1
Verificado: usage.server_tool_use.web_search_requests conta 1 — a requisição de recuperação de fato ocorreu e foi contabilizada.Chat Completions
A pesquisa na web não pode ser acionada em Chat. A referência oficial da API Chat da DeepSeek não contém nenhum campo de ferramenta de pesquisa em todo o schema da requisição (essa ausência foi constatada percorrendo a lista de campos um a um; a DeepSeek não fez nenhuma declaração explícita negando suporte). A API com declaração oficial explícita de suporte à pesquisa do lado do servidor é Responses (web_search), e a página oficial de compatibilidade com Messages também lista os blocos de conteúdo relacionados à pesquisa.
# Three control groups, same question requiring live information, all HTTP 200:
# A no search field -> "cannot retrieve", annotations = null
# B web_search_options -> "cannot retrieve", annotations = null, usage identical to A
# C enable_search -> "cannot retrieve", annotations = null, usage identical to A
Verificado: enviarweb_search_optionsouenable_searchnão gera erro, mas também não recupera nada — a resposta não trazannotations(a lista de citações anexada à resposta quando a pesquisa na web é executada), e o uso corresponde ao grupo de controle campo por campo. Para acesso à web, use a API Responses ou Messages.
9. Notas de uso: o design da DeepSeek vs. desvios no nosso caminho
Tudo abaixo retorna HTTP 200 mas se comporta de forma contraintuitiva. As causas diferem, e também o que fazer a respeito, por isso são listadas separadamente: o primeiro grupo é como a DeepSeek projetou o modelo, e trocar de provedor não o mudará; o segundo grupo é o comportamento atual no caminho do AIHubMix, em que estamos trabalhando.
9.1 Pelo design da DeepSeek
| Comportamento | Redação oficial | O que fazer |
|---|---|---|
| Responses não retém estado de sessão nem metadados | A página oficial de compatibilidade com Responses afirma, linha por linha, store | Not supported. The response always carries store: false, metadata | Not supported e safety_identifier | Not supported (entre esses quatro campos, apenas user é Supported). Os testes confirmam: a requisição retorna 200, mas metadata é null, safety_identifier está ausente e store é sempre false |
Mantenha no cliente os dados de correlação de requisições; não dependa de retenção no servidor |
| Parâmetros de amostragem não têm efeito no modo de raciocínio | A DeepSeek afirma explicitamente que temperature e top_p são silenciosamente inativos no modo de raciocínio. Nos testes, ambos retornam 200 sem nada de volta e sem alteração no formato da resposta |
Não dependa de parâmetros de amostragem para estabilidade de saída no modo de raciocínio; use saída estruturada quando precisar de determinismo |
| Continuação de prefixo / FIM só existe no endpoint beta oficial | A descrição oficial de prefix diz "(Beta) … You must set base_url="https://api.deepseek.com/beta" to use this feature", e a conclusão FIM também é um recurso Beta. Verificado na produção do AIHubMix: enviar prefix: true para o endpoint padrão retorna 200, mas o prefixo é silenciosamente descartado, em linha com a redação oficial |
Para formato de saída controlado, use saída estruturada (seção 5) ou truncamento com stop |
| A chamada paralela de ferramentas não pode ser desativada | Veja a seção 4: a DeepSeek afirma nas páginas de Responses e de Anthropic que a opção é ignorada e que a chamada paralela está sempre ativa | Enfileire as chamadas no cliente quando precisar de execução serial |
9.2 Comportamento atual no caminho do AIHubMix
| Comportamento | O que os testes mostram | O que fazer |
|---|---|---|
type não padrão nos objetos de erro de Responses |
O error.type em respostas 4xx é Aihubmix_api_error, enquanto a mesma classe de erro em Messages retorna o invalid_request_error canônico |
Trate a ramificação pelo código de status HTTP, não pela string error.type |
| Tokens de raciocínio contados como 0 em Messages | A resposta traz um bloco thinking, mas usage.output_tokens_details.thinking_tokens é sempre 0, o que contradiz o conteúdo de raciocínio efetivamente produzido; pelo contrato da Anthropic com que integramos, esse campo é obrigatório e deve ser ≤ output_tokens |
Para contabilizar o custo do raciocínio, use completion_tokens_details.reasoning_tokens em Chat ou output_tokens_details.reasoning_tokens em Responses |
Messages devolve model como deepseek-v4-pro |
A requisição envia deepseek-v4-pro-0813 e a resposta devolve deepseek-v4-pro. A causa é a nomenclatura: o único nome de modelo oficial da API da DeepSeek é deepseek-v4-pro, e 0813 é o rótulo de versão |
Não use o campo model da resposta como única base para verificações de roteamento de modelo ou atribuição de uso |
9.3 Não definido pela DeepSeek, então sem veredito em nenhum sentido
Enviar para reasoning_effort um valor fora do enum (por exemplo bogus_xyz) retorna 200 com uma resposta normal, sem erro e sem efeito observável. O fato é claro o suficiente: este caminho atualmente não valida o enum de reasoning_effort. O que não está claro é se ele deveria validar: a DeepSeek publica o enum válido, mas nunca declara se um nível ilegal deveria ser rejeitado, então não há base de comparação; por isso, isso não conta nem como comportamento oficial nem como defeito no nosso caminho. A abordagem segura do lado do cliente é validar o nível por conta própria e não contar com a API para detectá-lo.
10. Matriz de suporte capacidade × API
As células abaixo mostram a grafia do parâmetro / campo para cada API. Exceto onde marcado como redação explícita da DeepSeek, toda conclusão vem de chamadas reais feitas em 13/08/2026 contra as APIs de produção do AIHubMix.
| Capacidade | Chat Completions | Responses | Messages |
|---|---|---|---|
| Chat básico / instruções de sistema | ✅ messages |
✅ input + instructions |
✅ messages + system no nível superior |
| Streaming | ✅ stream + stream_options |
✅ stream (response.created … response.completed) |
✅ stream (message_start … message_stop) |
| Limite de saída | ✅ max_tokens (400 quando excedido, limite 393216) |
✅ max_output_tokens |
✅ max_tokens |
| Desativar o raciocínio | ✅ thinking: {"type": "disabled"} |
✅ reasoning: {"effort": "none"} |
✅ thinking: {"type": "disabled"} |
| Nível de raciocínio | 🟡 reasoning_effort aceito, sem sinal distinguível |
✅ reasoning.effort (só none pode ser confirmado) |
🟡 output_config.effort aceito, nada devolvido |
| Conteúdo de raciocínio retornado | ✅ campo reasoning_content |
✅ item de saída reasoning |
✅ bloco de conteúdo thinking |
| Retorno obrigatório do histórico de raciocínio | ✅ reasoning_content ausente → 400 |
✅ item reasoning ausente → 400 |
✅ bloco thinking ausente → 400 |
| Chamada de ferramentas | ✅ tools aninhado + tool_choice nomeado |
✅ tools plano |
✅ input_schema + tool_choice: {"type":"any"} |
Forçar uma chamada com required |
❗ 400 enquanto o raciocínio está ativado; desative-o primeiro | ❗ igual à coluna à esquerda | ✅ {"type": "any"} |
| Chamada paralela de ferramentas (não desativável) | ➖ não existe esse campo na API Chat oficial | ❗ A DeepSeek afirma que parallel_tool_calls é ignorado e que a chamada paralela está sempre ativa |
❗ A DeepSeek afirma que disable_parallel_tool_use é ignorado; os testes ainda retornam dois blocos tool_use |
| Saída estruturada | ✅ response_format (json_object) |
✅ text.format (json_schema + strict) |
➖ sem campo de protocolo; transporte o schema em uma ferramenta |
| Medição automática de cache-hit | ✅ usage.prompt_tokens_details.cached_tokens |
✅ usage.input_tokens_details.cached_tokens |
✅ usage.cache_read_input_tokens |
| logprobs | ❗ canal duplo: content + reasoning_content |
✅ top_logprobs apenas no item de texto final |
➖ |
| Pesquisa na web | ➖ não há campo de pesquisa na API Chat oficial; enviá-lo também não faz nenhuma recuperação | ✅ tools: [{"type": "web_search"}] |
✅ web_search_20250305 |
| Sequências de parada | ✅ stop |
➖ não há campo de sequência de parada no protocolo (apenas max_output_tokens limita o comprimento) |
✅ stop_sequences (stop_reason: "stop_sequence") |
Legenda: ✅ verificado funcionando · 🟡 aceito, mas não é possível confirmar que tem efeito · ❗ requer atenção (veja as notas acima) · ➖ não existe esse conceito nesta API
FAQ
Quais APIs o deepseek-v4-pro-0813 suporta no AIHubMix?
Chat Completions (/v1/chat/completions), Responses (/v1/responses) e a API Messages compatível com Claude (/v1/messages).
Por que uma conversa com várias rodadas retorna 400 de repente?
A causa mais comum é o histórico de raciocínio que não foi reenviado. No modo de raciocínio, o conteúdo de raciocínio da rodada anterior precisa ser reenviado literalmente: reasoning_content na mensagem do assistente para Chat, o item de saída type="reasoning" para Responses e o bloco de conteúdo thinking para Messages. Conversas com várias rodadas e ferramentas são onde isso mais causa problemas, pois muitos frameworks filtram os itens de saída por type == "message" ao montar o histórico, o que descarta o item de raciocínio.
É possível desativar o raciocínio?
Sim. Envie thinking: {"type": "disabled"} em Chat ou Messages, e reasoning: {"effort": "none"} em Responses. Quando desativado, tanto o conteúdo de raciocínio quanto os tokens de raciocínio desaparecem.
Os três níveis de reasoning_effort são diferentes?low / high / max são todos aceitos (padrão high; medium e xhigh são mapeados para high por compatibilidade). Nos testes, a contagem de tokens de raciocínio para a mesma pergunta não mostra diferença monotônica entre os níveis e nada é devolvido, então a diferença não pode ser confirmada do lado de quem faz a chamada. Apenas o nível none em Responses (raciocínio desativado) produz uma diferença observável clara.
Por que tool_choice: "required" retorna 400?
Esse valor não é aceito com o raciocínio ativado (o corpo do erro diz Thinking mode does not support this tool_choice). Use um tool_choice com nome de função ({"type": "function", "function": {"name": "..."}}) para forçar uma chamada específica com o raciocínio ativado, ou desative o raciocínio primeiro e depois use required.
Como ativar o cache de contexto?
Você não precisa ativar: ele é automático. Coloque no início da requisição o conteúdo estável e imutável (prompts de sistema, trechos de conhecimento, definições de ferramentas), e o número de acertos é informado em usage: prompt_tokens_details.cached_tokens em Chat, input_tokens_details.cached_tokens em Responses e cache_read_input_tokens em Messages.
Para preços e status em tempo real, veja a página do modelo deepseek-v4-pro-0813; para mais modelos, visite a galeria de modelos.
Guias práticos relacionados: guia prático do Kimi K3 (novos parâmetros e uma matriz de suporte às três APIs) e mudanças no cache de prompts e na cobrança do GPT-5.6.



