发送两者中的一个。Anthropic 为 Claude Haiku 4.5 记录了这一规则;开发者在 Claude Opus 4.6 和 Sonnet 4.6 上也遇到相同的 400 错误,而在 Claude Opus 4.7 及更高版本上规则进一步收紧为两个都不能发送。通常罪魁祸首是客户端或框架填充了你从未设置的参数。
错误
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "`temperature` and `top_p` cannot both be specified for this model. Please use only one."
},
"request_id": "req_..."
}原因和解决方法一览
| 原因 | 解决方法 |
|---|---|
| 你的代码或其下层框架同时发送了两者 | 只发送你真正需要的一个,并删除另一个键。 |
| 另一个是类似 top_p: 1 的“中性”默认值 | 据报告仍会以同样方式失败。删除该键,不要对其进行规范化。 |
| 较旧的 LangChain JS 或 n8n 构建版本 | 升级到 @langchain/anthropic 1.3.24 或更高版本,以及 n8n 1.114.1 或更高版本。 |
| LiteLLM 会将两者都传递下去 | 为该模型添加 additional_drop_params: ["top_p"]。 |
| 你已切换到 Claude Opus 4.7 或更高版本、Sonnet 5 或 Fable 5 | 这些模型的规则更严格:删除两者——任一参数的非默认值都会被拒绝。 |
哪些 Claude 模型会强制执行该规则(截至 2026 年 9 月)
Anthropic 的 Haiku 4.5 迁移指南:只能使用 temperature 或 top_p,不能同时使用——同时设置两者会在 Claude Haiku 4.5 上返回 400,这是从 Claude 3.x 迁移的代码中的破坏性变更(https://platform.claude.com/docs/en/models/haiku-4-5/migration-guide)。Anthropic 的 API 发布说明在 Claude Opus 4.1 于 2025 年 8 月 5 日发布时标记了相同规则,该模型后来已退役(https://platform.claude.com/docs/en/release-notes/api)。AWS 在 Bedrock 文档中针对 Claude Sonnet 4.5 和 Claude Haiku 4.5 说明了该规则(https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html)。我们没有找到 Anthropic 页面明确说明 4.6 模型的规则,但开发者报告在 Claude Opus 4.6(OpenHands issue #12846)和 Claude Sonnet 4.6(opencommit issue #566)上出现了这一确切的 400 错误。Claude Opus 4.7 及更高版本见下文:在那里,发送一个都已经太多。
发送一个——并删除另一个键
除非有特殊原因,否则保留 temperature:Anthropic 的 API 参考仅建议在高级使用场景中使用 top_p(https://platform.claude.com/docs/en/api/messages)。删除第二个键,不要将其设置为你认为中性的值——一名开发者报告称,在 Claude Sonnet 4.5 上,temperature 为 0.3、同时设置 top_p 为 1.0 仍然失败(n8n issue #18304)。
from openai import OpenAI
client = OpenAI(base_url="https://api.kunavo.com/v1", api_key="sk-kn-...")
def one_sampling_knob(params: dict) -> dict:
"""Where the rule applies, send temperature or top_p, not both. Keep temperature."""
if params.get("temperature") is not None:
params.pop("top_p", None)
return params
sampling = one_sampling_knob({"temperature": 0.3, "top_p": 0.9}) # {"temperature": 0.3}
resp = client.chat.completions.create(
model="claude-haiku-4-5",
max_tokens=512,
messages=[{"role": "user", "content": "Classify this support ticket: ..."}],
**sampling,
)
print(resp.choices[0].message.content)在添加第二个参数的客户端中修复
LangChain JS:ChatAnthropic 0.3.x 会在你设置的 top_p 旁边发送默认 temperature(issue #9258;PR #9362 于 2025 年 11 月在 0.3 分支修复),而 2026 年 3 月 17 日发布于 @langchain/anthropic 1.3.24 的 PR #10420 停止添加任何你未设置的采样键(https://github.com/langchain-ai/langchainjs/pull/10420)。n8n:Anthropic Chat Model 节点传递了 LangChain 的默认值(topP -1、temperature 0.7);已在 2025 年 10 月 2 日发布的 n8n 1.114.1 中修复(https://github.com/n8n-io/n8n/pull/20286)。LiteLLM:根据每次调用或每个模型,通过 additional_drop_params 指定要删除的参数(https://docs.litellm.ai/docs/completion/drop_params)——但其 Anthropic 直通路由除外,该报告以直通请求不会被修改为由关闭(https://github.com/BerriAI/litellm/issues/15097)。Amazon Bedrock:在 Converse 的 inferenceConfig 中设置 temperature 或 topP,或在 InvokeModel 请求体中设置 temperature 或 top_p——绝不能同时设置(https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InferenceConfiguration.html)。
model_list:
- model_name: claude-haiku-4-5
litellm_params:
model: openai/claude-haiku-4-5 # Kunavo speaks the OpenAI chat shape
api_base: https://api.kunavo.com/v1
api_key: sk-kn-...
additional_drop_params: ["top_p"] # keep temperature, never send top_p在 Claude Opus 4.7 及更高版本上,两个都不要发送
更新的模型更进一步。在 Claude Opus 4.7 及更高版本上,将 temperature、top_p 或 top_k 设置为任何非默认值都会返回 400(https://platform.claude.com/docs/en/models/opus-5-5/migration-guide);Claude Sonnet 5 也同样如此(https://platform.claude.com/docs/en/models/sonnet-5/migration-guide),并延伸到 Claude Fable 5(https://platform.claude.com/docs/en/models/fable-5/migration-guide)和 Fable 5.1(https://platform.claude.com/docs/en/models/fable-5-1/migration-guide)。错误消息发生变化——开发者会看到“`temperature` 已弃用于此模型。”——Anthropic 的 API 参考现在也将这三个参数全部标记为已弃用:对于 Claude Opus 4.6 之后发布的模型,为向后兼容,只接受 temperature 为 1.0 或 top_p 为 0.99 及以上,并且无论取何值都拒绝 top_k(https://platform.claude.com/docs/en/api/messages)。Anthropic Python SDK 在 v1.0 中从其 Messages 方法中移除了这些参数,该版本于 2026 年 8 月 20 日发布(https://platform.claude.com/docs/en/release-notes/api)。
如果你通过 Kunavo 调用
在 Anthropic 移除采样参数的七个 claude-* 模型中——claude-fable-5-1、claude-fable-5、claude-opus-5-5、claude-opus-5、claude-opus-4-8、claude-opus-4-7 和 claude-sonnet-5——Kunavo 会在请求离开网关前,从 /v1/chat/completions 和 /v1/messages 中删除 temperature、top_p 和 top_k。你不会从这七个模型收到此错误,但你发送的值不会产生任何效果:请求会像未设置这些参数一样发送到上游。对于 claude-opus-4-6、claude-sonnet-4-6 和 claude-haiku-4-5,Kunavo 不会删除任何参数:聊天转换器会将任何数字形式的 temperature、top_p 或 top_k 原样复制到 Claude 请求中,/v1/messages 也会按你发送的请求体转发,因此这里应发送两者中的一个。如果上游拒绝这对参数,其 400 响应会携带上游原始消息文本到达你这里,不会在其他通道上重试,并会以零成本记录。 另一个会被较新模型拒绝的请求参数将在 max_tokens 与 max_completion_tokens 指南.
常见问题
我应该在 Claude 中使用 temperature 还是 top_p?
使用 temperature,除非你有具体原因。Anthropic 的 API 参考仅建议在高级使用场景中使用 top_p,而在 Claude Opus 4.7 及更高版本上,两者都不能设置为非默认值。
top_p = 1 算作未设置吗?
不要指望如此。一名开发者报告称,在 Claude Sonnet 4.5 上,top_p 为 1.0、同时设置 temperature 时仍出现相同的 400 错误(n8n issue #18304)。请删除该键,而不是将其设置为看似中性的值。
为什么 n8n 或 LangChain 会在我从未设置 top_p 的情况下发送它?
两者都曾传递默认值。在 1.114.1 版本之前,n8n 的 Anthropic Chat Model 节点会发送 LangChain 的默认值(topP -1、temperature 0.7);LangChain JS 0.3.x 中的 ChatAnthropic 则会在你设置的 top_p 旁边发送默认 temperature。请升级到 n8n 1.114.1 或更高版本,以及 @langchain/anthropic 1.3.24 或更高版本。
“`temperature` 已弃用于此模型”是什么意思?
这是 Claude Opus 4.7 及更高版本、Sonnet 5、Fable 5 和 5.1 的更严格规则:这些模型会直接拒绝非默认采样值。请删除这些参数。通过 Kunavo 调用时,我们提供的这些模型会将它们删除,因此调用可以成功通过。
在 Kunavo 上,被拒绝的请求会产生费用吗?
不会。被上游拒绝的请求会按零成本记录。