언제나 그렇듯 25.04 기반입니다.
취미로 만들고 ( 라고 쓰고 Gemini-cli 에게 명령만 내리고 ) 있는 게임을 제작하기 위한 환경입니다.
좌측은 Gemini-cli와 Nvim이 자리 잡고 있습니다.
우측은 Gemini-cli가 토큰들 소모할 때를 대비해 백업으로 웹으로 접속한 Google Gemini입니다.
사실 이 둘을 섞어쓰면 결과가 좋지 않기 때문에 가급적 사용할 일이 없었으면 하지만 그래도 쓰게 되네요.
우측 가장자리가 지금 만들고 있는 게임 화면입니다.
로그라이크를 PC로 옮긴 디아블로를 다시 로그라이크로 만들겠다가 목표입니다.
저번에 불미스런 일이 있어서 인터페이스와 게임 시스템 만들다가 ( 폭주해서 토큰을 다 쓰고도 모자라 제미나이 웹에서 작업하다 꼬여버리는 바람에 ) 롤백해버려서 인터페이스가 좀 엉망이에요.
취미 생활에 음악이 빠질 수 없어서 Spotify로 음악을 계속 듣는 답니다.
천천히 완성시킬 계획이에요.
덧 : 제미나이가 토큰을 얼마나 썼는지 확인하는 앱도 하나 만들긴 했는데 어딘가 이상하게 돌아가네요.
혹시 도움을 주실 분이 계시면 감사하겠습니다.
파이선으로 만들었어요.
import os
import google.generativeai as genai
import json
from datetime import date
— 1. 설정 (필수) —
Gemini API 키를 환경 변수에서 불러옵니다.
터미널에서 ‘export GEMINI_API_KEY=“YOUR_API_KEY”’ 명령어로 설정하세요.
API_KEY = os.getenv(“GEMINI_API_KEY”)
if not API_KEY:
raise ValueError(“API 키가 설정되지 않았습니다. ‘export GEMINI_API_KEY="YOUR_API_KEY"’ 명령어를 실행하세요.”)
genai.configure(api_key=API_KEY)
사용할 Gemini 모델 설정
당신의 환경에 맞춰 ‘gemini-2.5-pro’ 또는 다른 모델명으로 변경하세요.
GEMINI_MODEL_NAME = ‘gemini-2.5-pro’
일일 API 요청 한도 (무료 플랜 기준, 100회)
DAILY_REQUEST_LIMIT = 100
일일 입력 토큰 한도 (무료 플랜 기준, 6,000,000 토큰)
DAILY_TOKEN_LIMIT = 6_000_000
경고를 시작할 요청 횟수/토큰 수 (예: 한도 도달 10회/100000토큰 전)
WARNING_REQUEST_LIMIT = 90
WARNING_TOKEN_LIMIT = 5_900_000 # 600만 토큰 중 590만 사용 시 경고
사용량 데이터를 저장할 파일
USAGE_FILE = “api_usage_log.json”
— 2. 사용량 데이터 관리 함수 —
def get_usage_data():
“”“파일에서 오늘 날짜의 사용량 데이터를 불러오거나 새로 만듭니다.”“”
if not os.path.exists(USAGE_FILE):
return {“date”: str(date.today()), “request_count”: 0, “token_count”: 0}
with open(USAGE_FILE, 'r') as f:
data = json.load(f)
# 날짜가 바뀌었으면 사용량을 초기화합니다.
if data["date"] != str(date.today()):
print("\n[알림] 새로운 날짜가 시작되어 API 사용량이 초기화되었습니다.")
return {"date": str(date.today()), "request_count": 0, "token_count": 0}
# 이전 버전 로그 파일 호환성 (token_count 필드가 없을 경우 추가)
if "token_count" not in data:
data["token_count"] = 0
if "request_count" not in data: # 기존 'count'를 'request_count'로 전환
data["request_count"] = data.get("count", 0)
del data["count"] # 이전 'count' 필드 삭제
save_usage_data(data["request_count"], data["token_count"]) # 변경사항 저장
return data
def save_usage_data(request_count, token_count):
“”“현재 사용량 데이터를 파일에 저장합니다.”“”
data = {“date”: str(date.today()), “request_count”: request_count, “token_count”: token_count}
with open(USAGE_FILE, ‘w’) as f:
json.dump(data, f)
— 3. Gemini API 호출 래퍼 함수 —
def call_gemini_api_with_quota_check(prompt):
“”"
사용량 한도를 확인하며 Gemini API를 호출하는 함수.
이 함수를 사용해 API를 호출하세요.
“”"
usage = get_usage_data()
current_request_count = usage[“request_count”]
current_token_count = usage[“token_count”]
model = genai.GenerativeModel(GEMINI_MODEL_NAME)
# --- 프롬프트 토큰 수 미리 계산 ---
try:
# API 호출 전에 프롬프트의 토큰 수를 계산합니다.
prompt_token_info = model.count_tokens(prompt)
prompt_tokens = prompt_token_info.total_tokens
except Exception as e:
print(f"[오류 발생] 프롬프트 토큰 계산 중 문제가 발생했습니다: {e}")
return None
# --- 할당량 확인 ---
# 요청 횟수 한도 초과 시
if current_request_count >= DAILY_REQUEST_LIMIT:
print("--------------------------------------------------")
print("🚨 경고: 일일 API 요청 횟수 한도(100회)를 초과했습니다.")
print("더 이상 API를 호출할 수 없습니다. 내일 다시 시도해주세요.")
print("--------------------------------------------------")
return None
# 토큰 수 한도 초과 시
if (current_token_count + prompt_tokens) >= DAILY_TOKEN_LIMIT:
print("--------------------------------------------------")
print(f"🚨 경고: 일일 입력 토큰 한도({DAILY_TOKEN_LIMIT:,} 토큰)를 초과했습니다.")
print(f"현재 토큰 사용량: {current_token_count:,} 토큰, 시도하려는 요청: {prompt_tokens:,} 토큰")
print("더 이상 API를 호출할 수 없습니다. 내일 다시 시도해주세요.")
print("--------------------------------------------------")
return None
# --- 경고 메시지 출력 ---
if current_request_count >= WARNING_REQUEST_LIMIT or current_token_count >= WARNING_TOKEN_LIMIT:
print("--------------------------------------------------")
print(f"⚠️ 경고: 현재 API 요청 횟수: {current_request_count}회 (남은 횟수: {DAILY_REQUEST_LIMIT - current_request_count}회)")
print(f"⚠️ 경고: 현재 토큰 사용량: {current_token_count:,} 토큰 (남은 토큰: {DAILY_TOKEN_LIMIT - current_token_count:,} 토큰)")
print("--------------------------------------------------")
# --- API 호출 ---
try:
response = model.generate_content(prompt)
# 호출 성공 시 사용량을 증가시키고 저장합니다.
current_request_count += 1
# 실제 사용된 출력 토큰도 함께 고려하려면 response.usage_metadata.output_token_count 등을 사용할 수 있지만,
# 무료 티어의 INPUT_TOKEN_COUNT 제약이 더 중요하므로 여기서는 입력 토큰만 추적합니다.
current_token_count += prompt_tokens # 성공 시에만 입력 토큰 추가
save_usage_data(current_request_count, current_token_count)
return response.text
except Exception as e:
print(f"[오류 발생] API 호출 중 문제가 발생했습니다: {e}")
return None
— 사용 예시 (이 스크립트를 직접 실행할 때만 작동) —
if name == “main”:
print(“API 사용량 추적 스크립트가 준비되었습니다.”)
# 현재 사용량 정보 출력
usage_info = get_usage_data()
print("\n--- 현재 누적 사용량 ---")
print(f"👉 총 요청 횟수: {usage_info['request_count']}회")
print(f"👉 총 토큰 사용량: {usage_info['token_count']:,} 토큰")
print("------------------------------------------\n")
# 첫 번째 API 호출 시도 (긴 프롬프트로 토큰 사용량 테스트)
long_prompt = "인공지능의 역사에 대해 1000단어 이상으로 자세히 설명해줘. 초기 개념부터 현재의 딥러닝, 생성형 AI까지 주요 사건과 인물, 기술 발전을 포함해줘. 각 시대별 특징을 명확히 구분하여 설명하고, 미래 전망에 대해서도 간략하게 언급해줘. 특히 머신러닝, 신경망, 빅데이터, 컴퓨팅 파워의 발전이 인공지능 발전에 어떤 영향을 미쳤는지 상세히 다뤄줘."
print("첫 번째 API 호출 시도 (토큰 테스트)...")
response1 = call_gemini_api_with_quota_check(long_prompt)
if response1:
print("\n--- 첫 번째 응답 ---")
print(response1[:200] + "...") # 너무 길면 잘라서 출력
else:
print("\n--- 첫 번째 응답 실패 ---")
# 두 번째 API 호출 시도 (짧은 프롬프트)
print("\n두 번째 API 호출 시도...")
response2 = call_gemini_api_with_quota_check("한국의 수도는 어디야?")
if response2:
print("\n--- 두 번째 응답 ---")
print(response2)
else:
print("\n--- 두 번째 응답 실패 ---")
# 오늘의 최종 사용량 확인
usage_info = get_usage_data()
print(f"\n오늘의 최종 요청 횟수: {usage_info['request_count']}회")
print(f"오늘의 최종 토큰 사용량: {usage_info['token_count']:,} 토큰")

