mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 15:53:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package billing
 | 
						||
 | 
						||
import (
 | 
						||
	"context"
 | 
						||
	"fmt"
 | 
						||
 | 
						||
	"github.com/songquanpeng/one-api/common/logger"
 | 
						||
	"github.com/songquanpeng/one-api/model"
 | 
						||
)
 | 
						||
 | 
						||
func ReturnPreConsumedQuota(ctx context.Context, preConsumedQuota int64, tokenId int) {
 | 
						||
	if preConsumedQuota != 0 {
 | 
						||
		go func(ctx context.Context) {
 | 
						||
			// return pre-consumed quota
 | 
						||
			err := model.PostConsumeTokenQuota(tokenId, -preConsumedQuota)
 | 
						||
			if err != nil {
 | 
						||
				logger.Error(ctx, "error return pre-consumed quota: "+err.Error())
 | 
						||
			}
 | 
						||
		}(ctx)
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
func PostConsumeQuota(ctx context.Context, tokenId int, quotaDelta int64, totalQuota int64, userId int, channelId int, modelRatio float64, groupRatio float64, modelName string, tokenName string) {
 | 
						||
	// quotaDelta is remaining quota to be consumed
 | 
						||
	err := model.PostConsumeTokenQuota(tokenId, quotaDelta)
 | 
						||
	if err != nil {
 | 
						||
		logger.SysError("error consuming token remain quota: " + err.Error())
 | 
						||
	}
 | 
						||
	err = model.CacheUpdateUserQuota(ctx, userId)
 | 
						||
	if err != nil {
 | 
						||
		logger.SysError("error update user quota cache: " + err.Error())
 | 
						||
	}
 | 
						||
	// totalQuota is total quota consumed
 | 
						||
	if totalQuota != 0 {
 | 
						||
		logContent := fmt.Sprintf("倍率:%.2f × %.2f", modelRatio, groupRatio)
 | 
						||
		model.RecordConsumeLog(ctx, &model.Log{
 | 
						||
			UserId:           userId,
 | 
						||
			ChannelId:        channelId,
 | 
						||
			PromptTokens:     int(totalQuota),
 | 
						||
			CompletionTokens: 0,
 | 
						||
			ModelName:        modelName,
 | 
						||
			TokenName:        tokenName,
 | 
						||
			Quota:            int(totalQuota),
 | 
						||
			Content:          logContent,
 | 
						||
		})
 | 
						||
		model.UpdateUserUsedQuotaAndRequestCount(userId, totalQuota)
 | 
						||
		model.UpdateChannelUsedQuota(channelId, totalQuota)
 | 
						||
	}
 | 
						||
	if totalQuota <= 0 {
 | 
						||
		logger.Error(ctx, fmt.Sprintf("totalQuota consumed is %d, something is wrong", totalQuota))
 | 
						||
	}
 | 
						||
}
 |