Skip to content

0011. Claude 사용량을 OAuth 사용량 API로도 가져온다

This content is not available in your language yet.

Belloga는 Claude 사용량을 Claude Code의 statusLine 훅으로 받기만 했다. statusLine은 Claude 세션이 돌 때, 그것도 일부 틱에만 rate_limits를 실어 보내므로 앱이 원할 때 새로 가져올 방법이 없었다. 또 Fable 주간 사용량은 statusLine에 들어오지 않는다.

상태 바에 Orca와 같은 갱신 단추와 Fable 주간 사용량을 두려면 사용량을 앱이 직접 가져올 경로가 필요하다.

Claude Code가 저장해 둔 OAuth 토큰으로 https://api.anthropic.com/api/oauth/usage를 불러 5시간, 주간, Fable 주간 사용량을 얻는다. 요청 헤더와 주기는 Orca와 같다.

  • 토큰은 macOS에서는 키체인의 Claude Code-credentials 항목에서, 없거나 다른 OS면 ~/.claude/.credentials.json에서 읽는다.
  • 렌더러의 상태 바가 마운트될 때 한 번, 그 뒤 15분마다, 그리고 갱신 단추를 누를 때 가져온다. 요청은 10초가 지나면 끊는다.
  • statusLine 값과 API 값은 같은 사용량 상태에 합치고, 창마다 나중에 들어온 값이 이긴다.
  • 토큰이 없거나 요청이 실패하면 로그 한 줄만 남기고 이전 값을 둔다.
  • 토큰은 메인 프로세스 밖으로 나가지 않는다. 렌더러, 로그, 저장 파일 어디에도 남기지 않는다.
  • statusLine만 쓴다. 사용자의 인증 정보를 읽지 않아도 된다. 그러나 갱신 단추가 할 일이 없고, Fable 주간 값을 얻을 수 없다.
  • Claude CLI의 /usage 화면을 PTY로 읽는다(Orca의 대체 경로). 토큰을 직접 읽지 않는다. 그러나 CLI를 한 번 띄우는 비용이 크고, 화면 글을 해석하므로 CLI가 바뀌면 깨지기 쉽다.
  • 채택안: Orca의 기본 경로와 같은 OAuth API를 쓴다. Orca의 PTY 대체 경로와 토큰 갱신(repairClaudeCredentialsThenRetryOAuth)은 가져오지 않는다. API가 실패하면 statusLine 값만 남는다.
  • 앱이 사용자의 Claude 인증 정보를 읽는다. macOS에서는 처음 읽을 때 키체인 접근을 허락할지 묻는 창이 뜰 수 있다. Orca도 같은 방식이다.
  • API 키로 Claude Code를 쓰는 사용자는 토큰이 없어서 지금처럼 statusLine 값만 본다.
  • 토큰이 만료되면 Claude Code가 다시 갱신할 때까지 API 요청이 실패하고, 그동안은 statusLine 값만 들어온다.
  • 공개되지 않은 API라 응답 모양이 바뀔 수 있다. 해석은 mapOAuthUsage 한 곳에 모아 두었다.