price.go 5.1 KB

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