Spaces:
Runtime error
Runtime error
package platform | |
import ( | |
"bytes" | |
"encoding/json" | |
"fmt" | |
"io" | |
"strings" | |
"github.com/gin-gonic/gin" | |
"github.com/linweiyuan/go-chatgpt-api/api" | |
http "github.com/bogdanfinn/fhttp" | |
) | |
func ListModels(c *gin.Context) { | |
handleGet(c, apiListModels) | |
} | |
func RetrieveModel(c *gin.Context) { | |
model := c.Param("model") | |
handleGet(c, fmt.Sprintf(apiRetrieveModel, model)) | |
} | |
//goland:noinspection GoUnhandledErrorResult | |
func CreateCompletions(c *gin.Context) { | |
var request CreateCompletionsRequest | |
c.ShouldBindJSON(&request) | |
data, _ := json.Marshal(request) | |
resp, err := handlePost(c, apiCreateCompletions, data, request.Stream) | |
if err != nil { | |
return | |
} | |
defer resp.Body.Close() | |
if request.Stream { | |
api.HandleConversationResponse(c, resp) | |
} else { | |
io.Copy(c.Writer, resp.Body) | |
} | |
} | |
//goland:noinspection GoUnhandledErrorResult | |
func CreateChatCompletions(c *gin.Context) { | |
var request ChatCompletionsRequest | |
c.ShouldBindJSON(&request) | |
data, _ := json.Marshal(request) | |
resp, err := handlePost(c, apiCreataeChatCompletions, data, request.Stream) | |
if err != nil { | |
return | |
} | |
defer resp.Body.Close() | |
if request.Stream { | |
api.HandleConversationResponse(c, resp) | |
} else { | |
io.Copy(c.Writer, resp.Body) | |
} | |
} | |
//goland:noinspection GoUnhandledErrorResult | |
func CreateEdit(c *gin.Context) { | |
var request CreateEditRequest | |
c.ShouldBindJSON(&request) | |
data, _ := json.Marshal(request) | |
resp, err := handlePost(c, apiCreateEdit, data, false) | |
if err != nil { | |
return | |
} | |
defer resp.Body.Close() | |
io.Copy(c.Writer, resp.Body) | |
} | |
//goland:noinspection GoUnhandledErrorResult | |
func CreateImage(c *gin.Context) { | |
var request CreateImageRequest | |
c.ShouldBindJSON(&request) | |
data, _ := json.Marshal(request) | |
resp, err := handlePost(c, apiCreateImage, data, false) | |
if err != nil { | |
return | |
} | |
defer resp.Body.Close() | |
io.Copy(c.Writer, resp.Body) | |
} | |
//goland:noinspection GoUnhandledErrorResult | |
func CreateEmbeddings(c *gin.Context) { | |
var request CreateEmbeddingsRequest | |
c.ShouldBindJSON(&request) | |
data, _ := json.Marshal(request) | |
resp, err := handlePost(c, apiCreateEmbeddings, data, false) | |
if err != nil { | |
return | |
} | |
defer resp.Body.Close() | |
io.Copy(c.Writer, resp.Body) | |
} | |
func CreateModeration(c *gin.Context) { | |
var request CreateModerationRequest | |
c.ShouldBindJSON(&request) | |
data, _ := json.Marshal(request) | |
resp, err := handlePost(c, apiCreateModeration, data, false) | |
if err != nil { | |
return | |
} | |
defer resp.Body.Close() | |
io.Copy(c.Writer, resp.Body) | |
} | |
func ListFiles(c *gin.Context) { | |
handleGet(c, apiListFiles) | |
} | |
func GetCreditGrants(c *gin.Context) { | |
handleGet(c, apiGetCreditGrants) | |
} | |
//goland:noinspection GoUnhandledErrorResult | |
func Login(c *gin.Context) { | |
var loginInfo api.LoginInfo | |
if err := c.ShouldBindJSON(&loginInfo); err != nil { | |
c.AbortWithStatusJSON(http.StatusBadRequest, api.ReturnMessage(api.ParseUserInfoErrorMessage)) | |
return | |
} | |
userLogin := UserLogin{ | |
client: api.NewHttpClient(), | |
} | |
// hard refresh cookies | |
resp, _ := userLogin.client.Get(auth0LogoutUrl) | |
defer resp.Body.Close() | |
// get authorized url | |
authorizedUrl, statusCode, err := userLogin.GetAuthorizedUrl("") | |
if err != nil { | |
c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error())) | |
return | |
} | |
// get state | |
state, _, _ := userLogin.GetState(authorizedUrl) | |
// check username | |
statusCode, err = userLogin.CheckUsername(state, loginInfo.Username) | |
if err != nil { | |
c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error())) | |
return | |
} | |
// check password | |
code, statusCode, err := userLogin.CheckPassword(state, loginInfo.Username, loginInfo.Password) | |
if err != nil { | |
c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error())) | |
return | |
} | |
// get access token | |
accessToken, statusCode, err := userLogin.GetAccessToken(code) | |
if err != nil { | |
c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error())) | |
return | |
} | |
// get session key | |
var getAccessTokenResponse GetAccessTokenResponse | |
json.Unmarshal([]byte(accessToken), &getAccessTokenResponse) | |
req, _ := http.NewRequest(http.MethodPost, dashboardLoginUrl, strings.NewReader("{}")) | |
req.Header.Set("Content-Type", "application/json") | |
req.Header.Set("User-Agent", api.UserAgent) | |
req.Header.Set("Authorization", api.GetAccessToken(getAccessTokenResponse.AccessToken)) | |
resp, err = userLogin.client.Do(req) | |
if err != nil { | |
c.AbortWithStatusJSON(http.StatusInternalServerError, api.ReturnMessage(err.Error())) | |
return | |
} | |
defer resp.Body.Close() | |
if resp.StatusCode != http.StatusOK { | |
c.AbortWithStatusJSON(resp.StatusCode, api.ReturnMessage(getSessionKeyErrorMessage)) | |
return | |
} | |
io.Copy(c.Writer, resp.Body) | |
} | |
func GetSubscription(c *gin.Context) { | |
handleGet(c, apiGetSubscription) | |
} | |
func GetApiKeys(c *gin.Context) { | |
handleGet(c, apiGetApiKeys) | |
} | |
//goland:noinspection GoUnhandledErrorResult | |
func handleGet(c *gin.Context, url string) { | |
req, _ := http.NewRequest(http.MethodGet, url, nil) | |
req.Header.Set("Authorization", api.GetAccessToken(c.GetHeader(api.AuthorizationHeader))) | |
resp, _ := api.Client.Do(req) | |
defer resp.Body.Close() | |
io.Copy(c.Writer, resp.Body) | |
} | |
func handlePost(c *gin.Context, url string, data []byte, stream bool) (*http.Response, error) { | |
req, _ := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data)) | |
req.Header.Set("Authorization", api.GetAccessToken(c.GetHeader(api.AuthorizationHeader))) | |
if stream { | |
req.Header.Set("Accept", "text/event-stream") | |
} | |
req.Header.Set("Content-Type", "application/json") | |
resp, err := api.Client.Do(req) | |
if err != nil { | |
c.AbortWithStatusJSON(http.StatusInternalServerError, api.ReturnMessage(err.Error())) | |
return nil, err | |
} | |
return resp, nil | |
} | |