| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package controller
- import (
- "errors"
- "fmt"
- "net/http"
- "one-api/common"
- "one-api/constant"
- "one-api/dto"
- "one-api/middleware"
- "one-api/model"
- "one-api/service"
- "one-api/setting"
- "time"
- "github.com/gin-gonic/gin"
- )
- 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, finalGroup, err := model.CacheGetRandomSatisfiedChannel(c, group, playgroundRequest.Model, 0)
- if err != nil {
- message := fmt.Sprintf("当前分组 %s 下对于模型 %s 无可用渠道", finalGroup, playgroundRequest.Model)
- openaiErr = service.OpenAIErrorWrapperLocal(errors.New(message), "get_playground_channel_failed", http.StatusInternalServerError)
- return
- }
- middleware.SetupContextForSelectedChannel(c, channel, playgroundRequest.Model)
- common.SetContextKey(c, constant.ContextKeyRequestStartTime, time.Now())
- // Write user context to ensure acceptUnsetRatio is available
- userId := c.GetInt("id")
- userCache, err := model.GetUserCache(userId)
- if err != nil {
- openaiErr = service.OpenAIErrorWrapperLocal(err, "get_user_cache_failed", http.StatusInternalServerError)
- return
- }
- userCache.WriteContext(c)
- Relay(c)
- }
|