| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package model
- import (
- "fmt"
- "github.com/QuantumNous/new-api/common"
- "gorm.io/gorm"
- )
- type RankingQuotaTotal struct {
- ModelName string `json:"model_name"`
- TotalTokens int64 `json:"total_tokens"`
- }
- type RankingQuotaBucket struct {
- ModelName string `json:"model_name"`
- Bucket int64 `json:"bucket"`
- Tokens int64 `json:"tokens"`
- }
- func GetRankingQuotaTotals(startTime int64, endTime int64) ([]RankingQuotaTotal, error) {
- var rows []RankingQuotaTotal
- query := DB.Table("quota_data").
- Select("model_name, sum(token_used) as total_tokens").
- Where("model_name <> ''").
- Group("model_name").
- Having("sum(token_used) > 0").
- Order("total_tokens DESC")
- query = applyRankingQuotaTimeRange(query, startTime, endTime)
- err := query.Find(&rows).Error
- return rows, err
- }
- func GetRankingQuotaBuckets(startTime int64, endTime int64, bucketSize int64) ([]RankingQuotaBucket, error) {
- if bucketSize <= 0 {
- bucketSize = 3600
- }
- bucketExpr := rankingBucketExpr(bucketSize)
- var rows []RankingQuotaBucket
- query := DB.Table("quota_data").
- Select(fmt.Sprintf("model_name, %s as bucket, sum(token_used) as tokens", bucketExpr)).
- Where("model_name <> ''").
- Group(fmt.Sprintf("model_name, %s", bucketExpr)).
- Having("sum(token_used) > 0").
- Order("bucket ASC")
- query = applyRankingQuotaTimeRange(query, startTime, endTime)
- err := query.Find(&rows).Error
- return rows, err
- }
- func rankingBucketExpr(bucketSize int64) string {
- if common.UsingMySQL {
- return fmt.Sprintf("FLOOR(created_at / %d) * %d", bucketSize, bucketSize)
- }
- return fmt.Sprintf("(created_at / %d) * %d", bucketSize, bucketSize)
- }
- func applyRankingQuotaTimeRange(query *gorm.DB, startTime int64, endTime int64) *gorm.DB {
- if startTime > 0 {
- query = query.Where("created_at >= ?", startTime)
- }
- if endTime > 0 {
- query = query.Where("created_at <= ?", endTime)
- }
- return query
- }
|