AI Quota Ring
Claude Code·Codex·Antigravity의 5시간/주간 사용량 한도를 Windows 작업표시줄에 원형 게이지로 띄워 주는 Python 위젯
| NO. | M-02 |
|---|---|
| FIELD | — |
| SCALE | 미니 |
| TOOLS | Python · Win32 |
| DATE | 2026 |
| REPO | khw1566/AI-quota-ring |
왜 만들었나
AI 코딩 도구를 세 개(Claude Code, Codex, Antigravity) 번갈아 쓰다 보니, 작업 도중에 한도가 바닥나 흐름이 끊기는 일이 잦았다. 남은 양을 확인하려면 도구마다 다른 화면을 열어야 했고, 5시간 한도와 주간 한도가 따로 돌아가서 머릿속으로 계산하기도 번거로웠다.
계기판처럼 한눈에 보이면 좋겠다 는 생각으로, 작업표시줄 한쪽에 세 도구의 잔량을 작은 원으로 띄워 두는 위젯을 만들었다.
무엇을 만들었나
- 작업표시줄 바: 도구별 주간 잔량을 원형 게이지로, 리셋까지 남은 시간을 숫자로 표시
- 잔량 50% 이상 초록, 20% 이상 주황, 그 미만 빨강
- Antigravity는 모델 그룹이 둘이라 바깥 원(Gemini)과 안쪽 원(Claude·GPT)을 겹친 이중 원
- 상세 패널: 바 위에 마우스를 0.7초 올리면 도구별 5시간·주간 막대와 리셋 시각이 펼쳐짐, 클릭하면 고정
- 트레이 옆 자동 배치, 드래그 이동, 우클릭 메뉴(새로고침·위치 초기화·종료)
install.ps1한 번으로 시작 프로그램 등록
어떻게 만들었나
구조는 데이터를 모으는 collector.py 와 그리는 widget.py 두 파일로 나눴다. collector는 도구마다 다른 응답을 {label, remaining %, resets_at} 한 가지 형식으로 정규화하고, widget은 그 형식만 알면 된다.
| 도구 | 1차 경로 | 실패 시 대체 경로 |
|---|---|---|
| Claude Code | 로그인 파일의 OAuth 토큰으로 사용량 조회 (만료 시 자동 갱신) | 마지막으로 받은 값 |
| Codex | 로그인 파일의 토큰으로 사용량 조회 | 최근 세션 로그(jsonl)의 rate_limits 기록 |
| Antigravity | 실행 중인 로컬 언어 서버에 직접 요청 | IDE를 최소화로 잠깐 띄워 조회(30분에 1회) → 앱의 SQLite 캐시를 protobuf 디코더로 읽기 |
신경 쓴 부분:
- 어느 경로가 실패해도 화면은 비지 않게 했다. 단계별로 다음 방법을 시도하고, 전부 실패하면 이전 값을 경고 문구와 함께 보여 준다.
- Antigravity 언어 서버는 포트와 CSRF 토큰이 매번 바뀐다. 프로세스 명령줄에서 토큰을,
netstat에서 그 PID가 연 포트를 찾아 연결했다. - 앱 캐시는 protobuf 바이너리라 라이브러리 없이 varint·필드 파서를 직접 짰다.
- 네트워크 조회는 별도 스레드에서 돌리고 결과만 Tk 메인 루프로 넘겨 화면이 멈추지 않게 했다.
- 작업표시줄 위에 항상 떠 있도록 Win32 API(SetWindowPos, 창 소유자 지정)를 ctypes로 호출하고, 고해상도(DPI) 배율에 맞춰 크기를 계산했다.
- 토큰은 실행 시점에 각 도구의 로그인 파일에서만 읽고, 저장소나 위젯 캐시에는 남기지 않는다.
결과
- 2분마다 자동 갱신되는 작업표시줄 위젯으로 매일 사용 중
- 한도가 얼마 남았는지 창을 바꾸지 않고 확인할 수 있게 되어, 무거운 작업을 언제 돌릴지 미리 정할 수 있게 됨
- 공개 API가 아닌 경로라 언제든 막힐 수 있음 → 그래서 대체 경로를 여러 겹 둔 것이 이 프로젝트의 핵심