price.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. if !usePrice {
  47. preConsumedTokens := common.Max(promptTokens, common.PreConsumedQuota)
  48. if meta.MaxTokens != 0 {
  49. preConsumedTokens += meta.MaxTokens
  50. }
  51. var success bool
  52. var matchName string
  53. modelRatio, success, matchName = ratio_setting.GetModelRatio(info.OriginModelName)
  54. if !success {
  55. acceptUnsetRatio := false
  56. if info.UserSetting.AcceptUnsetRatioModel {
  57. acceptUnsetRatio = true
  58. }
  59. if !acceptUnsetRatio {
  60. return types.PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请联系管理员设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", matchName, matchName)
  61. }
  62. }
  63. completionRatio = ratio_setting.GetCompletionRatio(info.OriginModelName)
  64. cacheRatio, _ = ratio_setting.GetCacheRatio(info.OriginModelName)
  65. cacheCreationRatio, _ = ratio_setting.GetCreateCacheRatio(info.OriginModelName)
  66. imageRatio, _ = ratio_setting.GetImageRatio(info.OriginModelName)
  67. ratio := modelRatio * groupRatioInfo.GroupRatio
  68. preConsumedQuota = int(float64(preConsumedTokens) * ratio)
  69. } else {
  70. if meta.ImagePriceRatio != 0 {
  71. modelPrice = modelPrice * meta.ImagePriceRatio
  72. }
  73. preConsumedQuota = int(modelPrice * common.QuotaPerUnit * groupRatioInfo.GroupRatio)
  74. }
  75. priceData := types.PriceData{
  76. ModelPrice: modelPrice,
  77. ModelRatio: modelRatio,
  78. CompletionRatio: completionRatio,
  79. GroupRatioInfo: groupRatioInfo,
  80. UsePrice: usePrice,
  81. CacheRatio: cacheRatio,
  82. ImageRatio: imageRatio,
  83. CacheCreationRatio: cacheCreationRatio,
  84. ShouldPreConsumedQuota: preConsumedQuota,
  85. }
  86. if common.DebugEnabled {
  87. println(fmt.Sprintf("model_price_helper result: %s", priceData.ToSetting()))
  88. }
  89. info.PriceData = priceData
  90. return priceData, nil
  91. }
  92. // ModelPriceHelperPerCall 按次计费的 PriceHelper (MJ、Task)
  93. func ModelPriceHelperPerCall(c *gin.Context, info *relaycommon.RelayInfo) types.PerCallPriceData {
  94. groupRatioInfo := HandleGroupRatio(c, info)
  95. modelPrice, success := ratio_setting.GetModelPrice(info.OriginModelName, true)
  96. // 如果没有配置价格,则使用默认价格
  97. if !success {
  98. defaultPrice, ok := ratio_setting.GetDefaultModelRatioMap()[info.OriginModelName]
  99. if !ok {
  100. modelPrice = 0.1
  101. } else {
  102. modelPrice = defaultPrice
  103. }
  104. }
  105. quota := int(modelPrice * common.QuotaPerUnit * groupRatioInfo.GroupRatio)
  106. priceData := types.PerCallPriceData{
  107. ModelPrice: modelPrice,
  108. Quota: quota,
  109. GroupRatioInfo: groupRatioInfo,
  110. }
  111. return priceData
  112. }
  113. func ContainPriceOrRatio(modelName string) bool {
  114. _, ok := ratio_setting.GetModelPrice(modelName, false)
  115. if ok {
  116. return true
  117. }
  118. _, ok, _ = ratio_setting.GetModelRatio(modelName)
  119. if ok {
  120. return true
  121. }
  122. return false
  123. }