feCalendar_ai.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package services
  2. import (
  3. "errors"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/fe_calendar"
  7. "eta/eta_api/models/system"
  8. "eta/eta_api/services/data"
  9. "eta/eta_api/utils"
  10. "eta/eta_api/utils/llm"
  11. "eta/eta_api/utils/llm/eta_llm"
  12. "fmt"
  13. "net/http"
  14. "time"
  15. )
  16. func GetFeCalendarAiArticle(req *fe_calendar.FeCalendarAiArticleGenerateReq, matterDateTime time.Time, edbInfo *data_manage.EdbInfo, sysUser *system.Admin) (ret *fe_calendar.FeCalendarAiArticleGenerateResp, err error) {
  17. defer func() {
  18. if err != nil {
  19. utils.FileLog.Error(fmt.Sprintf("获取AI文章失败: %s", err.Error()))
  20. }
  21. }()
  22. var endDate string
  23. if edbInfo.EndDate <= req.MatterDate {
  24. endDate = edbInfo.EndDate
  25. }else{
  26. month := matterDateTime.Month()
  27. year := matterDateTime.Year()
  28. endDate = time.Date(year, month+1, 1, 0, 0, 0, 0, matterDateTime.Location()).AddDate(0, 0, -1).Format(utils.FormatDate)
  29. }
  30. classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
  31. if err != nil {
  32. err = errors.New(errMsg)
  33. return
  34. }
  35. classifyName := ""
  36. for _, v := range classifyList {
  37. classifyName += v.ClassifyName + "/"
  38. }
  39. edbData := make([]*data_manage.EdbDataList, 0)
  40. switch edbInfo.EdbInfoType {
  41. case 0: //普通源指标
  42. //dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDateReal, endDate)
  43. // 获取指标数据
  44. edbData, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, "", endDate)
  45. if err != nil {
  46. err = errors.New("获取指标数据失败, Err: " + err.Error())
  47. return
  48. }
  49. case 1: //预测指标
  50. edbData, _, _, err, _ = data.GetPredictDataListByPredictEdbInfo(edbInfo, "", endDate, true)
  51. if err != nil {
  52. err = errors.New("获取预测指标数据失败, Err: " + err.Error())
  53. return
  54. }
  55. }
  56. if len(edbData) == 0 {
  57. err = errors.New("指标数据为空")
  58. return
  59. }
  60. dataStr := "日期 值\n"
  61. for _, v := range edbData {
  62. dataStr += fmt.Sprintf("%s %f.8\n", v.DataTime, v.Value)
  63. }
  64. endDate = edbData[len(edbData) - 1].DataTime
  65. // 获取提示词内容
  66. promote := models.BusinessConfMap[models.BusinessConfFeCalendarAiArticlePromote]
  67. // 调用大模型的接口
  68. edbName := edbInfo.EdbName
  69. frequency := edbInfo.Frequency
  70. startDate := edbInfo.StartDate
  71. sourceName := edbInfo.SourceName
  72. llmService, _ := llm.GetInstance(llm.ETA_LLM_CLIENT)
  73. promote = fmt.Sprintf(promote, edbName, frequency, startDate, endDate, sourceName, dataStr, classifyName)
  74. resp, err := llmService.CompletionChat(promote, nil)
  75. if err != nil {
  76. err = errors.New("获取AI文章失败, Err: " + err.Error())
  77. return
  78. }
  79. defer func() {
  80. if resp != nil && resp.Body != nil && err == nil {
  81. _ = resp.Body.Close()
  82. }
  83. }()
  84. if resp == nil {
  85. err = errors.New("知识库问答失败: 无应答")
  86. return
  87. }
  88. if err != nil {
  89. err = errors.New(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
  90. return
  91. }
  92. if resp.StatusCode != http.StatusOK {
  93. utils.FileLog.Error(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
  94. err = errors.New(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
  95. return
  96. }
  97. text := ""
  98. // 解析流式响应
  99. contentChan, errChan, closeChan, _ := eta_llm.ParseStreamResponse(resp)
  100. for {
  101. select {
  102. case content, ok := <-contentChan:
  103. if !ok {
  104. err = errors.New("未知的内容错误异常")
  105. // 标记llm提问状态:未提问
  106. return nil, err
  107. }
  108. text += content
  109. case chanErr, ok := <-errChan:
  110. if !ok {
  111. err = errors.New("未知的错误异常")
  112. } else if chanErr != nil {
  113. err = errors.New(chanErr.Error())
  114. }
  115. // 标记llm提问状态:未提问
  116. return nil, err
  117. case <-closeChan:
  118. goto LOOP_END
  119. }
  120. }
  121. LOOP_END:
  122. // 获取品种信息
  123. // permissionItem, err := models.GetChartPermissionById(req.ChartPermissionId)
  124. // if err != nil {
  125. // err = errors.New("获取品种信息失败, Err: " + err.Error())
  126. // return
  127. // }
  128. // article := new(fe_calendar.FeCalendarAiArticle)
  129. // article.Title = edbInfo.EdbName
  130. // article.Content = text
  131. // article.Prompt = promote
  132. // article.ChartPermissionId = req.ChartPermissionId
  133. // article.ChartPermissionName = permissionItem.PermissionName
  134. // article.EdbCode = edbInfo.EdbCode
  135. // article.EdbInfoId = edbInfo.EdbInfoId
  136. // article.MatterDate = req.MatterDate
  137. // article.MatterMonth = req.MatterDate
  138. // article.SysUserId = sysUser.AdminId
  139. // article.SysUserName = sysUser.RealName
  140. // // 设置月份
  141. // article.MatterMonth = matterDateTime.Format("2006-01")
  142. // err = article.Create()
  143. // if err != nil {
  144. // err = errors.New("保存AI文章失败, Err: " + err.Error())
  145. // return
  146. // }
  147. ret = &fe_calendar.FeCalendarAiArticleGenerateResp{
  148. Content: text,
  149. ModifyTime: time.Now().Format(utils.FormatDateTime),
  150. }
  151. return ret, nil
  152. }