Skip to content

Commit b39ef27

Browse files
committed
release: bump version to 2.3.0
- 新增聊天会话状态管理,跟踪会话ID、父消息ID等信息 - 重构请求处理流程,集成会话状态自动注入 - 新增多轮对话状态持久化 - 新增websocket代理和流式响应支持 - 调整环境变量加载顺序 - 新增大量单元测试覆盖新功能
1 parent fa21523 commit b39ef27

8 files changed

Lines changed: 1927 additions & 131 deletions

File tree

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.2.9
1+
2.3.0

initialize/handlers.go

Lines changed: 102 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919

2020
"github.com/gin-gonic/gin"
2121
"github.com/google/uuid"
22+
"github.com/gorilla/websocket"
2223
)
2324

2425
type Handler struct {
@@ -42,9 +43,13 @@ func NewHandle(proxy *proxys.IProxy, token *tokens.AccessToken) *Handler {
4243

4344
// initTurnStileWithRetry 初始化 turnstile,当 paid token 返回 401 时自动禁用并轮询下一个
4445
func (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+
67115
func (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

Comments
 (0)