usedata_rankings.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package model
  2. import (
  3. "fmt"
  4. "github.com/QuantumNous/new-api/common"
  5. "gorm.io/gorm"
  6. )
  7. type RankingQuotaTotal struct {
  8. ModelName string `json:"model_name"`
  9. TotalTokens int64 `json:"total_tokens"`
  10. }
  11. type RankingQuotaBucket struct {
  12. ModelName string `json:"model_name"`
  13. Bucket int64 `json:"bucket"`
  14. Tokens int64 `json:"tokens"`
  15. }
  16. func GetRankingQuotaTotals(startTime int64, endTime int64) ([]RankingQuotaTotal, error) {
  17. var rows []RankingQuotaTotal
  18. query := DB.Table("quota_data").
  19. Select("model_name, sum(token_used) as total_tokens").
  20. Where("model_name <> ''").
  21. Group("model_name").
  22. Having("sum(token_used) > 0").
  23. Order("total_tokens DESC")
  24. query = applyRankingQuotaTimeRange(query, startTime, endTime)
  25. err := query.Find(&rows).Error
  26. return rows, err
  27. }
  28. func GetRankingQuotaBuckets(startTime int64, endTime int64, bucketSize int64) ([]RankingQuotaBucket, error) {
  29. if bucketSize <= 0 {
  30. bucketSize = 3600
  31. }
  32. bucketExpr := rankingBucketExpr(bucketSize)
  33. var rows []RankingQuotaBucket
  34. query := DB.Table("quota_data").
  35. Select(fmt.Sprintf("model_name, %s as bucket, sum(token_used) as tokens", bucketExpr)).
  36. Where("model_name <> ''").
  37. Group(fmt.Sprintf("model_name, %s", bucketExpr)).
  38. Having("sum(token_used) > 0").
  39. Order("bucket ASC")
  40. query = applyRankingQuotaTimeRange(query, startTime, endTime)
  41. err := query.Find(&rows).Error
  42. return rows, err
  43. }
  44. func rankingBucketExpr(bucketSize int64) string {
  45. if common.UsingMySQL {
  46. return fmt.Sprintf("FLOOR(created_at / %d) * %d", bucketSize, bucketSize)
  47. }
  48. return fmt.Sprintf("(created_at / %d) * %d", bucketSize, bucketSize)
  49. }
  50. func applyRankingQuotaTimeRange(query *gorm.DB, startTime int64, endTime int64) *gorm.DB {
  51. if startTime > 0 {
  52. query = query.Where("created_at >= ?", startTime)
  53. }
  54. if endTime > 0 {
  55. query = query.Where("created_at <= ?", endTime)
  56. }
  57. return query
  58. }