Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2023-03-08 20:22:25 +08:00
commit 9526605245
5 changed files with 131 additions and 55 deletions

View file

@ -909,7 +909,7 @@
"task.history.database.index.commit": "Ejecutar la confirmación del índice de la base de datos del historial",
"task.database.index.embedBlock": "Ejecutar bloque de incrustación de índice de base de datos",
"task.reload.ui": "IU de recarga de tareas",
"task.upgrade.userGuide": "Ejecutar la guía de usuario de actualización",
"task.upgrade.userGuide": "Ejecutar la guía de usuario de actualización"
},
"_trayMenu": {
"showWindow": "Mostrar ventana",

View file

@ -909,7 +909,7 @@
"task.history.database.index.commit": "Effectuer la validation de l'index de la base de données d'historique",
"task.database.index.embedBlock": "Exécuter le bloc d'intégration d'index de base de données",
"task.reload.ui": "Interface utilisateur de rechargement de tâche",
"task.upgrade.userGuide": "Mise à niveau de la tâche de guide utilisateur",
"task.upgrade.userGuide": "Mise à niveau de la tâche de guide utilisateur"
},
"_trayMenu": {
"showWindow": "Afficher la fenêtre principale",

View file

@ -18,6 +18,7 @@ package model
import (
"bytes"
"strings"
"github.com/88250/lute/ast"
"github.com/88250/lute/parse"
@ -25,22 +26,69 @@ import (
"github.com/siyuan-note/siyuan/kernel/util"
)
func ChatGPT(msg string) (ret string) {
if !isOpenAIAPIEnabled() {
return
}
return chatGPT(msg, false)
}
func ChatGPTWithAction(ids []string, action string) (ret string) {
if !isOpenAIAPIEnabled() {
return
}
msg := getBlocksContent(ids)
ret = util.ChatGPTWithAction(msg, action)
ret = chatGPTWithAction(msg, action, false)
return
}
func ChatGPT(msg string) (ret string) {
if !isOpenAIAPIEnabled() {
return
var cachedContextMsg []string
func chatGPT(msg string, cloud bool) (ret string) {
ret, retCtxMsgs := chatGPTContinueWrite(msg, cachedContextMsg, cloud)
cachedContextMsg = append(cachedContextMsg, retCtxMsgs...)
return
}
func chatGPTWithAction(msg string, action string, cloud bool) (ret string) {
msg = action + ":\n\n" + msg
ret, _ = chatGPTContinueWrite(msg, nil, cloud)
return
}
func chatGPTContinueWrite(msg string, contextMsgs []string, cloud bool) (ret string, retContextMsgs []string) {
util.PushEndlessProgress("Requesting...")
defer util.ClearPushProgress(100)
if 7 < len(contextMsgs) {
contextMsgs = contextMsgs[len(contextMsgs)-7:]
}
return util.ChatGPT(msg)
c := util.NewOpenAIClient()
buf := &bytes.Buffer{}
for i := 0; i < 7; i++ {
var part string
var stop bool
if cloud {
part, stop = CloudChatGPT(msg, contextMsgs)
} else {
part, stop = util.ChatGPT(msg, contextMsgs, c)
}
buf.WriteString(part)
if stop {
break
}
util.PushEndlessProgress("Continue requesting...")
}
ret = buf.String()
ret = strings.TrimSpace(ret)
retContextMsgs = append(retContextMsgs, msg, ret)
return
}
func isOpenAIAPIEnabled() bool {

View file

@ -36,6 +36,66 @@ import (
var ErrFailedToConnectCloudServer = errors.New("failed to connect cloud server")
func CloudChatGPT(msg string, contextMsgs []string) (ret string, stop bool) {
if nil == Conf.User {
return
}
payload := map[string]interface{}{}
var messages []map[string]interface{}
for _, contextMsg := range contextMsgs {
messages = append(messages, map[string]interface{}{
"role": "user",
"content": contextMsg,
})
}
messages = append(messages, map[string]interface{}{
"role": "user",
"content": msg,
})
payload["messages"] = messages
requestResult := gulu.Ret.NewResult()
request := httpclient.NewCloudRequest30s()
_, err := request.
SetSuccessResult(requestResult).
SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
SetBody(payload).
Post(util.AliyunServer + "/apis/siyuan/ai/chatGPT")
if nil != err {
logging.LogErrorf("chat gpt failed: %s", err)
err = ErrFailedToConnectCloudServer
return
}
if 0 != requestResult.Code {
err = errors.New(requestResult.Msg)
stop = true
return
}
data := requestResult.Data.(map[string]interface{})
choices := data["choices"].([]interface{})
if 1 > len(choices) {
stop = true
return
}
choice := choices[0].(map[string]interface{})
message := choice["message"].(map[string]interface{})
ret = message["content"].(string)
if nil != choice["finish_reason"] {
finishReason := choice["finish_reason"].(string)
if "length" == finishReason {
stop = false
} else {
stop = true
}
} else {
stop = true
}
return
}
func StartFreeTrial() (err error) {
if nil == Conf.User {
return errors.New(Conf.Language(31))

View file

@ -17,7 +17,6 @@
package util
import (
"bytes"
"context"
"net/http"
"net/url"
@ -35,54 +34,11 @@ var (
OpenAIAPITimeout = 30 * time.Second
OpenAIAPIProxy = ""
OpenAIAPIMaxTokens = 0
OpenAIAPIBaseURL = "https://api.openai.com/v1"
)
var cachedContextMsg []string
func ChatGPT(msg string) (ret string) {
ret, retCtxMsgs := ChatGPTContinueWrite(msg, cachedContextMsg)
cachedContextMsg = append(cachedContextMsg, retCtxMsgs...)
return
}
func ChatGPTWithAction(msg string, action string) (ret string) {
msg = action + ":\n\n" + msg
ret, _ = ChatGPTContinueWrite(msg, nil)
return
}
func ChatGPTContinueWrite(msg string, contextMsgs []string) (ret string, retContextMsgs []string) {
if "" == OpenAIAPIKey {
return
}
PushEndlessProgress("Requesting...")
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 requesting...")
}
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) {
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:]
}
for _, ctxMsg := range contextMsgs {
reqMsgs = append(reqMsgs, gogpt.ChatCompletionMessage{
@ -129,7 +85,7 @@ func chatGPT(msg string, contextMsgs []string, c *gogpt.Client) (ret string, sto
return
}
func newOpenAIClient() *gogpt.Client {
func NewOpenAIClient() *gogpt.Client {
config := gogpt.DefaultConfig(OpenAIAPIKey)
if "" != OpenAIAPIProxy {
proxyUrl, err := url.Parse(OpenAIAPIProxy)
@ -139,6 +95,8 @@ func newOpenAIClient() *gogpt.Client {
config.HTTPClient = &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
}
}
config.BaseURL = OpenAIAPIBaseURL
return gogpt.NewClientWithConfig(config)
}
@ -169,5 +127,15 @@ func initOpenAI() {
}
}
logging.LogInfof("OpenAI API enabled [maxTokens=%d, timeout=%ds, proxy=%s]", OpenAIAPIMaxTokens, int(OpenAIAPITimeout.Seconds()), OpenAIAPIProxy)
baseURL := os.Getenv("SIYUAN_OPENAI_API_BASE_URL")
if "" != baseURL {
OpenAIAPIBaseURL = baseURL
}
logging.LogInfof("OpenAI API enabled\n"+
" baseURL=%s\n"+
" timeout=%ds\n"+
" proxy=%s\n"+
" maxTokens=%d",
OpenAIAPIBaseURL, int(OpenAIAPITimeout.Seconds()), OpenAIAPIProxy, OpenAIAPIMaxTokens)
}