API 空回复扣费是什么原因?completion_tokens=0 为什么还会扣费?
completion_tokens=0、无文本、无 tool_call、无 image),但站点仍然扣费的现象。根本原因通常是预扣费机制没有正确实现「无有效输出 = 返还预扣」的结算逻辑。通过 raw quota 对比可以精确判断是否有异常扣费。
空回复扣费的原因
- 站点使用预扣费机制,但结算时没有正确返还
- 请求失败(503/500/network error),预扣没有返还
- 请求格式不支持,返回空内容但仍扣估算费用
- 模型不支持,返回空内容但按 prompt tokens 扣费
如何判断?
对比请求前后的 raw quota。如果无有效输出但 quota 减少,则为异常扣费。
什么是空回复扣费?
空回复扣费是指请求返回了空内容,但站点仍然按估算 usage 扣费的现象。典型场景:
- API 返回
completion_tokens = 0,但余额少了 - 请求返回 HTTP 200,但 response 为空
- 请求返回 503,但预扣没有返还
- 请求格式不支持,返回空内容但按 prompt tokens 扣费
为什么页面余额看不出来?
页面余额通常只显示两位小数,无法发现 $0.0001 级别的扣费变化。
应该通过 /api/user/self 读取 raw quota(精确整数),再配合 /api/status 的 quota_per_unit 换算实际金额。
实际余额 (USD) = raw_quota / quota_per_unit 例如: raw_quota = 99819128 quota_per_unit = 500000 实际余额 = 99819128 / 500000 ≈ 199.64 USD
预扣费 + 最终结算机制
预扣费是中转站点的常见机制:
- 请求开始:预扣预估额度(如 prompt_tokens * 价格)
- 请求完成:根据实际 usage 结算,多退少补
- usage = 0 时:应全额返还预扣金额
如果站点没有正确实现「无有效输出 = 返还预扣」的结算逻辑,就会出现空回复扣费。
用户侧:如何发现空回复扣费?
- 记录请求前的 raw quota(GET
/api/user/self) - 发起测试请求(可以用无效模型触发空回复)
- 等待结算(3 秒快速结算 + 10 秒预扣结算)
- 记录请求后的 raw quota
- 对比 quota 变化:如果无有效输出但 quota 减少,则为异常扣费
- 用 API 扣费检测工具 自动完成以上步骤
站长侧:New API / One API 如何修复?
核心原则:无有效输出时,final_quota_change = 0,预扣金额应全额返还。
判断无有效输出的条件
completion_tokens = 0(无文本生成)- 无 tool_call 调用
- 无 image / audio / search 等有效产物
- HTTP 状态码为 5xx(上游错误)
结算逻辑建议
在 New API 的请求结算逻辑中增加判断:
# 请求完成后的结算逻辑(伪代码)
if (usage.completion_tokens == 0 and no_tool_calls and no_multimodal_output):
# 无有效输出,不扣最终费用
refund_precharge() # 返还预扣金额
record_consume_log(quota_change=0)
else:
# 有有效输出,按实际 usage 结算
final_charge = calculate_from_usage(usage)
refund_precharge() # 先返还预扣
deduct(final_charge) # 再扣实际费用
record_consume_log(quota_change=final_charge)
关键点:无论是否有有效输出,最终扣费都应该反映实际 usage。无有效输出时,final_quota_change = 0。
常见空回复扣费场景
| 场景 | 是否应扣费 | 修复方向 |
|---|---|---|
| completion_tokens=0,无文本 | 不应(final_change=0) | 返还预扣,不记录 consume log |
| HTTP 503,上游不可用 | 不应 | 返还预扣 |
| HTTP 500,服务端错误 | 不应 | 返还预扣,审计后补调 |
| 模型不支持,invalid model | 不应(无 usage) | 返还预扣,不扣 prompt 估算 |
| 网络超时,524 | 可能有(部分完成) | 检查 usage 是否 > 0 |
| completion_tokens > 0,有文本 | 应 | 按实际 usage 扣费 |
和 Link-AI 有什么关系?
Link-AI 是 OpenAI-compatible API gateway,面向开发者提供 Claude、GPT 等模型接入服务。
- Link-AI 按实际消耗计费,失败请求扣费会在审计后自动返还
- 如果发现异常扣费,请联系客服处理
- 如果担心扣费异常,使用 API 扣费检测工具 验证 raw quota 变化
常见问题
空回复扣费是指请求返回了空内容(completion_tokens=0、无文本、无 tool_call、无 image),但站点仍然按估算 usage 扣费的现象。
通常是因为站点使用了预扣费机制:请求开始时预扣额度,最终结算时如果 usage=0,应该返还预扣金额。如果站点没有正确实现返还逻辑,就会出现空回复扣费。
页面余额通常只显示两位小数,无法发现微小扣费。应该通过 /api/user/self 读取 raw quota(精确整数)来判断。
核心原则:无有效输出(completion_tokens=0)时,final_quota_change 应为 0,预扣金额应全额返还。在请求结算时检查 usage 是否为 0,若为 0 则不记录 consume log 并返还预扣金额。
通过 raw quota 对比:请求前读取 quota,请求后等待结算,再读取 quota。如果无有效输出但 quota 减少,则为异常扣费。
预扣费是中转站点的常见机制:请求开始时先冻结部分额度,请求完成后根据实际 usage 结算。如果最终 usage=0,应全额返还预扣金额;如果没有正确实现返还,就会出现空回复扣费。