Anthropic API 2026-10-21: temperature dá 400 mesmo com 1.0
Conteúdo
- Quais requisições retornam 400 na versão de API 2026-10-21?
- Como corrigir cada erro 400?
- O que mudou nos SDKs da Anthropic?
- Qual chave a requisição usa quando os dois cabeçalhos são enviados?
- O que se perde ao remover temperature?
- Como o Synthorai lida com a versão de API 2026-10-21?
- O que verificar antes de atualizar?
- Perguntas frequentes
- 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_petop_kretornam 400 no Claude Sonnet 4.6 e no Sonnet 5.5, inclusive comtemperature: 1.0. - A versão
2026-10-21também rejeita blocosdocumentem mensagens do assistente ecitationsem 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 usax-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ção | Sonnet 4.6, 2023-06-01 | Sonnet 4.6, 2026-10-21 | Sonnet 5.5, 2023-06-01 | Sonnet 5.5, 2026-10-21 |
|---|---|---|---|---|
| Sem parâmetros de amostragem | 200 | 200 | 200 | 200 |
temperature: 1.0 (padrão) | 200 | 400 | 200 | 400 |
temperature: 0.2 | 200 | 400 | 400 | 400 |
top_p: 0.9 | 200 | 400 | 400 | 400 |
top_k: 40 | 200 | 400 | 400 | 400 |
Bloco document em uma mensagem do assistente | 200 | 400 | 200 | 400 |
citations em um bloco de texto do usuário | 200 | 400 | 200 | 400 |
citations em um bloco de texto do assistente | 200 | 200 | 200 | 200 |
As mensagens de erro na nova versão:
| Requisição | Mensagem 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:
| Comportamento | SDK Python 1.17.0 | SDK Python 2.3.0 |
|---|---|---|
anthropic-version enviada | 2023-06-01 | 2026-10-21 |
| Cabeçalho que leva a chave de API | x-api-key | Authorization: Bearer |
temperature=0.2 como argumento | TypeError, requisição não enviada | TypeError, requisição não enviada |
temperature via extra_body (campos extras no corpo) | enviado; a API decide | enviado; retorna 400 com 2026-10-21 |
Outra chave em extra_headers={"X-Api-Key": ...} | substitui a chave do cliente | as duas chaves são enviadas |
api_key e auth_token (um token bearer usado no lugar da chave de API) juntos | ambos enviados | ValueError na criação do cliente |
| Requisição real à API da Anthropic | 200 | 200 |
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ção | Status nas duas versões |
|---|---|
Apenas x-api-key | 200 |
Apenas Authorization: Bearer | 200 |
| Ambos, com a mesma chave | 200 |
x-api-key válida, chave Bearer inválida | 200 |
x-api-key inválida, chave Bearer válida | 401 “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.
| Prompt | temperature: 0 | Padrã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 vezes | 1 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-versiondo 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-01pelo SDK 1.x e2026-10-21pelo 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.2para 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.0já é 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ê | Verifique | Altere |
|---|---|---|
| Chama a API por HTTP direto | Todos os pontos que definem anthropic-version | Remova temperature, top_p, top_k antes de mudar para 2026-10-21 |
| Usa o SDK Python | extra_body e wrappers que adicionam parâmetros de amostragem | Remova-os; não há substitutos |
Precisa de temperature baixa no Claude Sonnet 4.6 | Se a saída realmente depende dela | Mantenha essa requisição em 2023-06-01 ou remova o parâmetro após medir o efeito |
| Reenvia documentos ou citações no histórico | Mensagens do assistente com blocos document e mensagens do usuário com citations | Mova os documentos para mensagens do usuário; remova as citações do lado do usuário |
| Opera um proxy ou gateway | De qual cabeçalho ele lê a chave | Leia tanto Authorization quanto x-api-key, com a precedência da API |
| Chama o Claude pelo Synthorai | Se a saída depende de um valor de amostragem | Nã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
- Custo do Claude Sonnet 5.5: quanto o modelo custa em comparação com o Sonnet 5
- Controles de raciocínio de LLMs: as configurações de raciocínio que os modelos Claude mais recentes aceitam
- Incidente no OpenCode: proteção de chaves de API: como limitar o que uma chave vazada pode fazer
- Limites de requisições em APIs de LLMs: como os limites por chave são contabilizados