| package controller | |
| import ( | |
| "errors" | |
| "fmt" | |
| "github.com/gin-gonic/gin" | |
| "net/http" | |
| "one-api/common" | |
| "one-api/constant" | |
| "one-api/dto" | |
| "one-api/middleware" | |
| "one-api/model" | |
| "one-api/service" | |
| "one-api/setting" | |
| "time" | |
| ) | |
| func Playground(c *gin.Context) { | |
| var openaiErr *dto.OpenAIErrorWithStatusCode | |
| defer func() { | |
| if openaiErr != nil { | |
| c.JSON(openaiErr.StatusCode, gin.H{ | |
| "error": openaiErr.Error, | |
| }) | |
| } | |
| }() | |
| useAccessToken := c.GetBool("use_access_token") | |
| if useAccessToken { | |
| openaiErr = service.OpenAIErrorWrapperLocal(errors.New("暂不支持使用 access token"), "access_token_not_supported", http.StatusBadRequest) | |
| return | |
| } | |
| playgroundRequest := &dto.PlayGroundRequest{} | |
| err := common.UnmarshalBodyReusable(c, playgroundRequest) | |
| if err != nil { | |
| openaiErr = service.OpenAIErrorWrapperLocal(err, "unmarshal_request_failed", http.StatusBadRequest) | |
| return | |
| } | |
| if playgroundRequest.Model == "" { | |
| openaiErr = service.OpenAIErrorWrapperLocal(errors.New("请选择模型"), "model_required", http.StatusBadRequest) | |
| return | |
| } | |
| c.Set("original_model", playgroundRequest.Model) | |
| group := playgroundRequest.Group | |
| userGroup := c.GetString("group") | |
| if group == "" { | |
| group = userGroup | |
| } else { | |
| if !setting.GroupInUserUsableGroups(group) && group != userGroup { | |
| openaiErr = service.OpenAIErrorWrapperLocal(errors.New("无权访问该分组"), "group_not_allowed", http.StatusForbidden) | |
| return | |
| } | |
| c.Set("group", group) | |
| } | |
| c.Set("token_name", "playground-"+group) | |
| channel, err := model.CacheGetRandomSatisfiedChannel(group, playgroundRequest.Model, 0) | |
| if err != nil { | |
| message := fmt.Sprintf("当前分组 %s 下对于模型 %s 无可用渠道", group, playgroundRequest.Model) | |
| openaiErr = service.OpenAIErrorWrapperLocal(errors.New(message), "get_playground_channel_failed", http.StatusInternalServerError) | |
| return | |
| } | |
| middleware.SetupContextForSelectedChannel(c, channel, playgroundRequest.Model) | |
| c.Set(constant.ContextKeyRequestStartTime, time.Now()) | |
| Relay(c) | |
| } | |