gin 接入 openai API 文本对话请求,并实时检验key是否过期,自动切换key的代码
时间: 2023-05-26 17:01:18 浏览: 204
gin-swagger:可旋转的DRY模板
A:以下是使用gin接入openai API文本对话请求,并实时检验key是否过期,自动切换key的代码示例:
```
import (
"net/http"
"time"
"encoding/json"
"github.com/gin-gonic/gin"
)
type OpenAIAuth struct {
apiKey string
expireAt time.Time
}
var authList = []OpenAIAuth{
{
apiKey: "apikey1",
expireAt: time.Now().Add(time.Hour),
},
{
apiKey: "apikey2",
expireAt: time.Now().Add(time.Hour),
},
// add more api keys if you have
}
func main() {
r := gin.Default()
r.POST("/chat", handleChatRequest)
r.Run(":8080")
}
func handleChatRequest(c *gin.Context) {
requestBody := struct {
Text string `json:"text"`
}{}
err := c.BindJSON(&requestBody)
if err != nil {
c.Status(http.StatusBadRequest)
return
}
client := &http.Client{}
var resp *http.Response
var body []byte
var auth OpenAIAuth
for _, a := range authList {
if a.expireAt.Before(time.Now()) {
continue
}
req, err := http.NewRequest("POST", "https://api.openai.com/v1/engine/text-davinci-002/completions", nil)
if err != nil {
// handle error
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer " + a.apiKey)
params := struct {
Prompt string `json:"prompt"`
MaxTokens int `json:"max_tokens"`
}{
Prompt: requestBody.Text,
MaxTokens: 150,
}
jsonBody, err := json.Marshal(params)
if err != nil {
// handle error
}
req.Body = ioutil.NopCloser(bytes.NewBuffer(jsonBody))
resp, err = client.Do(req)
if err != nil {
// handle error
}
body, err = ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
auth = a
break
}
if resp.StatusCode != http.StatusOK {
c.Status(http.StatusInternalServerError)
return
}
response := struct {
Choices []struct {
Text string `json:"text"`
} `json:"choices"`
}{}
err = json.Unmarshal(body, &response)
if err != nil {
// handle error
}
c.JSON(http.StatusOK, gin.H{
"response": response.Choices[0].Text,
})
if auth.expireAt.Before(time.Now().Add(time.Minute)) {
// need to update the auth key
newAuth := OpenAIAuth{
apiKey: "new api key",
expireAt: time.Now().Add(time.Hour),
}
authList = append(authList, newAuth)
}
}
```
以上代码中,我们首先定义了一个OpenAIAuth结构体,其中包含了一个api key和过期时间。同时,我们还定义了一个authList数组,用于存储所有的api key。在接到文本对话请求时,我们会遍历authList中的所有api key,找到一个未过期的key用于发送请求。如果所有的key都已过期,则返回错误。同时,如果当前使用的key的过期时间距离当前时间不足1分钟,则需要更新该key。在代码的最后,我们通过调用c.JSON函数将对话响应发送给客户端。
需要注意的是,以上代码仅用于示例,需要根据实际场景进行修改。
阅读全文