dvc890/go-chatgpt-api
1
1package platform2 3import (4 "bytes"5 "encoding/json"6 "fmt"7 "io"8 "strings"9 10 "github.com/gin-gonic/gin"11 "github.com/linweiyuan/go-chatgpt-api/api"12 13 http "github.com/bogdanfinn/fhttp"14)15 16func ListModels(c *gin.Context) {17 handleGet(c, apiListModels)18}19 20func RetrieveModel(c *gin.Context) {21 model := c.Param("model")22 handleGet(c, fmt.Sprintf(apiRetrieveModel, model))23}24 25//goland:noinspection GoUnhandledErrorResult26func CreateCompletions(c *gin.Context) {27 var request CreateCompletionsRequest28 c.ShouldBindJSON(&request)29 data, _ := json.Marshal(request)30 resp, err := handlePost(c, apiCreateCompletions, data, request.Stream)31 if err != nil {32 return33 }34 35 defer resp.Body.Close()36 if request.Stream {37 api.HandleConversationResponse(c, resp)38 } else {39 io.Copy(c.Writer, resp.Body)40 }41}42 43//goland:noinspection GoUnhandledErrorResult44func CreateChatCompletions(c *gin.Context) {45 var request ChatCompletionsRequest46 c.ShouldBindJSON(&request)47 data, _ := json.Marshal(request)48 resp, err := handlePost(c, apiCreataeChatCompletions, data, request.Stream)49 if err != nil {50 return51 }52 53 defer resp.Body.Close()54 if request.Stream {55 api.HandleConversationResponse(c, resp)56 } else {57 io.Copy(c.Writer, resp.Body)58 }59}60 61//goland:noinspection GoUnhandledErrorResult62func CreateEdit(c *gin.Context) {63 var request CreateEditRequest64 c.ShouldBindJSON(&request)65 data, _ := json.Marshal(request)66 resp, err := handlePost(c, apiCreateEdit, data, false)67 if err != nil {68 return69 }70 71 defer resp.Body.Close()72 io.Copy(c.Writer, resp.Body)73}74 75//goland:noinspection GoUnhandledErrorResult76func CreateImage(c *gin.Context) {77 var request CreateImageRequest78 c.ShouldBindJSON(&request)79 data, _ := json.Marshal(request)80 resp, err := handlePost(c, apiCreateImage, data, false)81 if err != nil {82 return83 }84 85 defer resp.Body.Close()86 io.Copy(c.Writer, resp.Body)87}88 89//goland:noinspection GoUnhandledErrorResult90func CreateEmbeddings(c *gin.Context) {91 var request CreateEmbeddingsRequest92 c.ShouldBindJSON(&request)93 data, _ := json.Marshal(request)94 resp, err := handlePost(c, apiCreateEmbeddings, data, false)95 if err != nil {96 return97 }98 99 defer resp.Body.Close()100 io.Copy(c.Writer, resp.Body)101}102 103func CreateModeration(c *gin.Context) {104 var request CreateModerationRequest105 c.ShouldBindJSON(&request)106 data, _ := json.Marshal(request)107 resp, err := handlePost(c, apiCreateModeration, data, false)108 if err != nil {109 return110 }111 112 defer resp.Body.Close()113 io.Copy(c.Writer, resp.Body)114}115 116func ListFiles(c *gin.Context) {117 handleGet(c, apiListFiles)118}119 120func GetCreditGrants(c *gin.Context) {121 handleGet(c, apiGetCreditGrants)122}123 124//goland:noinspection GoUnhandledErrorResult125func Login(c *gin.Context) {126 var loginInfo api.LoginInfo127 if err := c.ShouldBindJSON(&loginInfo); err != nil {128 c.AbortWithStatusJSON(http.StatusBadRequest, api.ReturnMessage(api.ParseUserInfoErrorMessage))129 return130 }131 132 userLogin := UserLogin{133 client: api.NewHttpClient(),134 }135 136 // hard refresh cookies137 resp, _ := userLogin.client.Get(auth0LogoutUrl)138 defer resp.Body.Close()139 140 // get authorized url141 authorizedUrl, statusCode, err := userLogin.GetAuthorizedUrl("")142 if err != nil {143 c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error()))144 return145 }146 147 // get state148 state, _, _ := userLogin.GetState(authorizedUrl)149 150 // check username151 statusCode, err = userLogin.CheckUsername(state, loginInfo.Username)152 if err != nil {153 c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error()))154 return155 }156 157 // check password158 code, statusCode, err := userLogin.CheckPassword(state, loginInfo.Username, loginInfo.Password)159 if err != nil {160 c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error()))161 return162 }163 164 // get access token165 accessToken, statusCode, err := userLogin.GetAccessToken(code)166 if err != nil {167 c.AbortWithStatusJSON(statusCode, api.ReturnMessage(err.Error()))168 return169 }170 171 // get session key172 var getAccessTokenResponse GetAccessTokenResponse173 json.Unmarshal([]byte(accessToken), &getAccessTokenResponse)174 req, _ := http.NewRequest(http.MethodPost, dashboardLoginUrl, strings.NewReader("{}"))175 req.Header.Set("Content-Type", "application/json")176 req.Header.Set("User-Agent", api.UserAgent)177 req.Header.Set("Authorization", api.GetAccessToken(getAccessTokenResponse.AccessToken))178 resp, err = userLogin.client.Do(req)179 if err != nil {180 c.AbortWithStatusJSON(http.StatusInternalServerError, api.ReturnMessage(err.Error()))181 return182 }183 184 defer resp.Body.Close()185 if resp.StatusCode != http.StatusOK {186 c.AbortWithStatusJSON(resp.StatusCode, api.ReturnMessage(getSessionKeyErrorMessage))187 return188 }189 190 io.Copy(c.Writer, resp.Body)191}192 193func GetSubscription(c *gin.Context) {194 handleGet(c, apiGetSubscription)195}196 197func GetApiKeys(c *gin.Context) {198 handleGet(c, apiGetApiKeys)199}200 201//goland:noinspection GoUnhandledErrorResult202func handleGet(c *gin.Context, url string) {203 req, _ := http.NewRequest(http.MethodGet, url, nil)204 req.Header.Set("Authorization", api.GetAccessToken(c.GetHeader(api.AuthorizationHeader)))205 resp, _ := api.Client.Do(req)206 defer resp.Body.Close()207 io.Copy(c.Writer, resp.Body)208}209 210func handlePost(c *gin.Context, url string, data []byte, stream bool) (*http.Response, error) {211 req, _ := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data))212 req.Header.Set("Authorization", api.GetAccessToken(c.GetHeader(api.AuthorizationHeader)))213 if stream {214 req.Header.Set("Accept", "text/event-stream")215 }216 req.Header.Set("Content-Type", "application/json")217 resp, err := api.Client.Do(req)218 if err != nil {219 c.AbortWithStatusJSON(http.StatusInternalServerError, api.ReturnMessage(err.Error()))220 return nil, err221 }222 223 return resp, nil224}225 