TokenUsageAdvisor:
String userID = (String) chatClientRequest.context().get(ChatMemory.CONVERSATION_ID);
long used = tokenUsageService.getUsedTokens(userId);
if (used >= 50_000) { throw new TokenLimitExceededException("Monthly token limit exceeded");}
CREATE TABLE user_token_usage ( user_id VARCHAR(100) PRIMARY KEY, used_tokens BIGINT NOT NULL, quota_limit BIGINT NOT NULL, reset_at TIMESTAMP NOT NULL );
public void checkAndReset(String userId) { UserTokenUsage usage = repository.findByUserId(userId); LocalDateTime now = LocalDateTime.now(); if (now.isAfter(usage.getResetAt())) { usage.setUsedTokens(0); usage.setResetAt(now.plusDays(1)); repository.save(usage); } if (usage.getUsedTokens() >= usage.getQuotaLimit()) { throw new TokenLimitExceededException("Daily token limit exceeded."); } }
public void addTokens(String userId, long tokens) { UserTokenUsage usage = repository.findByUserId(userId); usage.setUsedTokens(usage.getUsedTokens() + tokens); repository.save(usage); }
@Override public ChatClientResponse adviseCall(ChatClientRequest request,CallAdvisorChain chain) { String userId = (String) request.context().get("userId"); tokenUsageService.checkAndReset(userId); ChatClientResponse response = chain.nextCall(request); long tokens = response.chatResponse() .getMetadata() .getUsage() .getTotalTokens(); tokenUsageService.addTokens(userId, tokens); return response; }