先把当时的情况摆出来。月初做上月成本报表,用 usage 接口按天循环拉取,结果每月最后三天数据为空,接口返回 200 但 data 是空数组,手动改日期区间又能取到。
这类报错背后常见的原因有几处,逐个排除就行。按天查询的时间边界是 UTC,本地日期错位。还有一种是接口对单次区间跨度有上限,超出被静默截断。
不容易想到的是,分页参数没带,只返回了第一页。还有一种情况,报表任务在月初零点跑,数据还没结算完。
上来先把时间区间改成 UTC 再查一次
curl -s "https://api.openai.com/v1/organization/usage/completions?start_time=1730419200&end_time=1733011200&bucket_width=1d" -H "Authorization: Bearer $OPENAI_ADMIN_KEY" | jq '.data | length'
显式带上分页参数并翻到底
curl -s "https://api.openai.com/v1/organization/usage/completions?start_time=1730419200&end_time=1733011200&limit=31&page=1" -H "Authorization: Bearer $OPENAI_ADMIN_KEY" | jq '.has_more'
然后改成按小时桶拉取再本地汇总
python usage_hourly.py --start 2024-11-01 --end 2024-11-30 --out usage.csv
剩下的就是把报表任务推迟到次日再跑
python -c "print('schedule at 09:00 next day, not 00:05')"
别只看报错消失,验证要多做一步。报表覆盖完整 30 天,每天都有数据,汇总金额与账单页一致,误差在 1% 以内。
补一句。用量接口的时间是 UTC,分页也有默认上限,做月度报表时两件事都要显式处理。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
