Skip to content

inputTokens 在缓存命中时为负数,导致 ACP 协议 u64 解析失败 #274

Description

@thirsty5034

在 codeg WebUI 中,API 代理 ccx 返回的 inputTokens 出现负值,违反 codeg项目ACP 协议对 u64 类型的约束,导致如下反序列化错误:

ACP protocol error: Parse error: {
  "error": "invalid value: integer `-9195`, expected u64",
  ...
}

复现步骤

  1. 向 API 代理发送一个请求,其中大部分提示命中缓存。
  2. 观察响应的 usage.inputTokens_meta.quota.model_usage[0].token_count.inputTokens 字段。
  3. cachedInputTokens 大于实际未缓存的新增 token 数时,inputTokens 为负。

预期行为

inputTokens 应等于 totalTokens - cachedInputTokens - outputTokens,且为非负整数。在上述测试数据中,正确值应为 789(而非 -9195)。

实际行为

代理返回了 -9195,该值可通过以下公式复现:

inputTokens = -(cachedInputTokens - actualInputTokens)

即等价于 inputTokens = actualInputTokens - cachedInputTokens。由于缓存 token 通常占大头,结果恒为负数。

证据

totalTokens cachedInputTokens outputTokens 正确 inputTokens 错误返回值 差异来源
10927 9984 154 789 -9195 -(9984 - 789) = -9195
10988 10880 56 52 -10828 -(10880 - 52) = -10828

根因分析

代理在计算 inputTokens 时,在最后一刻多减了一次 cachedInputTokens

# 实际逻辑可能接近:
actual_input = totalTokens - cachedInputTokens - outputTokens  # 正确
inputTokens = -(cachedInputTokens - actual_input)              # 错误
# 等价于:
inputTokens = actual_input - cachedInputTokens                 # 恒为负

修复建议

直接返回 actual_input 而非 -(cachedInputTokens - actual_input)

inputTokens = totalTokens - cachedInputTokens - outputTokens

影响范围

所有使用该代理且启用了缓存功能的请求。不仅导致 WebUI 报错,还使所有需要 token 计数的场景(成本追踪、配额管理)数据失真。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions