price.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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"
  8. "one-api/setting/operation_setting"
  9. "github.com/gin-gonic/gin"
  10. )
  11. type PriceData struct {
  12. ModelPrice float64
  13. ModelRatio float64
  14. CompletionRatio float64
  15. CacheRatio float64
  16. CacheCreationRatio float64
  17. ImageRatio float64
  18. GroupRatio float64
  19. UserGroupRatio float64
  20. UsePrice bool
  21. ShouldPreConsumedQuota int
  22. }
  23. func (p PriceData) ToSetting() string {
  24. 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.GroupRatio, p.UsePrice, p.CacheCreationRatio, p.ShouldPreConsumedQuota, p.ImageRatio)
  25. }
  26. func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens int, maxTokens int) (PriceData, error) {
  27. modelPrice, usePrice := operation_setting.GetModelPrice(info.OriginModelName, false)
  28. groupRatio := setting.GetGroupRatio(info.Group)
  29. userGroupRatio, ok := setting.GetGroupGroupRatio(info.UserGroup, info.Group)
  30. if ok {
  31. groupRatio = userGroupRatio
  32. }
  33. var preConsumedQuota int
  34. var modelRatio float64
  35. var completionRatio float64
  36. var cacheRatio float64
  37. var imageRatio float64
  38. var cacheCreationRatio float64
  39. if !usePrice {
  40. preConsumedTokens := common.PreConsumedQuota
  41. if maxTokens != 0 {
  42. preConsumedTokens = promptTokens + maxTokens
  43. }
  44. var success bool
  45. modelRatio, success = operation_setting.GetModelRatio(info.OriginModelName)
  46. if !success {
  47. acceptUnsetRatio := false
  48. if accept, ok := info.UserSetting[constant2.UserAcceptUnsetRatioModel]; ok {
  49. b, ok := accept.(bool)
  50. if ok {
  51. acceptUnsetRatio = b
  52. }
  53. }
  54. if !acceptUnsetRatio {
  55. return PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请联系管理员设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", info.OriginModelName, info.OriginModelName)
  56. }
  57. }
  58. completionRatio = operation_setting.GetCompletionRatio(info.OriginModelName)
  59. cacheRatio, _ = operation_setting.GetCacheRatio(info.OriginModelName)
  60. cacheCreationRatio, _ = operation_setting.GetCreateCacheRatio(info.OriginModelName)
  61. imageRatio, _ = operation_setting.GetImageRatio(info.OriginModelName)
  62. ratio := modelRatio * groupRatio
  63. preConsumedQuota = int(float64(preConsumedTokens) * ratio)
  64. } else {
  65. preConsumedQuota = int(modelPrice * common.QuotaPerUnit * groupRatio)
  66. }
  67. priceData := PriceData{
  68. ModelPrice: modelPrice,
  69. ModelRatio: modelRatio,
  70. CompletionRatio: completionRatio,
  71. GroupRatio: groupRatio,
  72. UserGroupRatio: userGroupRatio,
  73. UsePrice: usePrice,
  74. CacheRatio: cacheRatio,
  75. ImageRatio: imageRatio,
  76. CacheCreationRatio: cacheCreationRatio,
  77. ShouldPreConsumedQuota: preConsumedQuota,
  78. }
  79. if common.DebugEnabled {
  80. println(fmt.Sprintf("model_price_helper result: %s", priceData.ToSetting()))
  81. }
  82. return priceData, nil
  83. }
  84. func ContainPriceOrRatio(modelName string) bool {
  85. _, ok := operation_setting.GetModelPrice(modelName, false)
  86. if ok {
  87. return true
  88. }
  89. _, ok = operation_setting.GetModelRatio(modelName)
  90. if ok {
  91. return true
  92. }
  93. return false
  94. }