| | |
| | | :title="subItem.title" |
| | | :status="stepEnumMap[subItem.status]" |
| | | > |
| | | <!-- <template #icon> |
| | | <span v-if="subItem.status === StepEnum.Loading" class="ywifont ywicon-loading animate-spin"></span> |
| | | <span v-else class="ywifont ywicon-loading1 animate-spin"></span> |
| | | </template> --> |
| | | <template |
| | | #icon |
| | | v-if="index + 1 === item.stepList.length && isTalking && index === computedMessageList.length - 1" |
| | | > |
| | | <span class="ywifont ywicon-loading1 animate-spin !text-[24px]"></span> |
| | | </template> |
| | | <template #title> |
| | | <span class="text-sm">{{ subItem.title }}</span> |
| | | </template> |
| | |
| | | </div> |
| | | </div> |
| | | <template v-else> |
| | | <el-popover placement="bottom-start" trigger="hover" :popper-style="{ minWidth: '70px' }" :width="70"> |
| | | <template #default> |
| | | <div class="action" v-if="item.role === RoleEnum.user"> |
| | | <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]" |
| | | @click="copyUserClick(item)" |
| | | /> |
| | | </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]" |
| | | @click="setCommonQuestionClick(item)" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <template #reference> |
| | | <component |
| | | :is="answerTypeMapCom[item.content.type]" |
| | | v-if="item.role === RoleEnum.user" |
| | | :data="item.content.values" |
| | | :originData="item" |
| | | /> |
| | | </template> |
| | | </el-popover> |
| | | <component |
| | | :is="answerTypeMapCom[item.content.type]" |
| | | v-if="item.role !== RoleEnum.user" |
| | | :data="item.content.values" |
| | | :originData="item" |
| | | /> |
| | | <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" |
| | |
| | | </template> |
| | | </div> |
| | | <!-- 操作 --> |
| | | <div |
| | | 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]"> |
| | | <i |
| | | class="p-2 ywifont ywicon-copy cursor-pointer hover:text-[#0284ff] font-medium !text-[15px] hover:!text-[18px]" |
| | | @click="copyUserClick(item)" |
| | | /> |
| | | </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]" |
| | | @click="setCommonQuestionClick(item)" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div |
| | | v-if="item.role === RoleEnum.assistant && item.content?.values" |
| | | class="absolute flex items-center right-0 mr-4 mt-2 space-x-2" |
| | |
| | | @showUpChatClick="showUpChatClick" |
| | | @showDownChatClick="showDownChatClick" |
| | | :style="{ width: chatWidth }" |
| | | :setCommonQuestionInfo="setCommonQuestionInfo" |
| | | ></PlayBar> |
| | | </div> |
| | | </div> |
| | |
| | | <script setup lang="ts"> |
| | | import _ from 'lodash'; |
| | | import moment from 'moment'; |
| | | import { computed, onMounted, ref, triggerRef } from 'vue'; |
| | | import { v4 as uuidv4 } from 'uuid'; |
| | | import { computed, onMounted, ref } from 'vue'; |
| | | import FeedbackPanel from './components/FeedbackPanel.vue'; |
| | | import Loding from './components/Loding.vue'; |
| | | import { useAssistantContentOpt } from './hooks/useAssistantContentOpt'; |
| | | import { useQueryProcess } from './hooks/useQueryProcess'; |
| | | import { convertProcessItem, useScrollLoad } from './hooks/useScrollLoad'; |
| | | import { useScrollToBottom } from './hooks/useScrollToBottom'; |
| | | import type { ChatContent, StepItem } from './model/types'; |
| | | import { |
| | | AnswerState, |
| | | AnswerType, |
| | | RoleEnum, |
| | | answerTypeMapCom, |
| | | roleImageMap, |
| | | type ChatMessage, |
| | | StepEnum, |
| | | stepEnumMap, |
| | | } from './model/types'; |
| | | import { extCallQuery, questionStreamByPost } from '/@/api/ai/chat'; |
| | | import { AnswerState, AnswerType, RoleEnum, answerTypeMapCom, roleImageMap, type ChatMessage, stepEnumMap } from './model/types'; |
| | | import { QuestionAi, extCallQuery, questionStreamByPost } from '/@/api/ai/chat'; |
| | | import PlayBar from '/@/components/chat/components/playBar/PlayBar.vue'; |
| | | import CustomDrawer from '/@/components/drawer/CustomDrawer.vue'; |
| | | import router from '/@/router'; |
| | |
| | | getRoomConfig, |
| | | roomConfig, |
| | | } from '/@/stores/chatRoom'; |
| | | import { deepClone } from '/@/utils/other'; |
| | | import { ErrorCode } from '/@/utils/request'; |
| | | |
| | | import { Logger } from '/@/model/logger/Logger'; |
| | | const chatWidth = '75%'; |
| | | const voicePageIsShow = ref(false); |
| | | let isTalking = ref(false); |
| | |
| | | let questionRes = null; |
| | | |
| | | let finalCalcSectionAId = null; |
| | | const questionAi = async (text, assistantMsg: ChatMessage) => { |
| | | // processId.value = uuidv4(); |
| | | const questionAi = async (text) => { |
| | | let judgeParams = null; |
| | | if (!preQuestion.value) { |
| | | // const aiContent = computedMessageList.value.filter((item) => item.role === RoleEnum.assistant); |
| | |
| | | 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 { |
| | |
| | | questionRes = extRes; |
| | | resMsgContent = parseContent(extRes); |
| | | } else { |
| | | resMsgContent = await questionAi(content.values, assistantItem); |
| | | resMsgContent = await questionAi(content.values); |
| | | } |
| | | nextUserMsgEndIndex.value++; |
| | | if (isNewChat) { |
| | |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 用户询问的问题设置为常用语 ====================== |
| | | const setCommonQuestionInfo = ref({}); |
| | | //用户复制问题 |
| | | const copyUserClick = () => {}; |
| | | //用户问题设置为常用语 |
| | | const setCommonQuestionClick = () => {}; |
| | | //#endregion |
| | | |
| | | const setCommonQuestionClick = (item) => { |
| | | setCommonQuestionInfo.value = item; |
| | | }; |
| | | //#endregion |
| | | </script> |
| | | |
| | |
| | | position: absolute; |
| | | top: 0; |
| | | } |
| | | .action { |
| | | left: 0; |
| | | padding: 4px; |
| | | gap: 4px; |
| | | border-radius: 4px; |
| | | display: flex; |
| | | align-items: center; |
| | | flex-direction: row; |
| | | position: absolute; |
| | | top: 0; |
| | | } |
| | | </style> |