|
|
package controller |
|
|
|
|
|
import ( |
|
|
"github.com/QuantumNous/new-api/common" |
|
|
"github.com/QuantumNous/new-api/dto" |
|
|
"github.com/QuantumNous/new-api/model" |
|
|
"github.com/QuantumNous/new-api/setting/operation_setting" |
|
|
"github.com/gin-gonic/gin" |
|
|
) |
|
|
|
|
|
func GetSubscription(c *gin.Context) { |
|
|
var remainQuota int |
|
|
var usedQuota int |
|
|
var err error |
|
|
var token *model.Token |
|
|
var expiredTime int64 |
|
|
if common.DisplayTokenStatEnabled { |
|
|
tokenId := c.GetInt("token_id") |
|
|
token, err = model.GetTokenById(tokenId) |
|
|
expiredTime = token.ExpiredTime |
|
|
remainQuota = token.RemainQuota |
|
|
usedQuota = token.UsedQuota |
|
|
} else { |
|
|
userId := c.GetInt("id") |
|
|
remainQuota, err = model.GetUserQuota(userId, false) |
|
|
usedQuota, err = model.GetUserUsedQuota(userId) |
|
|
} |
|
|
if expiredTime <= 0 { |
|
|
expiredTime = 0 |
|
|
} |
|
|
if err != nil { |
|
|
openAIError := dto.OpenAIError{ |
|
|
Message: err.Error(), |
|
|
Type: "upstream_error", |
|
|
} |
|
|
c.JSON(200, gin.H{ |
|
|
"error": openAIError, |
|
|
}) |
|
|
return |
|
|
} |
|
|
quota := remainQuota + usedQuota |
|
|
amount := float64(quota) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch operation_setting.GetQuotaDisplayType() { |
|
|
case operation_setting.QuotaDisplayTypeCNY: |
|
|
amount = amount / common.QuotaPerUnit * operation_setting.USDExchangeRate |
|
|
case operation_setting.QuotaDisplayTypeTokens: |
|
|
|
|
|
default: |
|
|
amount = amount / common.QuotaPerUnit |
|
|
} |
|
|
if token != nil && token.UnlimitedQuota { |
|
|
amount = 100000000 |
|
|
} |
|
|
subscription := OpenAISubscriptionResponse{ |
|
|
Object: "billing_subscription", |
|
|
HasPaymentMethod: true, |
|
|
SoftLimitUSD: amount, |
|
|
HardLimitUSD: amount, |
|
|
SystemHardLimitUSD: amount, |
|
|
AccessUntil: expiredTime, |
|
|
} |
|
|
c.JSON(200, subscription) |
|
|
return |
|
|
} |
|
|
|
|
|
func GetUsage(c *gin.Context) { |
|
|
var quota int |
|
|
var err error |
|
|
var token *model.Token |
|
|
if common.DisplayTokenStatEnabled { |
|
|
tokenId := c.GetInt("token_id") |
|
|
token, err = model.GetTokenById(tokenId) |
|
|
quota = token.UsedQuota |
|
|
} else { |
|
|
userId := c.GetInt("id") |
|
|
quota, err = model.GetUserUsedQuota(userId) |
|
|
} |
|
|
if err != nil { |
|
|
openAIError := dto.OpenAIError{ |
|
|
Message: err.Error(), |
|
|
Type: "new_api_error", |
|
|
} |
|
|
c.JSON(200, gin.H{ |
|
|
"error": openAIError, |
|
|
}) |
|
|
return |
|
|
} |
|
|
amount := float64(quota) |
|
|
switch operation_setting.GetQuotaDisplayType() { |
|
|
case operation_setting.QuotaDisplayTypeCNY: |
|
|
amount = amount / common.QuotaPerUnit * operation_setting.USDExchangeRate |
|
|
case operation_setting.QuotaDisplayTypeTokens: |
|
|
|
|
|
default: |
|
|
amount = amount / common.QuotaPerUnit |
|
|
} |
|
|
usage := OpenAIUsageResponse{ |
|
|
Object: "list", |
|
|
TotalUsage: amount * 100, |
|
|
} |
|
|
c.JSON(200, usage) |
|
|
return |
|
|
} |
|
|
|