ai_file.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  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"
  8. "eta_gn/eta_api/services/aiser"
  9. "eta_gn/eta_api/utils"
  10. "fmt"
  11. "os"
  12. "path"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. type AiFileController struct {
  18. controllers.BaseAuthController
  19. }
  20. // @router /file/upload [post]
  21. func (this *AiFileController) FileUpload() {
  22. br := new(models.BaseResponse).Init()
  23. defer func() {
  24. this.Data["json"] = br
  25. this.ServeJSON()
  26. }()
  27. f, h, err := this.GetFile("File")
  28. if err != nil {
  29. br.Msg = "获取资源信息失败"
  30. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  31. return
  32. }
  33. model := this.GetString("Model")
  34. aiChatTopicId, _ := this.GetInt("AiChatTopicId")
  35. uploadFileName := h.Filename //上传的文件名
  36. ext := path.Ext(h.Filename)
  37. dateDir := time.Now().Format("20060102")
  38. uploadDir := utils.STATIC_DIR + "ai/" + dateDir
  39. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  40. if err != nil {
  41. br.Msg = "存储目录创建失败"
  42. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  43. return
  44. }
  45. randStr := utils.GetRandStringNoSpecialChar(28)
  46. fileName := randStr + ext
  47. fpath := uploadDir + "/" + fileName
  48. defer f.Close() //关闭上传文件
  49. err = this.SaveToFile("File", fpath)
  50. if err != nil {
  51. br.Msg = "文件上传失败"
  52. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  53. return
  54. }
  55. resourceUrl := ``
  56. ossClient := services.NewOssClient()
  57. if ossClient == nil {
  58. br.Msg = "上传失败"
  59. br.ErrMsg = "初始化OSS服务失败"
  60. return
  61. }
  62. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  63. if err != nil {
  64. br.Msg = "文件上传失败"
  65. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  66. return
  67. }
  68. defer func() {
  69. os.Remove(fpath)
  70. }()
  71. item := new(models.Resource)
  72. item.ResourceUrl = resourceUrl
  73. item.ResourceType = 1
  74. item.CreateTime = time.Now()
  75. newId, err := models.AddResource(item)
  76. if err != nil {
  77. br.Msg = "资源上传失败"
  78. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  79. return
  80. }
  81. //调用AI接口,上传文件
  82. resp := models.ResourceResp{
  83. Id: newId,
  84. ResourceUrl: resourceUrl,
  85. ResourceName: uploadFileName,
  86. }
  87. uploadResult, err := aiser.OpenAiFileUpload(resourceUrl, uploadFileName, model)
  88. if err != nil {
  89. br.Msg = "文件上传失败"
  90. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  91. return
  92. }
  93. var assistantId, threadId string
  94. if aiChatTopicId > 0 {
  95. aiChatTopicObj := new(aimod.AiChatTopic)
  96. aiChatTopicObj.AiChatTopicId = aiChatTopicId
  97. topic, err := aiChatTopicObj.GetAiChatTopicById()
  98. if err != nil {
  99. if utils.IsErrNoRow(err) {
  100. br.Msg = "获取数据失败!"
  101. br.ErrMsg = "获取数据失败,主题不存在,Err:" + err.Error()
  102. return
  103. }
  104. br.Msg = "获取数据失败!"
  105. br.ErrMsg = "获取数据失败,GetAiChatTopicById,Err:" + err.Error()
  106. return
  107. }
  108. assistantId = topic.AssistantId
  109. threadId = topic.ThreadId
  110. }
  111. if aiChatTopicId <= 0 { //新增
  112. topic := new(aimod.AiChatTopic)
  113. var filenameWithSuffix string
  114. filenameWithSuffix = path.Base(uploadFileName)
  115. var fileSuffix string
  116. fileSuffix = path.Ext(filenameWithSuffix)
  117. var filenameOnly string
  118. filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix)
  119. topic.TopicName = filenameOnly
  120. topic.SysUserId = this.SysUser.AdminId
  121. topic.SysUserRealName = this.SysUser.RealName
  122. topic.CreateTime = time.Now()
  123. topic.ModifyTime = time.Now()
  124. topic.AssistantId = assistantId
  125. topic.ThreadId = threadId
  126. topicId, err := aimod.AddAiChatTopic(topic)
  127. if err != nil {
  128. br.Msg = "获取数据失败!"
  129. br.ErrMsg = "生成话题失败,Err:" + err.Error()
  130. return
  131. }
  132. aiChatTopicId = int(topicId)
  133. chatItem := new(aimod.AiChat)
  134. chatItem.AiChatTopicId = aiChatTopicId
  135. chatItem.Ask = uploadFileName
  136. chatItem.AskUuid = utils.MD5(uploadFileName)
  137. chatItem.Model = EnabledModelsForMap[model]
  138. chatItem.SysUserId = this.SysUser.AdminId
  139. chatItem.SysUserRealName = this.SysUser.RealName
  140. if uploadResult != nil && uploadResult.Data != nil {
  141. chatItem.OpenaiFileId = uploadResult.Data.ID
  142. chatItem.OpenaiFileName = uploadFileName
  143. }
  144. chatItem.OpenaiFilePath = resourceUrl
  145. chatItem.CreateTime = time.Now()
  146. chatItem.ModifyTime = time.Now()
  147. _, err = aimod.AddAiChat(chatItem)
  148. if err != nil {
  149. br.Msg = "获取数据失败!"
  150. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  151. return
  152. }
  153. } else {
  154. chatItem := new(aimod.AiChat)
  155. chatItem.AiChatTopicId = aiChatTopicId
  156. chatItem.Ask = uploadFileName
  157. chatItem.AskUuid = utils.MD5(fileName)
  158. chatItem.Model = EnabledModelsForMap[model]
  159. chatItem.SysUserId = this.SysUser.AdminId
  160. chatItem.SysUserRealName = this.SysUser.RealName
  161. if uploadResult != nil && uploadResult.Data != nil {
  162. chatItem.OpenaiFileId = uploadResult.Data.ID
  163. chatItem.OpenaiFileName = uploadFileName
  164. }
  165. chatItem.OpenaiFilePath = resourceUrl
  166. chatItem.CreateTime = time.Now()
  167. chatItem.ModifyTime = time.Now()
  168. _, err = aimod.AddAiChat(chatItem)
  169. if err != nil {
  170. br.Msg = "获取数据失败!"
  171. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  172. return
  173. }
  174. }
  175. if uploadResult != nil && uploadResult.Data != nil && uploadResult.Data.ID != "" {
  176. uploadObj := new(aimod.FileUploadRecord)
  177. uploadObj.AdminId = this.SysUser.AdminId
  178. uploadObj.FileUrl = resourceUrl
  179. uploadObj.FileName = uploadFileName
  180. uploadObj.OpenaiFileId = uploadResult.Data.ID
  181. uploadObj.OpenaiFileName = uploadResult.Data.FileName
  182. uploadObj.OpenaiObject = uploadResult.Data.Object
  183. uploadObj.OpenaiStatus = uploadResult.Data.Status
  184. uploadObj.OpenaiPurpose = uploadResult.Data.Purpose
  185. uploadObj.OpenaiStatusDetails = uploadResult.Data.StatusDetails
  186. uploadObj.OpenaiCreatedAt = fmt.Sprint(uploadResult.Data.CreatedAt)
  187. uploadObj.CreateTime = time.Now()
  188. uploadObj.ModifyTime = time.Now()
  189. _, err = uploadObj.AddFileUploadRecord()
  190. if err != nil {
  191. br.Msg = "上传失败"
  192. br.ErrMsg = "上传失败,Err:" + err.Error()
  193. return
  194. }
  195. resp.OpenaiFileId = uploadObj.OpenaiFileId
  196. }
  197. resp.AiChatTopicId = aiChatTopicId
  198. br.Msg = "上传成功"
  199. br.Ret = 200
  200. br.Success = true
  201. br.Data = resp
  202. return
  203. }
  204. // @router /file/retrieve [post]
  205. func (this *AiFileController) FileRetrieve() {
  206. br := new(models.BaseResponse).Init()
  207. defer func() {
  208. this.Data["json"] = br
  209. this.ServeJSON()
  210. }()
  211. var req aimod.FileRetrieveReq
  212. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  213. if err != nil {
  214. br.Msg = "参数解析异常!"
  215. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  216. return
  217. }
  218. if req.Ask == "" {
  219. br.Msg = "请输入提问内容!"
  220. br.ErrMsg = "请输入提问内容"
  221. return
  222. }
  223. if utils.Re == nil {
  224. key := "CACHE_CHAT_" + strconv.Itoa(this.SysUser.AdminId)
  225. cacheVal, err := utils.Rc.RedisInt(key)
  226. fmt.Println("RedisString:", cacheVal, "err:", err)
  227. if err != nil && (err.Error() != "redigo: nil returned" && err.Error() != "redis: nil") {
  228. br.Msg = "获取数据失败!"
  229. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  230. return
  231. }
  232. putVal := 0
  233. if cacheVal <= 0 {
  234. putVal = utils.AiChatLimit
  235. } else {
  236. putVal = cacheVal - 1
  237. }
  238. if putVal <= 0 {
  239. br.Msg = "您今日" + strconv.Itoa(utils.AiChatLimit) + "次问答已达上限,请明天再来!"
  240. br.ErrMsg = "您今日" + strconv.Itoa(utils.AiChatLimit) + "次问答已达上限,请明天再来!"
  241. return
  242. }
  243. lastSecond := utils.GetTodayLastSecond()
  244. utils.Rc.Put(key, putVal, lastSecond)
  245. }
  246. askUuid := utils.MD5(req.Ask)
  247. var assistantId, threadId string
  248. if req.AiChatTopicId > 0 {
  249. aiChatTopicObj := new(aimod.AiChatTopic)
  250. aiChatTopicObj.AiChatTopicId = req.AiChatTopicId
  251. topic, err := aiChatTopicObj.GetAiChatTopicById()
  252. if err != nil {
  253. if utils.IsErrNoRow(err) {
  254. br.Msg = "获取数据失败!"
  255. br.ErrMsg = "获取数据失败,主题不存在,Err:" + err.Error()
  256. return
  257. }
  258. br.Msg = "获取数据失败!"
  259. br.ErrMsg = "获取数据失败,GetAiChatTopicById,Err:" + err.Error()
  260. return
  261. }
  262. assistantId = topic.AssistantId
  263. threadId = topic.ThreadId
  264. }
  265. resp := new(aimod.ChatResp)
  266. var answer string
  267. historyList, err := aimod.GetAiChatList(req.AiChatTopicId)
  268. if err != nil && !utils.IsErrNoRow(err) {
  269. br.Msg = "获取主题历史数据失败!"
  270. br.ErrMsg = "获取主题历史数据失败,Err:" + err.Error()
  271. return
  272. }
  273. frList := make([]aimod.HistoryChat, 0)
  274. tmpFileIdList := make([]string, 0)
  275. for _, v := range historyList {
  276. if v.OpenaiFileId != "" {
  277. tmpFileIdList = append(tmpFileIdList, v.OpenaiFileId)
  278. } else {
  279. historyFr := new(aimod.HistoryChat)
  280. historyFr.Ask = v.Ask
  281. historyFr.Answer = v.Answer
  282. historyFr.OpenaiFileId = tmpFileIdList
  283. frList = append(frList, *historyFr)
  284. tmpFileIdList = []string{}
  285. }
  286. }
  287. {
  288. frItem := new(aimod.HistoryChat)
  289. frItem.Ask = req.Ask
  290. frItem.Answer = ""
  291. frItem.OpenaiFileId = tmpFileIdList
  292. frList = append(frList, *frItem)
  293. }
  294. fileRetrieveResp, err := aiser.FileRetrieve(assistantId, threadId, req.Model, frList, req.OpenaiFileId)
  295. if err != nil {
  296. br.Msg = "获取数据失败!"
  297. br.ErrMsg = "获取数据失败,FileRetrieve,Err:" + err.Error()
  298. return
  299. }
  300. if fileRetrieveResp != nil {
  301. if fileRetrieveResp.Ret == 200 {
  302. assistantId = fileRetrieveResp.Data.AssistantId
  303. threadId = fileRetrieveResp.Data.ThreadId
  304. answer = fileRetrieveResp.Data.Answer
  305. } else {
  306. br.Msg = "获取数据失败!"
  307. br.ErrMsg = fileRetrieveResp.Msg
  308. return
  309. }
  310. }
  311. if req.AiChatTopicId <= 0 { //新增
  312. name, err := aiser.QueryAskContent(req.Ask)
  313. if err != nil {
  314. br.Msg = "获取数据失败!"
  315. br.ErrMsg = "获取数据失败,QueryAskContent,Err:" + err.Error()
  316. return
  317. }
  318. topic := new(aimod.AiChatTopic)
  319. topic.TopicName = name
  320. topic.SysUserId = this.SysUser.AdminId
  321. topic.SysUserRealName = this.SysUser.RealName
  322. topic.CreateTime = time.Now()
  323. topic.ModifyTime = time.Now()
  324. topic.AssistantId = assistantId
  325. topic.ThreadId = threadId
  326. topicId, err := aimod.AddAiChatTopic(topic)
  327. if err != nil {
  328. br.Msg = "获取数据失败!"
  329. br.ErrMsg = "生成话题失败,Err:" + err.Error()
  330. return
  331. }
  332. chatItem := new(aimod.AiChat)
  333. chatItem.AiChatTopicId = int(topicId)
  334. chatItem.Ask = req.Ask
  335. chatItem.AskUuid = utils.MD5(req.Ask)
  336. chatItem.Answer = answer
  337. chatItem.Model = EnabledModelsForMap[req.Model]
  338. chatItem.SysUserId = this.SysUser.AdminId
  339. chatItem.SysUserRealName = this.SysUser.RealName
  340. chatItem.CreateTime = time.Now()
  341. chatItem.ModifyTime = time.Now()
  342. _, err = aimod.AddAiChat(chatItem)
  343. if err != nil {
  344. br.Msg = "获取数据失败!"
  345. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  346. return
  347. }
  348. req.AiChatTopicId = int(topicId)
  349. } else {
  350. chatItem := new(aimod.AiChat)
  351. chatItem.AiChatTopicId = req.AiChatTopicId
  352. chatItem.Ask = req.Ask
  353. chatItem.AskUuid = askUuid
  354. chatItem.Answer = answer
  355. chatItem.Model = EnabledModelsForMap[req.Model]
  356. chatItem.SysUserId = this.SysUser.AdminId
  357. chatItem.SysUserRealName = this.SysUser.RealName
  358. chatItem.CreateTime = time.Now()
  359. chatItem.ModifyTime = time.Now()
  360. _, err = aimod.AddAiChat(chatItem)
  361. if err != nil {
  362. br.Msg = "获取数据失败!"
  363. br.ErrMsg = "生成话题记录失败,Err:" + err.Error()
  364. return
  365. }
  366. aiChatTopicObj := new(aimod.AiChatTopic)
  367. err = aiChatTopicObj.UpdateAssistantAndThreadId(assistantId, threadId, req.AiChatTopicId)
  368. if err != nil {
  369. br.Msg = "获取失败!"
  370. br.ErrMsg = "修改助手标识失败,Err:" + err.Error()
  371. return
  372. }
  373. }
  374. resp.Model = aimod.ModelViewMap[req.Model]
  375. resp.AiChatTopicId = req.AiChatTopicId
  376. resp.Ask = req.Ask
  377. resp.Answer = answer
  378. br.Ret = 200
  379. br.Success = true
  380. br.Msg = "获取成功"
  381. br.Data = resp
  382. return
  383. }
  384. var EnabledModelsForMap = map[string]string{
  385. "Kimi": "moonshot-v1-32k",
  386. "GPT-4 Turbo": "gpt-4-1106-preview",
  387. }