ai.go 8.5 KB

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