Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

169 rindas
5.2 KiB

  1. package helper
  2. import (
  3. "fmt"
  4. "github.com/QuantumNous/new-api/common"
  5. "github.com/QuantumNous/new-api/logger"
  6. relaycommon "github.com/QuantumNous/new-api/relay/common"
  7. "github.com/QuantumNous/new-api/setting/operation_setting"
  8. "github.com/QuantumNous/new-api/setting/ratio_setting"
  9. "github.com/QuantumNous/new-api/types"
  10. "github.com/gin-gonic/gin"
  11. )
  12. // HandleGroupRatio checks for "auto_group" in the context and updates the group ratio and relayInfo.UsingGroup if present
  13. func HandleGroupRatio(ctx *gin.Context, relayInfo *relaycommon.RelayInfo) types.GroupRatioInfo {
  14. groupRatioInfo := types.GroupRatioInfo{
  15. GroupRatio: 1.0,
  16. GroupSpecialRatio: -1,
  17. }
  18. autoGroup, exists := ctx.Get("auto_group")
  19. if exists {
  20. logger.LogDebug(ctx, fmt.Sprintf("final group: %s", autoGroup))
  21. relayInfo.UsingGroup = autoGroup.(string)
  22. }
  23. userGroupRatio, ok := ratio_setting.GetGroupGroupRatio(relayInfo.UserGroup, relayInfo.UsingGroup)
  24. if ok {
  25. groupRatioInfo.GroupSpecialRatio = userGroupRatio
  26. groupRatioInfo.GroupRatio = userGroupRatio
  27. groupRatioInfo.HasSpecialRatio = true
  28. } else {
  29. groupRatioInfo.GroupRatio = ratio_setting.GetGroupRatio(relayInfo.UsingGroup)
  30. }
  31. return groupRatioInfo
  32. }
  33. func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens int, meta *types.TokenCountMeta) (types.PriceData, error) {
  34. var modelPrice float64
  35. var usePrice bool
  36. var modelRatio float64
  37. var completionRatio float64
  38. modelPrice, usePrice = ratio_setting.GetModelPrice(info.OriginModelName, false)
  39. groupRatioInfo := HandleGroupRatio(c, info)
  40. var preConsumedQuota int
  41. var freeModel bool
  42. if !usePrice {
  43. preConsumedTokens := common.Max(promptTokens, common.PreConsumedQuota)
  44. if meta.MaxTokens != 0 {
  45. preConsumedTokens += meta.MaxTokens
  46. }
  47. var success bool
  48. var matchName string
  49. modelRatio, success, matchName = ratio_setting.GetModelRatio(info.OriginModelName)
  50. if !success {
  51. acceptUnsetRatio := false
  52. if info.UserSetting.AcceptUnsetRatioModel {
  53. acceptUnsetRatio = true
  54. }
  55. if !acceptUnsetRatio {
  56. return types.PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请联系管理员设置或开启自用模式;Model %s ratio or price not set, please set or start self-use mode", matchName, matchName)
  57. }
  58. }
  59. completionRatio = ratio_setting.GetCompletionRatio(info.OriginModelName)
  60. ratio := modelRatio * groupRatioInfo.GroupRatio
  61. preConsumedQuota = int(float64(preConsumedTokens) * ratio)
  62. } else {
  63. if meta.ImagePriceRatio != 0 {
  64. modelPrice = modelPrice * meta.ImagePriceRatio
  65. }
  66. preConsumedQuota = int(modelPrice * common.QuotaPerUnit * groupRatioInfo.GroupRatio)
  67. }
  68. cacheRatio, _ := ratio_setting.GetCacheRatio(info.OriginModelName)
  69. cacheCreationRatio, _ := ratio_setting.GetCreateCacheRatio(info.OriginModelName)
  70. imageRatio, _ := ratio_setting.GetImageRatio(info.OriginModelName)
  71. audioRatio := ratio_setting.GetAudioRatio(info.OriginModelName)
  72. audioCompletionRatio := ratio_setting.GetAudioCompletionRatio(info.OriginModelName)
  73. if !operation_setting.GetQuotaSetting().EnableFreeModelPreConsume {
  74. if groupRatioInfo.GroupRatio == 0 {
  75. preConsumedQuota = 0
  76. freeModel = true
  77. } else if usePrice {
  78. if modelPrice == 0 {
  79. preConsumedQuota = 0
  80. freeModel = true
  81. }
  82. } else if modelRatio == 0 {
  83. preConsumedQuota = 0
  84. freeModel = true
  85. }
  86. }
  87. priceData := types.PriceData{
  88. FreeModel: freeModel,
  89. ModelPrice: modelPrice,
  90. ModelRatio: modelRatio,
  91. CompletionRatio: completionRatio,
  92. GroupRatioInfo: groupRatioInfo,
  93. UsePrice: usePrice,
  94. QuotaToPreConsume: preConsumedQuota,
  95. CacheRatio: cacheRatio,
  96. ImageRatio: imageRatio,
  97. AudioRatio: audioRatio,
  98. AudioCompletionRatio: audioCompletionRatio,
  99. CacheCreationRatio: cacheCreationRatio,
  100. CacheCreation5mRatio: cacheCreationRatio,
  101. CacheCreation1hRatio: cacheCreationRatio * types.ClaudeCacheCreation1hMultiplier,
  102. }
  103. if common.DebugEnabled {
  104. println(fmt.Sprintf("model_price_helper result: %s", priceData.ToSetting()))
  105. }
  106. info.PriceData = priceData
  107. return priceData, nil
  108. }
  109. // ModelPriceHelperPerCall 按次计费的 PriceHelper (MJ、Task)
  110. func ModelPriceHelperPerCall(c *gin.Context, info *relaycommon.RelayInfo) types.PriceData {
  111. groupRatioInfo := HandleGroupRatio(c, info)
  112. modelPrice, success := ratio_setting.GetModelPrice(info.OriginModelName, true)
  113. if !success {
  114. defaultPrice, ok := ratio_setting.GetDefaultModelPriceMap()[info.OriginModelName]
  115. if !ok {
  116. modelPrice = 0.1
  117. } else {
  118. modelPrice = defaultPrice
  119. }
  120. }
  121. quota := int(modelPrice * common.QuotaPerUnit * groupRatioInfo.GroupRatio)
  122. freeModel := false
  123. if !operation_setting.GetQuotaSetting().EnableFreeModelPreConsume {
  124. if groupRatioInfo.GroupRatio == 0 || modelPrice == 0 {
  125. quota = 0
  126. freeModel = true
  127. }
  128. }
  129. priceData := types.PriceData{
  130. FreeModel: freeModel,
  131. ModelPrice: modelPrice,
  132. Quota: quota,
  133. GroupRatioInfo: groupRatioInfo,
  134. }
  135. return priceData
  136. }
  137. func ContainPriceOrRatio(modelName string) bool {
  138. _, ok := ratio_setting.GetModelPrice(modelName, false)
  139. if ok {
  140. return true
  141. }
  142. _, ok, _ = ratio_setting.GetModelRatio(modelName)
  143. if ok {
  144. return true
  145. }
  146. return false
  147. }