Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

151 řádky
4.9 KiB

  1. package helper
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "testing"
  6. "github.com/QuantumNous/new-api/common"
  7. "github.com/QuantumNous/new-api/constant"
  8. "github.com/QuantumNous/new-api/dto"
  9. "github.com/QuantumNous/new-api/model"
  10. relaycommon "github.com/QuantumNous/new-api/relay/common"
  11. "github.com/QuantumNous/new-api/setting/ratio_setting"
  12. "github.com/QuantumNous/new-api/types"
  13. "github.com/gin-gonic/gin"
  14. "github.com/glebarez/sqlite"
  15. "github.com/stretchr/testify/assert"
  16. "github.com/stretchr/testify/require"
  17. "gorm.io/gorm"
  18. )
  19. const testModelUsePriceSwitch = "test-useprice-switch-model"
  20. func setupUsePriceSwitchTest(t *testing.T) {
  21. t.Helper()
  22. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  23. require.NoError(t, err)
  24. sqlDB, err := db.DB()
  25. require.NoError(t, err)
  26. sqlDB.SetMaxOpenConns(1)
  27. origDB := model.DB
  28. origUsingSQLite := common.UsingSQLite
  29. origRedisEnabled := common.RedisEnabled
  30. model.DB = db
  31. common.UsingSQLite = true
  32. common.RedisEnabled = false
  33. require.NoError(t, db.AutoMigrate(&model.UserChannelRatio{}))
  34. require.NoError(t, ratio_setting.UpdateModelPriceByJSONString(`{"`+testModelUsePriceSwitch+`":0.5}`))
  35. require.NoError(t, ratio_setting.UpdateModelRatioByJSONString(`{"`+testModelUsePriceSwitch+`":15}`))
  36. require.NoError(t, ratio_setting.UpdateCompletionRatioByJSONString(`{"`+testModelUsePriceSwitch+`":3}`))
  37. require.NoError(t, ratio_setting.UpdateCacheRatioByJSONString(`{"`+testModelUsePriceSwitch+`":0.1}`))
  38. require.NoError(t, ratio_setting.UpdateCreateCacheRatioByJSONString(`{"`+testModelUsePriceSwitch+`":1.25}`))
  39. require.NoError(t, ratio_setting.UpdateImageRatioByJSONString(`{"`+testModelUsePriceSwitch+`":2.0}`))
  40. require.NoError(t, ratio_setting.UpdateAudioRatioByJSONString(`{"`+testModelUsePriceSwitch+`":5.0}`))
  41. require.NoError(t, ratio_setting.UpdateAudioCompletionRatioByJSONString(`{"`+testModelUsePriceSwitch+`":3.0}`))
  42. t.Cleanup(func() {
  43. model.DB = origDB
  44. common.UsingSQLite = origUsingSQLite
  45. common.RedisEnabled = origRedisEnabled
  46. require.NoError(t, sqlDB.Close())
  47. require.NoError(t, ratio_setting.UpdateModelPriceByJSONString(`{}`))
  48. require.NoError(t, ratio_setting.UpdateModelRatioByJSONString(`{}`))
  49. require.NoError(t, ratio_setting.UpdateCompletionRatioByJSONString(`{}`))
  50. require.NoError(t, ratio_setting.UpdateCacheRatioByJSONString(`{}`))
  51. require.NoError(t, ratio_setting.UpdateCreateCacheRatioByJSONString(`{}`))
  52. require.NoError(t, ratio_setting.UpdateImageRatioByJSONString(`{}`))
  53. require.NoError(t, ratio_setting.UpdateAudioRatioByJSONString(`{}`))
  54. require.NoError(t, ratio_setting.UpdateAudioCompletionRatioByJSONString(`{}`))
  55. })
  56. }
  57. func buildTestContext(t *testing.T) *gin.Context {
  58. t.Helper()
  59. gin.SetMode(gin.TestMode)
  60. w := httptest.NewRecorder()
  61. c, _ := gin.CreateTestContext(w)
  62. req, err := http.NewRequest(http.MethodPost, "/v1/chat/completions", nil)
  63. require.NoError(t, err)
  64. c.Request = req
  65. return c
  66. }
  67. func TestGlobalRatiosFilledWhenUsePriceTrue(t *testing.T) {
  68. setupUsePriceSwitchTest(t)
  69. c := buildTestContext(t)
  70. info := &relaycommon.RelayInfo{
  71. OriginModelName: testModelUsePriceSwitch,
  72. UserSetting: dto.UserSetting{},
  73. }
  74. priceData, err := ModelPriceHelper(c, info, 100, &types.TokenCountMeta{})
  75. require.NoError(t, err)
  76. assert.True(t, priceData.UsePrice)
  77. assert.Equal(t, 0.5, priceData.ModelPrice)
  78. assert.Equal(t, 0.1, priceData.CacheRatio)
  79. assert.Equal(t, 1.25, priceData.CacheCreationRatio)
  80. assert.Equal(t, 2.0, priceData.ImageRatio)
  81. assert.Equal(t, 5.0, priceData.AudioRatio)
  82. assert.Equal(t, 3.0, priceData.AudioCompletionRatio)
  83. }
  84. func TestGlobalRatiosFilledWhenUseRatioMode(t *testing.T) {
  85. setupUsePriceSwitchTest(t)
  86. c := buildTestContext(t)
  87. require.NoError(t, ratio_setting.UpdateModelPriceByJSONString(`{}`))
  88. info := &relaycommon.RelayInfo{
  89. OriginModelName: testModelUsePriceSwitch,
  90. UserSetting: dto.UserSetting{},
  91. }
  92. priceData, err := ModelPriceHelper(c, info, 100, &types.TokenCountMeta{})
  93. require.NoError(t, err)
  94. assert.False(t, priceData.UsePrice)
  95. assert.Equal(t, 15.0, priceData.ModelRatio)
  96. assert.Equal(t, 3.0, priceData.CompletionRatio)
  97. assert.Equal(t, 0.1, priceData.CacheRatio)
  98. assert.Equal(t, 2.0, priceData.ImageRatio)
  99. }
  100. func TestUpdatePriceDataForChannelPricingOnlyAppliesUserChannelRatio(t *testing.T) {
  101. setupUsePriceSwitchTest(t)
  102. ratio := &model.UserChannelRatio{
  103. UserId: 9,
  104. ModelName: testModelUsePriceSwitch,
  105. ChannelId: 9901,
  106. Ratio: 0.8,
  107. }
  108. require.NoError(t, ratio.Insert())
  109. c := buildTestContext(t)
  110. c.Set(string(constant.ContextKeyUserId), 9)
  111. info := &relaycommon.RelayInfo{
  112. OriginModelName: testModelUsePriceSwitch,
  113. PriceData: types.PriceData{
  114. ModelPrice: 0.5,
  115. UsePrice: true,
  116. QuotaToPreConsume: 1000,
  117. UserChannelRatio: 1.0,
  118. },
  119. }
  120. UpdatePriceDataForChannelPricing(c, info, 9901)
  121. assert.Equal(t, 0.8, info.PriceData.UserChannelRatio)
  122. assert.Equal(t, 800, info.PriceData.QuotaToPreConsume)
  123. assert.Equal(t, 0.5, info.PriceData.ModelPrice)
  124. }