ai.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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, err = aiser.ChatAutoMsg(req.Ask)
  81. if err != nil {
  82. br.Msg = "获取数据失败!"
  83. br.ErrMsg = "获取数据失败,ChatAutoMsg,Err:" + err.Error()
  84. return
  85. }
  86. }
  87. resp.Ask = req.Ask
  88. resp.Answer = answer
  89. if req.AiChatTopicId <= 0 { //新增
  90. topic := new(aimod.AiChatTopic)
  91. topic.TopicName = req.Ask
  92. topic.SysUserId = this.SysUser.AdminId
  93. topic.SysUserRealName = this.SysUser.RealName
  94. topic.CreateTime = time.Now()
  95. topic.ModifyTime = time.Now()
  96. topicId, err := aimod.AddAiChatTopic(topic)
  97. if err != nil {
  98. br.Msg = "获取数据失败!"
  99. br.ErrMsg = "生成话题失败,Err:" + err.Error()
  100. return
  101. }
  102. resp.AiChatTopicId = int(topicId)
  103. chatItem := new(aimod.AiChat)
  104. chatItem.AiChatTopicId = resp.AiChatTopicId
  105. chatItem.Ask = req.Ask
  106. chatItem.AskUuid = utils.MD5(req.Ask)
  107. chatItem.Answer = answer
  108. chatItem.Model = "gpt-4-1106-preview"
  109. chatItem.SysUserId = this.SysUser.AdminId
  110. chatItem.SysUserRealName = this.SysUser.RealName
  111. chatItem.CreateTime = time.Now()
  112. chatItem.ModifyTime = time.Now()
  113. _, err = aimod.AddAiChat(chatItem)
  114. if err != nil {
  115. br.Msg = "获取数据失败!"
  116. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  117. return
  118. }
  119. } else {
  120. resp.AiChatTopicId = req.AiChatTopicId
  121. chatItem := new(aimod.AiChat)
  122. chatItem.AiChatTopicId = resp.AiChatTopicId
  123. chatItem.Ask = req.Ask
  124. chatItem.AskUuid = utils.MD5(req.Ask)
  125. chatItem.Answer = answer
  126. chatItem.Model = "gpt-4-1106-preview"
  127. chatItem.SysUserId = this.SysUser.AdminId
  128. chatItem.SysUserRealName = this.SysUser.RealName
  129. chatItem.CreateTime = time.Now()
  130. chatItem.ModifyTime = time.Now()
  131. _, err = aimod.AddAiChat(chatItem)
  132. if err != nil {
  133. br.Msg = "获取数据失败!"
  134. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  135. return
  136. }
  137. }
  138. br.Ret = 200
  139. br.Success = true
  140. br.Msg = "获取成功"
  141. br.Data = resp
  142. }
  143. // @Title 获取话题列表
  144. // @Description 获取话题列表接口
  145. // @Success 200 {object} aimod.AiChatTopicListResp
  146. // @router /topic/list [get]
  147. func (this *AiController) TopicList() {
  148. br := new(models.BaseResponse).Init()
  149. defer func() {
  150. this.Data["json"] = br
  151. this.ServeJSON()
  152. }()
  153. sysUser := this.SysUser
  154. if sysUser == nil {
  155. br.Msg = "请登录"
  156. br.ErrMsg = "请登录,SysUser Is Empty"
  157. br.Ret = 408
  158. return
  159. }
  160. list, err := aimod.GetAiChatTopicList(sysUser.AdminId)
  161. if err != nil {
  162. br.Msg = "获取数据失败!"
  163. br.ErrMsg = "获取主题记录信息失败,Err:" + err.Error()
  164. return
  165. }
  166. resp := new(aimod.AiChatTopicListResp)
  167. resp.List = list
  168. br.Ret = 200
  169. br.Success = true
  170. br.Msg = "获取成功"
  171. br.Data = resp
  172. }
  173. // @Title 获取话题详情
  174. // @Description 获取话题详情接口
  175. // @Param AiChatTopicId query int true "主题id"
  176. // @Success 200 {object} aimod.AiChatDetailResp
  177. // @router /topic/detail [get]
  178. func (this *AiController) TopicDetail() {
  179. br := new(models.BaseResponse).Init()
  180. defer func() {
  181. this.Data["json"] = br
  182. this.ServeJSON()
  183. }()
  184. sysUser := this.SysUser
  185. if sysUser == nil {
  186. br.Msg = "请登录"
  187. br.ErrMsg = "请登录,SysUser Is Empty"
  188. br.Ret = 408
  189. return
  190. }
  191. aiChatTopicId, _ := this.GetInt("AiChatTopicId")
  192. list, err := aimod.GetAiChatList(aiChatTopicId)
  193. if err != nil {
  194. br.Msg = "获取数据失败!"
  195. br.ErrMsg = "获取主题记录信息失败,Err:" + err.Error()
  196. return
  197. }
  198. resp := new(aimod.AiChatDetailResp)
  199. resp.List = list
  200. br.Ret = 200
  201. br.Success = true
  202. br.Msg = "获取成功"
  203. br.Data = resp
  204. }
  205. // @Title 删除话题接口
  206. // @Description 删除话题接口
  207. // @Param request body aimod.TopicDeleteReq true "type json string"
  208. // @Success Ret=200 删除成功
  209. // @router /topic/delete [post]
  210. func (this *AiController) TopicDelete() {
  211. br := new(models.BaseResponse).Init()
  212. defer func() {
  213. this.Data["json"] = br
  214. this.ServeJSON()
  215. }()
  216. sysUser := this.SysUser
  217. if sysUser == nil {
  218. br.Msg = "请登录"
  219. br.ErrMsg = "请登录,SysUser Is Empty"
  220. br.Ret = 408
  221. return
  222. }
  223. var req aimod.TopicDeleteReq
  224. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  225. if err != nil {
  226. br.Msg = "参数解析异常!"
  227. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  228. return
  229. }
  230. if req.AiChatTopicId <= 0 {
  231. br.Msg = "参数错误!"
  232. br.ErrMsg = "参数错误!AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
  233. return
  234. }
  235. err = aimod.DeleteTopic(req.AiChatTopicId)
  236. if err != nil {
  237. br.Msg = "删除失败!"
  238. br.ErrMsg = "删除失败,Err:" + err.Error()
  239. return
  240. }
  241. br.Ret = 200
  242. br.Success = true
  243. br.Msg = "删除成功"
  244. br.IsAddLog = true
  245. }
  246. // @Title 编辑话题接口
  247. // @Description 编辑话题接口
  248. // @Param request body aimod.TopicEditReq true "type json string"
  249. // @Success Ret=200 编辑成功
  250. // @router /topic/edit [post]
  251. func (this *AiController) TopicEdit() {
  252. br := new(models.BaseResponse).Init()
  253. defer func() {
  254. this.Data["json"] = br
  255. this.ServeJSON()
  256. }()
  257. sysUser := this.SysUser
  258. if sysUser == nil {
  259. br.Msg = "请登录"
  260. br.ErrMsg = "请登录,SysUser Is Empty"
  261. br.Ret = 408
  262. return
  263. }
  264. var req aimod.TopicEditReq
  265. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  266. if err != nil {
  267. br.Msg = "参数解析异常!"
  268. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  269. return
  270. }
  271. if req.AiChatTopicId <= 0 {
  272. br.Msg = "参数错误!"
  273. br.ErrMsg = "参数错误!AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
  274. return
  275. }
  276. topic, err := aimod.GetAiChatTopicByTopicName(req.TopicName)
  277. if err != nil && err.Error() != utils.ErrNoRow() {
  278. br.Msg = "编辑失败!"
  279. br.ErrMsg = "获取数据失败!Err:" + err.Error()
  280. return
  281. }
  282. if topic != nil && topic.AiChatTopicId != req.AiChatTopicId {
  283. br.Msg = "话题名称已存在,请重新修改!"
  284. return
  285. }
  286. err = aimod.EditTopic(req.AiChatTopicId, req.TopicName)
  287. if err != nil {
  288. br.Msg = "编辑失败!"
  289. br.ErrMsg = "编辑失败,Err:" + err.Error()
  290. return
  291. }
  292. br.Ret = 200
  293. br.Success = true
  294. br.Msg = "编辑成功"
  295. br.IsAddLog = true
  296. }