在 codeg WebUI 中,API 代理 ccx 返回的 inputTokens 出现负值,违反 codeg项目ACP 协议对 u64 类型的约束,导致如下反序列化错误:
ACP protocol error: Parse error: {
"error": "invalid value: integer `-9195`, expected u64",
...
}
复现步骤
- 向 API 代理发送一个请求,其中大部分提示命中缓存。
- 观察响应的
usage.inputTokens 或 _meta.quota.model_usage[0].token_count.inputTokens 字段。
- 当
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 计数的场景(成本追踪、配额管理)数据失真。
在 codeg WebUI 中,API 代理
ccx返回的inputTokens出现负值,违反 codeg项目ACP 协议对u64类型的约束,导致如下反序列化错误:复现步骤
usage.inputTokens或_meta.quota.model_usage[0].token_count.inputTokens字段。cachedInputTokens大于实际未缓存的新增 token 数时,inputTokens为负。预期行为
inputTokens应等于totalTokens - cachedInputTokens - outputTokens,且为非负整数。在上述测试数据中,正确值应为789(而非-9195)。实际行为
代理返回了
-9195,该值可通过以下公式复现:即等价于
inputTokens = actualInputTokens - cachedInputTokens。由于缓存 token 通常占大头,结果恒为负数。证据
-(9984 - 789) = -9195-(10880 - 52) = -10828根因分析
代理在计算
inputTokens时,在最后一刻多减了一次cachedInputTokens:修复建议
直接返回
actual_input而非-(cachedInputTokens - actual_input):影响范围
所有使用该代理且启用了缓存功能的请求。不仅导致 WebUI 报错,还使所有需要 token 计数的场景(成本追踪、配额管理)数据失真。