price.go 3.0 KB

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