Voltar ao blog

Solução de problemasGuia

Erro 400 na API do Claude com temperature, top_p, top_k: como corrigir

Sua requisição ao Claude começou a retornar 400 na versão de API 2026-10-21? Remova temperature, top_p e top_k, ou fixe a versão antiga. Passos aqui dentro.

Por CheapTokens TeamPublicado em 4 min de leitura

Card em estilo de terminal: erro 400 para temperature, top_p e top_k na API do Claude
Nesta página
  1. Como é a requisição que falha
  2. A correção: remova os três parâmetros
  3. As respostas vão mudar depois que você removê-los?
  4. Checklist rápido quando você vê o 400
  5. Um único caminho de código para Claude e APIs no estilo OpenAI

Sua requisição ao Claude funcionou ontem, você a migrou para a versão de API 2026-10-21 (o cabeçalho anthropic-version, ou uma versão do SDK feita para ela), e agora ela retorna um 400. Olhe o corpo da requisição: se ele tiver temperature, top_p ou top_k, essa é a causa. Apague esses três campos e a requisição passa.

De acordo com o guia de migração da Anthropic para a versão 2026-10-21 (https://platform.claude.com/docs/en/api/migration-2026-10-21, verificado em 24 de outubro de 2026), uma requisição de Messages ou Message Batches que envie qualquer um dos três retorna um erro 400. Isso acontece mesmo se o valor for o padrão do parâmetro. Procure pelo status 400 e por esses nomes de campo na sua requisição.

Como é a requisição que falha#

Digamos que você tenha um script pequeno que pede ao Claude para resumir um ticket e mantém a resposta estável com uma temperatura baixa:

python
import anthropic

client = anthropic.Anthropic()

reply = client.messages.create(
    model="<your Claude model>",
    max_tokens=500,
    temperature=0.2,  # <- this line now causes the 400
    messages=[{"role": "user", "content": "Summarise this ticket in two lines: ..."}],
)

A mesma história em HTTP puro. Se você define o cabeçalho de versão por conta própria, esta é a linha que te leva ao novo comportamento:

bash
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2026-10-21" \
  -H "content-type: application/json" \
  -d '{"model": "<your Claude model>", "max_tokens": 500, "top_p": 0.9,
       "messages": [{"role": "user", "content": "Hello"}]}'

A correção: remova os três parâmetros#

Apague temperature, top_p e top_k de toda requisição de Messages e Message Batches. Sem eles, o modelo faz amostragem com seus padrões (temperatura 1.0), exatamente como fazia uma requisição 2023-06-01 que os omite.

python
reply = client.messages.create(
    model="<your Claude model>",
    max_tokens=500,
    messages=[{"role": "user", "content": "Summarise this ticket in two lines: ..."}],
)
Antes e depois: a requisição com temperature retorna 400, a mesma requisição sem ela passa
A mesma requisição antes e depois de remover temperature

As versões principais mais recentes do SDK e a CLI ant (2.0.0) não têm mais esses parâmetros, então depois de atualizar você precisa removê-los do seu código. Um 400 vem de requisições que saem com anthropic-version: 2026-10-21 e ainda carregam um dos três campos. Os adaptadores .NET IChatClient seguem um caminho mais suave: agora eles ignoram ChatOptions.Temperature, TopK e TopP. Os números exatos de versão do SDK por linguagem estão nas abas de etapas de atualização do guia.

Se você chama a API sem SDK, a versão é o cabeçalho anthropic-version, e 2026-10-21 é o valor que ativa a nova regra.

As respostas vão mudar depois que você removê-los?#

Depende do modelo, e o guia é específico aqui.

  • Claude 4.7 e posteriores já aceitam apenas valores de amostragem padrão. Nada muda para você: eles faziam amostragem com os padrões antes e continuam fazendo.
  • Modelos que aceitam outros valores, como o Claude Sonnet 4.6: se você baixou temperature para obter uma saída mais consistente, esse efeito desaparece, e nenhuma outra configuração o substitui.

Se uma requisição específica realmente depende de um valor não padrão, você tem duas opções no guia: parar de enviar o parâmetro e aceitar a amostragem padrão, ou manter essa requisição em anthropic-version: 2023-06-01.

Se suas respostas precisam ser estritamente consistentes, coloque a consistência no prompt: um formato de saída fixo, um exemplo curto da resposta que você quer e uma verificação no seu código que rejeite qualquer coisa fora do formato. Dá mais trabalho do que um número, mas não depende de um botão de amostragem.

Checklist rápido quando você vê o 400#

  1. Procure no projeto por temperature, top_p, top_k, incluindo wrappers e arquivos de configuração compartilhados.
  2. Verifique os jobs em lote: a regra se aplica a cada requisição dentro de um Message Batch criado com 2026-10-21, então olhe os params de cada requisição do lote.
  3. Verifique o que mudou: versão principal do SDK, versão da CLI ou o cabeçalho anthropic-version.
  4. Remova os campos, ou fixe essa requisição em 2023-06-01 se ela precisar de um valor não padrão.
  5. Execute uma requisição antes de relançar um lote grande.

Um único caminho de código para Claude e APIs no estilo OpenAI#

Uma configuração comum: um único helper que monta a requisição e a envia para Anthropic Messages ou para um endpoint Chat Completions no estilo OpenAI. A correção mais simples é separar os parâmetros. Mantenha temperature apenas no ramo no estilo OpenAI, e não o adicione ao ramo Messages.

No formato Chat Completions a configuração é um campo normal de requisição. Na CheapTokens ela funciona pelo endereço compatível com OpenAI https://api.cheaptokens.dev/v1. Aqui está uma requisição para o DeepSeek-V4-Flash (contexto de 380K, até 32.768 tokens de saída por resposta), com o id completo do modelo da documentação da CheapTokens:

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "temperature": 0.2,
    "max_tokens": 300,
    "messages": [{"role": "user", "content": "Summarise this ticket in two lines: ..."}]
  }'

Uma requisição assim, com 1.000 tokens de entrada e 300 tokens de saída, custa $0.000045 no preço atual. O DeepSeek-V4-Flash tem um preço a qualquer hora do dia, sem horários de pico, e um saldo cobre todos os modelos. Para o mesmo caminho de código com uma janela de contexto de 390K há também o GLM-5.3-Flash (zai-org/GLM-5.3-Flash, até 8.192 tokens de saída). Os preços atuais de todos os modelos estão na página de preços.

Para ver como a configuração se comporta, leia System prompt e temperature: o que fazem e como defini-los. Para chamar Messages no formato Claude a partir do Python, veja Anthropic Python SDK com CheapTokens. O endereço base e a configuração da chave estão na documentação da CheapTokens.