DAY 03작업 3일째
요금제를 올리자 주간 한도가 85%로 남았다
같은 창 안에서는 사용량이 줄지 않는다는 가정이 요금제 변경에서 깨져서, 가장 최근에 측정한 값을 고르게 바꿨다.
실제로는 2%인데 85%로 나왔다
주중에 요금제를 올렸더니 실제 주간 사용량은 2%인데 위젯은 85%라고 띄웠다. 리셋까지 남은 시간도 "34:36 후 리셋"이라고 나와서, 하루 넘게 남았는데 시간인지 분인지 한눈에 읽히지 않았다.
높은 값을 고르는 규칙이 문제였다
사용량 한도는 세션마다 따로 받는다. 각 세션은 마지막으로 받은 모델 응답에 실려 온 한도 값을 들고 있고, 위젯은 여러 세션의 값 가운데 하나를 골라 계정 사용량으로 보여 준다. 고르는 규칙은 이랬다.
| 상황 | 고른 값 |
|---|---|
| 리셋 시각이 다르다 | 더 나중 창의 값 |
| 같은 창이다 | 퍼센트가 더 높은 값 |
같은 창 안에서 사용량은 늘기만 한다고 봤다. 쉬고 있는 세션은 예전 값을 들고 있으니, 높은 값이 곧 최신 값이라고 생각했다. 그런데 요금제를 올리면 한도가 커지면서 같은 창 안에서 퍼센트가 85%에서 2%로 내려간다. 요금제를 올리기 전에 열어 둔 세션들이 85%를 들고 있었고, 규칙대로 그 값이 이겼다.
세션 파일이 갱신된 시각으로 고를 수도 없었다. 쉬고 있는 세션도 살아 있다는 표시로 30초마다 파일을 다시 쓰기 때문에, 파일 시각만 보면 모두 최신처럼 보인다.
값을 받은 시각을 같이 내보낸다
플러그인이 한도 값을 언제 모델 응답에서 받았는지(limitsAt)를 따로 기록해 세션 파일에 같이 쓰게 했다. 엔진이 응답 뒤에 사용량을 알려 주는 session.measure 훅에서 한도 값이 실려 왔을 때, 그리고 작업 중에 5초마다 사용량을 다시 읽을 때 이 시각을 갱신한다.
on('session.measure', async ($, e, next) => {
if (e.rateLimits.length > 0) limitsAt = await $.clock.now()
// ...
})
위젯은 같은 창이면 퍼센트 대신 이 시각을 비교한다. 시각이 없는 옛 세션 파일끼리만 예전처럼 높은 값을 고른다.
- if ($isLater -or ($isSame -and $m.pct -gt $have.pct)) { $best[$m.short] = $m }
+ $isNewer = if ($at -gt 0 -or $haveAt -gt 0) { $at -gt $haveAt } else { $m.pct -gt $have.pct }
+ if ($isLater -or ($isSame -and $isNewer)) { $best[$m.short] = $m; $bestAt[$m.short] = $at }
리셋 표시는 하루가 넘게 남으면 "1일 10시간 후 리셋"처럼 날짜와 시간으로 쓰게 했다. 하루 안쪽은 원래대로 "5:23 후 리셋"이다.

감수한 것
한도 값은 결국 각 세션이 받은 마지막 응답에 달려 있다. 앱을 다시 켠 직후처럼 어느 세션도 아직 응답을 받지 않았으면 측정 시각이 없어서, 그 사이에는 예전처럼 높은 값이 나올 수 있다. 세션 하나가 응답을 받는 순간 바로 맞춰진다.