콘텐츠로 이동

예산·사용자 비용·토큰 정책 UX 점검

참고: AWS 사내 LLM Gateway 샘플. 2026-10-13에 본문과 실제 예산·대시보드 이미지를 확인했다.

기존 화면에는 예산 폼과 팀 사용량이 있었지만, 요청한 세 작업이 충분히 쉽게 이어지지는 않았다. 사용자 비용 API는 화면에 없었고, 일일 예산 입력과 일간·월간 토큰 총량 설정도 빠져 있었다. 아래 흐름으로 보완한다.

작업 기존 상태 현재 흐름
팀·키 예산 월간만 입력, 기간이 모호한 label mayu에서 일일·월간 USD를 구분하여 입력·조회·편집
개인 예산 계정 참조와 정책 이름을 직접 알아야 함 CP 사용자 행의 Set budget → 계정 선택 완료 → 금액·기간 → 검토·게시
사용자당 비용 API만 있고 화면에 없음 Users & costs에서 비용·토큰·모델 상세; 개요에 사용자 수·평균 비용
일일 팀 토큰 숫자 입력은 있지만 소수를 parseInt로 자름 mayu 팀 폼에서 일일 토큰을 정수로 검증하여 저장
월간/일간 사용자 토큰 전체 JSON 편집 필요 사용자 행의 Token limit → 기간·총량 → shared 프로파일 확인 → 검토·게시
TPM/RPM 의미와 총량의 차이를 알아야 함 분당 처리량과 달력 기준 총량을 별도 label·정책 카드로 표시
모델 대체 한 임계점만 가이드로 작성 두 임계점 작성 및 원래 요청 모델 → 단계별 대상의 시각적 표시

예산 설정

mayu /admin/ui/의 키·팀 폼은 Daily budget과 Monthly budget을 구분한다. USD를 최대 소수점 6자리까지 입력하고 정수 microUSD로 변환한다. 빈칸·0은 해당 범위에 추가 한도를 두지 않는 값이며, 다른 더 엄격한 한도는 계속 적용된다. 기존 팀의 일일 예산을 불러오고 월간 한도와 함께 보존한다.

CP /ui/에서는 Users & costs → Set budget으로 개인 예산을 설정한다. 이름은 자동 생성하므로 기술적인 정책 이름을 먼저 작성할 필요가 없다. 선언된 계정 연결이 있으면 정확한 account_ref를 채운다. 연결이 없는 managed 보고 ID는 감사·보고용 digest일 수 있으므로 재무 계정을 추측하지 않는다. 승인된 키 조회의 account_ref를 명시적으로 선택한다. 잘못된 사용자 정책이나 팀 전용 정책으로 개인 설정을 대체하지 않는다.

등록 사용자·서비스 계정 키 발급도 mayu 폼에서 선택할 수 있다. 이 선택은 verified-identity 선언과 전체 관리자 권한을 요구하며 기존 서버가 최종 검증한다. Human의 issuer·subject를 브라우저에서 받아 신원을 만들어내지 않는다.

사용자 비용

지출, 전체 토큰, 입력·출력·캐시 읽기·5분/1시간 쓰기를 조회한다. 팀별로 필터링하거나 사용자를 검색·정렬하고, 사용자 행에서 모델 상세로 이동한다. 출력에는 이미 reasoning이 포함되며 토큰 클래스는 한 번씩 더한다.

평균 비용은 귀속된 계정의 보고 지출을 계정 수로 나눈 값이다. 서비스 계정이 포함될 수 있으며 빈 귀속의 지출은 따로 표시하고 평균에서는 제외한다. 연결 선언이 있는 과거·현재 보고 alias는 같은 재무 계정으로 집계하되, 실제 회계 행이나 권한을 바꾸지 않는다. 모든 금액은 정수 단위를 유지한다.

이 화면은 사용자 풀·직원 수·AWS 청구서·남은 승인 크레딧이 아니다. 저장된 보고 데이터에 한정되고 도착 지연이 있을 수 있다. 조회 장애, 불완전 fallback, 귀속 누락을 구분한다. API 필터의 빈 user가 모든 사용자를 의미하므로 귀속 없는 행은 모델 조회나 개인 한도 설정으로 연결하지 않는다.

토큰 정책과 프로파일

  • TPM: 분당 토큰 처리량.
  • RPM: 분당 요청 수.
  • Daily team tokens: default/local 게이트웨이 팀의 일일 토큰 한도.
  • Token quota: shared Postgres 프로파일의 일간·월간 총량; 사용자 또는 팀을 선택할 수 있으며 항상 FailClosed.

사용자별 RPM/TPM과 tokenQuota는 shared Postgres가 필요하다. 폼은 이 조건을 확인하도록 하며 체크박스가 프로파일을 켜거나 readiness를 증명하지는 않는다. 실제 데이터 플레인이 검증하고 거절 기록을 보고한다. 예약 중인 토큰 때문에 기록된 정산 사용량이 상한에 도달하기 전에도 새 요청이 거절될 수 있다.

default/local 개인 예산 카운터는 팀·게이트웨이별이며, node-local money 및 shared 프로파일의 별도 계약을 그대로 따른다. shared의 DB 장애는 신규 승인을 거절한다. 모든 팀을 합친 보고 지출과 로컬 한도의 카운터 범위를 혼동하지 않아야 한다.

샘플과 다른 부분

AWS 샘플 기능 inferplane에서의 해석
HARD_BLOCK hard cap·차단 동작을 사용하며 다른 hard cap도 함께 적용
SOFT_WARNING + 110% 상한 그대로 지원하지 않음; soft threshold가 110% 차단을 만들지는 않음
예산에 따라 RPM 50%씩 낮추는 THROTTLE 자동 예산 연동 RPM 축소는 구현하지 않음
CPM·CPH 비용 속도 제한 현재 rate 폼은 RPM·TPM; 비용은 일간·월간 한도
팀 예산 미설정이면 항상 거절 기본 로컬의 0/빈칸 의미를 바꾸지 않음
한도 소진율·잔액 텔레메트리로 실제 남은 승인 크레딧을 꾸며내지 않음
다운그레이드 체인 임계점별 원 요청 모델 → 대상 매핑; 재귀적 체인은 아님

재현

go test ./internal/controlplane ./internal/controlplane/ui ./internal/server/adminui -race
node internal/controlplane/ui/testdata/user_limits.cjs
node internal/server/adminui/testdata/routing_forms.cjs --money
python3 internal/controlplane/ui/testdata/browser_qa.py --screenshots /tmp/inferplane-budget-user-token-ux
python3 internal/server/adminui/testdata/browser_qa.py --screenshots /tmp/inferplane-daily-budget-ux

브라우저는 설치된 Playwright·Chromium을 사용하며 합성 로컬 API만 호출한다. 실제 AWS·IdP·모델·키를 사용하지 않는다. 동작 검증은 프로파일별 정책 수용·거절, 조회 권한, 정확한 계정 참조, 검토 전 쓰기 금지, 숫자 범위, 과거 응답 무시, 모바일·테마·로그아웃을 확인한다. 실제 사람의 작업 시간·오류율 비교는 별도 평가다.