用 Responses 接口做多轮问答,第一轮为了不留数据把 store 设成 false,第二轮带上 previous_response_id 接着问,接口直接报错,原文是 Previous response with id 'resp_01JXXX' not found。把 store 去掉整条链路就能接上,可合规要求响应不落库。

一开始怀疑是「两轮之间换了 key,读不到上一轮的上下文」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。不落库的响应没有可查询记录,链在第二轮就断了。也可能是previous_response_id 只在同组织同项目内有效。

还有一种情况,响应被手动删除后 id 仍然留在客户端缓存里。

先确认这条响应到底有没有落库

curl -s https://api.openai.com/v1/responses/resp_01JXXX -H "Authorization: Bearer $OPENAI_API_KEY"

随后把 store 打开跑通链路,确认不是参数拼错

curl https://api.openai.com/v1/responses -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-4.1-mini","store":true,"input":"第一轮问题"}'

不落库时改为在客户端拼完整的 input 数组

python build_input.py --history history.json --append '第二轮问题'

每轮只保留必要条数,控制 input 体积

python trim_history.py --max-turns 6 --in history.json

别只看报错消失,验证要多做一步。第二轮请求返回 200,output 能接着上一轮结论回答,而在服务端响应列表里查不到任何存留记录。

容易忽略的是,无状态模式把上下文责任推回客户端,历史裁剪和顺序校验都得自己写,别指望服务端兜底。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189