rate_limit.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package setting
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "math"
  6. "sync"
  7. "github.com/QuantumNous/new-api/common"
  8. )
  9. var ModelRequestRateLimitEnabled = false
  10. var ModelRequestRateLimitDurationMinutes = 1
  11. var ModelRequestRateLimitCount = 0
  12. var ModelRequestRateLimitSuccessCount = 1000
  13. var ModelRequestRateLimitGroup = map[string][2]int{}
  14. var ModelRequestRateLimitMutex sync.RWMutex
  15. func ModelRequestRateLimitGroup2JSONString() string {
  16. ModelRequestRateLimitMutex.RLock()
  17. defer ModelRequestRateLimitMutex.RUnlock()
  18. jsonBytes, err := json.Marshal(ModelRequestRateLimitGroup)
  19. if err != nil {
  20. common.SysLog("error marshalling model ratio: " + err.Error())
  21. }
  22. return string(jsonBytes)
  23. }
  24. func UpdateModelRequestRateLimitGroupByJSONString(jsonStr string) error {
  25. ModelRequestRateLimitMutex.RLock()
  26. defer ModelRequestRateLimitMutex.RUnlock()
  27. ModelRequestRateLimitGroup = make(map[string][2]int)
  28. return json.Unmarshal([]byte(jsonStr), &ModelRequestRateLimitGroup)
  29. }
  30. func GetGroupRateLimit(group string) (totalCount, successCount int, found bool) {
  31. ModelRequestRateLimitMutex.RLock()
  32. defer ModelRequestRateLimitMutex.RUnlock()
  33. if ModelRequestRateLimitGroup == nil {
  34. return 0, 0, false
  35. }
  36. limits, found := ModelRequestRateLimitGroup[group]
  37. if !found {
  38. return 0, 0, false
  39. }
  40. return limits[0], limits[1], true
  41. }
  42. func CheckModelRequestRateLimitGroup(jsonStr string) error {
  43. checkModelRequestRateLimitGroup := make(map[string][2]int)
  44. err := json.Unmarshal([]byte(jsonStr), &checkModelRequestRateLimitGroup)
  45. if err != nil {
  46. return err
  47. }
  48. for group, limits := range checkModelRequestRateLimitGroup {
  49. if limits[0] < 0 || limits[1] < 1 {
  50. return fmt.Errorf("group %s has negative rate limit values: [%d, %d]", group, limits[0], limits[1])
  51. }
  52. if limits[0] > math.MaxInt32 || limits[1] > math.MaxInt32 {
  53. return fmt.Errorf("group %s [%d, %d] has max rate limits value 2147483647", group, limits[0], limits[1])
  54. }
  55. }
  56. return nil
  57. }