报错是这么冒出来的。写存储清理脚本时按文件列表一次性拉全量,跑完发现只处理了 100 个文件,账户里实际有两千多个,返回体里的 has_more 一直是 true。

中间走过弯路,把「边删边翻会让游标失效,后面的数据被跳过」当成主因,改完现象没变。

把日志和配置对完,能解释这个现象的基本就这几处。列表接口默认条数很小,最大也才 100,不传 limit 就按默认返回。还有一种是翻页要用 after 带上最后一条 id,用 page 参数是无效的。

少数情况下是不同 purpose 的文件要分别拉取,一次只能按一个用途过滤。

带 limit 拉第一页并看游标字段

curl -s "https://api.openai.com/v1/files?limit=100" -H "Authorization: Bearer $OPENAI_API_KEY" | jq -r '.has_more,.data[-1].id'

然后用最后一条 id 作为 after 拉下一页

curl -s "https://api.openai.com/v1/files?limit=100&after=file-abc" -H "Authorization: Bearer $OPENAI_API_KEY" | jq '.data|length'

接着把 id 全部落盘再统一删除

for f in $(cat ids.txt); do curl -X DELETE https://api.openai.com/v1/files/$f -H "Authorization: Bearer $OPENAI_API_KEY"; done

剩下的就是核对落盘的 id 数与本地统计是否一致

wc -l ids.txt

怎么算真的好了,看的是同一批现象。最后一页 has_more 为 false,ids.txt 行数与控制台显示的文件总数一致,脚本第二遍运行时已无新 id 可拉。

删除会改变分页结果,收集和删除必须分两遍做,一边翻页一边删是最隐蔽的漏数据方式。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189