把 max_tokens 设成 8192 想让它一次写完长文,claude-3-haiku-20240307 直接返回 400,原文 max_tokens: 8192 > 4096,the maximum allowed for this model。
真正麻烦的地方在于,几个原因的现象几乎一样。haiku 这一代模型的输出上限本来就是 4096,与输入窗口无关;参数从别的模型配置里复制过来,没按模型改;网关做了参数合并,用户传的值被覆盖成更大的默认值;SDK 里 max_tokens 属于必填项,省略时取了一个偏大的常量。
动手时先按模型查一次可用参数,别靠记忆
curl -sS https://api.anthropic.com/v1/models -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" | jq -r '.data[] | [.id,.max_tokens] | @tsv'
再往下把上限换成小值做冒烟
curl -sS https://api.anthropic.com/v1/messages -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" -d '{"model":"claude-3-haiku-20240307","max_tokens":4096,"messages":[{"role":"user","content":"写一段百字介绍"}]}'
长文改成续写而不是一次拉满
python -c "print('split into 3 calls, each max_tokens=2048')"
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
改完先别撤,确认这几项。4096 以内任意取值都返回 200,返回体 stop_reason 为 end_turn,日志里不再出现 max_tokens 上限报错。
容易忽略的是,输出上限和上下文窗口是两个数字,换模型时只改 model 不改 max_tokens,是最常见的 400 来源。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
