rate_limit.go 1.7 KB

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