记录一下那天晚上的排查过程。想让输出直接从 JSON 的 { 开始,把 assistant 预填充写成 “{ ” 加个空格方便排版,结果返回 400,提示 prefill must not end with trailing whitespace。
刚开始盯着「预填充与 max_tokens 太小时,输出可能被立即截断」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。预填充内容末尾不能有空白字符。还有一种是预填充为空字符串同样不合法。
少数情况下是把长段示例塞进预填充,等同于伪造历史。
去掉尾部空白后重发
python -c "s=open('prefill.txt').read().rstrip();open('prefill.txt','w').write(s);print(repr(s[-3:]))"
预填充只留一个起始括号
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-5-sonnet-20241022","max_tokens":256,"messages":[{"role":"user","content":"输出一个含 name 字段的 JSON"},{"role":"assistant","content":"{"}]}'
拼回预填充后再解析
python -c "import json;print(json.loads('{'+open('out.txt').read()))"
命令输出我都留了记录,免得改完记不清原来的值。
改完先别撤,确认这几项。返回 200 且内容能被补上预填充后解析成合法 JSON,末尾空白检查不再触发。
容易忽略的是,预填充很适合强制输出格式,但它算在上下文里也占 token,别把整段示例当预填充用。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
