55 lines
1.8 KiB
Go
55 lines
1.8 KiB
Go
package service
|
||
|
||
import (
|
||
"context"
|
||
"prompts-core/dao"
|
||
"prompts-core/model/dto"
|
||
"prompts-core/model/entity"
|
||
|
||
"gitea.com/red-future/common/beans"
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
)
|
||
|
||
var Session = &sessionService{}
|
||
|
||
type sessionService struct{}
|
||
|
||
// SessionCallback 会话回调处理
|
||
func (s *sessionService) SessionCallback(ctx context.Context, req *dto.SessionCallbackReq) (res *beans.ResponseEmpty, err error) {
|
||
// 1. 解析AI返回的文本
|
||
result, err := sessionParseModelOutput(req.Text)
|
||
if err != nil {
|
||
g.Log().Errorf(ctx, "[会话回调] 解析模型输出失败 epicycleId=%d err=%v", req.EpicycleId, err)
|
||
return nil, err
|
||
}
|
||
|
||
// 2. 更新数据库(AI回调内容)
|
||
_, err = dao.ComposeSession.UpdateById(ctx, req.EpicycleId, map[string]any{
|
||
entity.ComposeSessionCol.ResponseContent: result,
|
||
})
|
||
if err != nil {
|
||
g.Log().Errorf(ctx, "[会话回调] 更新数据库失败 epicycleId=%d err=%v", req.EpicycleId, err)
|
||
return nil, err
|
||
}
|
||
|
||
// 3. 获取当前轮次的完整数据
|
||
session, err := dao.ComposeSession.GetById(ctx, req.EpicycleId)
|
||
if err != nil {
|
||
g.Log().Errorf(ctx, "[会话回调] 获取会话数据失败 epicycleId=%d err=%v", req.EpicycleId, err)
|
||
return nil, err
|
||
}
|
||
|
||
// 4. 写入 Redis(多轮记忆)
|
||
requestMessages := s.convertToMessages(session.RequestContent)
|
||
responseMessages := s.convertToMessages(session.ResponseContent)
|
||
if err = s.saveToRedis(ctx, session.SessionId, requestMessages, responseMessages); err != nil {
|
||
g.Log().Errorf(ctx, "[会话回调] Redis存储失败 sessionId=%s id=%d err=%v",
|
||
session.SessionId, session.Id, err)
|
||
return nil, err
|
||
}
|
||
|
||
g.Log().Infof(ctx, "[会话回调] 存储成功 sessionId=%s id=%d requestLen=%d responseLen=%d",
|
||
session.SessionId, session.Id, len(requestMessages), len(responseMessages))
|
||
return &beans.ResponseEmpty{}, nil
|
||
}
|