Oapi-Feishu/code/services/sessionCache.go
2023-06-23 18:53:44 +08:00

196 lines
5.1 KiB
Go

package services
import (
"start-feishubot/services/openai"
"time"
"github.com/patrickmn/go-cache"
)
type SessionMode string
type SessionService struct {
cache *cache.Cache
}
type PicSetting struct {
resolution Resolution
}
type Resolution string
type SessionMeta struct {
Mode SessionMode `json:"mode"`
Msg []openai.Messages `json:"msg,omitempty"`
PicSetting PicSetting `json:"pic_setting,omitempty"`
AIMode openai.AIMode `json:"ai_mode,omitempty"`
}
const (
Resolution256 Resolution = "256x256"
Resolution512 Resolution = "512x512"
Resolution1024 Resolution = "1024x1024"
)
const (
ModePicCreate SessionMode = "pic_create"
ModePicVary SessionMode = "pic_vary"
ModeGPT SessionMode = "gpt"
)
type SessionServiceCacheInterface interface {
Get(sessionId string) *SessionMeta
Set(sessionId string, sessionMeta *SessionMeta)
GetMsg(sessionId string) []openai.Messages
SetMsg(sessionId string, msg []openai.Messages)
SetMode(sessionId string, mode SessionMode)
GetMode(sessionId string) SessionMode
GetAIMode(sessionId string) openai.AIMode
SetAIMode(sessionId string, aiMode openai.AIMode)
SetPicResolution(sessionId string, resolution Resolution)
GetPicResolution(sessionId string) string
Clear(sessionId string)
}
var sessionServices *SessionService
// implement Get interface
func (s *SessionService) Get(sessionId string) *SessionMeta {
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
return nil
}
sessionMeta := sessionContext.(*SessionMeta)
return sessionMeta
}
// implement Set interface
func (s *SessionService) Set(sessionId string, sessionMeta *SessionMeta) {
maxCacheTime := time.Hour * 12
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
}
func (s *SessionService) GetMode(sessionId string) SessionMode {
// Get the session mode from the cache.
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
return ModeGPT
}
sessionMeta := sessionContext.(*SessionMeta)
return sessionMeta.Mode
}
func (s *SessionService) SetMode(sessionId string, mode SessionMode) {
maxCacheTime := time.Hour * 12
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
sessionMeta := &SessionMeta{Mode: mode}
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
return
}
sessionMeta := sessionContext.(*SessionMeta)
sessionMeta.Mode = mode
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
}
func (s *SessionService) GetAIMode(sessionId string) openai.AIMode {
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
return openai.Balance
}
sessionMeta := sessionContext.(*SessionMeta)
return sessionMeta.AIMode
}
// SetAIMode set the ai mode for the session.
func (s *SessionService) SetAIMode(sessionId string, aiMode openai.AIMode) {
maxCacheTime := time.Hour * 12
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
sessionMeta := &SessionMeta{AIMode: aiMode}
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
return
}
sessionMeta := sessionContext.(*SessionMeta)
sessionMeta.AIMode = aiMode
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
}
func (s *SessionService) GetMsg(sessionId string) (msg []openai.Messages) {
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
return nil
}
sessionMeta := sessionContext.(*SessionMeta)
return sessionMeta.Msg
}
func (s *SessionService) SetMsg(sessionId string, msg []openai.Messages) {
maxLength := 4096
maxCacheTime := time.Hour * 12
//限制对话上下文长度
for getStrPoolTotalLength(msg) > maxLength {
msg = append(msg[:1], msg[2:]...)
}
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
sessionMeta := &SessionMeta{Msg: msg}
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
return
}
sessionMeta := sessionContext.(*SessionMeta)
sessionMeta.Msg = msg
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
}
func (s *SessionService) SetPicResolution(sessionId string,
resolution Resolution) {
maxCacheTime := time.Hour * 12
//if not in [Resolution256, Resolution512, Resolution1024] then set
//to Resolution256
switch resolution {
case Resolution256, Resolution512, Resolution1024:
default:
resolution = Resolution256
}
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
sessionMeta := &SessionMeta{PicSetting: PicSetting{resolution: resolution}}
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
return
}
sessionMeta := sessionContext.(*SessionMeta)
sessionMeta.PicSetting.resolution = resolution
s.cache.Set(sessionId, sessionMeta, maxCacheTime)
}
func (s *SessionService) GetPicResolution(sessionId string) string {
sessionContext, ok := s.cache.Get(sessionId)
if !ok {
return string(Resolution256)
}
sessionMeta := sessionContext.(*SessionMeta)
return string(sessionMeta.PicSetting.resolution)
}
func (s *SessionService) Clear(sessionId string) {
// Delete the session context from the cache.
s.cache.Delete(sessionId)
}
func GetSessionCache() SessionServiceCacheInterface {
if sessionServices == nil {
sessionServices = &SessionService{cache: cache.New(time.Hour*12, time.Hour*1)}
}
return sessionServices
}
func getStrPoolTotalLength(strPool []openai.Messages) int {
var total int
for _, v := range strPool {
total += v.CalculateTokenLength()
}
return total
}