price.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package helper
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "one-api/common"
  6. relaycommon "one-api/relay/common"
  7. "one-api/setting"
  8. "one-api/setting/operation_setting"
  9. )
  10. type PriceData struct {
  11. ModelPrice float64
  12. ModelRatio float64
  13. CompletionRatio float64
  14. CacheRatio float64
  15. GroupRatio float64
  16. UsePrice bool
  17. CacheCreationRatio float64
  18. ShouldPreConsumedQuota int
  19. }
  20. func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens int, maxTokens int) (PriceData, error) {
  21. modelPrice, usePrice := operation_setting.GetModelPrice(info.OriginModelName, false)
  22. groupRatio := setting.GetGroupRatio(info.Group)
  23. var preConsumedQuota int
  24. var modelRatio float64
  25. var completionRatio float64
  26. var cacheRatio float64
  27. var cacheCreationRatio float64
  28. if !usePrice {
  29. preConsumedTokens := common.PreConsumedQuota
  30. if maxTokens != 0 {
  31. preConsumedTokens = promptTokens + maxTokens
  32. }
  33. var success bool
  34. modelRatio, success = operation_setting.GetModelRatio(info.OriginModelName)
  35. if !success {
  36. if info.UserId == 1 {
  37. return PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", info.OriginModelName, info.OriginModelName)
  38. } else {
  39. return PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置, 请联系管理员设置;Model %s ratio or price not set, please contact administrator to set", info.OriginModelName, info.OriginModelName)
  40. }
  41. }
  42. completionRatio = operation_setting.GetCompletionRatio(info.OriginModelName)
  43. cacheRatio, _ = operation_setting.GetCacheRatio(info.OriginModelName)
  44. cacheCreationRatio, _ = operation_setting.GetCreateCacheRatio(info.OriginModelName)
  45. ratio := modelRatio * groupRatio
  46. preConsumedQuota = int(float64(preConsumedTokens) * ratio)
  47. } else {
  48. preConsumedQuota = int(modelPrice * common.QuotaPerUnit * groupRatio)
  49. }
  50. return PriceData{
  51. ModelPrice: modelPrice,
  52. ModelRatio: modelRatio,
  53. CompletionRatio: completionRatio,
  54. GroupRatio: groupRatio,
  55. UsePrice: usePrice,
  56. CacheRatio: cacheRatio,
  57. CacheCreationRatio: cacheCreationRatio,
  58. ShouldPreConsumedQuota: preConsumedQuota,
  59. }, nil
  60. }