| | |
| | | <div |
| | | class="group flex px-4 py-6 hover:bg-slate-100 rounded-lg relative" |
| | | :class="{ 'flex-row-reverse': item.role === RoleEnum.user }" |
| | | v-for="(item, index) of computedMessageList" |
| | | v-for="(item, msgIndex) of computedMessageList" |
| | | :key="`${item.historyId}_${item.role}`" |
| | | > |
| | | <div class="absolute top-0 left-[72px] text-[#8d8e99]">{{ item?.createTime }}</div> |
| | |
| | | > |
| | | <template |
| | | #icon |
| | | v-if="index + 1 === item.stepList.length && isTalking && index === computedMessageList.length - 1" |
| | | v-if="index + 1 === item.stepList.length && isTalking && msgIndex === computedMessageList.length - 1" |
| | | > |
| | | <span class="ywifont ywicon-loading1 animate-spin !text-[24px]"></span> |
| | | </template> |
| | |
| | | </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" |
| | |
| | | v-if="item.role === RoleEnum.user && item.content?.values" |
| | | class="absolute flex items-center right-0 mr-4 space-x-2" |
| | | > |
| | | <!-- <div class="flex items-center justify-center size-[20px]"> |
| | | <div class="flex items-center justify-center size-[20px]"> |
| | | <i |
| | | class="p-2 ywifont ywicon-copy cursor-pointer hover:text-[#0284ff] font-medium !text-[15px] hover:!text-[18px]" |
| | | @click="copyUserClick(item)" |
| | | /> |
| | | </div> --> |
| | | </div> |
| | | <div class="flex items-center justify-center size-[20px]"> |
| | | <i |
| | | class="p-2 ywifont ywicon-cubelifangti cursor-pointer hover:text-[#0284ff] text-[#000] font-[590] !text-[15px] hover:!text-[18px]" |
| | |
| | | roomConfig, |
| | | } from '/@/stores/chatRoom'; |
| | | import { ErrorCode } from '/@/utils/request'; |
| | | import { ElMessage } from 'element-plus'; |
| | | import useClipboard from 'vue-clipboard3'; |
| | | const chatWidth = '75%'; |
| | | const voicePageIsShow = ref(false); |
| | | let isTalking = ref(false); |
| | |
| | | // 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 { |
| | | |
| | | 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 = '分析结束'; |
| | | } |
| | | |
| | | if (chunkRes.mode === 'finish') { |
| | | isTalking.value = false; |
| | | return; |
| | | } |
| | | |
| | | const stepItem = convertProcessItem(chunkRes); |
| | | computedMessageList.value.at(-1).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; |
| | | |
| | | questionRes = await resultP; |
| | | const content = parseContent(res); |
| | | return content; |
| | | }; |
| | |
| | | // type: AnswerType.Text, |
| | | // values: '发生错误!', |
| | | // }); |
| | | } finally { |
| | | isTalking.value = false; |
| | | } |
| | | }; |
| | | |
| | |
| | | //#endregion |
| | | //#region ====================== 用户询问的问题设置为常用语 ====================== |
| | | const setCommonQuestionInfo = ref({}); |
| | | const { toClipboard } = useClipboard(); |
| | | |
| | | //用户复制问题 |
| | | const copyUserClick = () => {}; |
| | | const copyUserClick = (item) => { |
| | | const text = item.content.values; |
| | | ElMessage.success('复制成功'); |
| | | toClipboard(text); |
| | | }; |
| | | //用户问题设置为常用语 |
| | | const setCommonQuestionClick = (item) => { |
| | | setCommonQuestionInfo.value = item; |