groothaha/tokensaver-api
0
TokenSaver
LLM API 비용을 자동으로 절감하는 프록시 서버. 시맨틱 캐싱, 프롬프트 압축, 스마트 라우팅을 통해 OpenAI, Anthropic, Google Gemini API 호출 비용을 줄여줍니다.
기존 코드 한 줄 수정 없이 API Base URL만 변경하면 즉시 적용됩니다.
핵심 기능
시맨틱 캐싱
동일하거나 유사한 요청을 자동으로 캐싱합니다. Redis로 정확 매칭, Qdrant 벡터 DB로 의미 기반 유사도 검색을 수행하는 2계층 구조입니다.
- 정확히 같은 프롬프트 -> Redis 해시 매칭 (즉시 응답)
- 의미적으로 비슷한 프롬프트 -> Qdrant 벡터 검색 (유사도 임계값 설정 가능)
- TTL, 유사도 임계값 등 사용자별 설정 가능
프롬프트 압축
불필요한 토큰을 제거하여 입력 비용을 줄입니다.
스마트 라우팅
요청의 복잡도를 분석하여 비용 대비 효율이 좋은 모델로 자동 라우팅합니다.
지원 모델
빠른 시작
1. 서버 실행
git clone https://github.com/groothaha/tokensaver.git
cd tokensaver
cp .env.example .env
# .env 파일에서 DATABASE_URL, REDIS_URL, JWT_SECRET, ENCRYPTION_KEY 설정
docker-compose up서버가 http://localhost:8000 에서 시작됩니다.
2. 계정 생성 및 API 키 발급
# 회원가입
curl -X POST http://localhost:8000/v1/auth/signup \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "yourpassword"}'
# 로그인 (access_token 획득)
curl -X POST http://localhost:8000/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "yourpassword"}'
# API 키 생성
curl -X POST http://localhost:8000/v1/api-keys \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"name": "my-key"}'3. LLM API 키 등록
사용하려는 LLM 프로바이더의 API 키를 등록합니다.
# OpenAI 키 등록
curl -X POST http://localhost:8000/v1/auth/llm-credentials \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"provider": "openai", "api_key": "sk-..."}'
# Anthropic 키 등록
curl -X POST http://localhost:8000/v1/auth/llm-credentials \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"provider": "anthropic", "api_key": "sk-ant-..."}'
# Google 키 등록
curl -X POST http://localhost:8000/v1/auth/llm-credentials \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"provider": "google", "api_key": "AIza..."}'4. API 호출
기존 LLM SDK에서 Base URL만 변경하면 됩니다.
# OpenAI 호환 엔드포인트
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer ts-{api_key}" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}]
}'CLI 도구 연동
자동 설정 스크립트
# 모든 CLI 도구 한번에 설정 (Claude Code + OpenAI + Gemini)
python scripts/setup_claude_code.py \
--api-key ts-{your_api_key} \
--server-url http://localhost:8000
# 특정 도구만 설정
python scripts/setup_claude_code.py --api-key ts-xxx --tools claude
python scripts/setup_claude_code.py --api-key ts-xxx --tools openai
python scripts/setup_claude_code.py --api-key ts-xxx --tools gemini
# 설정 되돌리기
python scripts/setup_claude_code.py --revertClaude Code
~/.claude/settings.json 에 아래 내용이 추가됩니다:
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:8000",
"ANTHROPIC_API_KEY": "ts-{your_api_key}"
}
}OpenAI CLI / ChatGPT
셸 환경변수가 설정됩니다:
export OPENAI_BASE_URL="http://localhost:8000/v1"
export OPENAI_API_KEY="ts-{your_api_key}"Gemini CLI
export GEMINI_API_KEY="ts-{your_api_key}"
export GOOGLE_GENAI_BASE_URL="http://localhost:8000"SDK 사용법
Python SDK
pip install tokensaverfrom tokensaver import Client
client = Client(
api_key="ts-...",
base_url="http://localhost:8000/v1",
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
cache_enabled=True,
compression_level="moderate",
routing_enabled=True,
)
print(response.choices[0].message.content)비동기 클라이언트:
from tokensaver import AsyncClient
async with AsyncClient(api_key="ts-...", base_url="http://localhost:8000/v1") as client:
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)API 엔드포인트
인증
API 키 관리
LLM 프록시
채팅
채팅 히스토리
분석/설정
헬스체크
GET /health → {"status": "ok"}최적화 설정
사용자별로 최적화 기능을 세부 조정할 수 있습니다.
curl -X PATCH http://localhost:8000/v1/settings \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"cache_enabled": true,
"cache_threshold": 0.92,
"cache_ttl_seconds": 3600,
"compression_enabled": true,
"compression_level": "moderate",
"routing_enabled": true
}'요청 처리 흐름
클라이언트 요청
│
├─ 1. 인증 (API Key 또는 JWT)
│
├─ 2. 캐시 조회
│ ├─ Redis 정확 매칭 → 캐시 히트 시 즉시 반환
│ └─ Qdrant 유사도 검색 → 임계값 초과 시 반환
│
├─ 3. 프롬프트 압축
│ └─ 설정된 레벨에 따라 토큰 수 절감
│
├─ 4. 스마트 라우팅
│ └─ 복잡도 분석 후 최적 모델 선택
│
├─ 5. LLM API 호출
│ └─ 실제 프로바이더에 요청 전달
│
├─ 6. 응답 캐싱
│ └─ Redis + Qdrant에 저장
│
└─ 7. 사용량 기록 및 응답 반환배포
Docker Compose (로컬 개발)
cp .env.example .env
# .env 수정 후
docker-compose upPostgreSQL, Redis, Qdrant, 백엔드 API, 백그라운드 워커가 함께 실행됩니다.
Railway
Railway에 연결하면 Git push 시 자동 배포됩니다. railway.json 설정이 포함되어 있으며 헬스체크(/health)와 자동 DB 마이그레이션이 구성되어 있습니다.
필요한 환경변수를 Railway 대시보드에서 설정하세요.
수동 Docker 빌드
docker build -t tokensaver .
docker run -p 8000:8000 --env-file .env tokensaver컨테이너 시작 시 Alembic 마이그레이션이 자동 실행된 후 Uvicorn 서버가 시작됩니다.
환경변수
# 앱
APP_NAME=TokenSaver
DEBUG=false
BASE_URL=https://yourdomain.com
# 데이터베이스
DATABASE_URL=postgresql+asyncpg://user:pass@host:5432/tokensaver
# Redis
REDIS_URL=redis://localhost:6379/0
# Qdrant
QDRANT_URL=http://localhost:6333
QDRANT_API_KEY= # Qdrant Cloud 사용 시
QDRANT_COLLECTION=tokensaver_cache
# 보안 (프로덕션에서 반드시 변경)
JWT_SECRET=<64자 랜덤 문자열>
JWT_EXPIRE_MINUTES=1440
ENCRYPTION_KEY=<32자 랜덤 문자열>
# CORS
CORS_ORIGINS=https://yourdomain.com
# Rate Limiting
RATE_LIMIT_PER_MINUTE=60
RATE_LIMIT_BURST=20
# 이메일 (smtp / resend / console 중 택1)
EMAIL_PROVIDER=smtp
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=587
SMTP_USER=apikey
SMTP_PASSWORD=SG.xxx
EMAIL_FROM=noreply@yourdomain.com
# 결제 - Lemon Squeezy
LEMONSQUEEZY_API_KEY=
LEMONSQUEEZY_STORE_ID=
LEMONSQUEEZY_WEBHOOK_SECRET=기술 스택
라이선스
MIT
