Skip to content

CLI 会话中 quota 不刷新 — refreshUserQuota() 为空实现 #4

Description

@leeke-dev

问题

CLI 会话启动后,quota(剩余额度)不会刷新。只有在启动新会话或执行 /model 命令时才会 fetch 一次 quota。会话中发消息不会触发 quota 更新。

分析

通过分析 qodercli 二进制(v1.0.33),发现以下代码:

refreshUserQuota() 是空实现(no-op):

async refreshAvailableCredits() {}
async refreshUserQuota() { return }  // ← 应该 fetch API,但什么都没做

refreshUserQuotaIfStale() 逻辑正确,30 秒阈值:

async refreshUserQuotaIfStale(A = 30000) {
  if (Date.now() - this.lastQuotaFetchTime > A)
    return this.refreshUserQuota();  // 调了,但方法是空的
  return this.lastRetrievedQuota;
}

每次 LLM 调用后确实会触发刷新检查:

// 在 generateContent 和 loggingStreamWrapper 中:
this.config.refreshUserQuotaIfStale()
  .catch((g) => G.debug("quota refresh failed", g));

预期行为

refreshUserQuota() 应该调用 https://openapi.qoder.sh/api/v2/quota/usage API 获取最新 quota,更新 lastRetrievedQuotalastQuotaFetchTime。这样每次 LLM 调用后(间隔 ≥30s)就会自动刷新 quota。

实际行为

  • ✅ 会话启动时:fetch quota(正常,走独立代码路径)
  • ✅ 执行 /model 命令时:fetch quota(正常,附带刷新)
  • ❌ 每次 LLM 调用后:调了 refreshUserQuotaIfStale(),但 refreshUserQuota() 是 no-op,不 fetch
  • ❌ 无定时刷新机制

影响

  • 多窗口场景下,各窗口的 quota 显示不同(各会话启动时的快照)
  • 长时间运行的会话,quota 数据过时
  • 用户无法知道当前实际剩余额度

环境信息

  • qodercli v1.0.33
  • macOS (darwin, arm64)
  • Bun runtime

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions