ai.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. package ai
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_api/controllers"
  5. "eta_gn/eta_api/models"
  6. "eta_gn/eta_api/models/aimod"
  7. "eta_gn/eta_api/services/aiser"
  8. "eta_gn/eta_api/utils"
  9. "fmt"
  10. "strconv"
  11. "time"
  12. )
  13. // AI
  14. type AiController struct {
  15. controllers.BaseAuthController
  16. }
  17. // @router /chat [post]
  18. func (this *AiController) List() {
  19. br := new(models.BaseResponse).Init()
  20. defer func() {
  21. this.Data["json"] = br
  22. this.ServeJSON()
  23. }()
  24. var req aimod.ChatReq
  25. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  26. if err != nil {
  27. br.Msg = "参数解析异常!"
  28. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  29. return
  30. }
  31. if req.Ask == "" {
  32. br.Msg = "请输入提问内容!"
  33. br.ErrMsg = "请输入提问内容"
  34. return
  35. }
  36. if utils.Re == nil {
  37. key := "CACHE_CHAT_" + strconv.Itoa(this.SysUser.AdminId)
  38. cacheVal, err := utils.Rc.RedisInt(key)
  39. fmt.Println("RedisString:", cacheVal, "err:", err)
  40. if err != nil && (err.Error() != "redigo: nil returned" && err.Error() != "redis: nil") {
  41. br.Msg = "获取数据失败!"
  42. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  43. return
  44. }
  45. putVal := 0
  46. if cacheVal <= 0 {
  47. putVal = utils.AiChatLimit
  48. } else {
  49. putVal = cacheVal - 1
  50. }
  51. if putVal <= 0 {
  52. br.Msg = "您今日" + strconv.Itoa(utils.AiChatLimit) + "次问答已达上限,请明天再来!"
  53. br.ErrMsg = "您今日" + strconv.Itoa(utils.AiChatLimit) + "次问答已达上限,请明天再来!"
  54. return
  55. }
  56. lastSecond := utils.GetTodayLastSecond()
  57. utils.Rc.Put(key, putVal, lastSecond)
  58. }
  59. askUuid := utils.MD5(req.Ask)
  60. chatMode, err := aimod.GetAiChatByAsk(askUuid)
  61. if err != nil && !utils.IsErrNoRow(err) {
  62. br.Msg = "获取数据失败!"
  63. br.ErrMsg = "获取数据失败,GetAiChatByAsk,Err:" + err.Error()
  64. return
  65. }
  66. resp := new(aimod.ChatResp)
  67. var answer string
  68. if chatMode != nil && chatMode.Answer != "" {
  69. answer = chatMode.Answer
  70. } else {
  71. historyList, err := aimod.GetAiChatList(req.AiChatTopicId)
  72. if err != nil && !utils.IsErrNoRow(err) {
  73. br.Msg = "获取主题历史数据失败!"
  74. br.ErrMsg = "获取主题历史数据失败,Err:" + err.Error()
  75. return
  76. }
  77. historyChatList := make([]aimod.HistoryChat, 0)
  78. for _, v := range historyList {
  79. historyChat := new(aimod.HistoryChat)
  80. historyChat.Ask = v.Ask
  81. historyChat.Answer = v.Answer
  82. historyChatList = append(historyChatList, *historyChat)
  83. }
  84. answer, err = aiser.ChatAutoMsg(req.Ask, historyChatList, req.Model)
  85. if err != nil {
  86. br.Msg = "获取数据失败!"
  87. br.ErrMsg = "获取数据失败,ChatAutoMsg,Err:" + err.Error()
  88. return
  89. }
  90. }
  91. resp.Ask = req.Ask
  92. resp.Answer = answer
  93. resp.Model = req.Model
  94. if req.AiChatTopicId <= 0 { //新增
  95. name, err := aiser.QueryAskContent(req.Ask)
  96. if err != nil {
  97. br.Msg = "获取数据失败!"
  98. br.ErrMsg = "获取数据失败,QueryAskContent,Err:" + err.Error()
  99. return
  100. }
  101. topic := new(aimod.AiChatTopic)
  102. topic.TopicName = name
  103. topic.SysUserId = this.SysUser.AdminId
  104. topic.SysUserRealName = this.SysUser.RealName
  105. topic.CreateTime = time.Now()
  106. topic.ModifyTime = time.Now()
  107. topicId, err := aimod.AddAiChatTopic(topic)
  108. if err != nil {
  109. br.Msg = "获取数据失败!"
  110. br.ErrMsg = "生成话题失败,Err:" + err.Error()
  111. return
  112. }
  113. resp.AiChatTopicId = int(topicId)
  114. chatItem := new(aimod.AiChat)
  115. chatItem.AiChatTopicId = resp.AiChatTopicId
  116. chatItem.Ask = req.Ask
  117. chatItem.AskUuid = utils.MD5(req.Ask)
  118. chatItem.Answer = answer
  119. chatItem.Model = EnabledModelsForMap[req.Model]
  120. chatItem.SysUserId = this.SysUser.AdminId
  121. chatItem.SysUserRealName = this.SysUser.RealName
  122. chatItem.CreateTime = time.Now()
  123. chatItem.ModifyTime = time.Now()
  124. _, err = aimod.AddAiChat(chatItem)
  125. if err != nil {
  126. br.Msg = "获取数据失败!"
  127. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  128. return
  129. }
  130. } else {
  131. resp.AiChatTopicId = req.AiChatTopicId
  132. chatItem := new(aimod.AiChat)
  133. chatItem.AiChatTopicId = resp.AiChatTopicId
  134. chatItem.Ask = req.Ask
  135. chatItem.AskUuid = utils.MD5(req.Ask)
  136. chatItem.Answer = answer
  137. chatItem.Model = EnabledModelsForMap[req.Model]
  138. chatItem.SysUserId = this.SysUser.AdminId
  139. chatItem.SysUserRealName = this.SysUser.RealName
  140. chatItem.CreateTime = time.Now()
  141. chatItem.ModifyTime = time.Now()
  142. _, err = aimod.AddAiChat(chatItem)
  143. if err != nil {
  144. br.Msg = "获取数据失败!"
  145. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  146. return
  147. }
  148. }
  149. br.Ret = 200
  150. br.Success = true
  151. br.Msg = "获取成功"
  152. br.Data = resp
  153. }
  154. // @router /topic/list [get]
  155. func (this *AiController) TopicList() {
  156. br := new(models.BaseResponse).Init()
  157. defer func() {
  158. this.Data["json"] = br
  159. this.ServeJSON()
  160. }()
  161. sysUser := this.SysUser
  162. if sysUser == nil {
  163. br.Msg = "请登录"
  164. br.ErrMsg = "请登录,SysUser Is Empty"
  165. br.Ret = 408
  166. return
  167. }
  168. list, err := aimod.GetAiChatTopicList(sysUser.AdminId)
  169. if err != nil {
  170. br.Msg = "获取数据失败!"
  171. br.ErrMsg = "获取主题记录信息失败,Err:" + err.Error()
  172. return
  173. }
  174. resp := new(aimod.AiChatTopicListResp)
  175. resp.List = list
  176. br.Ret = 200
  177. br.Success = true
  178. br.Msg = "获取成功"
  179. br.Data = resp
  180. }
  181. // @router /topic/detail [get]
  182. func (this *AiController) TopicDetail() {
  183. br := new(models.BaseResponse).Init()
  184. defer func() {
  185. this.Data["json"] = br
  186. this.ServeJSON()
  187. }()
  188. sysUser := this.SysUser
  189. if sysUser == nil {
  190. br.Msg = "请登录"
  191. br.ErrMsg = "请登录,SysUser Is Empty"
  192. br.Ret = 408
  193. return
  194. }
  195. aiChatTopicId, _ := this.GetInt("AiChatTopicId")
  196. list, err := aimod.GetAiChatList(aiChatTopicId)
  197. if err != nil {
  198. br.Msg = "获取数据失败!"
  199. br.ErrMsg = "获取主题记录信息失败,Err:" + err.Error()
  200. return
  201. }
  202. for index := range list {
  203. list[index].Model = aimod.ModelViewMap[list[index].Model]
  204. }
  205. resp := new(aimod.AiChatDetailResp)
  206. resp.List = list
  207. br.Ret = 200
  208. br.Success = true
  209. br.Msg = "获取成功"
  210. br.Data = resp
  211. }
  212. // @router /topic/delete [post]
  213. func (this *AiController) TopicDelete() {
  214. br := new(models.BaseResponse).Init()
  215. defer func() {
  216. this.Data["json"] = br
  217. this.ServeJSON()
  218. }()
  219. sysUser := this.SysUser
  220. if sysUser == nil {
  221. br.Msg = "请登录"
  222. br.ErrMsg = "请登录,SysUser Is Empty"
  223. br.Ret = 408
  224. return
  225. }
  226. var req aimod.TopicDeleteReq
  227. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  228. if err != nil {
  229. br.Msg = "参数解析异常!"
  230. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  231. return
  232. }
  233. if req.AiChatTopicId <= 0 {
  234. br.Msg = "参数错误!"
  235. br.ErrMsg = "参数错误!AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
  236. return
  237. }
  238. err = aimod.DeleteTopic(req.AiChatTopicId)
  239. if err != nil {
  240. br.Msg = "删除失败!"
  241. br.ErrMsg = "删除失败,Err:" + err.Error()
  242. return
  243. }
  244. br.Ret = 200
  245. br.Success = true
  246. br.Msg = "删除成功"
  247. br.IsAddLog = true
  248. }
  249. // @router /topic/edit [post]
  250. func (this *AiController) TopicEdit() {
  251. br := new(models.BaseResponse).Init()
  252. defer func() {
  253. this.Data["json"] = br
  254. this.ServeJSON()
  255. }()
  256. sysUser := this.SysUser
  257. if sysUser == nil {
  258. br.Msg = "请登录"
  259. br.ErrMsg = "请登录,SysUser Is Empty"
  260. br.Ret = 408
  261. return
  262. }
  263. var req aimod.TopicEditReq
  264. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  265. if err != nil {
  266. br.Msg = "参数解析异常!"
  267. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  268. return
  269. }
  270. if req.AiChatTopicId <= 0 {
  271. br.Msg = "参数错误!"
  272. br.ErrMsg = "参数错误!AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
  273. return
  274. }
  275. topic, err := aimod.GetAiChatTopicByTopicName(req.TopicName)
  276. if err != nil && !utils.IsErrNoRow(err) {
  277. br.Msg = "编辑失败!"
  278. br.ErrMsg = "获取数据失败!Err:" + err.Error()
  279. return
  280. }
  281. if topic != nil && topic.AiChatTopicId > 0 && topic.AiChatTopicId != req.AiChatTopicId {
  282. br.Msg = "话题名称已存在,请重新修改!"
  283. return
  284. }
  285. err = aimod.EditTopic(req.AiChatTopicId, req.TopicName)
  286. if err != nil {
  287. br.Msg = "编辑失败!"
  288. br.ErrMsg = "编辑失败,Err:" + err.Error()
  289. return
  290. }
  291. br.Ret = 200
  292. br.Success = true
  293. br.Msg = "编辑成功"
  294. br.IsAddLog = true
  295. }