diff --git a/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20230304000547-ibldj1z.sy b/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20230304000547-ibldj1z.sy index a787e959a..a25bc9ffe 100644 --- a/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20230304000547-ibldj1z.sy +++ b/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20230304000547-ibldj1z.sy @@ -5,7 +5,7 @@ "Properties": { "id": "20230304000547-ibldj1z", "title": "Artificial Intelligence", - "updated": "20230304171533" + "updated": "20230305102525" }, "Children": [ { @@ -70,7 +70,7 @@ }, "Properties": { "id": "20230304000646-a5e7srt", - "updated": "20230304171533" + "updated": "20230305102525" }, "Children": [ { @@ -114,7 +114,7 @@ }, "Properties": { "id": "20230304000646-6207b6r", - "updated": "20230304171533" + "updated": "20230305102525" }, "Children": [ { @@ -137,7 +137,7 @@ "ListData": {}, "Properties": { "id": "20230304000646-aj5szch", - "updated": "20230304171533" + "updated": "20230305102525" }, "Children": [ { @@ -186,7 +186,7 @@ }, "Properties": { "id": "20230304000646-78w2ck5", - "updated": "20230304000646" + "updated": "20230305102525" }, "Children": [ { @@ -194,7 +194,7 @@ "Type": "NodeParagraph", "Properties": { "id": "20230304000646-2blt9e0", - "updated": "20230304000646" + "updated": "20230305102525" }, "Children": [ { @@ -208,7 +208,7 @@ }, { "Type": "NodeText", - "Data": "​ specifies the timeout time (seconds), the default is 15 seconds (optional)" + "Data": "​ specifies the timeout time (seconds), the default is 30 seconds (optional)" } ] } diff --git a/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20230303235619-ex5l63e.sy b/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20230303235619-ex5l63e.sy index 5412ff89b..9e8b0fda7 100644 --- a/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20230303235619-ex5l63e.sy +++ b/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20230303235619-ex5l63e.sy @@ -5,7 +5,7 @@ "Properties": { "id": "20230303235619-ex5l63e", "title": "人工智能", - "updated": "20230304171349" + "updated": "20230305102554" }, "Children": [ { @@ -70,7 +70,7 @@ }, "Properties": { "id": "20230303235749-kurfjky", - "updated": "20230304171349" + "updated": "20230305102554" }, "Children": [ { @@ -114,7 +114,7 @@ }, "Properties": { "id": "20230303235819-0o648f9", - "updated": "20230304171349" + "updated": "20230305102554" }, "Children": [ { @@ -137,7 +137,7 @@ "ListData": {}, "Properties": { "id": "20230303235950-z00ou0r", - "updated": "20230304171349" + "updated": "20230305102554" }, "Children": [ { @@ -186,7 +186,7 @@ }, "Properties": { "id": "20230303235950-l6o3a5a", - "updated": "20230303235950" + "updated": "20230305102554" }, "Children": [ { @@ -194,7 +194,7 @@ "Type": "NodeParagraph", "Properties": { "id": "20230303235950-zfhft7e", - "updated": "20230303235950" + "updated": "20230305102554" }, "Children": [ { @@ -208,7 +208,7 @@ }, { "Type": "NodeText", - "Data": "​ 指定超时时间(秒),默认为 15 秒(可选)" + "Data": "​ 指定超时时间(秒),默认为 30 秒(可选)" } ] } diff --git a/app/guide/20211226090932-5lcq56f/20211226115423-d5z1joq/20211226121203-rjjngpz/20230304000829-9jwu3po.sy b/app/guide/20211226090932-5lcq56f/20211226115423-d5z1joq/20211226121203-rjjngpz/20230304000829-9jwu3po.sy index 8f784b3c7..db97e3ec5 100644 --- a/app/guide/20211226090932-5lcq56f/20211226115423-d5z1joq/20211226121203-rjjngpz/20230304000829-9jwu3po.sy +++ b/app/guide/20211226090932-5lcq56f/20211226115423-d5z1joq/20211226121203-rjjngpz/20230304000829-9jwu3po.sy @@ -5,7 +5,7 @@ "Properties": { "id": "20230304000829-9jwu3po", "title": "人工智能", - "updated": "20230304171553" + "updated": "20230305102546" }, "Children": [ { @@ -70,7 +70,7 @@ }, "Properties": { "id": "20230304000837-t0swnf6", - "updated": "20230304171553" + "updated": "20230305102546" }, "Children": [ { @@ -114,7 +114,7 @@ }, "Properties": { "id": "20230304000837-ktv65zx", - "updated": "20230304171553" + "updated": "20230305102546" }, "Children": [ { @@ -137,7 +137,7 @@ "ListData": {}, "Properties": { "id": "20230304000837-8z180b1", - "updated": "20230304171553" + "updated": "20230305102546" }, "Children": [ { @@ -186,7 +186,7 @@ }, "Properties": { "id": "20230304000837-71slt0q", - "updated": "20230304000837" + "updated": "20230305102546" }, "Children": [ { @@ -194,7 +194,7 @@ "Type": "NodeParagraph", "Properties": { "id": "20230304000837-t2um8y2", - "updated": "20230304000837" + "updated": "20230305102546" }, "Children": [ { @@ -208,7 +208,7 @@ }, { "Type": "NodeText", - "Data": "​ 指定超時時間(秒),默認為 15 秒(可選)" + "Data": "​ 指定超時時間(秒),默認為 30 秒(可選)" } ] } diff --git a/kernel/util/openai.go b/kernel/util/openai.go index ada939c33..5a549239d 100644 --- a/kernel/util/openai.go +++ b/kernel/util/openai.go @@ -19,9 +19,6 @@ package util import ( "bytes" "context" - "errors" - "github.com/88250/lute/html" - "io" "net/http" "net/url" "os" @@ -35,7 +32,7 @@ import ( var ( OpenAIAPIKey = "" - OpenAIAPITimeout = 15 * time.Second + OpenAIAPITimeout = 30 * time.Second OpenAIAPIProxy = "" OpenAIAPIMaxTokens = 0 ) @@ -57,7 +54,25 @@ func ChatGPTContinueWrite(msg string, contextMsgs []string) (ret string, retCont defer ClearPushProgress(100) c := newOpenAIClient() + buf := &bytes.Buffer{} + for i := 0; i < 7; i++ { + part, stop := chatGPT(msg, contextMsgs, c) + buf.WriteString(part) + if stop { + break + } + + PushEndlessProgress("Continue writing...") + } + + ret = buf.String() + ret = strings.TrimSpace(ret) + retContextMsgs = append(retContextMsgs, msg, ret) + return +} + +func chatGPT(msg string, contextMsgs []string, c *gogpt.Client) (ret string, stop bool) { var reqMsgs []gogpt.ChatCompletionMessage if 7 < len(contextMsgs) { contextMsgs = contextMsgs[len(contextMsgs)-7:] @@ -81,35 +96,30 @@ func ChatGPTContinueWrite(msg string, contextMsgs []string) (ret string, retCont } ctx, cancel := context.WithTimeout(context.Background(), OpenAIAPITimeout) defer cancel() - stream, err := c.CreateChatCompletionStream(ctx, req) + resp, err := c.CreateChatCompletion(ctx, req) if nil != err { - logging.LogErrorf("create chat completion stream failed: %s", err) + PushErrMsg("Requesting failed, please check kernel log for more details", 3000) + logging.LogErrorf("create chat completion failed: %s", err) + stop = true return } - defer stream.Close() - buf := bytes.Buffer{} - for { - resp, recvErr := stream.Recv() - if errors.Is(recvErr, io.EOF) { - break - } + if 1 > len(resp.Choices) { + stop = true + return + } - if nil != recvErr { - logging.LogErrorf("create chat completion stream recv failed: %s", recvErr) - break - } - - for _, choice := range resp.Choices { - content := choice.Delta.Content - buf.WriteString(content) - PushEndlessProgress(html.EscapeHTMLStr(buf.String())) - } + buf := &strings.Builder{} + choice := resp.Choices[0] + buf.WriteString(choice.Message.Content) + if "length" == choice.FinishReason { + stop = false + } else { + stop = true } ret = buf.String() ret = strings.TrimSpace(ret) - retContextMsgs = append(retContextMsgs, msg, ret) return }