@@ -19,6 +19,7 @@ import (
1919
2020 "github.com/gin-gonic/gin"
2121 "github.com/google/uuid"
22+ "github.com/gorilla/websocket"
2223)
2324
2425type Handler struct {
@@ -42,9 +43,13 @@ func NewHandle(proxy *proxys.IProxy, token *tokens.AccessToken) *Handler {
4243
4344// initTurnStileWithRetry 初始化 turnstile,当 paid token 返回 401 时自动禁用并轮询下一个
4445func (h * Handler ) initTurnStileWithRetry (client * * bogdanfinn.TlsClient , secret * * tokens.Secret , proxyUrl string ) (* chatgpt.TurnStile , int , error ) {
46+ return h .initTurnStileWithRetryState (client , secret , proxyUrl , nil )
47+ }
48+
49+ func (h * Handler ) initTurnStileWithRetryState (client * * bogdanfinn.TlsClient , secret * * tokens.Secret , proxyUrl string , state * chatgpt.ChatClientState ) (* chatgpt.TurnStile , int , error ) {
4550 for {
4651 (* client ).SetCookies ("https://chatgpt.com" , chatgpt .BasicCookies )
47- turnStile , status , err := chatgpt .InitTurnStile (* client , * secret , proxyUrl )
52+ turnStile , status , err := chatgpt .InitTurnStileWithState (* client , * secret , proxyUrl , state )
4853 if err == nil {
4954 return turnStile , status , nil
5055 }
@@ -64,6 +69,49 @@ func (h *Handler) initTurnStileWithRetry(client **bogdanfinn.TlsClient, secret *
6469 }
6570}
6671
72+ func (h * Handler ) postConversationGptClientOrder (client * * bogdanfinn.TlsClient , secret * * tokens.Secret , translatedRequest chatgpt_types.ChatGPTRequest , proxyUrl string , stream bool , state * chatgpt.ChatClientState ) (* http.Response , * websocket.Conn , int , error ) {
73+ if state != nil {
74+ state .ApplyToRequest (& translatedRequest )
75+ }
76+ turnTraceID := uuid .NewString ()
77+ secretTokenBefore := ""
78+ if * secret != nil {
79+ secretTokenBefore = (* secret ).Token
80+ }
81+ conduitToken , err := chatgpt .PrepareConversationConduitWithState (* client , translatedRequest , * secret , proxyUrl , turnTraceID , state )
82+ if err != nil {
83+ return nil , nil , http .StatusInternalServerError , err
84+ }
85+
86+ turnStile , status , err := h .initTurnStileWithRetryState (client , secret , proxyUrl , state )
87+ if err != nil {
88+ return nil , nil , status , err
89+ }
90+ if * secret != nil && (* secret ).Token != secretTokenBefore {
91+ conduitToken , err = chatgpt .PrepareConversationConduitWithState (* client , translatedRequest , * secret , proxyUrl , turnTraceID , state )
92+ if err != nil {
93+ return nil , nil , http .StatusInternalServerError , err
94+ }
95+ }
96+
97+ var wsConn * websocket.Conn
98+ if stream {
99+ wsConn , err = chatgpt .DialChatWebsocketWithStateAndProxy (* client , * secret , state , proxyUrl )
100+ if err != nil {
101+ return nil , nil , http .StatusInternalServerError , err
102+ }
103+ }
104+
105+ response , err := chatgpt .POSTconversationPreparedWithState (* client , translatedRequest , * secret , turnStile , proxyUrl , conduitToken , turnTraceID , state )
106+ if err != nil {
107+ if wsConn != nil {
108+ wsConn .Close ()
109+ }
110+ return nil , nil , http .StatusInternalServerError , err
111+ }
112+ return response , wsConn , http .StatusOK , nil
113+ }
114+
67115func (h * Handler ) refresh (c * gin.Context ) {
68116 var refreshToken officialtypes.OpenAIRefreshToken
69117 err := c .BindJSON (& refreshToken )
@@ -236,29 +284,22 @@ func (h *Handler) nightmare(c *gin.Context) {
236284
237285 uid := uuid .NewString ()
238286 client := bogdanfinn .NewStdClient ()
239- turnStile , status , err := h .initTurnStileWithRetry (& client , & secret , proxyUrl )
240- if err != nil {
241- c .JSON (status , gin.H {
242- "message" : err .Error (),
243- "type" : "InitTurnStile_request_error" ,
244- "param" : err ,
245- "code" : status ,
246- })
247- return
248- }
249287
250288 // Convert the chat request to a ChatGPT request
251289 translated_request := chatgptrequestconverter .ConvertAPIRequest (original_request , secret , proxyUrl )
290+ clientState := chatgpt .NewChatClientState ()
291+ clientState .ConversationID = translated_request .ConversationID
292+ clientState .ParentMessageID = translated_request .ParentMessageID
252293
253294 // Use the model from the original request, default to "auto"
254295 reqModel := original_request .Model
255296 if reqModel == "" {
256297 reqModel = "auto"
257298 }
258299
259- response , err := chatgpt . POSTconversation ( client , translated_request , secret , turnStile , proxyUrl )
300+ response , wsConn , status , err := h . postConversationGptClientOrder ( & client , & secret , translated_request , proxyUrl , original_request . Stream , clientState )
260301 if err != nil {
261- c .JSON (500 , gin.H {"error" : gin.H {
302+ c .JSON (status , gin.H {"error" : gin.H {
262303 "message" : err .Error (),
263304 "type" : "request_conversion_error" ,
264305 "param" : "model" ,
@@ -268,6 +309,10 @@ func (h *Handler) nightmare(c *gin.Context) {
268309 }
269310 defer response .Body .Close ()
270311 if chatgpt .Handle_request_error (c , response ) {
312+ if wsConn != nil {
313+ wsConn .Close ()
314+ wsConn = nil
315+ }
271316 return
272317 }
273318 var full_response string
@@ -286,7 +331,13 @@ func (h *Handler) nightmare(c *gin.Context) {
286331 }
287332 for i := 3 ; i > 0 ; i -- {
288333 var continue_info * chatgpt.ContinueInfo
289- result := chatgpt .HandlerDetailed (c , response , client , secret , uid , translated_request , original_request .Stream , reqModel )
334+ result := chatgpt .HandlerDetailedWithOptions (c , response , client , secret , uid , translated_request , original_request .Stream , reqModel , chatgpt.HandlerDetailedOptions {
335+ Websocket : wsConn ,
336+ ClientState : clientState ,
337+ ArtifactDelivery : original_request .ArtifactDelivery ,
338+ ProxyURL : proxyUrl ,
339+ })
340+ wsConn = nil
290341 continue_info = result .Continue
291342 full_response += result .Text
292343 if result .ConversationID != "" {
@@ -296,6 +347,11 @@ func (h *Handler) nightmare(c *gin.Context) {
296347 if result .StopSent {
297348 stopSent = true
298349 }
350+ parentMessageID := result .ParentMessageID
351+ if continue_info != nil {
352+ parentMessageID = continue_info .ParentID
353+ }
354+ clientState .NoteTurnResult (result .ConversationID , parentMessageID )
299355 if continue_info == nil {
300356 break
301357 }
@@ -304,9 +360,9 @@ func (h *Handler) nightmare(c *gin.Context) {
304360 translated_request .ConversationID = continue_info .ConversationID
305361 translated_request .ParentMessageID = continue_info .ParentID
306362
307- response , err := chatgpt . POSTconversation ( client , translated_request , secret , turnStile , proxyUrl )
363+ response , wsConn , status , err = h . postConversationGptClientOrder ( & client , & secret , translated_request , proxyUrl , original_request . Stream , clientState )
308364 if err != nil {
309- c .JSON (500 , gin.H {"error" : gin.H {
365+ c .JSON (status , gin.H {"error" : gin.H {
310366 "message" : err .Error (),
311367 "type" : "request_conversion_error" ,
312368 "param" : "model" ,
@@ -316,6 +372,10 @@ func (h *Handler) nightmare(c *gin.Context) {
316372 }
317373 defer response .Body .Close ()
318374 if chatgpt .Handle_request_error (c , response ) {
375+ if wsConn != nil {
376+ wsConn .Close ()
377+ wsConn = nil
378+ }
319379 return
320380 }
321381 }
@@ -377,26 +437,19 @@ func (h *Handler) responses(c *gin.Context) {
377437
378438 uid := uuid .NewString ()
379439 client := bogdanfinn .NewStdClient ()
380- turnStile , status , err := h .initTurnStileWithRetry (& client , & secret , proxyUrl )
381- if err != nil {
382- c .JSON (status , gin.H {
383- "message" : err .Error (),
384- "type" : "InitTurnStile_request_error" ,
385- "param" : err ,
386- "code" : status ,
387- })
388- return
389- }
390440
391441 translated_request := chatgptrequestconverter .ConvertAPIRequest (original_request , secret , proxyUrl )
442+ clientState := chatgpt .NewChatClientState ()
443+ clientState .ConversationID = translated_request .ConversationID
444+ clientState .ParentMessageID = translated_request .ParentMessageID
392445 reqModel := original_request .Model
393446 if reqModel == "" {
394447 reqModel = "auto"
395448 }
396449
397- response , err := chatgpt . POSTconversation ( client , translated_request , secret , turnStile , proxyUrl )
450+ response , wsConn , status , err := h . postConversationGptClientOrder ( & client , & secret , translated_request , proxyUrl , false , clientState )
398451 if err != nil {
399- c .JSON (500 , gin.H {"error" : gin.H {
452+ c .JSON (status , gin.H {"error" : gin.H {
400453 "message" : err .Error (),
401454 "type" : "request_conversion_error" ,
402455 "param" : "model" ,
@@ -406,15 +459,29 @@ func (h *Handler) responses(c *gin.Context) {
406459 }
407460 defer response .Body .Close ()
408461 if chatgpt .Handle_request_error (c , response ) {
462+ if wsConn != nil {
463+ wsConn .Close ()
464+ wsConn = nil
465+ }
409466 return
410467 }
411468
412469 var full_response string
413470 for i := 3 ; i > 0 ; i -- {
414471 var continue_info * chatgpt.ContinueInfo
415472 var response_part string
416- response_part , continue_info = chatgpt .Handler (c , response , client , secret , uid , translated_request , false , reqModel )
473+ result := chatgpt .HandlerDetailedWithOptions (c , response , client , secret , uid , translated_request , false , reqModel , chatgpt.HandlerDetailedOptions {
474+ Websocket : wsConn ,
475+ ClientState : clientState ,
476+ })
477+ wsConn = nil
478+ response_part , continue_info = result .Text , result .Continue
417479 full_response += response_part
480+ parentMessageID := result .ParentMessageID
481+ if continue_info != nil {
482+ parentMessageID = continue_info .ParentID
483+ }
484+ clientState .NoteTurnResult (result .ConversationID , parentMessageID )
418485 if continue_info == nil {
419486 break
420487 }
@@ -423,9 +490,9 @@ func (h *Handler) responses(c *gin.Context) {
423490 translated_request .ConversationID = continue_info .ConversationID
424491 translated_request .ParentMessageID = continue_info .ParentID
425492
426- response , err = chatgpt . POSTconversation ( client , translated_request , secret , turnStile , proxyUrl )
493+ response , wsConn , status , err = h . postConversationGptClientOrder ( & client , & secret , translated_request , proxyUrl , false , clientState )
427494 if err != nil {
428- c .JSON (500 , gin.H {"error" : gin.H {
495+ c .JSON (status , gin.H {"error" : gin.H {
429496 "message" : err .Error (),
430497 "type" : "request_conversion_error" ,
431498 "param" : "model" ,
@@ -435,6 +502,10 @@ func (h *Handler) responses(c *gin.Context) {
435502 }
436503 defer response .Body .Close ()
437504 if chatgpt .Handle_request_error (c , response ) {
505+ if wsConn != nil {
506+ wsConn .Close ()
507+ wsConn = nil
508+ }
438509 return
439510 }
440511 }
0 commit comments