解决ChatGPT open api请求失败&超时的问题

1,058 阅读1分钟

问题

curl: (28) Failed to connect to api.openai.com port 443: Connection timed out

前提

在有科学上网的情况下,开全局模式依然会请求不通,解决方式

  • github上有一些代理方案借助于第三方例如:github.com/justjavac/o…; 还有一些其他的原理一样,这个的好处是一键部署,省时省力,但是会有实效性,所以决定用自己方式解决

解决方式

  • 我这里直接用go举个例子,其他同理,可以直接用ChatGPT转js或者java都可以,我试过了,话不多说直接贴代码了 `
func ChatCompletions(c *gin.Context) {
   var (
      appG = app.Gin{C: c}
      form ChatForm
   )
   httpCode, errCode := app.BindAndValid(c, &form)

   if errCode != e.SUCCESS {
      appG.Response(httpCode, errCode, nil)
      return
   }
   ctx := context.Background()
   log.Printf("[info]ChatCompletions %s", form.Text)

   // 设置代理
   proxyURL := "http://127.0.0.1:7890"
   proxy := func(_ *http.Request) (*url.URL, error) {
      return url.Parse(proxyURL)
   }
   transport := &http.Transport{Proxy: proxy}
   httpClient := &http.Client{Transport: transport}

   cfg := openai.DefaultConfig("apiKey")
   cfg.BaseURL = "https://api.openai.com/v1"
   cfg.HTTPClient = httpClient // 使用代理的 HTTP 客户端

   client := openai.NewClientWithConfig(cfg)
   var str = "你作为一个作家,将我书写的内容续写成一个富有戏剧性故事"
   req := openai.ChatCompletionRequest{
      Model:   openai.GPT3Dot5Turbo1106,
      MaxTokens: 1024,
      Messages: []openai.ChatCompletionMessage{
         {
            Role:    openai.ChatMessageRoleUser,
            Content: str + form.Text,
         },
      },
      Stream: true,
   }
   stream, err := client.CreateChatCompletionStream(ctx, req)
   if err != nil {
      log.Printf("ChatCompletionStream error: %v\n", err)
      appG.Response(http.StatusInternalServerError, e.ERROR, nil)
      return
   }

   defer stream.Close()
   for {
      response, err := stream.Recv()
      if errors.Is(err, io.EOF) {
         fmt.Println("\nStream finished")
         return
      }

      if err != nil {
         log.Printf("\nStream error: %v\n", err)
         appG.Response(http.StatusInternalServerError, e.ERROR, nil)
         return
      }

      appG.StreamResponse(http.StatusOK, e.SUCCESS, response)
   }
}

http://127.0.0.1:7890 这个是代理的前提,懂得都懂

下面是我的前端项目截图

WX20240116-190620@2x.png