| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package controller
- import (
- "github.com/gin-gonic/gin"
- "one-api/common"
- "one-api/dto"
- "one-api/model"
- "one-api/setting/operation_setting"
- )
- 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)
- // OpenAI 兼容接口中的 *_USD 字段含义保持“额度单位”对应值:
- // 我们将其解释为以“站点展示类型”为准:
- // - USD: 直接除以 QuotaPerUnit
- // - CNY: 先转 USD 再乘汇率
- // - TOKENS: 直接使用 tokens 数量
- switch operation_setting.GetQuotaDisplayType() {
- case operation_setting.QuotaDisplayTypeCNY:
- amount = amount / common.QuotaPerUnit * operation_setting.USDExchangeRate
- case operation_setting.QuotaDisplayTypeTokens:
- // amount 保持 tokens 数值
- 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:
- // tokens 保持原值
- default:
- amount = amount / common.QuotaPerUnit
- }
- usage := OpenAIUsageResponse{
- Object: "list",
- TotalUsage: amount * 100,
- }
- c.JSON(200, usage)
- return
- }
|