报错是这么冒出来的。在火山方舟用 doubao-pro-32k 做多轮客服,历史里有一条工具调用消息 content 为空字符串,请求回 400,原文是 InvalidParameter.ContentEmpty,把那条消息删掉就能通,但删了模型就忘了上一轮查过什么。
中间走过弯路,把「消息裁剪把 content 删了 只剩 role」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。工具调用轮次的 assistant 消息 content 允许为空 但网关校验更严。还有一种是前端把空字符串写进了数据库 读出来原样发送。
另外,多模态分支传了空数组 被序列化成空串。
先把会话历史里的空 content 找出来
python -c "import json;[print(i,m['role']) for i,m in enumerate(json.load(open('hist.json'))['messages']) if not m.get('content')]"
然后用 curl 单独复现 确认是不是空串导致
curl https://ark.cn-beijing.volces.com/api/v3/chat/completions -H "Authorization: Bearer $ARK_API_KEY" -H "Content-Type: application/json" -d '{"model":"doubao-pro-32k","messages":[{"role":"assistant","content":""},{"role":"user","content":"继续"}]}'
给空 content 补一个占位说明再发送
python fix_hist.py --fill '(工具调用)' --in hist.json --out hist_fix.json
末了在写库前做一次校验 拦掉空内容
python -c "import json;h=json.load(open('hist_fix.json'));print(all(m.get('content') for m in h['messages']))"
恢复的判定其实很直接。同一段历史补齐后返回 200,模型能引用上一轮的订单号,日志里不再出现 ContentEmpty。
占位文本会被模型当成真实内容,尽量写清是工具调用占位,否则下一轮回答可能把这句话复述给用户。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
