# Claude temperature、top_p、top_k 报错：Anthropic 的规则与改好的请求

> https://router.one/zh/claude-sampling-parameters-400 的 Markdown 镜像，供 AI 助手与爬虫使用。Router One 是 OpenAI 兼容的统一 LLM API 网关。
> 最后更新：2026-10-30

给 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，哪怕传的是默认值，该版本的迁移指南也要求去掉它们。

`app.py`

```python
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": {...}} 里：

`response.json`

```json
{
  "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：

`terminal.sh`

```bash
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：

`terminal.sh`

```bash
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 核对）。

## 相关页面

- LLM API 错误码：https://router.one/zh/llm-api-error-codes
- Claude Sonnet 5.5 API 指南：https://router.one/zh/blog/claude-sonnet-5-5-api-guide
- Claude Haiku 5.5 API 指南：https://router.one/zh/blog/claude-haiku-5-5-api-guide
- Claude Opus 5.5 迁移指南：https://router.one/zh/blog/claude-opus-5-5-migration-guide
- API 文档：https://router.one/zh/docs
- 本页规范地址：https://router.one/zh/claude-sampling-parameters-400
- 模型与每模型 token 价格：https://router.one/zh/models （markdown：https://router.one/zh/models.md ）
- 定价：https://router.one/zh/pricing
- API 文档（markdown）：https://router.one/zh/docs.md
- 公司事实（markdown）：https://router.one/zh/facts/company.md
