Anthropic API 2026-10-21: temperature dá 400 mesmo com 1.0

Conteúdo
  1. Quais requisições retornam 400 na versão de API 2026-10-21?
  2. Como corrigir cada erro 400?
  3. O que mudou nos SDKs da Anthropic?
  4. Qual chave a requisição usa quando os dois cabeçalhos são enviados?
  5. O que se perde ao remover temperature?
  6. Como o Synthorai lida com a versão de API 2026-10-21?
  7. O que verificar antes de atualizar?
  8. Perguntas frequentes
  9. Leituras relacionadas

Uma requisição ao Claude com a versão de API 2026-10-21 retorna HTTP 400 se incluir temperature, top_p ou top_k, mesmo com o valor padrão: temperature: 1.0 falha com “temperature: Extra inputs are not permitted”. Esses parâmetros de amostragem controlam a aleatoriedade na escolha de cada próximo token pelo modelo. A versão da API é definida no cabeçalho anthropic-version, que determina como a Messages API valida e responde às requisições; o valor anterior é 2023-06-01. As versões principais dos SDKs que a Anthropic lançou em 21 de outubro (Python 2.0.0, TypeScript 1.0.0 e mais cinco) enviam a nova versão por padrão. Esses SDKs já não oferecem os parâmetros de amostragem. Por isso, o erro 400 afeta código que monta o corpo da requisição por conta própria: clientes HTTP diretos e campos extras no corpo. Testamos oito formatos de requisição nas duas versões com Claude Sonnet 4.6 e Claude Sonnet 5.5, comparamos duas versões do SDK Python e repetimos os testes pelo Synthorai.

TL;DR

  • Com 2026-10-21, temperature, top_p e top_k retornam 400 no Claude Sonnet 4.6 e no Sonnet 5.5, inclusive com temperature: 1.0.
  • A versão 2026-10-21 também rejeita blocos document em mensagens do assistente e citations em blocos de texto do usuário.
  • O SDK Python 2.x da Anthropic envia a chave em Authorization: Bearer; quando a requisição contém os dois cabeçalhos, a API usa x-api-key.
  • Pelo Synthorai, todas as 32 requisições retornaram 200 com ambos os SDKs, incluindo as 12 que a API da Anthropic rejeita com 2026-10-21.

Quais requisições retornam 400 na versão de API 2026-10-21?

Cinco mudanças causam os erros 400: os três parâmetros de amostragem, um bloco document inserido diretamente em uma mensagem do assistente e citations (referências de um bloco de texto a um trecho de documento) em um bloco de texto de uma mensagem do usuário. A tabela cobre essas mudanças em seis casos que falham, além de dois que continuam funcionando. Enviamos cada caso uma vez por modelo e versão, diretamente à API da Anthropic. 200 significa que a requisição foi aceita; 400, que foi rejeitada com invalid_request_error.

RequisiçãoSonnet 4.6, 2023-06-01Sonnet 4.6, 2026-10-21Sonnet 5.5, 2023-06-01Sonnet 5.5, 2026-10-21
Sem parâmetros de amostragem200200200200
temperature: 1.0 (padrão)200400200400
temperature: 0.2200400400400
top_p: 0.9200400400400
top_k: 40200400400400
Bloco document em uma mensagem do assistente200400200400
citations em um bloco de texto do usuário200400200400
citations em um bloco de texto do assistente200200200200

As mensagens de erro na nova versão:

RequisiçãoMensagem de erro com 2026-10-21
temperature, top_p, top_k”temperature: Extra inputs are not permitted” (o nome do parâmetro muda)
document em uma mensagem do assistente”messages: `document` blocks can’t be placed directly in `assistant` messages; send them in a `user` message. Found at: messages.1.content.0”
citations em texto do usuário”messages: text blocks in `user` messages can’t have `citations`; remove `citations` from them. Found at: messages.0.content.1”

O Claude Sonnet 5.5 já rejeitava valores de amostragem diferentes do padrão com 2023-06-01, mas com outra mensagem (“`temperature` is deprecated for this model.”), e aceitava temperature: 1.0. Com 2026-10-21, o parâmetro deixou de existir, então até o valor padrão falha. O Claude Sonnet 4.6 aceitava todos os casos na versão anterior. O guia de migração da Anthropic informa que as mesmas regras valem para a contagem de tokens e para cada requisição de um Message Batch (a Batch API, que executa várias requisições de forma assíncrona com desconto). O guia não informa uma data de encerramento para 2023-06-01.

Como corrigir cada erro 400?

Remova os três parâmetros de amostragem, mova os documentos para mensagens do usuário e retire citations dos textos enviados como usuário. Sem parâmetros de amostragem, a requisição usa os valores padrão, incluindo temperature 1.0. Esse já era o comportamento de uma requisição sem esses parâmetros em 2023-06-01. As citações nas respostas anteriores do próprio Claude e a configuração "citations": {"enabled": true} nos documentos continuam sendo aceitas.

Com o SDK Python, esta requisição funciona nas duas versões:

import anthropic

client = anthropic.Anthropic()  # 2.x sends anthropic-version: 2026-10-21

message = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=1024,
    # no temperature, top_p or top_k: the parameters no longer exist in 2.x
    messages=[{"role": "user", "content": "Summarize this memo in one sentence."}],
)
print(message.content[0].text)

Se uma requisição precisar de um valor de temperature diferente do padrão em um modelo que ainda o aceita, como o Claude Sonnet 4.6, ela precisa continuar na versão anterior. Em HTTP direto, basta definir o cabeçalho:

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "max_tokens": 256, "temperature": 0.2,
       "messages": [{"role": "user", "content": "Pick a number from 1 to 100."}]}'

O que mudou nos SDKs da Anthropic?

As versões principais dos SDKs que enviam 2026-10-21 são Python 2.0.0, TypeScript 1.0.0, Go 2.0.0, Java 3.0.0, C# 13.0.0, PHP 1.0.0 e Ruby 2.0.0. Além da versão da API, elas mudam a forma de enviar a chave e quantas credenciais um cliente pode ter. A licença também passou de MIT para Apache 2.0. Instalamos as versões 1.17.0 (a última 1.x) e 2.3.0 do SDK Python e apontamos cada uma para um servidor de eco local, que registra os cabeçalhos e o corpo de cada requisição recebida:

ComportamentoSDK Python 1.17.0SDK Python 2.3.0
anthropic-version enviada2023-06-012026-10-21
Cabeçalho que leva a chave de APIx-api-keyAuthorization: Bearer
temperature=0.2 como argumentoTypeError, requisição não enviadaTypeError, requisição não enviada
temperature via extra_body (campos extras no corpo)enviado; a API decideenviado; retorna 400 com 2026-10-21
Outra chave em extra_headers={"X-Api-Key": ...}substitui a chave do clienteas duas chaves são enviadas
api_key e auth_token (um token bearer usado no lugar da chave de API) juntosambos enviadosValueError na criação do cliente
Requisição real à API da Anthropic200200

O argumento temperature foi removido dos métodos de mensagens do SDK Python na versão 1.0.0. Por isso, usuários de Python só recebem o erro 400 do servidor ao usar extra_body (a opção do SDK que adiciona campos diretamente ao corpo da requisição) ou clientes HTTP e bibliotecas que montam o corpo por conta própria. O cabeçalho Bearer funciona nas duas versões da API: uma requisição apenas com Authorization: Bearer <key> também retornou 200 com 2023-06-01. Assim, a mudança de autenticação e a mudança de versão podem ser implantadas separadamente.

Qual chave a requisição usa quando os dois cabeçalhos são enviados?

A API da Anthropic usa x-api-key quando a requisição contém os dois cabeçalhos. Enviamos cinco combinações de cabeçalhos nas duas versões:

Cabeçalhos da requisiçãoStatus nas duas versões
Apenas x-api-key200
Apenas Authorization: Bearer200
Ambos, com a mesma chave200
x-api-key válida, chave Bearer inválida200
x-api-key inválida, chave Bearer válida401 “invalid x-api-key”

Um proxy ou gateway na frente do Claude pode identificar uma chave diferente da usada pela API. Com o SDK 2.x, código que adiciona uma segunda chave por extra_headers={"X-Api-Key": other_key} passa a enviar duas chaves: a do cliente em Authorization e a outra em x-api-key. A API da Anthropic autentica a requisição com other_key, mas um proxy que lê apenas Authorization atribui a requisição à chave do cliente. Com isso, cotas por chave, logs e limites de gastos podem ser atribuídos à chave errada. A correção indicada pelo guia no lado do cliente é enviar a segunda chave como Authorization: Bearer <other_key>. No proxy, leia os dois cabeçalhos e siga a precedência da API (x-api-key primeiro) ou rejeite requisições em que os dois cabeçalhos contenham chaves diferentes.

O que se perde ao remover temperature?

Remover temperature tem menos impacto do que uma equipe acostumada a usar temperature: 0 talvez espere. O guia de migração informa que o Claude 4.7 e os modelos posteriores já aceitam apenas os valores padrão, então nada muda para eles. Em um modelo que ainda aceita outros valores, como o Claude Sonnet 4.6, uma requisição que reduzia temperature para obter respostas mais estáveis perde esse efeito, e nenhuma outra configuração o substitui. Medimos o tamanho desse efeito: fizemos 20 requisições por configuração ao Sonnet 4.6 com 2023-06-01, cada uma com um ID de requisição aleatório acrescentado ao prompt, para que nenhuma fosse idêntica à outra.

Prompttemperature: 0Padrão (temperature: 1.0)
“Escolha um número de 1 a 100”2 respostas distintas: 47 (19 vezes), 42 (1)2 respostas distintas: 47 (17), 42 (3)
“Escreva um slogan para uma cafeteria, com no máximo oito palavras”1 resposta distinta, 20 vezes1 resposta distinta, 20 vezes

Nessas respostas curtas, as saídas do Sonnet 4.6 com a temperatura padrão ficaram tão concentradas quanto com 0. Remover temperature: 0, portanto, mudou pouco. temperature: 0 também não garantia determinismo: retornou dois números diferentes em 20 tentativas. O texto do prompt influenciou mais a saída do que a configuração: sem o ID de requisição, 42 foi a resposta mais comum (17 de 20 com temperature: 0); com o ID, foi 47. Se você precisa de saídas reproduzíveis, compare as respostas em código ou armazene-as em cache; o parâmetro de amostragem já não garantia isso antes.

Como o Synthorai lida com a versão de API 2026-10-21?

O Synthorai aceita requisições nas duas versões da API e de ambos os SDKs. Atualizar para o SDK 2.x ou enviar anthropic-version: 2026-10-21 não quebra uma requisição que já funcionava. Repetimos a matriz de 16 casos dos dois modelos pelo Synthorai com os dois valores de anthropic-version: todas as 32 requisições retornaram 200, incluindo as 12 que a API da Anthropic rejeita com 2026-10-21. Tanto o SDK Python 1.17.0 (que envia x-api-key) quanto o 2.3.0 (que envia Authorization: Bearer) funcionaram com base_url="https://synthorai.io" e a mesma chave. O envio de temperature por extra_body também funcionou.

O Synthorai adota esse comportamento por quatro motivos:

  • Um modelo, vários provedores. Um modelo Claude pode ser servido pela API da Anthropic, pelo Amazon Bedrock ou pelo Google Cloud Vertex AI, e cada provedor recebe sua própria string de versão. O Synthorai envia a versão esperada por cada provedor, então o cabeçalho anthropic-version do cliente não determina como a requisição será validada.
  • Clientes em versões diferentes durante a migração. As equipes atualizam um serviço por vez. Durante semanas, a mesma conta envia 2023-06-01 pelo SDK 1.x e 2026-10-21 pelo SDK 2.x. Aceitar ambos permite que cada serviço migre no seu ritmo, e a mesma chave funciona com o cabeçalho de autenticação de qualquer um dos SDKs.
  • Troca de modelo sem alterar o código. Código que define temperature: 0.2 para o Claude Sonnet 4.6 continua funcionando quando o nome do modelo muda para Claude Sonnet 5.5, que não aceita esse parâmetro, em vez de falhar na troca.
  • Nenhuma falha por enviar o valor padrão. temperature: 1.0 já é o valor usado pelo modelo. Rejeitá-lo faria a requisição falhar sem mudar a saída.

A contrapartida é que um 200 não significa que todos os parâmetros tiveram efeito. O Sonnet 5.5 só aceita os valores padrão de amostragem. Por isso, enviar temperature: 0.2 a ele pelo Synthorai funciona, mas não reduz a aleatoriedade. Se a sua saída depende de um valor de amostragem, compare os resultados com e sem ele nos seus próprios prompts; a medição acima encontrou pouco efeito em respostas curtas.

O que verificar antes de atualizar?

Se vocêVerifiqueAltere
Chama a API por HTTP diretoTodos os pontos que definem anthropic-versionRemova temperature, top_p, top_k antes de mudar para 2026-10-21
Usa o SDK Pythonextra_body e wrappers que adicionam parâmetros de amostragemRemova-os; não há substitutos
Precisa de temperature baixa no Claude Sonnet 4.6Se a saída realmente depende delaMantenha essa requisição em 2023-06-01 ou remova o parâmetro após medir o efeito
Reenvia documentos ou citações no históricoMensagens do assistente com blocos document e mensagens do usuário com citationsMova os documentos para mensagens do usuário; remova as citações do lado do usuário
Opera um proxy ou gatewayDe qual cabeçalho ele lê a chaveLeia tanto Authorization quanto x-api-key, com a precedência da API
Chama o Claude pelo SynthoraiSe a saída depende de um valor de amostragemNão é preciso alterar a requisição para atualizar; compare as saídas com e sem o valor de amostragem

Perguntas frequentes

Por que minha requisição ao Claude falha com “temperature: Extra inputs are not permitted”? A requisição foi enviada com anthropic-version: 2026-10-21, que já não tem o parâmetro temperature. Qualquer valor retorna 400, inclusive 1.0. As novas versões principais dos SDKs enviam essa versão por padrão. Remova o parâmetro ou fixe 2023-06-01 nas requisições que precisam de um valor diferente do padrão em um modelo que ainda o aceita.

A versão anthropic-version 2023-06-01 será descontinuada? A Anthropic não anunciou uma data de encerramento para 2023-06-01: nem o guia de migração nem as notas de versão da API de 21 de outubro informam uma data. Requisições que definem o cabeçalho explicitamente mantêm o comportamento anterior. Assim, uma requisição específica pode continuar usando temperature no Claude Sonnet 4.6.

A API da Anthropic ainda aceita o cabeçalho x-api-key? A API da Anthropic aceita tanto x-api-key quanto Authorization: Bearer nas duas versões; só os SDKs mudaram qual deles enviam. Quando os dois cabeçalhos estão presentes, a API usa x-api-key.

Leituras relacionadas

← Voltar ao blog