feat(pool): 新增账号配额展示并清理 Codex 旧限额字段

- 后端池子 Key 列表新增 account_quota 字段,按 provider_type 生成配额摘要(codex/kiro/antigravity)
- 前端 PoolManagement 新增“配额”列与进度条展示,桌面端与移动端同步支持
- Provider 详情页移除 Codex code_review 限额展示,仅保留周限额与 5H 限额
- 清理 codex usage parser/realtime quota 中 code_review 相关解析与比较逻辑
- 同步更新调度与配额相关测试,改为忽略无关历史字段
This commit is contained in:
AAEE86
2026-03-01 00:32:14 +08:00
parent 6a8b5e6c8e
commit d7a8a89aa7
11 changed files with 349 additions and 68 deletions

View File

@@ -25,7 +25,6 @@ _COMPARE_IGNORE_FIELDS = frozenset(
"updated_at",
"primary_reset_seconds",
"secondary_reset_seconds",
"code_review_reset_seconds",
}
)
_CACHE_TTL_SECONDS = 30.0

View File

@@ -202,12 +202,10 @@ def parse_codex_wham_usage_response(data: dict[str, Any]) -> dict[str, Any] | No
Free 账号:
- rate_limit.primary_window: 周限额
- code_review_rate_limit.primary_window: 代码审查周限额
Team/Plus/Enterprise 账号:
- rate_limit.primary_window: 5H 限额
- rate_limit.secondary_window: 周限额
- code_review_rate_limit.primary_window: 代码审查周限额
"""
if data is None:
return None
@@ -261,18 +259,6 @@ def parse_codex_wham_usage_response(data: dict[str, Any]) -> dict[str, Any] | No
target_prefix="primary",
)
# 解析 code_review_rate_limit (代码审查限额)
code_review_limit = _as_dict(data.get("code_review_rate_limit"), "code_review_rate_limit")
code_review_primary = _as_dict(
code_review_limit.get("primary_window"), "code_review_rate_limit.primary_window"
)
_write_window(
result,
source=code_review_primary,
source_field="code_review_rate_limit.primary_window",
target_prefix="code_review",
)
# 解析 credits
credits = _as_dict(data.get("credits"), "credits")
has_credits = credits.get("has_credits")
@@ -333,16 +319,6 @@ def parse_codex_usage_headers(headers: Mapping[str, Any] | None) -> dict[str, An
window_minutes_key="x-codex-secondary-window-minutes",
source_field="headers.secondary_window",
)
# 兼容未来可能出现的 code review header当前反代可缺失
code_review_primary = _read_header_window(
headers=normalized_headers,
used_percent_key="x-codex-code-review-primary-used-percent",
reset_seconds_key="x-codex-code-review-primary-reset-after-seconds",
reset_at_key="x-codex-code-review-primary-reset-at",
window_minutes_key="x-codex-code-review-primary-window-minutes",
source_field="headers.code_review.primary_window",
)
# 与 wham/usage 解析保持一致:
# - metadata.primary_* 统一表示周限额
# - metadata.secondary_* 统一表示 5H 限额
@@ -368,13 +344,6 @@ def parse_codex_usage_headers(headers: Mapping[str, Any] | None) -> dict[str, An
target_prefix="primary",
)
_write_window(
result,
source=code_review_primary,
source_field="headers.code_review.primary_window",
target_prefix="code_review",
)
# 当前窗口挤占占比(有值才记录)
primary_over_secondary_limit = _coerce_optional_float(
normalized_headers.get("x-codex-primary-over-secondary-limit-percent"),

View File

@@ -33,7 +33,7 @@ def is_key_quota_exhausted(
Requirements:
- Kiro: account-level quota. When remaining == 0, skip this key; allow again when remaining > 0.
- Codex: only consider weekly quota + 5H quota (ignore code review quota).
- Codex: only consider weekly quota + 5H quota.
If either remaining is 0%, skip this key.
- Antigravity: quota is per-model; do not disable the account.
When the requested model's quota is 0%, skip this key.