price.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. )
  9. type PriceData struct {
  10. ModelPrice float64
  11. ModelRatio float64
  12. GroupRatio float64
  13. UsePrice bool
  14. ShouldPreConsumedQuota int
  15. }
  16. func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens int, maxTokens int) (PriceData, error) {
  17. modelPrice, usePrice := setting.GetModelPrice(info.OriginModelName, false)
  18. groupRatio := setting.GetGroupRatio(info.Group)
  19. var preConsumedQuota int
  20. var modelRatio float64
  21. if !usePrice {
  22. preConsumedTokens := common.PreConsumedQuota
  23. if maxTokens != 0 {
  24. preConsumedTokens = promptTokens + maxTokens
  25. }
  26. var success bool
  27. modelRatio, success = setting.GetModelRatio(info.OriginModelName)
  28. if !success {
  29. if info.UserId == 1 {
  30. return PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", info.OriginModelName, info.OriginModelName)
  31. } else {
  32. return PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置, 请联系管理员设置;Model %s ratio or price not set, please contact administrator to set", info.OriginModelName, info.OriginModelName)
  33. }
  34. }
  35. ratio := modelRatio * groupRatio
  36. preConsumedQuota = int(float64(preConsumedTokens) * ratio)
  37. } else {
  38. preConsumedQuota = int(modelPrice * common.QuotaPerUnit * groupRatio)
  39. }
  40. return PriceData{
  41. ModelPrice: modelPrice,
  42. ModelRatio: modelRatio,
  43. GroupRatio: groupRatio,
  44. UsePrice: usePrice,
  45. ShouldPreConsumedQuota: preConsumedQuota,
  46. }, nil
  47. }