CoolFace
Apppublic

dvc890/go-chatgpt-api

sourceHugging Faceupdated 3y agoView on Hugging Face
1likes
api.go225 linesDownload Raw Back to platform
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