先把当时的情况摆出来。发现批次数据选错后立刻调了 cancel,状态从 cancelling 走到 cancelled,账单里仍有三十多美元,原以为取消就等于这次不收费。

真正麻烦的地方在于,几个原因的现象几乎一样。取消只停止后续请求,已经完成的照常按折扣计费。还有一种是cancelling 是中间状态,正在执行的请求会跑完。

另外,输入 token 在请求被受理时就算用量,与是否完成无关。少数情况下是取消后依然会有部分结果文件,不能当成整批失败。

提交取消并立刻看返回状态

curl -X POST https://api.openai.com/v1/batches/batch_abc/cancel -H "Authorization: Bearer $OPENAI_API_KEY" | jq '.status'

轮询到终态再取请求计数

curl -s https://api.openai.com/v1/batches/batch_abc -H "Authorization: Bearer $OPENAI_API_KEY" | jq '.status,.request_counts'

再往下把已完成的结果文件下载下来

curl -s https://api.openai.com/v1/files/$OUT/content -H "Authorization: Bearer $OPENAI_API_KEY" -o part.jsonl

剩下的就是核对当天用量与已处理条数

curl -s "https://api.openai.com/v1/organization/usage/completions?start_time=$(date -d '-1 day' +%s)" -H "Authorization: Bearer $ADMIN_KEY" | jq '.data[0].results'

怎么算真的好了,看的是同一批现象。状态停在 cancelled 且 request_counts 不再增长,已完成的条数与输出文件行数一致,用量记录里的 token 只覆盖这部分。

取消越晚越贵,发现数据选错时先取消再排查,别等整批跑完才动手,计费已经按完成量落定。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189