AI 도구 신기능 풀이

한도를 다 쓰고 싶어서, 리셋되면 폰으로 알려주는 걸 만들었습니다

AI 모델 구독 한도를 꽉 채워 쓰려고, 한도가 리셋되는 순간을 감지해 폰으로 알려주는 작은 도구를 만들었습니다. 만들면서 막힌 세 가지 — 오래된 맥의 AVX2, SSH에서 잠긴 Keychain, 공식 vs 비공식 토큰 갱신.


어제 새 모델 Fable이 나왔고, 오늘 아침은 어딜 봐도 그 얘기였습니다. 하루 써보니 분석과 개선을 확실히 잘해줘서, 하던 프로젝트에 바로 붙여 썼습니다. 토큰을 많이 먹길래 분석은 Fable에 맡기고, 나온 문서로 실제 작업은 평소 쓰던 모델에 넘기는 식으로요.

그러다 보니 요금제 한도가 금방 찼습니다. 이 모델을 구독으로 쓸 수 있는 게 이달 22일까지라, 남은 열흘 동안은 한도를 최대한 뽑아 쓰고 싶었습니다. 그래서 든 생각이 하나였습니다. “한도가 리셋되는 순간을 알면, 바로 다시 채워 쓸 텐데.”

컴퓨터 앞에 계속 있는 게 아니니, 폰이나 애플워치로 알림이 오면 좋겠다 싶었습니다. 그래서 작은 도구를 하나 만들었습니다. 만들면서 막힌 곳이 더 재미있어서, 그 이야기를 적습니다.

설계 전제 · 잔액 조회가 아니라 리셋 감지

만들기 전에 알아둔 게 있습니다. “남은 한도가 얼마”인지 알려주는 공식 API는 없습니다. 구독 사용량은 활성 세션 안에서만 보이고, 밖에서 조회하는 공개 엔드포인트가 없습니다.

그래서 만들 수 있는 건 “잔액 알림”이 아니라 **“리셋됐다는 신호”**뿐입니다. 사용률이 거의 찼다가 뚝 떨어지는 순간 = 리셋. 그 순간만 잡아 폰으로 쏘는 구조입니다. 원리는 단순합니다. 사용량 상태를 주기적으로 읽고, 직전보다 사용률이 확 내려가면 “풀렸다”고 판단합니다.

한 가지 더. 무작정 24시간 폴링하면 낭비라, 응답에 들어있는 다음 리셋 예정 시각(resets_at)을 읽어서 그 시각 부근에서만 집중해서 확인하게 했습니다.

막힌 것 1 · 오래된 맥에서 도구가 그냥 죽었습니다

24시간 켜두는 서버가 따로 있어서, 처음엔 거기 깔려고 했습니다. 그런데 설치 도중 Illegal instruction으로 죽었습니다.

원인은 CPU였습니다. 그 서버는 오래된 맥이라 AVX2 명령어가 없는데, 요즘 CLI 바이너리는 AVX2를 씁니다. CPU가 그 명령어 자체를 모르니 실행하다 죽는 겁니다. 설치 방법 문제가 아니라 하드웨어 벽이었습니다.

# CPU가 AVX2를 지원하는지 한 줄로 확인
sysctl -n machdep.cpu.leaf7_features | grep -o AVX2 || echo "AVX2 없음 = 최신 바이너리 실행 불가"

같은 최신 macOS가 돌아가도, CPU 세대가 한 줄을 긋습니다. 결국 AVX2가 있는 다른 서버(2018년식)로 옮겨서 해결했습니다. “왜 어떤 맥엔 최신 도구가 안 깔리지?” 싶을 때, 한 번쯤 CPU 명령어를 의심해볼 만합니다.

막힌 것 2 · SSH로는 토큰을 못 읽었습니다

macOS는 인증 토큰을 Keychain에 둡니다. 그런데 SSH로 접속한 세션에서 토큰 값을 읽으려 하면 막힙니다. User interaction is not allowed 에러가 납니다.

이유는 이렇습니다. 로그인 Keychain은 화면에 로그인된 GUI 세션에서만 풀립니다. SSH는 화면 없는 세션이라 잠긴 채로 남고, 잠긴 Keychain을 비대화식으로 열려다 거부당하는 겁니다. 실제로 같은 명령이 제 데스크톱 터미널에선 됐는데 SSH에선 안 됐습니다.

해결은 도구를 GUI 세션 안에서 돌게 하는 것이었습니다. macOS의 launchctl로 백그라운드 작업을 GUI 도메인에 띄우면, 그 프로세스는 화면 세션 컨텍스트라 Keychain이 풀려 있습니다. 토큰을 읽는 쪽도, 잠시 뒤에 나올 갱신 작업도 전부 그 안에서 돌립니다.

# SSH(비-GUI) 세션이 아니라, 화면 로그인된 GUI 도메인에 등록해야 Keychain이 열린다
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/<>.plist

결정 · 직접 갱신 vs 공식 도구에 맡기기

여기서 한 번 고민이 있었습니다. 서버에서 한참 쓰지 않으면 토큰이 만료됩니다. 그럼 누군가 갱신을 해줘야 하는데, 두 갈래가 있었습니다.

하나는 제가 직접 갱신 요청을 보내는 것. 다른 하나는 공식 CLI에 맡기는 것.

처음엔 직접 짰습니다. 그런데 같은 일을 하는, 평이 좋은 오픈소스 도구를 뜯어봤더니 그 방식을 일부러 피하고 있었습니다. 자격증명을 직접 다루는 대신, 공식 CLI를 실행해서 갱신을 맡기고 결과만 읽더군요. 비공식 엔드포인트에 토큰을 직접 보내는 설계를 의도적으로 버린 겁니다.

그게 더 안전한 패턴이라 판단해서, 저도 그렇게 바꿨습니다. 제가 만든 직접 갱신 코드는 버리고, 공식 CLI를 몇 시간마다 가볍게 한 번 실행해 토큰을 최신으로 유지하고, 제 도구는 그 결과를 읽기만 하게요. AI 도구를 자동화할 때, “공식 경로에 위임”과 “직접 역설계” 사이에서 후자가 편해 보여도, 안전은 전자 쪽이라는 걸 다시 확인했습니다.

최종 구조

정리하면 서버에 백그라운드 작업 두 개가 돕니다.

  • 갱신 작업 — 공식 CLI를 주기적으로 실행해 토큰을 최신으로 유지합니다.
  • 감지 작업 — 사용량을 읽어 리셋(사용률 급락)을 잡고, ntfy로 폰에 푸시합니다.

푸시 자체는 한 줄입니다. 리셋을 감지하면 내가 정한 토픽으로 메시지를 쏘고, 폰의 ntfy 앱이 그걸 받습니다.

# 리셋 감지 시 폰으로 푸시 (토픽 이름이 곧 주소 = 무작위로 길게)
curl -H "Title: Claude reset" -d "한도가 리셋됐어요" https://ntfy.sh/<내가-정한-토>

폰에선 ntfy 앱으로 이 토픽 하나만 구독해두면 끝입니다. 수면 모드 중에도 받으려면, 집중 모드의 허용 앱에 ntfy를 넣어두면 됩니다. 애플워치는 폰 알림을 그대로 미러링합니다.

폰에 실제로 도착한 한도 리셋 푸시 알림

실제로 이렇게 옵니다. “5시간 세션 한도가 리셋됐어요. 다시 사용 가능합니다 — 이전 90% → 현재 5%, 다음 리셋 20:49.” 한도가 풀린 걸 자리에 없어도 알게 됩니다.

도구 자체는 외부 라이브러리 없이 파이썬 기본 모듈만 씁니다. 토큰은 읽기만 하고, 어디에도 기록하거나 보내지 않습니다.

마무리

아침엔 “AI가 이렇게 빠르면 개발자로 일하기 더 어렵겠다” 싶었는데, 저녁엔 그 AI를 더 쓰려고 알림기를 만들고 있었습니다. 도망갈 게 아니라 더 부려먹는 쪽이 맞다는 생각이, 하루 만에 손으로 옮겨진 셈입니다.

이렇게 혼자서도 굴러가는 도구를 하나씩 붙여가는 과정을, 매주 뉴스레터로 정리해 보내고 있습니다. 비슷한 고민을 하신다면 뉴스레터 구독으로 같이 보셔도 좋겠습니다.

자주 묻는 질문

Claude 구독 한도가 리셋되는 시각을 알 수 있나요?

남은 한도를 조회하는 공식 API는 없지만, Claude Code가 쓰는 OAuth 사용량 엔드포인트 응답에 다음 리셋 시각(resets_at)이 들어 있습니다. 이 값을 읽으면 5시간 세션·주간 한도가 언제 리셋되는지 알 수 있습니다.

Claude 한도가 리셋되면 휴대폰으로 알림을 받을 수 있나요?

공식 푸시 알림은 없습니다. 대신 사용량을 주기적으로 확인해 리셋 순간을 감지하고, ntfy 같은 무료 푸시 서비스로 폰·애플워치에 알림을 보낼 수 있습니다. 수면 모드에서도 받으려면 집중 모드 허용 앱에 ntfy를 넣으면 됩니다.

macOS에서 SSH로 Keychain 토큰을 못 읽는 이유는 무엇인가요?

로그인 Keychain은 화면에 로그인된 GUI 세션에서만 잠금이 풀립니다. SSH는 화면 없는 세션이라 잠긴 채로 남아 권한 오류가 납니다. launchd로 작업을 GUI 도메인에 등록해 실행하면 Keychain에 접근할 수 있습니다.

Claude Code가 'Illegal instruction'으로 죽는 이유는 무엇인가요?

오래된 CPU에 AVX2 명령어가 없는데 최신 CLI 바이너리가 AVX2를 사용하기 때문입니다. 설치 방법 문제가 아니라 하드웨어 한계라, AVX2를 지원하는 더 최신 머신에서 실행해야 합니다.

Claude OAuth 토큰 갱신을 직접 구현해야 하나요?

권장하지 않습니다. refresh 토큰을 비공식 엔드포인트로 직접 보내는 대신, 공식 claude CLI를 주기적으로 실행해 토큰을 갱신하게 맡기는 편이 안전합니다. 평이 좋은 오픈소스 모니터링 도구들도 같은 방식을 씁니다.

#Claude#ntfy#macOS#자동화#서버