ai_scheduler/internal/services/advice/chat.go

154 lines
3.8 KiB
Go

package advice
import (
"ai_scheduler/internal/biz"
"ai_scheduler/internal/config"
errorcode "ai_scheduler/internal/data/error"
"ai_scheduler/internal/pkg"
"ai_scheduler/internal/data/mongo_model"
"ai_scheduler/internal/entitys"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/log"
)
// FileService 文件处理
type ChatService struct {
adviceChatBiz *biz.AdviceChatBiz
adviceClientBiz *biz.AdviceClientBiz
adviceAdvicerBiz *biz.AdviceAdvicerBiz
adviceProjectBiz *biz.AdviceProjectBiz
adviceSkillBiz *biz.AdviceSkillBiz
cfg *config.Config
}
// NewFileService
func NewChatService(
adviceChatBiz *biz.AdviceChatBiz,
adviceClientBiz *biz.AdviceClientBiz,
adviceAdvicerBiz *biz.AdviceAdvicerBiz,
adviceProjectBiz *biz.AdviceProjectBiz,
adviceSkillBiz *biz.AdviceSkillBiz,
cfg *config.Config,
) *ChatService {
return &ChatService{
adviceChatBiz: adviceChatBiz,
cfg: cfg,
adviceClientBiz: adviceClientBiz,
adviceAdvicerBiz: adviceAdvicerBiz,
adviceProjectBiz: adviceProjectBiz,
adviceSkillBiz: adviceSkillBiz,
}
}
func (a *ChatService) Regis(c *fiber.Ctx) error {
req := &entitys.AdvicerChatRegistReq{}
if err := c.BodyParser(req); err != nil {
return err
}
if len(req.AdvicerVersionId) == 0 {
return errorcode.ParamErr("AdvicerVersionId is empty")
}
if len(req.TalkSkillId) == 0 {
return errorcode.ParamErr("talkSkillId is empty")
}
if len(req.Mission) == 0 {
return errorcode.ParamErr("misiion is empty")
}
//顾问版本信息
versionInfo, err := a.adviceAdvicerBiz.VersionInfo(c.UserContext(), &entitys.AdvicerVersionInfoReq{
Id: req.AdvicerVersionId,
})
if err != nil {
return err
}
//顾问信息
advicerInfo, err := a.adviceAdvicerBiz.AdvicerInfo(c.UserContext(), &entitys.AdvicerInfoReq{
AdvicerID: versionInfo.AdvicerId,
})
if err != nil {
return err
}
//项目信息
projectInfo, err := a.adviceProjectBiz.Info(c.UserContext(), &entitys.AdvicerProjectInfoReq{
ProjectId: advicerInfo.ProjectID,
})
if err != nil {
return err
}
if len(projectInfo.ModelInfo.Key) == 0 {
return errorcode.ParamErr("项目未设置模型key")
}
if len(projectInfo.ModelInfo.ChatModel) == 0 {
return errorcode.ParamErr("项目未设置模型对话模型")
}
//销售技巧
talkSkill, err := a.adviceSkillBiz.Info(c.UserContext(), &entitys.AdvicerTalkSkillInfoReq{
Id: req.TalkSkillId,
})
if err != nil {
return err
}
//客户信息
var clientInfo mongo_model.AdvicerClientMongo
if len(req.ClientId) != 0 {
clientInfo, err = a.adviceClientBiz.Info(c.UserContext(), &entitys.AdvicerClientInfoReq{
Id: req.ClientId,
})
if err != nil {
return err
}
}
chat := entitys.ChatData{
ClientInfo: clientInfo.Entity(),
TalkSkill: talkSkill.Entity(),
ProjectInfo: projectInfo.ConfigInfo.Entity(),
AdvicerInfo: advicerInfo.Entity(),
AdvicerVersion: versionInfo.Entity(),
}
sessionId, err := a.adviceChatBiz.Regis(c.UserContext(), &chat, req, projectInfo)
log.Info(sessionId)
return pkg.HandleResponse(c, sessionId, err)
}
func (a *ChatService) Chat(c *fiber.Ctx) error {
req := &entitys.AdvicerChatReq{}
if err := c.BodyParser(req); err != nil {
return err
}
if len(req.SessionId) == 0 {
return errorcode.ParamErr("SessionId is empty")
}
if len(req.Content) == 0 {
return errorcode.ParamErr("Content is empty")
}
res, err := a.adviceChatBiz.Chat(c.UserContext(), req)
log.Info(res)
return pkg.HandleResponse(c, res, err)
}
func (a *ChatService) ChatContext(c *fiber.Ctx) error {
req := &entitys.AdvicerChatReq{}
if err := c.BodyParser(req); err != nil {
return err
}
if len(req.SessionId) == 0 {
return errorcode.ParamErr("SessionId is empty")
}
if len(req.Content) == 0 {
return errorcode.ParamErr("Content is empty")
}
res, err := a.adviceChatBiz.Chat(c.UserContext(), req)
log.Info(res)
return pkg.HandleResponse(c, res, err)
}