同类问题我见过几次,现场表现一样但根因不同,所以第一步是把范围缩小。 用 anthropic 0.34 调 claude-3-5-sonnet-20241022,返回 400 invalid_request_error,原文是 max_tokens: Field required,可是印象里这个参数以前不填也能跑。

如果同一时间还改过其他配置,建议一次只回退一项,方便确认是哪一步起的作用。

先分清是哪一类原因

  1. messages 接口从一开始就要求显式给出 max_tokens
  2. 新版 SDK 移除了隐式默认值,缺省直接报错
  3. 中间封装层做了字段白名单,把该字段过滤掉了
  4. 配置里的键名写成 maxTokens,序列化后不生效

按顺序处理

1. 显式传入输出上限后再请求

curl https://api.anthropic.com/v1/messages -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" -d '{"model":"claude-3-5-sonnet-20241022","max_tokens":1024,"messages":[{"role":"user","content":"hi"}]}'

2. 检查封装层的参数白名单是否漏了字段

grep -rn "max_tokens" ./llm_client/

3. 把该参数提到配置里统一管理

python -c "print(settings.model_dump().get('max_tokens'))"

4. 压测一次确认长输出不会中途截断

python -c "print(len(open('long_out.txt').read()))"

怎么确认已经恢复

请求返回 200,stop_reason 是 end_turn,usage.output_tokens 小于设定的上限,长文输出也能完整结束。

容易忽略的地方

max_tokens 只限制输出长度,不包含输入 token,把它设大并不会让超长输入通过校验,反过来设太小则会以 max_tokens 作为停止原因。 涉及改配置的操作,改完记得做一次完整的回归,别只看当前这个报错有没有消失。

作者 9823189