Affected Page / Module
Accounts page / Codex subscription remaining days (remainingDays / 套餐剩余时间)
Use Case
账号列表里 Codex 付费套餐的「剩余 N 天」依赖订阅到期时间。希望确认维护者是否考虑把 live 订阅有效期 的数据源,从当前的 wham/usage 改为(或兼用)ChatGPT 的 /backend-api/subscriptions(字段 active_until)。
Current Pain Point
当前解析路径(accountSubscriptionPresentation / fetchCodexQuotaSummary)大致是:
- 优先 live:
api-call → GET https://chatgpt.com/backend-api/wham/usage → subscription_active_until / subscriptionActiveUntil
- 否则 fallback:解析凭证
id_token 里的 chatgpt_subscription_active_until(管理端常把 JWT 嵌套 claim https://api.openai.com/auth 拍平后返回)
- 仅当
isPaidCodex && subscriptionUntilMs > now 时渲染「N 天」;过期或不存在则空白
实际观察:
- 多张 Codex 凭证上
wham/usage 可稳定返回 401 Unauthorized,live 路径形同失效
- 列表「N 天」实际几乎全靠 JWT claim fallback
- JWT 里的
chatgpt_subscription_active_until 可能与真实订阅不同步:token 换发(iat 更新)后 claim 仍可能停留在旧周期;而同一账号对 /backend-api/subscriptions 可返回更新的 active_until
- 结果:claim 已过期、subscriptions 仍有效时,列表空白,但运维侧用 subscriptions 能看到正确到期日
Expected Solution
请维护者评估是否采用(或混合)以下方案,并给出倾向。
方案 A(现状):wham/usage + id_token claim
|
|
| 做法 |
live 用 wham/usage 的 subscription_active_until;失败则用 JWT chatgpt_subscription_active_until |
| 优点 |
已实现;与配额刷新同链路;无额外 endpoint;改动面小 |
| 缺点 |
wham/usage 在部分部署上对 Codex OAuth 常 401,live 不可用;JWT claim 可能陈旧(换 token ≠ 更新 until);过期 claim + 失败 live → 列表空白,易误判为「无套餐/已失效」;与运维侧常用的 subscriptions 真相源不一致 |
方案 B:/backend-api/subscriptions 的 active_until
|
|
| 做法 |
通过现有 api-call(或等价代理)请求 ChatGPT /backend-api/subscriptions,用响应 active_until 作为 live subscriptionUntilMs(可保留 JWT 作二次 fallback) |
| 优点 |
与真实订阅状态对齐(含 scheduled_cancellation 等);在 wham/usage 401 时仍可能拿到有效 until;减少「claim 过期但订阅仍在」导致的空白;和常见 Codex 账号池对账脚本同一数据源 |
| 缺点 |
需新增/确认 endpoint、鉴权头与错误处理;多一次上游请求(成本、限流、延迟);响应字段/语义需与现有 subscriptionActiveUntil 映射并写测试;若 OpenAI 变更路径,维护成本高于沿用现有 usage 链路;是否与配额窗口逻辑耦合需设计清楚 |
可选折中
- B 优先,A 垫底:subscriptions → wham/usage → JWT claim
- 或仅在 wham 非 2xx / 无
subscription_active_until 时再打 subscriptions
- UX:
until <= now 时显示「已过期」或绝对日期,避免空白(与数据源选择正交)
Relevant Data Dimensions
Expected Acceptance Result
维护者明确倾向其一(或折中),以便后续按社区规范向 dev 提实现 PR。若认可方案 B / 折中,希望约定:
- live until 的权威字段与优先级
- 失败时的 fallback 顺序
- 过期时列表/详情的展示语义(空白 vs「已过期」)
Priority
Medium: clearly improves usability
Additional Context
相关前端逻辑大致在:
apps/web/src/features/accounts/model/accountSubscriptionPresentation.ts(resolveCodexSubscriptionUntilMs / remainingDays)
apps/web/src/utils/quota/providerRequests.ts(fetchCodexQuotaSummary → CODEX_USAGE_URL = .../wham/usage)
apps/web/src/utils/quota/constants.ts
这是咨询向 issue,尚未实现 subscriptions 接入;先征求方案态度,避免直接改 live 源与上游意图不符。
Checklist
Affected Page / Module
Accounts page / Codex subscription remaining days (
remainingDays/ 套餐剩余时间)Use Case
账号列表里 Codex 付费套餐的「剩余 N 天」依赖订阅到期时间。希望确认维护者是否考虑把 live 订阅有效期 的数据源,从当前的
wham/usage改为(或兼用)ChatGPT 的/backend-api/subscriptions(字段active_until)。Current Pain Point
当前解析路径(
accountSubscriptionPresentation/fetchCodexQuotaSummary)大致是:api-call→GET https://chatgpt.com/backend-api/wham/usage→subscription_active_until/subscriptionActiveUntilid_token里的chatgpt_subscription_active_until(管理端常把 JWT 嵌套 claimhttps://api.openai.com/auth拍平后返回)isPaidCodex && subscriptionUntilMs > now时渲染「N 天」;过期或不存在则空白实际观察:
wham/usage可稳定返回 401 Unauthorized,live 路径形同失效chatgpt_subscription_active_until可能与真实订阅不同步:token 换发(iat更新)后 claim 仍可能停留在旧周期;而同一账号对/backend-api/subscriptions可返回更新的active_untilExpected Solution
请维护者评估是否采用(或混合)以下方案,并给出倾向。
方案 A(现状):
wham/usage+id_tokenclaimwham/usage的subscription_active_until;失败则用 JWTchatgpt_subscription_active_untilwham/usage在部分部署上对 Codex OAuth 常 401,live 不可用;JWT claim 可能陈旧(换 token ≠ 更新 until);过期 claim + 失败 live → 列表空白,易误判为「无套餐/已失效」;与运维侧常用的 subscriptions 真相源不一致方案 B:
/backend-api/subscriptions的active_untilapi-call(或等价代理)请求 ChatGPT/backend-api/subscriptions,用响应active_until作为 livesubscriptionUntilMs(可保留 JWT 作二次 fallback)scheduled_cancellation等);在wham/usage401 时仍可能拿到有效 until;减少「claim 过期但订阅仍在」导致的空白;和常见 Codex 账号池对账脚本同一数据源subscriptionActiveUntil映射并写测试;若 OpenAI 变更路径,维护成本高于沿用现有 usage 链路;是否与配额窗口逻辑耦合需设计清楚可选折中
subscription_active_until时再打 subscriptionsuntil <= now时显示「已过期」或绝对日期,避免空白(与数据源选择正交)Relevant Data Dimensions
Expected Acceptance Result
维护者明确倾向其一(或折中),以便后续按社区规范向
dev提实现 PR。若认可方案 B / 折中,希望约定:Priority
Medium: clearly improves usability
Additional Context
相关前端逻辑大致在:
apps/web/src/features/accounts/model/accountSubscriptionPresentation.ts(resolveCodexSubscriptionUntilMs/remainingDays)apps/web/src/utils/quota/providerRequests.ts(fetchCodexQuotaSummary→CODEX_USAGE_URL=.../wham/usage)apps/web/src/utils/quota/constants.ts这是咨询向 issue,尚未实现 subscriptions 接入;先征求方案态度,避免直接改 live 源与上游意图不符。
Checklist