这个坑值得记一笔。用 claude-3-7-sonnet-20250219 开 extended thinking,thinking 里 budget_tokens 设了 8000,max_tokens 还留着 4096,接口立刻返回 400,说 budget_tokens 必须小于 max_tokens。
刚开始盯着「老版本模型不支持 thinking 字段,传了直接报未知参数」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。思考 token 也算在 max_tokens 总额里,两者是包含关系;budget 下限有硬门槛,小于 1024 同样会被拒;开了思考后 temperature 只能留默认值,改了会冲突。
上来先把 max_tokens 抬到 budget 之上再试
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-7-sonnet-20250219","max_tokens":16000,"thinking":{"type":"enabled","budget_tokens":8000},"messages":[{"role":"user","content":"证明根号2是无理数"}]}'
接着确认模型 id 支持思考能力
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'
剩下的就是读取返回里的思考块,确认真的生效
python -c "import json;d=json.load(open('r.json'));print([b['type'] for b in d['content']])"
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
改完先别撤,确认这几项。返回 200 且 content 里先出现 thinking 块再出现 text 块,usage 里能看到思考消耗的 token 数。
思考预算不是额外赠送的额度,它从 max_tokens 里扣,预算调大之后留给正文的空间会同步变小。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
