AI API 中转站为什么会空回复扣费?如何判断扣费是否透明

💰 扣费透明 2026-05-21 阅读约 8 分钟

🤖 AI 摘要

AI API 中转站的计费通常采用"预扣费 + 最终结算"模式,但很多中转站不透明的地方在于:失败请求、空回复、503/524 错误时,预扣费没有返还。页面余额显示的是经过处理的数字,raw quota 才是真实消耗数据。结合 quota 前后差值与后台消费记录,可以辅助判断扣费是否需要进一步核查。对于站长侧,无有效输出时应将 final_quota 设为 0 并返还预扣费。

什么是预扣费 + 最终结算

大多数 AI API 中转站(包括 New API / One API 架构)采用两阶段计费:

  1. 预扣费阶段:发起请求时,根据预估 token 数扣除费用
  2. 最终结算阶段:请求完成后,根据实际 token 消耗多退少补

问题出在第二步:如果请求失败或没有有效输出,预扣费可能不会返还。

为什么页面余额看不出小额扣费

页面余额经过了两层处理:

如果大量小额失败请求累积(比如每笔 0.001 元),余额页面可能只显示"掉了 10 元",但用户不知道这 10 元是由 10000 笔失败请求组成的。

⚠️ 关键问题

很多中转站的"余额掉了"不等于"实际消耗了"。失败请求的预扣费没有返还,这是很多用户没有察觉到的隐形损失。

raw quota 为什么更准确

raw quota 是请求前后 quota 的实际差值,代表真实 token 消耗。通过 /api/user/self 接口可以获取:

对比这两个值,可以判断:

失败请求是否应该扣费

失败类型 理想处理 实际常见情况 用户应该怎么做
401 认证失败 完全不扣费 不扣费 检查 Key 配置
403 权限不足 完全不扣费 可能预扣不返还 检查模型授权
503 上游不可用 完全不扣费 可能预扣不返还 等待恢复,检测 raw quota
524 Cloudflare 超时 按实际消耗结算 可能全部预扣不返还 缩短单次任务/降低超时概率,并结合 raw quota + 消费记录判断
空回复(completion_tokens=0) 完全不扣费 可能预扣不返还 检测 raw quota

常见场景怎么查

场景 用户看到什么 重点看什么 建议动作
tool_call message 可见 用户看到 tool_call / function_call / arguments 客户端是否支持工具调用、是否有 completion_tokens、是否有可用输出、是否返回 usage 先查 /tool-call-message-api-error/,再结合后台消费记录核验
client_gone 请求中途断开或客户端停止等待 stream 状态、completion_tokens、是否有部分输出、后台是否有 usage 保留时间和消费记录(含 request_id),如无可用输出但疑似扣费可联系客服核查
empty response 没有正常文本输出 completion_tokens 是否为 0、content 是否为空、后台是否有 usage / raw quota 变化 回到 raw quota + 消费记录综合判断(必要时截图留存)
model not found 模型名或权限不匹配 模型名、Base URL、是否为 OpenAI-compatible /v1 模式、模型权限 参考 /model-not-found-api-error/ 并检查 API Gateway 说明:/openai-compatible-api-gateway/
no available channel 模型路由没有可用渠道 模型权限、渠道状态、上游状态 参考 /no-available-channel/,必要时按 Claude API 渠道选择排查:/claude-api-channel-cost/
503 / 524 长请求或上游超时 任务长度、客户端超时、是否存在部分输出、usage/raw quota 变化、消费记录 参考 /claude-code-524-503-timeout/;必要时结合渠道选择说明:/claude-api-channel-cost/

空回复是否应该扣费

completion_tokens=0 的空回复需要分情况判断:

503 / 524 是否应该扣费

💡 判断方法

可以对比请求前后的 quota 差值:发起一个会触发 503/524 的请求(故意传错误参数),然后查看 quota 变化。如果 quota 或 raw quota 有变化,结合 request_id、usage、completion_tokens、stream 状态、tool_call / 图片 / 音频 / 搜索等其他计费项,以及后台消费记录综合判断。

Claude Code 524 / 503 超时会不会扣费?

超时不等于一定扣费,也不等于一定没扣费。判断时要看请求是否到达上游、是否产生 usage/raw quota、是否有 completion_tokens,以及中转站是否记录了错误明细。

Claude Code 的 524/503 超时场景有特殊性:

什么情况下不应该扣费

什么情况下可能扣了费

💡 用户反馈"超时但扣费"时,请准备以下信息

  • request_id(最重要)
  • 请求时间(精确到分钟)
  • 模型名和版本
  • API Key 后四位或 token 名称
  • 客户端名称,例如 Claude Code / Codex / Cursor
  • 是否为 stream 请求
  • 是否有 completion_tokens
  • 是否有 raw quota / usage log

建议配合以下页面进行排查:

如何辅助核查扣费记录

可以结合以下方式辅助判断扣费是否需要进一步排查:

  1. 对比请求前后的 quota 差值,参考 /api/user/self 返回的 quotaraw_quota
  2. 检查 request_id、usage、stream 状态和 completion_tokens
  3. 确认是否有 tool_call、图片、音频或搜索等其他计费项
  4. 结合后台消费记录和结算明细综合判断

你也可以使用 AI API Doctor 辅助检查 Base URL、API Key、模型权限和常见错误,结合后台 usage、raw quota 与消费记录进行辅助核查。

# 获取用户 quota 信息
curl https://api1.link-ai.cc/api/user/self \
  -H "Authorization: Bearer 你的APIKey"

# 响应中的 quota 相关字段
{
  "quota": 998.50,        # 页面显示余额
  "raw_quota": 999.00,    # 原始 quota
  "quota_per_unit": 0.01  # 每单位价格
}

站长侧建议:无有效输出时的处理

如果你是中转站的运营者,建议采用以下扣费逻辑:

if (final_output_tokens == 0) {
  // 无有效输出,final_quota = 0,返还预扣费
  refund_precharge()
} else {
  // 有有效输出,按实际消耗结算
  final_quota = actual_tokens * price_per_token
}

这不仅是对用户的公平,也是建立长期信任的基础。

如何辅助核查 Link-AI 的扣费记录

结合 quota 差值、usage、raw quota 与消费记录综合判断,必要时使用 AI API Doctor 辅助检查

API 中转站常见错误码对照表

错误文本 含义 用户看到什么 重点看什么 建议动作
401 invalid_api_key API Key 无效 提示 Key 错误,请求被拦截 Key 是否复制完整、是否带空格、Key 与 Base URL 是否属于同一平台 重新复制 Key、确认 Base URL 匹配
403 permission denied 权限不足 Key 可能有效,但没有该模型权限 模型是否已启用、账号/分组是否有权限访问 检查 Link-AI 控制台模型授权与用户分组
404 model not found 模型名不存在 找不到对应模型 Base URL 路径、模型名拼写、/v1 格式是否匹配 核对后台模型列表与 Base URL
429 rate limit 请求过多 被限速,请求被拒绝 并发或频率是否过高、账户额度是否不足 降低并发、稍后重试
503 Service Unavailable 上游不可用 服务暂时不可用,或 no available channel 渠道状态、上游可用性、模型权限 等待后重试,参考 Claude Code 524 / 503 排查
524 Gateway Timeout 网关超时 长时间没有返回,或空回复 任务长度、Cloudflare 120 秒限制、是否切到 api2 缩短任务或切换 api2 通道
tool_call message 工具调用内容直接显示 用户看到 tool_call / function_call / arguments 原文 客户端是否支持工具调用、是否有 completion_tokens 与 usage 先查 tool_call message 排查,再结合扣费记录判断
client_gone 客户端提前断开 请求中途断开,没拿到完整输出 stream 状态、completion_tokens、是否有部分输出 保留时间和消费记录(含 request_id),联系客服核查
empty response 空回复 没有正常文本输出,但可能已扣费 completion_tokens 是否为 0、usage / raw quota 是否有变化 回到 raw quota + 消费记录综合判断

更多错误码和排查口径,参考 OpenAI-compatible API Gatewayno available channel 排查

FAQ

什么是预扣费?
预扣费是指中转站在发起请求时预先扣除费用,最终结算时根据实际消耗多退少补。如果请求失败或无有效输出,理论上应该返还预扣费。
为什么页面余额看不出小额扣费?
大多数后台显示的是预扣后余额,不是 raw quota(真实消耗)。大量小额失败请求累积起来可能造成显著浪费,但余额页面不易察觉。
raw quota 为什么比页面余额更准确?
raw quota 是请求前后 quota 的实际差值,反映真实 token 消耗。页面余额经过预扣和结算两层处理,可能掩盖异常扣费。
失败请求是否应该扣费?
如果失败是由服务端错误(503/524/空回复)导致的,理论上不应该让用户承担预扣费。中转站应该有自己的容错和返还机制。
503/524 错误是否应该扣费?
503 表示上游不可用,不是用户请求的问题,理论上不应扣费。524 表示 Cloudflare 超时,如果上游实际处理了请求,需要看具体情况。
如何辅助核查 Link-AI 的扣费记录?
可以结合 AI API Doctor 辅助检查 Base URL、API Key、模型权限和常见错误,并结合后台 usage、raw quota 和消费记录进行辅助核查。最终判断仍应以后台记录与实际请求结果为准。
Claude Code 524 一定不会扣费吗?
不一定。超时不等于一定扣费,也不等于一定没扣费。要看请求是否到达上游、是否产生 usage/raw quota、是否有 completion_tokens,以及中转站最终结算逻辑。524 更常见于代理层超时而非上游处理失败,所以需要结合 request_id 和 raw quota 综合判断。
Claude Code 503 一定是上游坏了吗?
不一定。503 可能来自上游渠道不可用、模型权限未开通、账户余额不足、路由失败或临时服务异常。需要结合 request_id 和错误透传信息排查,不能直接归因于上游故障。
用户反馈扣费异常时,应该提供哪些信息?
反馈扣费异常时,请提供以下信息以便排查:1)request_id(最重要);2)请求时间(精确到分钟);3)模型名和版本;4)客户端名称(Claude Code / Codex / Cursor / NextChat);5)API Key 后四位或 token 名称;6)是否为 stream 请求;7)是否有 completion_tokens;8)是否有 raw quota / usage log;9)是否有 tool_call、图片、音频或搜索产物;10)复现步骤或 curl 示例。相关页面:API 中转站安全检查清单|Claude Code 524 / 503 排查
tool_call message 显示出来一定会扣费吗?
不一定。要结合 usage、completion_tokens、是否有可用输出(文本 / tool_call / 图片 / 音频等)和后台消费记录综合判断。tool_call 可见更多是客户端或协议兼容问题,但扣费判断仍应以后台记录为准。
client_gone 没拿到完整输出怎么办?
client_gone 通常表示客户端提前断开或停止等待。建议记录时间、模型、客户端、错误截图和消费记录(最好包含 request_id)。如果没有获得可用输出但疑似产生扣费,可以联系客服核查。
completion_tokens=0 就代表不会扣费吗?
不一定。不能只看单个字段。需要结合 prompt_tokens、是否返回 usage、stream 状态、是否有 tool_call 或其他计费项,以及后台消费记录综合判断。