| | |
| | | <!-- <span class="title">{{ agentTitle }}</span>--> |
| | | |
| | | <a-popover position="bottom" trigger="click"> |
| | | <a-button border |
| | | <a-button border> |
| | | <span |
| | | style=" |
| | | width: 100px; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | " |
| | | >{{ from.name }}</span |
| | | > |
| | | <span style=" |
| | | width: 100px; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | ">{{ from.name }}</span> |
| | | <icon-down style="margin-left: 4px" /> |
| | | </a-button> |
| | | <template #content> |
| | |
| | | ref="scrollbar" |
| | | id="home" |
| | | class="chat-list" |
| | | style=" |
| | | width: 80%; |
| | | overflow: auto; |
| | | margin: 0px auto 20px; |
| | | " |
| | | style="width: 80%; overflow: auto; margin: 0px auto 20px" |
| | | :style="{ |
| | | height:uploaditemList.length > 0 ? 'calc(100vh - 480px)' : 'calc(100vh - 380px)' |
| | | height: |
| | | uploaditemList.length > 0 |
| | | ? 'calc(100vh - 480px)' |
| | | : 'calc(100vh - 380px)', |
| | | }" |
| | | > |
| | | <div |
| | |
| | | /> |
| | | </template> |
| | | <template #content> |
| | | <!-- <a-card :class="{ chatItemAnswer: theme === 'light' }">--> |
| | | <!-- <div--> |
| | | <!-- :class="{ light: theme === 'light' }"--> |
| | | <!-- v-html="sessionDetail.content.replace(/\n/g, '<br/>')"--> |
| | | <!-- >--> |
| | | <!-- </div>--> |
| | | <!-- </a-card>--> |
| | | <a-textarea |
| | | readonly |
| | | auto-size |
| | | v-model="sessionDetail.content" |
| | | :class="{ chatItemAnswer: theme === 'light' }" |
| | | :style="{ |
| | | <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)" |
| | | > |
| | | <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> |
| | | </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" /> |
| | | </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-textarea> |
| | | }" style="border: none"> |
| | | {{ sessionDetail.content }} |
| | | </div> |
| | | </a-card> |
| | | </template> |
| | | <!-- <div>{{ sessionDetail.role === 'assistant' }}</div> --> |
| | | <template #actions> |
| | |
| | | v-model="inputMsg" |
| | | @keydown.shift.enter="handleShiftEnter" |
| | | @keydown.enter="sendMessage" |
| | | :placeholder="uploaditemList.length>0?'整理这些文件的核心内容':'输入您想了解的内容,Shift+Enter换行,Enter发送'" |
| | | :placeholder=" |
| | | uploaditemList.length > 0 |
| | | ? '整理这些文件的核心内容' |
| | | : '输入您想了解的内容,Shift+Enter换行,Enter发送' |
| | | " |
| | | allow-clear |
| | | show-word-limit |
| | | :disabled="chatDis" |
| | |
| | | maxRows: 5, |
| | | }" |
| | | /> |
| | | <div style="width: 100%;display: flex;justify-content: space-between"> |
| | | <updataFile ref="fileInput" :sessionId="activeSessionId" @selectFileCallback="selectFileCallback"></updataFile> |
| | | <div |
| | | style=" |
| | | width: 100%; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | " |
| | | > |
| | | <updataFile |
| | | ref="fileInput" |
| | | :sessionId="activeSessionId" |
| | | @selectFileCallback="selectFileCallback" |
| | | ></updataFile> |
| | | <a-button |
| | | :disabled="chatDis" |
| | | @click="sentClick" |
| | |
| | | class="files" |
| | | v-for="(item, index) in uploaditemList" |
| | | :key="index" |
| | | style="position: relative; width: 200px; margin-top: 10px;margin-right: 20px" |
| | | style=" |
| | | position: relative; |
| | | width: 200px; |
| | | margin-top: 10px; |
| | | margin-right: 20px; |
| | | " |
| | | > |
| | | <a-comment |
| | | :author="item.name" |
| | |
| | | </template> |
| | | </a-spin> |
| | | <!-- <a-button type="text" :loading="onFileSelectedLoading" v-if="onFileSelectedLoading"></a-button>--> |
| | | <!-- <a-avatar v-if="!onFileSelectedLoading">--> |
| | | <!-- <icon-file style="color: #0960bd" />--> |
| | | <!-- </a-avatar>--> |
| | | <img :src="getIconByExtension(item.name)" alt="" /> |
| | | <!-- <a-avatar v-if="!onFileSelectedLoading">--> |
| | | <!-- <icon-file style="color: #0960bd" />--> |
| | | <!-- </a-avatar>--> |
| | | <img :src="getIconByExtension(item.name)" alt="" /> |
| | | </template> |
| | | </a-comment> |
| | | <icon-close-circle-fill |
| | |
| | | :footer="false" |
| | | title-align="start" |
| | | > |
| | | <a-form |
| | | ref="formRef" |
| | | :rules="rules" |
| | | :model="from" |
| | | @submit="handleSubmit" |
| | | > |
| | | <a-form ref="formRef" :rules="rules" :model="from" @submit="handleSubmit"> |
| | | <a-form-item field="name" label="名称"> |
| | | <a-input v-model="from.name" placeholder="请输入名称" /> |
| | | </a-form-item> |
| | |
| | | import pdfImg3 from '@/assets/session/execl.png'; |
| | | 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"; |
| | | |
| | | // const url = ref('../../assets/session/PDF.png'); |
| | | |
| | | const sessionDetailList = ref([ |
| | | { |
| | | "content": "你好! 我是你的助理,有什么可以帮到你的吗?", |
| | | "role": "assistant" |
| | | } |
| | | content: '你好! 我是你的助理,有什么可以帮到你的吗?', |
| | | role: 'assistant', |
| | | }, |
| | | ]); //根据会话id出来的会话详情 |
| | | const messagenList = ref({}); |
| | | const sessionList = ref([]); //会话列表 |
| | |
| | | const agentTitle = ref('未命名会话'); |
| | | let chatObj = reactive({}); |
| | | let from = reactive({ |
| | | name:'未命名会话', |
| | | name: '未命名会话', |
| | | }); |
| | | const isStopChat = ref(false); |
| | | const currIndex = ref(0); |
| | |
| | | } |
| | | }; |
| | | let dataItem = []; |
| | | const getTxt = (data, role, message, index) => { |
| | | 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; |
| | | 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)) { |
| | | if (role == 'assistant' && index) { |
| | | let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0; |
| | | dataItem = data[i].doc_aggs; |
| | |
| | | return dataItem; |
| | | }; |
| | | |
| | | const getTipContent = (data, index): string => { |
| | | 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; |
| | | } |
| | | } |
| | | ); |
| | | return maxSimilarityContent; |
| | | }; |
| | | |
| | | const clickHref = (item) => { |
| | | // return Message.warning('暂无法查看'); |
| | | // window.open(`/api/v1/document/get/${item.doc_id}`, '_blank'); |
| | |
| | | }); |
| | | }; |
| | | |
| | | const downloadFile = ({ |
| | | url, |
| | | filename, |
| | | target, |
| | | }: { |
| | | const downloadFile = ({ |
| | | url, |
| | | filename, |
| | | target, |
| | | }: { |
| | | url: string; |
| | | filename?: string; |
| | | target?: string; |
| | |
| | | |
| | | const deleteFile = (item) => { |
| | | console.log(uploaditemList.value); |
| | | uploaditemList.value.splice(item.index,1); |
| | | uploaditemList.value.splice(item.index, 1); |
| | | }; |
| | | |
| | | const { toClipboard } = useClipboard(); |
| | | const copy = async (text) => { |
| | | await toClipboard(text); //参数为要复制的文本 |
| | | }; |
| | | |
| | | |
| | | |
| | | const DialogList = async () => { |
| | | const { code, data } = await getDialogListApi(); |
| | |
| | | event.preventDefault(); // 阻止默认行为,即不换行 |
| | | } |
| | | |
| | | // if (!activeSessionId.value) { |
| | | // Message.warning("请选择会话"); |
| | | // chatDis.value = false; |
| | | // loading.value = false; |
| | | // return; |
| | | // } |
| | | |
| | | // if (displayedText.value) { |
| | | // querySessionList(); |
| | | // } |
| | | |
| | | if (inputMsg.value) { |
| | | startChat(inputMsg.value); |
| | | if (!activeSessionId.value) { |
| | | //新建会话 |
| | | // 如果有会话id |
| | | console.log(inputMsg.value, '新建会话名称'); |
| | | |
| | | inputMsg.value = ''; |
| | | const res = await addSessionApi({ |
| | | dialog_id: '', |
| | | conversation_desc: inputMsg.value, |
| | | }); |
| | | // console.log(res, "res"); |
| | | 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); |
| | | } else { |
| | | Message.error('创建会话失败,请重试'); |
| | | } |
| | | } else { |
| | | startChat(inputMsg.value); |
| | | inputMsg.value = ''; |
| | | } |
| | | } else { |
| | | Message.warning('消息不能为空'); |
| | | } |
| | |
| | | querySessionList(); |
| | | }; |
| | | onBeforeMount(() => { |
| | | //新建会话 |
| | | createSession(''); |
| | | activeSessionId.value = ''; |
| | | }); |
| | | onMounted(() => { |
| | | let container = document.getElementById('container'); |
| | | container.addEventListener('click', () => { |
| | | fileInput.value.cancel(); |
| | | |
| | | }) |
| | | }); |
| | | EventBus.on('newChat', () => { |
| | | agentType.value = '1'; |
| | | createSession(''); |
| | | // createSession(''); |
| | | activeSessionId.value = ''; |
| | | sessionDetailList.value = [ |
| | | { |
| | | content: '你好! 我是你的助理,有什么可以帮到你的吗?', |
| | | role: 'assistant', |
| | | }, |
| | | ]; |
| | | from.name = '未命名会话'; |
| | | }); |
| | | }); |
| | | onBeforeUnmount(() => { |
| | |
| | | :deep(.arco-upload-list-item-operation) { |
| | | //display: none; |
| | | } |
| | | .uploadFileList{ |
| | | .uploadFileList { |
| | | width: 100%; |
| | | max-height: 140px; |
| | | overflow-y: auto; |