Skip to content

fix(grok): 兼容账单接口缺省 creditUsagePercent 时正常解析配额周期与重置时间 - #64

Open
Frost2026 wants to merge 1 commit into
V1ki:mainfrom
Frost2026:fix/grok-usage-period-fallback
Open

fix(grok): 兼容账单接口缺省 creditUsagePercent 时正常解析配额周期与重置时间#64
Frost2026 wants to merge 1 commit into
V1ki:mainfrom
Frost2026:fix/grok-usage-period-fallback

Conversation

@Frost2026

Copy link
Copy Markdown
Contributor

背景与问题

目前在 fetchGrokUsagesrc/providers/grok.ts:355)中,解析周限额窗口强依赖于 creditUsagePercent 字段必须为有效的数字类型:

if (typeof config.creditUsagePercent === 'number' && Number.isFinite(config.creditUsagePercent)) {
  ...
}

但在真实的 xAI 线上账单接口(https://cli-chat-proxy.grok.com/v1/billing?format=credits)中,对于未产生扣费消耗、当周刚重置或部分新订阅账号,xAI 返回的 payload 中:

  • 能够正常返回 currentPeriod: { type: "USAGE_PERIOD_TYPE_WEEKLY", end: "..." }
  • creditUsagePercent 字段可能为 nullundefined 或被直接省略。

由于上述严苛校验,代码会直接跳过提取,导致解析出的配额窗口 windows空数组 []。在 DSH 前端界面上表现为完全看不到 Grok 的用量额度、无法显示当周用量进度条与重置倒计时。

解决方案

  1. 放宽判断条件:只要存在 config.currentPeriod(包含重置周期信息)或 creditUsagePercent 为有效数字,即判定为有效配额窗口;
  2. 缺省保底处理:当 creditUsagePercent 未提供时,usedPercent 保底默认为 0,并正常提取 resetsAt(周期重置时间戳)。

验证

  • test/usage.spec.ts 中补充了针对性单元测试:
    • 测试用例:fetchGrokUsage extracts reset window when creditUsagePercent is absent but currentPeriod is present
    • 验证当 payload 仅有 currentPeriod 时,能够正确提取出配额窗口(kind: "weekly"usedPercent: 0,正确计算 resetsAt);
  • 全量测试通过:pnpm test(370/370 pass);
  • 打包构建通过:pnpm buildtsc && tsdown 零报错)。

@V1ki

V1ki commented Sep 5, 2026

Copy link
Copy Markdown
Owner

感谢修复。百分比缺失时仍保留配额周期和重置时间,这个目标合理;不过当前实现会跳过原有的旧字段用量计算,需要调整后再合并。

我已复现以下情况:

{
  "config": {
    "currentPeriod": {
      "type": "USAGE_PERIOD_TYPE_WEEKLY",
      "end": "2026-09-10T12:00:00Z"
    },
    "monthlyLimit": { "val": 100 },
    "used": { "val": 100 }
  }
}

creditUsagePercent 缺失,但旧字段可计算出 100%。修改前返回 100%;本 PR 因为 currentPeriod 存在进入第一个分支,直接返回 0%,绕过旧字段回退。这不只影响显示,账号池也使用该百分比判断额度可用性。

建议将“用量”和“周期”分开解析:

  1. creditUsagePercent 为有效数字时优先使用,包括明确的 0
  2. 百分比缺失时,优先从有效的 used.val / monthlyLimit.val 计算用量,保留旧格式兼容。
  3. 最后才处理只有 currentPeriod 的情况。请补充脱敏响应或协议依据,确认百分比省略/为 null 的具体语义;只有能确认对应响应格式中缺省值代表零,才按 0% 展示,不能把所有无效值都当作零。若无法确认,应保留周期并表达“用量未知”,避免账号池把它当作明确的零用量。

周期信息优先使用 currentPeriod,重置时间缺失或不可解析时回退到 billingPeriodEnd,不应因为用量来自旧字段就丢掉可用的新周期。

至少请补充以下回归测试:

  • 百分比缺失、旧字段算出 100%、新周期存在:保留 100% 和新周期。
  • 新百分比明确为 0%、旧字段非零:使用明确的 0%。
  • 只有周期、没有可计算用量:按已确认的协议处理,并覆盖字段省略与 null。

最小修复可以先把“仅周期兜底”放到旧字段计算之后,消除已复现的回归,再确认缺省零值语义。现有测试通过,但没有覆盖上述新旧字段同时出现的情况。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants