| | |
| | | <template> |
| | | <div class="flex flex-col h-full"> |
| | | <div class="h-full flex flex-col items-center overflow-y-auto"> |
| | | <div ref="chatListDom" class="h-full w-[100ch]"> |
| | | <div class="group flex px-4 py-4 hover:bg-slate-100 rounded-lg" v-for="(item, index) of computedMessageList" :key="index"> |
| | | <img class="rounded-full size-12 mr-4" :src="roleImageMap[item.role]" alt="" srcset="" /> |
| | | <div ref="chatListDom" class="h-full" :style="{width:chatWidth}"> |
| | | <div |
| | | class="group flex px-4 py-6 hover:bg-slate-100 rounded-lg" |
| | | :class="{ 'flex-row-reverse': item.role === RoleEnum.user }" |
| | | v-for="(item, index) of computedMessageList" |
| | | :key="index" |
| | | > |
| | | <img |
| | | class="rounded-full size-12 mr-4" |
| | | :class="{ 'mr-4': item.role === RoleEnum.assistant, 'ml-4': item.role === RoleEnum.user }" |
| | | :src="roleImageMap[item.role]" |
| | | alt="" |
| | | srcset="" |
| | | /> |
| | | |
| | | <div class="flex"> |
| | | <div class="relative" v-if="item.content?.values"> |
| | | <div class="text-sm rounded-[6px] p-4 leading-relaxed max-w-[100ch] bg-white"> |
| | | <component class="max-w-[100ch]" :is="answerTypeMapCom[item.content.type]" :data="item.content.values" :error="item.content.error"/> |
| | | <div class="flex" :class="{ 'w-full': item.role === RoleEnum.assistant }"> |
| | | <div class="relative w-full" v-if="item.content?.values"> |
| | | <div |
| | | class="text-sm rounded-[6px] p-4 leading-relaxed " |
| | | :style="{backgroundColor:item.role ===RoleEnum.user? 'rgb(197 224 255)':'white'}" |
| | | > |
| | | <component :is="answerTypeMapCom[item.content.type]" :data="item.content.values" :error="item.content.error" /> |
| | | </div> |
| | | |
| | | <div v-if="item.role === RoleEnum.assistant" class="absolute flex items-center right-0 mr-2 mt-2 space-x-2"> |
| | |
| | | </div> |
| | | |
| | | <div class="sticky bottom-0 w-full p-6 pb-8 bg-[rgb(247,248,250)] flex justify-center"> |
| | | <PlayBar :isTalking="isTalking" v-model="messageContent.values" @sendClick="sendChatMessage" /> |
| | | <PlayBar :isTalking="isTalking" v-model="messageContent.values" @sendClick="sendChatMessage" :style="{width:chatWidth}"></PlayBar> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | import router from '/@/router'; |
| | | import { activeChatRoom, activeLLMId, activeRoomId, activeSampleId, activeSectionAId, roomConfig } from '/@/stores/chatRoom'; |
| | | import { v4 as uuidv4 } from 'uuid'; |
| | | |
| | | const chatWidth = '75%'; |
| | | |
| | | let isTalking = ref(false); |
| | | let messageContent = ref<ChatContent>({ |
| | |
| | | content = { |
| | | type: AnswerType.Summary, |
| | | values: res.summary, |
| | | error: res.error ?? res.json_msg , |
| | | error: res.error ?? res.json_msg, |
| | | }; |
| | | break; |
| | | case AnswerType.Url: |
| | | content = { |
| | | type: AnswerType.Url, |
| | | values: res.url, |
| | | }; |
| | | break; |
| | | default: |
| | |
| | | } |
| | | clearQueryProcess(); |
| | | queryProcess(); |
| | | const res = await QuestionAi(params).finally(()=>{ |
| | | const res = await QuestionAi(params).finally(() => { |
| | | clearQueryProcess(); |
| | | }); |
| | | questionRes = res; |