Skip to content

[Bug] Codex Auth: primary_window가 월간(≈30d)인데 UI/API가 주간(Week)으로 표시됨 #315

Closed

Description

@jhste102lab

요약

Codex Auth 계정 풀에서 일부 Team 계정은 WHAM primary_window.limit_window_seconds=2628000(약 30.4일)인데, OpenCodex가 이를 무조건 weeklyPercent/Week로 매핑합니다.
결과적으로 월간 한도 계정이 대시보드와 /api/codex-auth/accounts에서 주간 한도로 잘못 표시됩니다.

환경

  • OpenCodex: 2.7.33 (@bitkyc08/opencodex)
  • OS: WSL2 / Linux
  • Dashboard: http://localhost:10100/#codex-auth
  • OpenAI account mode: Pool mode

재현 결과 (실측)

같은 Team plan이라도 limit_window_seconds가 계정별로 다릅니다.
(계정 alias / email / account id는 마스킹)

account plan limit_window_seconds reset (local) 실제 의미 UI/API 표시
monthly-1 team 2628000 (~30.4d) 2026-08-22 03:20 KST 월간 Week / weeklyPercent
monthly-2 team 2628000 (~30.4d) 2026-08-22 21:22 KST 월간 Week / weeklyPercent
weekly-1 team 604800 (7d) 2026-07-29 10:06 KST 주간 Week / weeklyPercent
weekly-2 team 604800 (7d) 2026-07-29 11:10 KST 주간 Week / weeklyPercent

chatgpt.com/backend-api/wham/usage 원본(민감정보 제외):

{
  "account": "monthly-1",
  "plan_type": "team",
  "primary_window": {
    "used_percent": 6,
    "reset_at": 1787336442,
    "limit_window_seconds": 2628000,
    "reset_after_seconds": 2549330
  },
  "secondary_window": null,
  "tertiary_window": null
}
{
  "account": "monthly-2",
  "plan_type": "team",
  "primary_window": {
    "used_percent": 39,
    "reset_at": 1787401330,
    "limit_window_seconds": 2628000,
    "reset_after_seconds": 2614217
  },
  "secondary_window": null,
  "tertiary_window": null
}

반면 OpenCodex /api/codex-auth/accounts?refresh=1 응답은 위 계정들을 모두 주간으로 내립니다:

{
  "account": "monthly-1",
  "quota": {
    "weeklyPercent": 6,
    "weeklyResetAt": 1787336442,
    "resetCredits": 0
  }
}
{
  "account": "monthly-2",
  "quota": {
    "weeklyPercent": 38,
    "weeklyResetAt": 1787401330,
    "resetCredits": 0
  }
}

대시보드 Codex Auth UI도 두 월간 계정 모두 Week로 표시합니다.

원인 추정

src/codex/quota.ts의 parseUsageQuota()가 primary_window를 항상 weekly로 취급합니다.

// primary_window was the 5h window; it now carries weekly data for GPT plans.
// secondary_window is the legacy weekly source; prefer primary when present.
const weeklyPercent = primaryPercent ?? secondaryPercent;
const monthlyPercent = normalizeUsagePercent(data.rate_limit.tertiary_window?.used_percent);

또한 WhamUsageResponse 타입에 limit_window_seconds가 없어, 실제 윈도우 길이로 주간/월간을 구분하지 않습니다.
월간은 tertiary_window만 본다고 가정하지만, 위 Team 계정은 primary_window만 있고 그 값이 월간입니다.

영향

  1. Codex Auth UI에서 월간 한도가 Week로 오표시됨
  2. /api/codex-auth/accounts가 monthlyPercent 대신 weeklyPercent만 반환
  3. 계정 로테이션/usage score가 잘못된 window를 기준으로 동작할 수 있음

기대 동작

  • limit_window_seconds ≈ 604800 → weekly (weeklyPercent / Week)
  • limit_window_seconds ≈ 2628000(또는 30d 근처) → monthly (monthlyPercent / 30d/Month)
  • 가능하면 window 길이(또는 명시 필드)로 판별하고, plan_type만으로 하드코딩하지 않기

제안 수정

  1. WHAM window 타입에 limit_window_seconds 반영
  2. parseUsageQuota()에서 window 길이로 weekly/monthly 분류
  3. Codex Auth UI는 monthlyPercent가 있으면 30d/Month로 표시
  4. 회귀 테스트: weekly(7d) primary / monthly(≈30d) primary / tertiary monthly 케이스

참고

  • 재현 시점: 2026-07-23
  • 동일 증상 open/closed 이슈는 검색 시 확인되지 않음

Activity

  1. Ingwannu commented on Jul 23, 2026

    @Ingwannu
    Owner

    재현 확인했습니다. 최신 dev에서도 primary_window.limit_window_seconds=2628000인 Team 응답이 실제로 weeklyPercent로 파싱됩니다.

    다음 방식으로 수정하겠습니다.

    • WHAM window 타입에 limit_window_seconds를 반영합니다.
    • 명시된 window 길이가 28일 이상이면 월간으로 분류하고, 7일 window 및 길이 정보가 없는 기존 응답은 현재 주간 fallback 동작을 유지합니다. 특정 plan 이름에는 의존하지 않겠습니다.
    • primary_window가 월간이면 monthlyPercent/monthlyResetAt으로 내리고, 함께 존재하는 secondary_window는 주간 fallback으로 보존합니다. 기존 tertiary_window 월간 처리도 유지합니다.
    • 7일 primary, 약 30일 primary, 월간 primary + 주간 secondary, 기존 tertiary, 길이 누락 호환성에 대한 회귀 테스트를 추가하겠습니다.

    수정 후 전체 테스트와 타입/프라이버시 검사를 통과시킨 뒤 dev PR 및 완료 결과를 다시 남기겠습니다.

  2. Ingwannu commented on Jul 23, 2026

    @Ingwannu
    Owner

    수정 완료 후 dev에 병합했습니다: #317 (merge commit은 PR 병합 상태에 기록됨).

    반영 내용:

    • WHAM window 타입에 limit_window_seconds를 유지합니다.
    • 명시된 primary window가 28일 이상이면 monthlyPercent / monthlyResetAt으로 분류합니다.
    • primary가 월간인 경우에도 함께 온 secondary 주간 window는 보존합니다.
    • 기간이 없는 기존 primary 응답과 7일 primary는 기존처럼 주간으로 처리하며, 기존 tertiary 월간 경로도 유지합니다.
    • 영문/한국어 대시보드 문서와 7일·약 30일·혼합·기간 누락 회귀 테스트를 추가했습니다.

    검증: 전체 3,624개 테스트 통과(실패 0), typecheck·privacy scan 및 Linux/macOS/Windows CI 전체 통과했습니다. 완료 처리합니다.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions