Claude temperature、top_p、top_k 报错:Anthropic 的规则与 改好的 请求
给 Claude 传 temperature、top_p 或 top_k 时,会遇到两种不同的报错。用 anthropic 1.0.0 及以后的 Python SDK,调用在你自己的机器上就抛 TypeError,请求根本没有发出去;请求真的带上这几个参数时,Anthropic 的规则可能以 HTTP 400 拒绝它:Anthropic 说 Claude 4.7 及之后的模型只接受默认值,Claude Sonnet 5.5 的页面写明设置这三个参数中的任何一个都会返回 400 错误,而在 API 版本 2026-10-21 上,任何模型收到其中任何一个都返回 400。本页按 Anthropic 的规则(注明核对日期)讲清这两种报错,并给出在 Router One(统一 LLM API 网关,30+ 模型)上 /v1/chat/completions 与 /v1/messages 两种改好的请求。
先判断是哪种 报错
- TypeError: Messages.create() got an unexpected keyword argument 'temperature'(或 'top_p'、'top_k'):Python SDK 在你本机抛出,请求没有发出。见下面的 SDK 一节。
- HTTP 400,type 为 invalid_request_error、code 为 INVALID_REQUEST:请求已经发出并被拒绝。如果请求里带了 temperature、top_p 或 top_k,请对照下面 Anthropic 的规则。
Anthropic Python SDK 为什么报 TypeError?
从 anthropic 1.0.0(2026-08-20 发布)起,messages.create() 就没有 temperature、top_p、top_k 这三个参数了,此前的 0.125.0 还有(据 SDK 源码,2026-10-30 核对)。传其中任意一个,哪怕传的是默认值,Python 都会在构造请求之前抛 TypeError,请求不会到达 Router One,也就谈不上 400。把它们从调用里去掉,SDK 就会照常发出请求。把取值放进 extra_body 也不是办法:从 anthropic 2.0.0 起,SDK 发送的 API 版本是 2026-10-21,Anthropic 在这个版本上对三者中的任何一个都返回 400,哪怕传的是默认值,该版本的迁移指南也要求去掉它们。
import anthropic
client = anthropic.Anthropic(
base_url="https://api.router.one",
api_key="sk-your-router-one-key",
)
# anthropic 1.0.0 and later: TypeError ... unexpected keyword argument 'temperature'
# client.messages.create(model=..., temperature=0.7, ...)
# Fixed: no sampling arguments
message = client.messages.create(
model="anthropic/claude-sonnet-5.5",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
)Anthropic 对各 模型 怎么 规定?
这些规则由 Anthropic 按模型、按 API 版本规定,下表是 2026-10-30 Anthropic 页面上的写法。各页面并没有都说明默认值能不能传;三个参数都不传的请求,满足表里的每一条。
| 适用范围 | Anthropic 的规则 | 出处 |
|---|---|---|
| Claude Sonnet 5.5(anthropic/claude-sonnet-5.5) | 设置 temperature、top_p 或 top_k 会返回 400 错误 | Claude Sonnet 5.5 模型页 |
| Claude Haiku 5.5(anthropic/claude-haiku-5.5) | 不传 temperature、top_p、top_k;采样参数被列为可能返回错误的不兼容变更 | Claude Haiku 5.5 模型页、新特性页与迁移指南 |
| Claude 4.7 及之后的模型 | 在 API 版本 2023-06-01 上只接受默认值 | API 版本 2026-10-21 迁移指南 |
| API 版本 2026-10-21 上的所有模型 | 请求里带这三个参数中的任何一个都返回 400 错误,哪怕是默认值 | API 版本页;API 版本 2026-10-21 迁移指南 |
anthropic-version 版本头有 影响吗?
在 Anthropic 的 API 上有。按 Anthropic 的 API 版本页和 2026-10-21 版本迁移指南(均为 2026-10-30 核对),API 版本 2026-10-21 删除了 temperature、top_p 和 top_k:请求里带其中任何一个,在任何模型上都返回 400 错误,哪怕是默认值。Anthropic 的 Python SDK 从 anthropic 2.0.0 起发送 2026-10-21,1.x 发送的是 2023-06-01。而在 2023-06-01 上,Claude 4.7 及之后的模型同样只接受默认值,所以对当前模型来说,换回旧版本头不是办法。请去掉这三个参数:Anthropic 说,不带它们的请求按默认值采样,temperature 为 1.0。
400 长什么样?
HTTP 400,type 为 invalid_request_error,code 为 INVALID_REQUEST。/v1/chat/completions 上的错误体结构如下;/v1/messages 上同样的 type、message、code 放在 Anthropic 的错误外层结构 {"type": "error", "error": {...}} 里:
{
"error": {
"message": "...",
"type": "invalid_request_error",
"code": "INVALID_REQUEST"
}
}请求 怎么改?
- 从请求里去掉 temperature、top_p 和 top_k。Anthropic 对 Claude Haiku 5.5 的建议是改用提示词引导模型的行为。
- Python SDK:messages.create() 里不传这三个参数,也不要放进 extra_body。
- OpenAI 兼容客户端和框架:有些会自己带上 temperature 或 top_p;如果你的代码从没设置过,请检查客户端的模型设置。
- 按 Anthropic 的 API 版本 2026-10-21 迁移指南,调低 temperature 的效果没有别的设置可以替代,请用提示词约束输出。
示例:/v1/chat/completions
OpenAI 兼容格式调用 Claude Sonnet 5.5,不带 temperature、top_p、top_k:
curl https://api.router.one/v1/chat/completions \
-H "Authorization: Bearer sk-your-router-one-key" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5.5",
"messages": [{"role": "user", "content": "你好"}]
}'示例:/v1/messages
Anthropic 格式调用 Claude Haiku 5.5,不带 temperature、top_p、top_k:
curl https://api.router.one/v1/messages \
-H "x-api-key: sk-your-router-one-key" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-haiku-5.5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "你好"}]
}'常见 问题
为什么 temperature=1 在 Python SDK 里也报 TypeError?
因为从 anthropic 1.0.0 起,messages.create() 根本没有 temperature 参数,传任何值(包括 1)在 Python 看来都是多余的关键字参数。去掉它即可。
用 extra_body 能绕开 这个 报错吗?
它只是绕开本地的 TypeError、把参数照样发出去,这并不是 Anthropic 建议的做法:Anthropic 的建议是去掉这三个参数,而在 anthropic 2.0.0 及以后使用的 API 版本 2026-10-21 上,Anthropic 对其中任何一个都返回 400,哪怕是默认值。请直接去掉。
把 anthropic-version 改成 2023-06-01 能解决吗?
对当前的 Claude 模型不能。按 Anthropic 的 API 版本 2026-10-21 迁移指南(2026-10-30 核对),Claude 4.7 及之后的模型在 2023-06-01 上同样只接受默认值,Anthropic 的 Claude Sonnet 5.5 页面也写明设置这三个参数中的任何一个都会返回 400 错误。请去掉参数,而不是改版本头。
其他 Claude 模型 也有 同样的 规则吗?
按 Anthropic 的说法(2026-10-30 核对),Claude 4.7 及之后的模型只接受默认值;Claude Sonnet 5 的页面也和 Claude Sonnet 5.5 一样,写明设置 temperature、top_p 或 top_k 会返回 400 错误。三个参数都不传的请求,在每个 Claude 模型上都满足这些规则。
Claude Haiku 5.5 不用 temperature,该传 什么?
不用传任何替代参数。Anthropic 的 Claude Haiku 5.5 迁移指南说,去掉 temperature、top_p 和 top_k,改用提示词引导模型的行为(2026-10-30 核对)。