123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- package services
- import (
- "errors"
- "eta/eta_api/models"
- "eta/eta_api/models/data_manage"
- "eta/eta_api/models/fe_calendar"
- "eta/eta_api/models/system"
- "eta/eta_api/services/data"
- "eta/eta_api/utils"
- "eta/eta_api/utils/llm"
- "eta/eta_api/utils/llm/eta_llm"
- "fmt"
- "net/http"
- "time"
- )
- func GetFeCalendarAiArticle(req *fe_calendar.FeCalendarAiArticleGenerateReq, matterDateTime time.Time, edbInfo *data_manage.EdbInfo, sysUser *system.Admin) (ret *fe_calendar.FeCalendarAiArticleGenerateResp, err error) {
- defer func() {
- if err != nil {
- utils.FileLog.Error(fmt.Sprintf("获取AI文章失败: %s", err.Error()))
- }
- }()
-
-
- var endDate string
- if edbInfo.EndDate <= req.MatterDate {
- endDate = edbInfo.EndDate
- }else{
- month := matterDateTime.Month()
- year := matterDateTime.Year()
- endDate = time.Date(year, month+1, 1, 0, 0, 0, 0, matterDateTime.Location()).AddDate(0, 0, -1).Format(utils.FormatDate)
- }
-
- classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
- if err != nil {
- err = errors.New(errMsg)
- return
- }
- classifyName := ""
- for _, v := range classifyList {
- classifyName += v.ClassifyName + "/"
- }
- edbData := make([]*data_manage.EdbDataList, 0)
- switch edbInfo.EdbInfoType {
- case 0: //普通源指标
- //dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDateReal, endDate)
- // 获取指标数据
- edbData, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, "", endDate)
- if err != nil {
- err = errors.New("获取指标数据失败, Err: " + err.Error())
- return
- }
-
- case 1: //预测指标
- edbData, _, _, err, _ = data.GetPredictDataListByPredictEdbInfo(edbInfo, "", endDate, true)
- if err != nil {
- err = errors.New("获取预测指标数据失败, Err: " + err.Error())
- return
- }
-
- }
- if len(edbData) == 0 {
- err = errors.New("指标数据为空")
- return
- }
- dataStr := "日期 值\n"
- for _, v := range edbData {
- dataStr += fmt.Sprintf("%s %f.8\n", v.DataTime, v.Value)
- }
- endDate = edbData[len(edbData) - 1].DataTime
- // 获取提示词内容
- promote := models.BusinessConfMap[models.BusinessConfFeCalendarAiArticlePromote]
-
- // 调用大模型的接口
- edbName := edbInfo.EdbName
- frequency := edbInfo.Frequency
- startDate := edbInfo.StartDate
- sourceName := edbInfo.SourceName
-
-
- llmService, _ := llm.GetInstance(llm.ETA_LLM_CLIENT)
- promote = fmt.Sprintf(promote, edbName, frequency, startDate, endDate, sourceName, dataStr, classifyName)
- resp, err := llmService.CompletionChat(promote, nil)
- if err != nil {
- err = errors.New("获取AI文章失败, Err: " + err.Error())
- return
- }
- defer func() {
- if resp != nil && resp.Body != nil && err == nil {
- _ = resp.Body.Close()
- }
- }()
- if resp == nil {
- err = errors.New("知识库问答失败: 无应答")
- return
- }
- if err != nil {
- err = errors.New(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
- return
- }
- if resp.StatusCode != http.StatusOK {
- utils.FileLog.Error(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
- err = errors.New(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
- return
- }
- text := ""
- // 解析流式响应
- contentChan, errChan, closeChan, _ := eta_llm.ParseStreamResponse(resp)
- for {
- select {
- case content, ok := <-contentChan:
- if !ok {
- err = errors.New("未知的内容错误异常")
- // 标记llm提问状态:未提问
- return nil, err
- }
- text += content
- case chanErr, ok := <-errChan:
- if !ok {
- err = errors.New("未知的错误异常")
- } else if chanErr != nil {
- err = errors.New(chanErr.Error())
- }
- // 标记llm提问状态:未提问
- return nil, err
- case <-closeChan:
- goto LOOP_END
- }
- }
- LOOP_END:
-
- // 获取品种信息
- // permissionItem, err := models.GetChartPermissionById(req.ChartPermissionId)
- // if err != nil {
- // err = errors.New("获取品种信息失败, Err: " + err.Error())
- // return
- // }
- // article := new(fe_calendar.FeCalendarAiArticle)
- // article.Title = edbInfo.EdbName
- // article.Content = text
- // article.Prompt = promote
- // article.ChartPermissionId = req.ChartPermissionId
- // article.ChartPermissionName = permissionItem.PermissionName
- // article.EdbCode = edbInfo.EdbCode
- // article.EdbInfoId = edbInfo.EdbInfoId
- // article.MatterDate = req.MatterDate
- // article.MatterMonth = req.MatterDate
- // article.SysUserId = sysUser.AdminId
- // article.SysUserName = sysUser.RealName
- // // 设置月份
- // article.MatterMonth = matterDateTime.Format("2006-01")
- // err = article.Create()
- // if err != nil {
- // err = errors.New("保存AI文章失败, Err: " + err.Error())
- // return
- // }
- ret = &fe_calendar.FeCalendarAiArticleGenerateResp{
- Content: text,
- ModifyTime: time.Now().Format(utils.FormatDateTime),
- }
- return ret, nil
- }
|