자동화 slecs

Anthropic 잔액 부족으로 죽는 봇에 명확한 알림과 즉시 종료 추가

목차

잔액 부족으로 봇이 조용히 죽는 걸 뒤늦게 발견하고 나서 고친 작업이다.

왜 이 픽스가 필요했나

자동화 봇에서 Anthropic API를 붙여 쓸 때 흔히 겪는 문제가 있다. 크레딧이 0에 가까워지거나 완전히 소진되면 API 호출 자체가 실패하는데, 문제는 그 실패가 얼마나 "시끄럽게" 실패하느냐다.

기존 코드는 잔액 부족 에러를 일반적인 예외와 동일하게 처리하거나, 아니면 무시에 가깝게 넘어가는 구조였다. 결과적으로 봇이 에러를 삼키고 계속 루프를 돌거나, 혹은 텔레그램으로 보내는 알림 메시지가 너무 모호해서 "뭔가 잘못됐다"는 건 알겠는데 "왜 죽었는지"를 파악하려면 로그를 뒤져야 했다. 운영 자동화 봇은 대개 아무도 안 보는 백그라운드에서 돌기 때문에, 알림이 불명확하면 사실상 무의미하다.

이번 변경에서 두 가지를 동시에 잡았다.

  1. 잔액 부족 감지 시 즉시 종료(early exit): 재시도나 대기 없이 바로 프로세스를 멈추는 것이 맞다. 잔액이 없는 상태에서 재시도는 그냥 에러를 반복 생산하는 것이고, 어떤 경우엔 불필요한 API 호출 비용(혹은 실패 카운트 누적)을 더 만들 수도 있다.
  2. 텔레그램 알림 메시지 명확화: "오류가 발생했습니다" 수준이 아니라, "Anthropic 잔액이 부족해서 봇을 종료했습니다. 크레딧을 충전하세요." 수준으로 명확하게.

generate.py — 어떤 구조로 고쳤나

변경 파일은 generate.py 하나다. 이름에서 알 수 있듯 LLM 호출과 응답 생성을 담당하는 핵심 파일이다. 이 파일에서 API 에러 핸들링 로직을 건드렸다는 게 포인트인데, 대략 이런 패턴으로 수정됐을 것이다.

# Before: 일반 예외로 퉁치거나 흘려보냄
try:
    response = client.messages.create(...)
except Exception as e:
    notify_telegram(f"에러 발생: {e}")
    # 재시도 or 그냥 넘어감

# After: 잔액 부족은 별도로 잡아서 즉시 종료
try:
    response = client.messages.create(...)
except anthropic.BadRequestError as e:
    if "credit" in str(e).lower() or "balance" in str(e).lower():
        notify_telegram("⚠️ Anthropic 크레딧 부족 — 봇을 즉시 종료합니다. 충전 필요.")
        sys.exit(1)
    raise
except Exception as e:
    notify_telegram(f"예상치 못한 오류: {e}")
    raise

실제 에러 타입이나 메시지 파싱 방식은 Anthropic SDK 버전에 따라 다르지만, 핵심은 잔액 부족 케이스를 일반 예외와 분리해 처리하는 것이다. 이렇게 하면 로그나 알림을 보는 사람이 "아, 돈 문제구나" vs "아, 코드 문제구나"를 바로 구분할 수 있다.

알림 명확화가 왜 팀 관점에서 중요한가

알림 수준 예시 액션까지 걸리는 시간
모호 Error: 400 Bad Request 로그 확인 → 원인 파악 → 조치 (긴 과정)
보통 API 호출 실패 어느 API인지 알아야 조치 가능
명확 Anthropic 잔액 부족 — 충전 필요 즉시 조치 가능

자동화 봇의 알림을 설계할 때 내가 항상 팀원들한테 강조하는 게 있다. 알림을 받는 사람이 컨텍스트 없이도 다음 행동을 결정할 수 있어야 한다는 것. 특히 새벽에 봇이 죽어서 알림이 오는 상황을 생각해보면, 코드를 열어보지 않고도 "충전하러 가야겠다"는 판단이 가능해야 한다.

이건 비단 잔액 부족 케이스만의 이야기가 아니다. Rate limit, 네트워크 타임아웃, 인증 만료 — 이런 에러들도 각각 대응 방식이 다르다. 그 구분이 알림 메시지에 반영돼 있어야 운영이 된다.

회고

솔직히 이 픽스는 "있어야 했던 것"이다. 잔액 부족 케이스를 명시적으로 안 잡은 채로 봇을 배포했다는 게 조금 아쉽다. 처음 만들 때 "일단 돌아가게"에 집중하다 보면 이런 엣지 케이스들이 뒤로 밀리는데, 자동화 봇은 특히 조용히 죽는 경우가 제일 위험하다. 눈에 안 띄는 실패가 며칠씩 방치되는 일이 생긴다.

generate.py 하나만 건드린 작은 변경이지만, 운영 가시성 측면에서는 꽤 의미 있는 작업이었다.

끝.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.