ai.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package ai
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/aimod"
  7. "eta/eta_api/services/aiser"
  8. "eta/eta_api/utils"
  9. "fmt"
  10. "strconv"
  11. "time"
  12. )
  13. // AI
  14. type AiController struct {
  15. controllers.BaseAuthController
  16. }
  17. // @Title 聊天接口
  18. // @Description 聊天接口
  19. // @Param request body aimod.ChatReq true "type json string"
  20. // @Success 200 {object} response.ListResp
  21. // @router /chat [post]
  22. func (this *AiController) List() {
  23. br := new(models.BaseResponse).Init()
  24. defer func() {
  25. this.Data["json"] = br
  26. this.ServeJSON()
  27. }()
  28. var req aimod.ChatReq
  29. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  30. if err != nil {
  31. br.Msg = "参数解析异常!"
  32. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  33. return
  34. }
  35. if req.Ask == "" {
  36. br.Msg = "请输入提问内容!"
  37. br.ErrMsg = "请输入提问内容"
  38. return
  39. }
  40. if utils.Re == nil {
  41. key := "CACHE_CHAT_" + strconv.Itoa(this.SysUser.AdminId)
  42. cacheVal, err := utils.Rc.RedisInt(key)
  43. fmt.Println("RedisString:", cacheVal, "err:", err)
  44. if err != nil && err.Error() != "redigo: nil returned" {
  45. br.Msg = "获取数据失败!"
  46. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  47. return
  48. }
  49. putVal := 0
  50. if cacheVal <= 0 {
  51. putVal = utils.AiChatLimit
  52. } else {
  53. putVal = cacheVal - 1
  54. }
  55. if putVal <= 0 {
  56. br.Msg = "您今日50次问答已达上限,请明天再来!"
  57. br.ErrMsg = "您今日50次问答已达上限,请明天再来!"
  58. return
  59. }
  60. lastSecond := utils.GetTodayLastSecond()
  61. utils.Rc.Put(key, putVal, lastSecond)
  62. }
  63. //根据提问,获取信息
  64. askUuid := utils.MD5(req.Ask)
  65. chatMode, err := aimod.GetAiChatByAsk(askUuid)
  66. if err != nil && err.Error() != utils.ErrNoRow() {
  67. br.Msg = "获取数据失败!"
  68. br.ErrMsg = "获取数据失败,GetAiChatByAsk,Err:" + err.Error()
  69. return
  70. }
  71. resp := new(aimod.ChatResp)
  72. var answer string
  73. //answerArr := []string{
  74. // "周度数据显示,成品油现货市场价格跟随原油下跌,但近期相对抗跌,裂解价差走扩。批零价差方面汽油收窄,柴油走扩",
  75. // "出口利润在原油下跌海外成品油矛盾更大的情况下汽柴油出口窗口完全关闭",
  76. // "汽油需求在经历五一假期的一段高峰后将回归平稳,总体没有明显矛盾,后期我们担心更多的还是柴油。"}
  77. if chatMode != nil && chatMode.Answer != "" {
  78. answer = chatMode.Answer
  79. } else {
  80. answer, _ = aiser.ChatAutoMsg(req.Ask)
  81. }
  82. resp.Ask = req.Ask
  83. resp.Answer = answer
  84. if req.AiChatTopicId <= 0 { //新增
  85. topic := new(aimod.AiChatTopic)
  86. topic.TopicName = req.Ask
  87. topic.SysUserId = this.SysUser.AdminId
  88. topic.SysUserRealName = this.SysUser.RealName
  89. topic.CreateTime = time.Now()
  90. topic.ModifyTime = time.Now()
  91. topicId, err := aimod.AddAiChatTopic(topic)
  92. if err != nil {
  93. br.Msg = "获取数据失败!"
  94. br.ErrMsg = "生成话题失败,Err:" + err.Error()
  95. return
  96. }
  97. resp.AiChatTopicId = int(topicId)
  98. chatItem := new(aimod.AiChat)
  99. chatItem.AiChatTopicId = resp.AiChatTopicId
  100. chatItem.Ask = req.Ask
  101. chatItem.AskUuid = utils.MD5(req.Ask)
  102. chatItem.Answer = answer
  103. chatItem.Model = "gpt-4-1106-preview"
  104. chatItem.SysUserId = this.SysUser.AdminId
  105. chatItem.SysUserRealName = this.SysUser.RealName
  106. chatItem.CreateTime = time.Now()
  107. chatItem.ModifyTime = time.Now()
  108. _, err = aimod.AddAiChat(chatItem)
  109. if err != nil {
  110. br.Msg = "获取数据失败!"
  111. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  112. return
  113. }
  114. } else {
  115. resp.AiChatTopicId = req.AiChatTopicId
  116. chatItem := new(aimod.AiChat)
  117. chatItem.AiChatTopicId = resp.AiChatTopicId
  118. chatItem.Ask = req.Ask
  119. chatItem.AskUuid = utils.MD5(req.Ask)
  120. chatItem.Answer = answer
  121. chatItem.Model = "gpt-4-1106-preview"
  122. chatItem.SysUserId = this.SysUser.AdminId
  123. chatItem.SysUserRealName = this.SysUser.RealName
  124. chatItem.CreateTime = time.Now()
  125. chatItem.ModifyTime = time.Now()
  126. _, err = aimod.AddAiChat(chatItem)
  127. if err != nil {
  128. br.Msg = "获取数据失败!"
  129. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  130. return
  131. }
  132. }
  133. br.Ret = 200
  134. br.Success = true
  135. br.Msg = "获取成功"
  136. br.Data = resp
  137. }
  138. // @Title 获取话题列表
  139. // @Description 获取话题列表接口
  140. // @Success 200 {object} aimod.AiChatTopicListResp
  141. // @router /topic/list [get]
  142. func (this *AiController) TopicList() {
  143. br := new(models.BaseResponse).Init()
  144. defer func() {
  145. this.Data["json"] = br
  146. this.ServeJSON()
  147. }()
  148. sysUser := this.SysUser
  149. if sysUser == nil {
  150. br.Msg = "请登录"
  151. br.ErrMsg = "请登录,SysUser Is Empty"
  152. br.Ret = 408
  153. return
  154. }
  155. list, err := aimod.GetAiChatTopicList(sysUser.AdminId)
  156. if err != nil {
  157. br.Msg = "获取数据失败!"
  158. br.ErrMsg = "获取主题记录信息失败,Err:" + err.Error()
  159. return
  160. }
  161. resp := new(aimod.AiChatTopicListResp)
  162. resp.List = list
  163. br.Ret = 200
  164. br.Success = true
  165. br.Msg = "获取成功"
  166. br.Data = resp
  167. }
  168. // @Title 获取话题详情
  169. // @Description 获取话题详情接口
  170. // @Param AiChatTopicId query int true "主题id"
  171. // @Success 200 {object} aimod.AiChatDetailResp
  172. // @router /topic/detail [get]
  173. func (this *AiController) TopicDetail() {
  174. br := new(models.BaseResponse).Init()
  175. defer func() {
  176. this.Data["json"] = br
  177. this.ServeJSON()
  178. }()
  179. sysUser := this.SysUser
  180. if sysUser == nil {
  181. br.Msg = "请登录"
  182. br.ErrMsg = "请登录,SysUser Is Empty"
  183. br.Ret = 408
  184. return
  185. }
  186. aiChatTopicId, _ := this.GetInt("AiChatTopicId")
  187. list, err := aimod.GetAiChatList(aiChatTopicId)
  188. if err != nil {
  189. br.Msg = "获取数据失败!"
  190. br.ErrMsg = "获取主题记录信息失败,Err:" + err.Error()
  191. return
  192. }
  193. resp := new(aimod.AiChatDetailResp)
  194. resp.List = list
  195. br.Ret = 200
  196. br.Success = true
  197. br.Msg = "获取成功"
  198. br.Data = resp
  199. }
  200. // @Title 删除话题接口
  201. // @Description 删除话题接口
  202. // @Param request body aimod.TopicDeleteReq true "type json string"
  203. // @Success Ret=200 删除成功
  204. // @router /topic/delete [post]
  205. func (this *AiController) TopicDelete() {
  206. br := new(models.BaseResponse).Init()
  207. defer func() {
  208. this.Data["json"] = br
  209. this.ServeJSON()
  210. }()
  211. sysUser := this.SysUser
  212. if sysUser == nil {
  213. br.Msg = "请登录"
  214. br.ErrMsg = "请登录,SysUser Is Empty"
  215. br.Ret = 408
  216. return
  217. }
  218. var req aimod.TopicDeleteReq
  219. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  220. if err != nil {
  221. br.Msg = "参数解析异常!"
  222. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  223. return
  224. }
  225. if req.AiChatTopicId <= 0 {
  226. br.Msg = "参数错误!"
  227. br.ErrMsg = "参数错误!AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
  228. return
  229. }
  230. err = aimod.DeleteTopic(req.AiChatTopicId)
  231. if err != nil {
  232. br.Msg = "删除失败!"
  233. br.ErrMsg = "删除失败,Err:" + err.Error()
  234. return
  235. }
  236. br.Ret = 200
  237. br.Success = true
  238. br.Msg = "删除成功"
  239. br.IsAddLog = true
  240. }
  241. // @Title 编辑话题接口
  242. // @Description 编辑话题接口
  243. // @Param request body aimod.TopicEditReq true "type json string"
  244. // @Success Ret=200 编辑成功
  245. // @router /topic/edit [post]
  246. func (this *AiController) TopicEdit() {
  247. br := new(models.BaseResponse).Init()
  248. defer func() {
  249. this.Data["json"] = br
  250. this.ServeJSON()
  251. }()
  252. sysUser := this.SysUser
  253. if sysUser == nil {
  254. br.Msg = "请登录"
  255. br.ErrMsg = "请登录,SysUser Is Empty"
  256. br.Ret = 408
  257. return
  258. }
  259. var req aimod.TopicEditReq
  260. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  261. if err != nil {
  262. br.Msg = "参数解析异常!"
  263. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  264. return
  265. }
  266. if req.AiChatTopicId <= 0 {
  267. br.Msg = "参数错误!"
  268. br.ErrMsg = "参数错误!AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
  269. return
  270. }
  271. topic, err := aimod.GetAiChatTopicByTopicName(req.TopicName)
  272. if err != nil && err.Error() != utils.ErrNoRow() {
  273. br.Msg = "编辑失败!"
  274. br.ErrMsg = "获取数据失败!Err:" + err.Error()
  275. return
  276. }
  277. if topic != nil && topic.AiChatTopicId != req.AiChatTopicId {
  278. br.Msg = "话题名称已存在,请重新修改!"
  279. return
  280. }
  281. err = aimod.EditTopic(req.AiChatTopicId, req.TopicName)
  282. if err != nil {
  283. br.Msg = "编辑失败!"
  284. br.ErrMsg = "编辑失败,Err:" + err.Error()
  285. return
  286. }
  287. br.Ret = 200
  288. br.Success = true
  289. br.Msg = "编辑成功"
  290. br.IsAddLog = true
  291. }