记录一下那天晚上的排查过程。想让输出直接从 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,别把整段示例当预填充用。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189