Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
9526605245
5 changed files with 131 additions and 55 deletions
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue