wujingjing
2024-11-06 2fe9598285b3ab807d4c7496dbc9be7b706697f3
src/components/chat/Chat.vue
@@ -56,7 +56,7 @@
                                          <span class="ywifont ywicon-loading1 animate-spin !text-[24px]"></span>
                                       </template>
                                       <template #title>
                                          <span class="text-sm">{{ subItem.title }}</span>
                                          <span class="text-sm">{{ subItem.title }}<span v-if="subItem.ms" class="text-green-600">{{ `(${subItem.ms})` }}</span></span>
                                       </template>
                                    </el-step>
                                 </el-steps>
@@ -84,7 +84,12 @@
                                    </div>
                                 </div>
                                 <template v-else>
                                    <component :is="answerTypeMapCom[item.content.type]" :data="item.content.values" :originData="item" />
                                    <component
                                       :conclusion="item.conclusion"
                                       :is="answerTypeMapCom[item.content.type]"
                                       :data="item.content.values"
                                       :originData="item"
                                    />
                                    <div
                                       v-if="item.role === RoleEnum.assistant && item.content.origin?.ext_call_list"
                                       class="flex font-bold items-center mt-6"
@@ -243,6 +248,7 @@
import { ErrorCode } from '/@/utils/request';
import { ElMessage } from 'element-plus';
import useClipboard from 'vue-clipboard3';
import { toMyFixed, toPercent } from '/@/utils/util';
const chatWidth = '75%';
const voicePageIsShow = ref(false);
let isTalking = ref(false);
@@ -258,7 +264,7 @@
const computedMessageList = computed(() => {
   return messageList.value.filter((v) => !!v);
});
const parseContent = (res) => {
const parseContent = (res, reportIsShow = false) => {
   if (!res) return null;
   let content: ChatContent = {
      type: AnswerType.Text,
@@ -289,7 +295,10 @@
      case AnswerType.Summary:
         content = {
            type: AnswerType.Summary,
            values: res.summary,
            values: res.summary?.map((item) => {
               item.reportIsShow = reportIsShow;
               return item;
            }),
         };
         break;
      case AnswerType.Url:
@@ -412,21 +421,57 @@
   // queryProcess();
   resetStep();
   let res = null;
   await questionStreamByPost(params, (chunkRes) => {
      Logger.info('chunk response:\n\n' + JSON.stringify(chunkRes));
      if (chunkRes.mode === 'result') {
         res = chunkRes.value;
      } else {
   let lastTimestamp = new Date().getTime();
   const resultP = new Promise(async (resolve, reject) => {
      await questionStreamByPost(params, (chunkRes) => {
         Logger.info('chunk response:\n\n' + JSON.stringify(chunkRes));
         if (chunkRes.mode === 'result') {
            res = chunkRes.value;
            resolve(res);
            chunkRes.value = '准备数据分析';
         }
         if (chunkRes.mode === 'conclusion') {
            computedMessageList.value.at(-1).conclusion = chunkRes.value;
            chunkRes.value = '分析结束';
         }
         const stepList = computedMessageList.value.at(-1).stepList;
         const currentTimeStamp = new Date().getTime();
         const ms = toMyFixed(currentTimeStamp - lastTimestamp, 2) + ' ms';
         if (chunkRes.mode === 'finish') {
            const title = stepList.at(-1).title;
            // stepList.at(-1).title = `${title}(${ms})`;
            stepList.at(-1).ms = ms;
            isTalking.value = false;
            return;
         }
         if (stepList?.length >= 1) {
            const title = stepList.at(-1).title;
            // stepList.at(-1).title = `${title}(${ms})`;
            stepList.at(-1).ms = ms;
         }
         lastTimestamp = currentTimeStamp;
         const stepItem = convertProcessItem(chunkRes);
         computedMessageList.value.at(-1).stepList.push(stepItem);
         stepList.push(stepItem);
         scrollToBottom();
      }
   }).finally(() => {
      computedMessageList.value.at(-1).stepIsShow = false;
      resetStep();
      })
         .catch((err) => {
            throw err;
         })
         .finally(() => {
            isTalking.value = false;
            computedMessageList.value.at(-1).stepIsShow = false;
            resetStep();
         });
   });
   questionRes = res;
   const content = parseContent(res);
   questionRes = await resultP;
   const content = parseContent(res, true);
   return content;
};
@@ -477,7 +522,7 @@
      if (isCallExtParams) {
         const extRes = await extCallQuery(isCallExtParams);
         questionRes = extRes;
         resMsgContent = parseContent(extRes);
         resMsgContent = parseContent(extRes, true);
      } else {
         resMsgContent = await questionAi(content.values);
      }
@@ -502,8 +547,6 @@
      //    type: AnswerType.Text,
      //    values: '发生错误!',
      // });
   } finally {
      isTalking.value = false;
   }
};