price.go 5.1 KB

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