From 312dd4fbc040b0f413c9b27149613d6f22c949a0 Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期二, 10 九月 2024 17:44:54 +0800 Subject: [PATCH] scroll to bottom;section A Id --- src/components/chat/Chat.vue | 137 ++++++++++++++++++++++++++++++++++++--------- 1 files changed, 108 insertions(+), 29 deletions(-) diff --git a/src/components/chat/Chat.vue b/src/components/chat/Chat.vue index b7c1684..1a85964 100644 --- a/src/components/chat/Chat.vue +++ b/src/components/chat/Chat.vue @@ -36,23 +36,43 @@ v-for="fixItem in item.content.origin.err_json.fix_question?.values" :key="fixItem" class="bg-gray-200 p-3 hover:bg-[#c5e0ff] hover:text-[#1c86ff] cursor-pointer rounded-lg" - @click="fixQuestionClick(fixItem)" + @click="fixQuestionClick(fixItem, item.content.origin)" > {{ fixItem.title }} </div> </div> </div> </div> - <component v-else :is="answerTypeMapCom[item.content.type]" :data="item.content.values" :originData="item" /> + <template v-else> + <component :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" + > + <div class="flex-0 mb-auto -mr-4">鍏宠仈鍔熻兘锛�</div> + <div class="space-x-5 flex flex-wrap"> + <div + v-for="callItem in item.content.origin?.ext_call_list" + :key="callItem.call_ext_id" + @click="relativeQueryClick(callItem)" + class="cursor-pointer hover:underline first-of-type:ml-5" + > + {{ callItem.question }} + </div> + </div> + </div> + </template> </div> + <!-- 鎿嶄綔 --> <div v-if="item.role === RoleEnum.assistant" class="absolute flex items-center right-0 mr-4 mt-2 space-x-2"> <div class="flex items-center justify-center size-[15px]" v-if="item.content?.type === AnswerType.Text || item.content?.type === AnswerType.Knowledge" > <i - class="p-2 ywicon icon-copy cursor-pointer hover:text-[#0284ff] hover:!text-[18px]" + class="p-2 ywifont ywicon-copy cursor-pointer hover:text-[#0284ff] hover:!text-[18px]" @click="copyClick(item)" /> </div> @@ -60,14 +80,14 @@ <div class="flex items-center justify-center size-[15px]"> <i :class="{ 'text-[#0284ff]': item.state === AnswerState.Like }" - class="p-2 ywicon icon-dianzan cursor-pointer hover:text-[#0284ff] font-medium hover:!text-[18px]" + class="p-2 ywifont ywicon-dianzan cursor-pointer hover:text-[#0284ff] font-medium hover:!text-[18px]" @click="likeClick(item)" /> </div> <div class="flex items-center justify-center size-[15px]"> <i :class="{ 'text-[#0284ff]': item.state === AnswerState.Unlike }" - class="p-2 ywicon icon-buzan cursor-pointer hover:text-[#0284ff] !text-[13px] hover:!text-[15px]" + class="p-2 ywifont ywicon-buzan cursor-pointer hover:text-[#0284ff] !text-[13px] hover:!text-[15px]" @click="unLikeClick(item)" /> </div> @@ -75,7 +95,7 @@ <div class="flex items-center justify-center size-[15px] relative"> <i - class="p-2 ywicon icon-wentifankui cursor-pointer hover:text-[#0284ff] !text-[13px] hover:!text-[15px]" + class="p-2 ywifont ywicon-wentifankui cursor-pointer hover:text-[#0284ff] !text-[13px] hover:!text-[15px]" @click=" ($event) => feedbackClick( @@ -99,7 +119,7 @@ </div> </div> - <Loding v-else class="w-fit" :process="process" /> + <Loding v-if="isTalking && index === messageList.length - 1" class="w-fit" :process="process" /> </div> </div> </div> @@ -147,7 +167,7 @@ import { useScrollToBottom } from './hooks/useScrollToBottom'; import type { ChatContent } from './model/types'; import { AnswerState, AnswerType, RoleEnum, answerTypeMapCom, roleImageMap, type ChatMessage } from './model/types'; -import { GetHistoryAnswer, QueryHistoryDetail, QuestionAi } from '/@/api/ai/chat'; +import { GetHistoryAnswer, QueryHistoryDetail, QuestionAi, extCallQuery } from '/@/api/ai/chat'; import PlayBar from '/@/components/chat/components/playBar/PlayBar.vue'; import CustomDrawer from '/@/components/drawer/CustomDrawer.vue'; import router from '/@/router'; @@ -230,30 +250,58 @@ }; const { clearQueryProcess, process, processId, queryProcess } = useQueryProcess(); +const DEFAULT_SECTION_A_ID = 'knowledge_base'; let questionRes = null; + +let finalCalcSectionAId = null; const questionAi = async (text) => { - if (!currentSectionId) { - ElMessage.warning('鍙戦�佸け璐ワ紝鏈‘瀹氬簲鐢ㄥ満鏅紒'); - } + processId.value = uuidv4(); + let judgeParams = null; + if (!preQuestion.value) { + // const aiContent = computedMessageList.value.filter((item) => item.role === RoleEnum.assistant); + // const lastQuestion = aiContent[aiContent.length - 2]?.content?.origin?.question; + // judgeParams = lastQuestion + // ? { + // prev_question: lastQuestion, + // } + // : {}; + // 姝e父鍥炵瓟鏆傛椂涓嶉噰鐢� + judgeParams = {}; + } else { + judgeParams = { + prev_question: preQuestion.value, + }; + } + let currentSectionAId = ''; + if (activeSectionAId.value) { + currentSectionAId = activeSectionAId.value; + activeSectionAId.value = ''; + } else { + const lastSectionAItem = _.findLast(computedMessageList.value as any, (item) => item.role === RoleEnum.assistant && !!item.sectionAId); + currentSectionAId = lastSectionAItem?.sectionAId ?? DEFAULT_SECTION_A_ID; + } + finalCalcSectionAId = currentSectionAId; + const params = { process_id: processId.value, question: text, // FIXME: 鏆傛椂杩欐牱 - section_a_id: currentSectionId, + section_a_id: currentSectionAId, history_group_id: currentRouteId, raw_mode: roomConfig.value?.[currentRouteId]?.isAnswerByLLM ?? false, - next_chat: isNextChat.value, + ...judgeParams, } as any; if (currentSampleId) { params.sample_id = currentSampleId; + currentSampleId = ''; } - if (currentLLMId) { - params.llm_id = currentLLMId; - } + // if (currentLLMId) { + // params.llm_id = currentLLMId; + // } clearQueryProcess(); queryProcess(); const res = await QuestionAi(params).finally(() => { @@ -270,8 +318,7 @@ values: '', }); -let currentSectionId = null; -let currentSampleId = null; +let currentSampleId = ''; let currentLLMId = null; @@ -281,8 +328,8 @@ }); }; -const sendChatMessage = async (content: ChatContent = messageContent.value, cb?: any) => { - if (!content?.values) return; +const sendChatMessage = async (content: ChatContent = messageContent.value, cb?: any, isCallExtParams?: any) => { + if (!content?.values || isTalking.value) return; const isNewChat = messageList.value.length === 0; if (isNewChat) { if (activeSampleId.value) { @@ -293,9 +340,7 @@ currentLLMId = activeLLMId.value; } - if (activeSectionAId.value) { - currentSectionId = activeSectionAId.value; - } + } let resMsgContent: ChatContent = null; @@ -310,8 +355,14 @@ // 鍑虹幇鍥炲锛岀疆绌哄嚭鐜扮瓑寰呭姩鐢� messageList.value.push(assistantItem); + if (isCallExtParams) { + const extRes = await extCallQuery(isCallExtParams); + questionRes = extRes; + resMsgContent = parseContent(extRes); + } else { + resMsgContent = await questionAi(content.values); + } - resMsgContent = await questionAi(content.values); if (isNewChat) { const firstResCb = getRoomConfig(currentRouteId, 'firstResCb'); firstResCb?.(resMsgContent); @@ -319,7 +370,9 @@ cb?.(resMsgContent); } userItem.historyId = questionRes.history_id; + userItem.content.values = questionRes?.question ?? userItem.content.values; assistantItem.historyId = questionRes.history_id; + assistantItem.sectionAId = finalCalcSectionAId; appendLastMessageContent(resMsgContent); } catch (error: any) { // appendLastMessageContent({ @@ -355,13 +408,19 @@ }, } as ChatMessage; }); - currentSectionId = res?.details?.[0]?.section_a_id; - currentSampleId = res?.details?.[0]?.sample_id; - const resList = await Promise.all((res.details ?? []).map((item) => getAnswerById(item.history_id))); - let i = 0; + const sectionAIdMap = new Map(); + const resList = await Promise.all( + (res.details ?? []).map((item) => { + sectionAIdMap.set(item.history_id, item.section_a_id); + return getAnswerById(item.history_id); + }) + ); + let i = 0; resList.map((item, index) => { const insertIndex = index + 1 + i; + const userMsg = messageList.value[insertIndex - 1]; + userMsg.content.values = item?.answer?.question ??userMsg.content.values; messageList.value.splice( insertIndex, 0, @@ -372,6 +431,8 @@ role: RoleEnum.assistant, content: parseContent(item.answer), state: item.answer_state, + sectionAId: sectionAIdMap.get(item.answer.history_id), + } ); i++; @@ -392,6 +453,24 @@ displayMessageList: computedMessageList, }); +//#region ====================== 鍏宠仈鏌ヨ ====================== +const relativeQueryClick = async (val) => { + sendChatMessage( + { + type: AnswerType.Text, + values: val.question, + }, + undefined, + { + history_group_id: currentRouteId, + question: val.question, + call_ext_id: val.call_ext_id, + call_ext_args: val.agrs ? JSON.stringify(val.agrs) : null, + } + ); +}; +//#endregion + const { copyClick, likeClick, @@ -404,7 +483,7 @@ feedbackClick, askMoreClick, fixQuestionClick, - isNextChat, + preQuestion, showFixQuestion, showAskMore, } = useAssistantContentOpt({ -- Gitblit v1.9.3