playground.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package controller
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "net/http"
  7. "one-api/common"
  8. "one-api/dto"
  9. "one-api/middleware"
  10. "one-api/model"
  11. "one-api/service"
  12. "one-api/setting"
  13. )
  14. func Playground(c *gin.Context) {
  15. var openaiErr *dto.OpenAIErrorWithStatusCode
  16. defer func() {
  17. if openaiErr != nil {
  18. c.JSON(openaiErr.StatusCode, gin.H{
  19. "error": openaiErr.Error,
  20. })
  21. }
  22. }()
  23. useAccessToken := c.GetBool("use_access_token")
  24. if useAccessToken {
  25. openaiErr = service.OpenAIErrorWrapperLocal(errors.New("暂不支持使用 access token"), "access_token_not_supported", http.StatusBadRequest)
  26. return
  27. }
  28. playgroundRequest := &dto.PlayGroundRequest{}
  29. err := common.UnmarshalBodyReusable(c, playgroundRequest)
  30. if err != nil {
  31. openaiErr = service.OpenAIErrorWrapperLocal(err, "unmarshal_request_failed", http.StatusBadRequest)
  32. return
  33. }
  34. if playgroundRequest.Model == "" {
  35. openaiErr = service.OpenAIErrorWrapperLocal(errors.New("请选择模型"), "model_required", http.StatusBadRequest)
  36. return
  37. }
  38. c.Set("original_model", playgroundRequest.Model)
  39. group := playgroundRequest.Group
  40. userGroup := c.GetString("group")
  41. if group == "" {
  42. group = userGroup
  43. } else {
  44. if !setting.GroupInUserUsableGroups(group) && group != userGroup {
  45. openaiErr = service.OpenAIErrorWrapperLocal(errors.New("无权访问该分组"), "group_not_allowed", http.StatusForbidden)
  46. return
  47. }
  48. c.Set("group", group)
  49. }
  50. c.Set("token_name", "playground-"+group)
  51. channel, err := model.CacheGetRandomSatisfiedChannel(group, playgroundRequest.Model, 0)
  52. if err != nil {
  53. message := fmt.Sprintf("当前分组 %s 下对于模型 %s 无可用渠道", group, playgroundRequest.Model)
  54. openaiErr = service.OpenAIErrorWrapperLocal(errors.New(message), "get_playground_channel_failed", http.StatusInternalServerError)
  55. return
  56. }
  57. middleware.SetupContextForSelectedChannel(c, channel, playgroundRequest.Model)
  58. Relay(c)
  59. }