relay-dashboard.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package controller
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "github.com/gin-gonic/gin"
  7. "github.com/labring/aiproxy/core/common/balance"
  8. "github.com/labring/aiproxy/core/middleware"
  9. "github.com/labring/aiproxy/core/relay/adaptor/openai"
  10. log "github.com/sirupsen/logrus"
  11. )
  12. // GetSubscription godoc
  13. //
  14. // @Summary Get subscription
  15. // @Description Get subscription
  16. // @Tags relay
  17. // @Produce json
  18. // @Security ApiKeyAuth
  19. // @Success 200 {object} openai.SubscriptionResponse
  20. // @Router /v1/dashboard/billing/subscription [get]
  21. func GetSubscription(c *gin.Context) {
  22. group := middleware.GetGroup(c)
  23. b, _, err := balance.GetGroupRemainBalance(c.Request.Context(), group)
  24. if err != nil {
  25. if errors.Is(err, balance.ErrNoRealNameUsedAmountLimit) {
  26. middleware.ErrorResponse(c, http.StatusForbidden, err.Error())
  27. return
  28. }
  29. log.Errorf("get group (%s) balance failed: %s", group.ID, err)
  30. middleware.ErrorResponse(
  31. c,
  32. http.StatusInternalServerError,
  33. fmt.Sprintf("get group (%s) balance failed", group.ID),
  34. )
  35. return
  36. }
  37. token := middleware.GetToken(c)
  38. quota := token.Quota
  39. if quota <= 0 {
  40. quota = b
  41. }
  42. c.JSON(http.StatusOK, openai.SubscriptionResponse{
  43. HardLimitUSD: quota + token.UsedAmount,
  44. SoftLimitUSD: b,
  45. SystemHardLimitUSD: quota + token.UsedAmount,
  46. })
  47. }
  48. // GetUsage godoc
  49. //
  50. // @Summary Get usage
  51. // @Description Get usage
  52. // @Tags relay
  53. // @Produce json
  54. // @Security ApiKeyAuth
  55. // @Success 200 {object} openai.UsageResponse
  56. // @Router /v1/dashboard/billing/usage [get]
  57. func GetUsage(c *gin.Context) {
  58. token := middleware.GetToken(c)
  59. c.JSON(http.StatusOK, openai.UsageResponse{TotalUsage: token.UsedAmount * 100})
  60. }