크레딧 계산 모델
크레딧이 어디서 들어와 어디로 나가는지, 얼마가 언제 빠지는지의 전부.
단위
| 항목 | 값 |
|---|---|
| 화면 단위 | C (크레딧) |
| 내부 저장 단위 | 센티크레딧 = 1/100 C, 정수 |
| 기본 단가 | ₩500 / 1 C (Super Admin이 변경 가능) |
| 기본 VAT | 10% |
소수점 오차를 없애려고 내부에서는 정수만 쓴다. 화면에 12.34 C로 보이는 값은 내부에서
1234다. 부동소수점 계산을 하지 않으므로 반올림으로 돈이 새지 않는다.
계정 구조
크레딧은 계정에 담긴다. 두 종류뿐이다.
조직 계정 (org)
├─ 미할당 풀 ← 여기서 팀으로 나간다
└─ 팀 계정 (team) × N ← 여기서 실제로 쓴다
항상 성립하는 등식
조직 총 크레딧 = 미할당 풀 + Σ(팀 잔여)
이 등식은 팀 생성·예산 변경·팀 삭제·조직 제거 어느 경우에도 깨지지 않는다. 크레딧이 이동할 때 양쪽에 쌍으로 기록되기 때문이다.
잔액의 세 값
계정마다 세 값이 있다.
| 값 | 뜻 |
|---|---|
balance | 총 잔액 |
held | 선점된 금액. 실행 중인 세션이 잡아둔 것 |
| 가용 | balance − held. 지금 새로 쓸 수 있는 금액 |
화면의 잔여는 가용이다. 실행 중인 인스턴스가 있으면 그만큼 이미 잡혀 있다.
데이터베이스가 지키는 제약
CHECK (balance >= 0 AND held >= 0 AND held <= balance)
애플리케이션이 계산을 틀려도 데이터베이스가 거부한다. 잔액이 음수가 될 수 없는 마지막 방어선이다.
원장은 추가만 된다
모든 크레딧 변동은 기록으로 남고 수정·삭제되지 않는다. 잘못된 기록은 지우는 게 아니라 반대 기록을 더한다.
| 기록 유형 | 방향 | 언제 |
|---|---|---|
purchase | 조직 + | Super Admin이 크레딧을 판매할 때 |
allocate_out | 조직 − | 팀에 예산을 줄 때 |
allocate_in | 팀 + | 위와 쌍 |
reclaim_out | 팀 − | 팀 삭제·조직 제거로 회수할 때 |
reclaim_in | 조직 + | 위와 쌍 |
hold | 선점 + | 인스턴스를 시작할 때 |
hold_extend | 선점 + | 실행이 길어져 선점을 연장할 때 |
capture | 잔액 −, 선점 − | 실사용을 확정할 때 |
release | 선점 − | 안 쓴 선점을 놓을 때 |
usage_reservation | 팀 − | 예약 승인 시 선불 확정 차감 |
serverless_purchase | 팀 − | 서버리스 키 발급·증액 |
serverless_refund | 팀 + | 키 폐기·감액 환원 |
adjust | ± | 운영자 수동 조정. 사유 필수 |
멱등키 모든 기록에 유일한 키가 붙는다. 같은 요청이 두 번 도착해도 두 번 기록되지 않는다. 네트워크가 끊겨 재시도해도 이중 차감이 없다.
세 가지 과금 방식
Voltra에는 돈이 빠지는 방식이 세 가지 있다. 언제 빠지는지가 각각 다르다.
1. 즉시 실행 — 쓴 만큼
시작 ──▶ hold(선점) ──▶ running ──▶ 1분마다 재계산 ──▶ 중지 ──▶ capture(확정) + release(반환)
계산식
차감액 = 시간당 단가 × (중지 요청 시각 − running 진입 시각)
- 1분 주기로 재계산되고 초 단위로 누적된다.
running전까지는 무과금이다. 기동 준비 구간(provisioning·pending)은 청구되지 않는다.- 중지를 누른 시각까지만 과금된다. 실제 정지 전이가 느려도 그 구간은 무료다.
- 선점은 시작 클릭 시점에 걸린다. 선점과 과금은 별개다.
- 실행이 길어지면 선점을 자동으로 연장한다. 남은 선점이 30분 아래로 내려가면 60분씩 더 잡는다.
- 시작 시점의 단가가 그 세션 내내 유지된다. 중간에 단가표가 바뀌어도 영향이 없다.
선점하는 이유 실행 중인 인스턴스의 예상 비용을 미리 잡아두지 않으면, 그 사이에 다른 데 크레딧을 다 써버려 정산할 돈이 없어진다.
2. 서버급 예약 — 선불 확정
신청 ──▶ (차감 없음) ──▶ 승인 ──▶ usage_reservation 전액 차감 ──▶ 끝
계산식
차감액 = 시간당 단가 × 노드 수 × 예약 시간
- 승인 순간 전액이 빠진다.
- 안 써도 환불이 없다. 취소도 없다.
- 조정안을 수락한 경우 조정된 조건 기준으로 계산된다.
선불인 이유 Capacity Block은 플랫폼이 AWS에 미리 값을 치르고 확보하는 자원이다. 팀이 안 써도 비용은 이미 나갔다.
3. 서버리스 — 발급 시 선불
키 발급 ──▶ serverless_purchase 예산 전액 차감 ──▶ 호출 (원장 무변동) ──▶ 폐기 ──▶ serverless_refund
- 발급하는 순간 예산만큼 팀 크레딧에서 빠진다.
- 호출할 때마다 키의
used만 올라간다. 원장은 건드리지 않는다. - 폐기하면
예산 − 사용액이 돌아온다. - 증액은 추가 차감, 감액은 차액 환원이다.
환원 상한 구매액 − 기환원액을 넘을 수 없다. 감액을 반복해도 넣은 것보다 많이 돌려받지
못한다. 크레딧이 생성되는 경로가 없다.
호출마다 차감하지 않는 이유 LLM 호출은 초당 수십 건이 올 수 있다. 그때마다 원장에 쓰면 원장이 병목이 되고, 여러 요청이 같은 잔액을 보고 동시에 통과하는 문제가 생긴다. 지갑을 미리 사두고 그 안에서 쓰는 구조가 더 안전하고 빠르다.
잔여 대비 알림
| 지점 | 무슨 일 |
|---|---|
| 30% 남음 | 팀·Org Admin에 경고 알림 |
| 10% 남음 | 한 번 더 |
| 0 | 팀 잠금. 실행 중 인스턴스 전부 중지, 새 실행·예약·서버리스 차단 |
- 임계값은 팀마다 바꿀 수 있다. 기본은 30%·10%다.
- 같은 임계값으로 중복 알림이 오지 않는다. 한 번 울린 임계값은 기록된다.
- 예산을 증액하면 그 기록이 초기화되어 다시 울릴 수 있게 된다.
리포트와 잔액이 다를 수 없는 이유
사용량 리포트는 원장을 그대로 투영한 것이다. 별도로 집계하지 않는다. 그래서 화면 합계, CSV 합계, 실제 차감액이 항상 같다.
검증용 체크리스트
크레딧 회계가 맞는지 확인하려면 이것들을 본다.
| 확인 | 방법 |
|---|---|
| 조직 등식 | 미할당 풀 + Σ팀 잔여 = 조직 총액 |
| 팀 등식 | 잔여 = balance − held |
| 리포트 일치 | 사용량 리포트 합계 = CSV 합계 |
| 즉시 실행 과금 | 차감액 ≈ 실행 분 × 단가 ÷ 60 |
| 예약 과금 | 차감액 = 단가 × 대수 × 시간 |
| 서버리스 | 팀 차감 = 키 예산. 호출로 팀 잔여가 변하지 않는다 |
| 음수 방지 | 어떤 경로로도 잔액이 0 아래로 못 간다 |
관련 상태 전이 · 사용량 리포트 · 시나리오 A·B·C·D