price.go 4.6 KB

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