mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-19 17:56:39 +08:00
定期清理用户聊天会话上下文 ChatContext
This commit is contained in:
parent
4e575d01db
commit
cb2b01127b
@ -80,9 +80,9 @@ func (s *Server) sendMessage(session types.ChatSession, role types.ChatRole, pro
|
|||||||
Stream: true,
|
Stream: true,
|
||||||
}
|
}
|
||||||
var context []types.Message
|
var context []types.Message
|
||||||
var key = session.SessionId + role.Name
|
var ctxKey = fmt.Sprintf("%s-%s", session.SessionId, role.Key)
|
||||||
if v, ok := s.ChatContext[key]; ok && s.Config.Chat.EnableContext {
|
if v, ok := s.ChatContexts[ctxKey]; ok && s.Config.Chat.EnableContext {
|
||||||
context = v
|
context = v.Messages
|
||||||
} else {
|
} else {
|
||||||
context = role.Context
|
context = role.Context
|
||||||
}
|
}
|
||||||
@ -206,7 +206,11 @@ func (s *Server) sendMessage(session types.ChatSession, role types.ChatRole, pro
|
|||||||
context = append(context, useMsg)
|
context = append(context, useMsg)
|
||||||
message.Content = strings.Join(contents, "")
|
message.Content = strings.Join(contents, "")
|
||||||
context = append(context, message)
|
context = append(context, message)
|
||||||
s.ChatContext[key] = context
|
// 更新上下文消息
|
||||||
|
s.ChatContexts[ctxKey] = types.ChatContext{
|
||||||
|
Messages: context,
|
||||||
|
LastAccessTime: time.Now().Unix(),
|
||||||
|
}
|
||||||
|
|
||||||
// 追加历史消息
|
// 追加历史消息
|
||||||
if user.EnableHistory {
|
if user.EnableHistory {
|
||||||
|
@ -63,6 +63,18 @@ func (s *Server) ConfigSetHandle(c *gin.Context) {
|
|||||||
s.Config.Chat.EnableContext = v
|
s.Config.Chat.EnableContext = v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if expireTime, ok := data["chat_context_expire_time"]; ok {
|
||||||
|
v, err := strconv.Atoi(expireTime)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusOK, types.BizVo{
|
||||||
|
Code: types.InvalidParams,
|
||||||
|
Message: "chat_context_expire_time must be a integer parameter",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.Config.Chat.ChatContextExpireTime = v
|
||||||
|
}
|
||||||
|
|
||||||
// enable auth
|
// enable auth
|
||||||
if enableAuth, ok := data["enable_auth"]; ok {
|
if enableAuth, ok := data["enable_auth"]; ok {
|
||||||
v, err := strconv.ParseBool(enableAuth)
|
v, err := strconv.ParseBool(enableAuth)
|
||||||
@ -123,7 +135,7 @@ func (s *Server) AddUserHandle(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
user := types.User{Name: data.Name, MaxCalls: data.MaxCalls, RemainingCalls: data.MaxCalls}
|
user := types.User{Name: data.Name, MaxCalls: data.MaxCalls, RemainingCalls: data.MaxCalls, EnableHistory: data.EnableHistory}
|
||||||
err = PutUser(user)
|
err = PutUser(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Failed to save configs"})
|
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Failed to save configs"})
|
||||||
|
@ -15,6 +15,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var logger = logger2.GetLogger()
|
var logger = logger2.GetLogger()
|
||||||
@ -33,7 +34,7 @@ func (s StaticFile) Open(name string) (fs.File, error) {
|
|||||||
type Server struct {
|
type Server struct {
|
||||||
Config *types.Config
|
Config *types.Config
|
||||||
ConfigPath string
|
ConfigPath string
|
||||||
ChatContext map[string][]types.Message // 聊天上下文 [SessionID] => []Messages
|
ChatContexts map[string]types.ChatContext // 聊天上下文 [SessionID+ChatRole] => ChatContext
|
||||||
|
|
||||||
// 保存 Websocket 会话 Username, 每个 Username 只能连接一次
|
// 保存 Websocket 会话 Username, 每个 Username 只能连接一次
|
||||||
// 防止第三方直接连接 socket 调用 OpenAI API
|
// 防止第三方直接连接 socket 调用 OpenAI API
|
||||||
@ -61,7 +62,7 @@ func NewServer(configPath string) (*Server, error) {
|
|||||||
return &Server{
|
return &Server{
|
||||||
Config: config,
|
Config: config,
|
||||||
ConfigPath: configPath,
|
ConfigPath: configPath,
|
||||||
ChatContext: make(map[string][]types.Message, 16),
|
ChatContexts: make(map[string]types.ChatContext, 16),
|
||||||
ChatSession: make(map[string]types.ChatSession),
|
ChatSession: make(map[string]types.ChatSession),
|
||||||
ApiKeyAccessStat: make(map[string]int64),
|
ApiKeyAccessStat: make(map[string]int64),
|
||||||
}, nil
|
}, nil
|
||||||
@ -111,6 +112,20 @@ func (s *Server) Run(webRoot embed.FS, path string, debug bool) {
|
|||||||
path: path,
|
path: path,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
// 定时清理过期的会话
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
for key, context := range s.ChatContexts {
|
||||||
|
// 清理超过 60min 没有更新,则表示为过期会话
|
||||||
|
if time.Now().Unix()-context.LastAccessTime > 3600 {
|
||||||
|
logger.Infof("清理会话上下文: %s", key)
|
||||||
|
delete(s.ChatContexts, key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
time.Sleep(time.Second * 5) // 每隔 5 秒钟清理一次
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
logger.Infof("http://%s", s.Config.Listen)
|
logger.Infof("http://%s", s.Config.Listen)
|
||||||
err := engine.Run(s.Config.Listen)
|
err := engine.Run(s.Config.Listen)
|
||||||
|
|
||||||
|
@ -48,6 +48,12 @@ type ChatSession struct {
|
|||||||
Username string `json:"user"` // 当前登录的 user
|
Username string `json:"user"` // 当前登录的 user
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChatContext 聊天上下文
|
||||||
|
type ChatContext struct {
|
||||||
|
Messages []Message
|
||||||
|
LastAccessTime int64 // 最后一次访问上下文时间
|
||||||
|
}
|
||||||
|
|
||||||
func GetDefaultChatRole() map[string]ChatRole {
|
func GetDefaultChatRole() map[string]ChatRole {
|
||||||
return map[string]ChatRole{
|
return map[string]ChatRole{
|
||||||
"gpt": {
|
"gpt": {
|
||||||
|
@ -28,6 +28,7 @@ type Chat struct {
|
|||||||
Temperature float32
|
Temperature float32
|
||||||
MaxTokens int
|
MaxTokens int
|
||||||
EnableContext bool // 是否保持聊天上下文
|
EnableContext bool // 是否保持聊天上下文
|
||||||
|
ChatContextExpireTime int // 聊天上下文过期时间,单位:秒
|
||||||
}
|
}
|
||||||
|
|
||||||
// Session configs struct
|
// Session configs struct
|
||||||
|
@ -33,6 +33,7 @@ func NewDefaultConfig() *types.Config {
|
|||||||
MaxTokens: 1024,
|
MaxTokens: 1024,
|
||||||
Temperature: 0.9,
|
Temperature: 0.9,
|
||||||
EnableContext: true,
|
EnableContext: true,
|
||||||
|
ChatContextExpireTime: 3600,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user