| | |
| | | <template #avatar> |
| | | <img |
| | | class="icon-user-jpg" |
| | | src="../../assets/images/icon-chart.png" |
| | | src="../../assets/images/icon-picture.png" |
| | | alt="本地图片" |
| | | /> |
| | | </template> |
| | | <template #content> |
| | | <a-card v-if="isExistTip(sessionDetail.content)"> |
| | | <div :class="{ chatItemAnswer: theme === 'light' }" |
| | | :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}" style="border: none;display: inline;" v-for="(item,tipIndex) in tipMatch(sessionDetail)" |
| | | <div |
| | | :class="{ chatItemAnswer: theme === 'light' }" |
| | | :style="{ |
| | | backgroundColor: |
| | | theme === 'light' ? '#ffffff' : '#000000', |
| | | }" |
| | | style="border: none; display: inline" |
| | | v-for="(item, tipIndex) in tipMatch(sessionDetail)" |
| | | > |
| | | <span v-if="tipIndex == 0"> |
| | | {{ sessionDetail.content.substring(0, item.index) }} |
| | | <a-tooltip background-color="#3491FA" :content="getTipContent( |
| | | messagenList.reference, |
| | | index |
| | | )"> |
| | | <img style="width: 20px;height: 20px" :src="tipImage" /> |
| | | <a-tooltip |
| | | background-color="#3491FA" |
| | | :content=" |
| | | getTipContent(messagenList.reference, index) |
| | | " |
| | | > |
| | | <img |
| | | style="width: 20px; height: 20px" |
| | | :src="tipImage" |
| | | /> |
| | | </a-tooltip> |
| | | </span> |
| | | <span v-else> |
| | | {{ sessionDetail.content.substring(item.preIndex+item.item.length, item.index) }} |
| | | <a-tooltip background-color="#3491FA" :content="getTipContent( |
| | | messagenList.reference, |
| | | index |
| | | )"> |
| | | <img style="width: 20px;height: 20px" :src="tipImage" /> |
| | | {{ |
| | | sessionDetail.content.substring( |
| | | item.preIndex + item.item.length, |
| | | item.index |
| | | ) |
| | | }} |
| | | <a-tooltip |
| | | background-color="#3491FA" |
| | | :content=" |
| | | getTipContent(messagenList.reference, index) |
| | | " |
| | | > |
| | | <img |
| | | style="width: 20px; height: 20px" |
| | | :src="tipImage" |
| | | /> |
| | | </a-tooltip> |
| | | </span> |
| | | |
| | | </div> |
| | | </a-card> |
| | | <a-card v-else> |
| | | <div :class="{ chatItemAnswer: theme === 'light' }" |
| | | :style="{ |
| | | backgroundColor: |
| | | theme === 'light' ? '#ffffff' : '#000000', |
| | | }" style="border: none"> |
| | | <a-card v-else> |
| | | <div |
| | | :class="{ chatItemAnswer: theme === 'light' }" |
| | | :style="{ |
| | | backgroundColor: |
| | | theme === 'light' ? '#ffffff' : '#000000', |
| | | }" |
| | | style="border: none" |
| | | > |
| | | {{ sessionDetail.content }} |
| | | </div> |
| | | </a-card> |
| | |
| | | <template #avatar> |
| | | <img |
| | | class="icon-user-jpg" |
| | | src="../../assets/images/icon-chart.png" |
| | | src="../../assets/images/icon-picture.png" |
| | | alt="本地图片" |
| | | /> |
| | | </template> |
| | |
| | | </div> |
| | | </a-col> |
| | | </a-row> |
| | | <a-modal title=" " v-model:visible="fileVisible" :footer="false" fullscreen> |
| | | <!-- <docx previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>--> |
| | | <docx v-if="documenttype == 'docx'" :previewSrc="previewSrc"></docx> |
| | | <excel v-if="documenttype == 'excel'" :previewSrc="previewSrc"></excel> |
| | | <txtPdf v-if="documenttype == 'txtPdf'" :previewSrc="previewSrc"></txtPdf> |
| | | </a-modal> |
| | | <a-modal |
| | | v-model:visible="visible" |
| | | title="修改名称" |
| | |
| | | </div> |
| | | </template> |
| | | <script setup lang="ts"> |
| | | import { useAppStore, useUserStore } from '@/store'; |
| | | import { useAppStore, userModelState, useUserStore } from '@/store'; |
| | | import { |
| | | computed, |
| | | nextTick, |
| | |
| | | import pdfImg4 from '@/assets/session/icon-txt.png'; |
| | | import pdfImg5 from '@/assets/session/txt.png'; |
| | | import tipImage from '@/assets/session/tip.png'; |
| | | import { number } from "@intlify/core-base"; |
| | | |
| | | import docx from '@/views/dmx/knowledgeLib/components/docx.vue'; |
| | | import excel from '@/views/dmx/knowledgeLib/components/excel.vue'; |
| | | import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue'; |
| | | |
| | | // const url = ref('../../assets/session/PDF.png'); |
| | | |
| | |
| | | const fileInput = ref(null); |
| | | const chatDataMeg = reactive({}); |
| | | const visible = ref(false); |
| | | const fileVisible = ref(false); |
| | | let toStop = false; |
| | | let documenttype = ref('docx'); |
| | | let previewSrc = ref(''); |
| | | |
| | | const modelStore = userModelState(); |
| | | const httpUrl = modelStore.hrefUrl; |
| | | |
| | | const rules = { |
| | | name: [ |
| | |
| | | } |
| | | }; |
| | | let dataItem = []; |
| | | const isExistTip=(message:string):boolean=>{ |
| | | const isExistTip = (message: string): boolean => { |
| | | if (/##[0-9]\$\$/.test(message)) { |
| | | return true; |
| | | } else { |
| | | return false; |
| | | } |
| | | } |
| | | }; |
| | | |
| | | const tipMatch = (session: any): any[] => { |
| | | //match session.content中的##[0-9]$$的索引 |
| | | let indexs: any[] = []; |
| | | let preTip=0; |
| | | let preTip = 0; |
| | | session.content.match(/##([0-9]+)\$\$/g)?.map((item) => { |
| | | let i = session.content.indexOf(item); |
| | | indexs.push({ index: i, item: item, preIndex: preTip }); |
| | | preTip = i; |
| | | }); |
| | | return indexs; |
| | | } |
| | | }; |
| | | |
| | | const getTxt = (data, role, message, index) => { |
| | | if (isExistTip(message)) { |
| | |
| | | }; |
| | | |
| | | const getTipContent = (data, index): string => { |
| | | let maxSimilarityContent = ""; |
| | | let maxSimilarityContent = ''; |
| | | let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0; |
| | | let maxSimilarity = 0; |
| | | data[i].chunks.forEach((chunk) => { |
| | | if (chunk.similarity > maxSimilarity) { |
| | | maxSimilarity = chunk.similarity; |
| | | maxSimilarityContent = chunk.content_with_weight; |
| | | } |
| | | if (chunk.similarity > maxSimilarity) { |
| | | maxSimilarity = chunk.similarity; |
| | | maxSimilarityContent = chunk.content_with_weight; |
| | | } |
| | | ); |
| | | }); |
| | | return maxSimilarityContent; |
| | | }; |
| | | |
| | | const clickHref = (item) => { |
| | | // return Message.warning('暂无法查看'); |
| | | // window.open(`/api/v1/document/get/${item.doc_id}`, '_blank'); |
| | | downloadFile({ |
| | | url: `/api/v1/document/get/${item.doc_id}`, |
| | | filename: item.doc_name, |
| | | }); |
| | | const clickHref = async (item) => { |
| | | documenttype.value = item.doc_name.split('.').pop(); |
| | | previewSrc.value = httpUrl + `/api/v1/document/get/${item.doc_id}`; |
| | | fileVisible.value = true; |
| | | }; |
| | | |
| | | const downloadFile = ({ |
| | |
| | | |
| | | const selectFileCallback = (data) => { |
| | | console.log(data, 'selectFileCallback'); |
| | | uploaditemList.value = data; |
| | | uploaditemList.value = [...uploaditemList.value, ...data]; |
| | | }; |
| | | |
| | | let onFileSelectedLoading = ref(false); |
| | |
| | | //新建会话 |
| | | // 如果有会话id |
| | | console.log(inputMsg.value, '新建会话名称'); |
| | | |
| | | const res = await addSessionApi({ |
| | | dialog_id: '', |
| | | conversation_desc: inputMsg.value, |
| | |
| | | if (res.code == 200) { |
| | | // console.log(res.data.conversation_id); |
| | | activeSessionId.value = res.data?.conversation_id; |
| | | startChat(inputMsg.value); |
| | | inputMsg.value = ''; |
| | | // queryNewSessionDetail(res.data?.conversation_id); |
| | | const { code, data } = await getSessionDetailsApi( |
| | | res.data?.conversation_id |
| | | ); |
| | | if (code === 200) { |
| | | console.log(data, '新建会话详情'); |
| | | Object.assign(chatObj, data); |
| | | startChat(inputMsg.value); |
| | | inputMsg.value = ''; |
| | | } |
| | | } else { |
| | | Message.error('创建会话失败,请重试'); |
| | | } |
| | |
| | | sessionDetailList.value = sessionDetailList.value |
| | | .splice(0, sessionDetailList.value.length - 2) |
| | | .concat(lastArr); |
| | | |
| | | console.log(sessionDetailList.value, 'sessionDetailList2'); |
| | | console.log(chatObj, 'chatObj对象'); |
| | | chatObj.message = chatObj.message.concat(lastArr); |