From dfb7a8a63e87390dc095e81b04f0404697246d9f Mon Sep 17 00:00:00 2001
From: 张涛 <“2538313560@qq.com”>
Date: 星期五, 22 十一月 2024 20:20:56 +0800
Subject: [PATCH] 增加跳转的接口
---
src/views/sessionManager/components/seniorAgentSession.vue | 418 +++++++++++++++++++++++++----------------------------------
1 files changed, 175 insertions(+), 243 deletions(-)
diff --git a/src/views/sessionManager/components/seniorAgentSession.vue b/src/views/sessionManager/components/seniorAgentSession.vue
index 319f481..3f92ea7 100644
--- a/src/views/sessionManager/components/seniorAgentSession.vue
+++ b/src/views/sessionManager/components/seniorAgentSession.vue
@@ -3,7 +3,6 @@
<div class="header___section">
<div class="chatHeader">
<div class="chatHeaderBox">
- <!-- <span class="title">{{agentTitle}}</span>-->
<a-popover position="bottom" trigger="click">
<a-button border>
<span
@@ -35,9 +34,9 @@
</div>
</div>
</div>
- <a-scrollbar
+ <div
ref="scrollbar"
- id="agentHome"
+ id="chatAgentHome"
class="chat-list"
style="
width: 80%;
@@ -59,22 +58,6 @@
<div :class="{ chartUserText: theme === 'light' }"
>{{ sessionDetail.content }}
</div>
-
- <!-- <div class="uploadFileList fileList">
- <a-comment
- content="232323"
- style="
- background: var(--color-bg-2);
- padding: 10px;
- border-radius: 10px;
- font-size: 12px;
- "
- >
- <template #avatar>
- <img :src="getIconByExtension('wps')" alt="" />
- </template>
- </a-comment>
- </div> -->
</template>
</a-comment>
<a-comment v-else-if="sessionDetail?.role === 'assistant'">
@@ -86,55 +69,38 @@
/>
</template>
<template #content>
- <!-- <a-card :class="{ chatItemAnswer: theme === 'light' }">-->
- <!-- <div :class="{ light: theme === 'light' }"-->
- <!-- >{{ sessionDetail.content }}-->
- <!-- </div>-->
- <!-- </a-card>-->
- <a-textarea
- v-if="sessionDetail?.content"
- readonly
- auto-size
- v-model="sessionDetail.content"
- :class="{ chatItemAnswer: theme === 'light' }"
- :style="{
- backgroundColor: theme === 'light' ? '#ffffff' : '#000000',
- }"
- style="border: none"
- >
- </a-textarea>
- <div v-else>
- <!-- <a-textarea
- readonly
- auto-size
- :default-value="chartText(sessionDetail.code, sessionDetail.sql)"
- :class="{ chatItemAnswer: theme === 'light' }"
- :style="{
- backgroundColor: theme === 'light' ? '#ffffff' : '#000000',
- }"
- style="border: none"
- >
- </a-textarea> -->
- <!-- <codemirror
- v-model="sessionDetail.code"
- placeholder="Code gose here..."
- :style="{ height: '100%' }"
- :autofocus="true"
- :tabSize="2"
- /> -->
- <div class="codeStle">
- <div class="language">python</div>
- <pre
- style="background: #2c2c36; padding: 10px; margin-top: 0"
- ><code class="language-js line-numbers">{{ sessionDetail.code+ sessionDetail.sql}}</code></pre>
+ <div v-if="isExistTip(sessionDetail.content)" :class="{ chartUserText: theme === 'light' }">
+ <div v-for="(item, breakIndex) in breakLine(sessionDetail)">
+ <span v-if="item.preIndex==0">
+ {{ sessionDetail.content.substring(0, item.index) }}
+ </span>
+ <span v-else>
+ {{ sessionDetail.content.substring(item.preIndex+item.preItem.length, item.index) }}
+ </span>
+ <div class="codeStle">
+ <div class="language">{{ item.item }}</div>
+ <pre
+ style="
+ background: #2c2c36;
+ padding: 10px;
+ margin-top: 0;
+ margin-bottom: 0;
+ "
+ ><code class="language-js line-numbers">{{ item?.tip_content }}</code></pre>
+ </div>
</div>
-
+ </div>
+ <div v-else :class="{ chartUserText: theme === 'light' }">{{ sessionDetail.content }}</div>
+ <div>
<a-image
v-if="sessionDetail?.image_name"
:src="getImg(sessionDetail)"
alt=""
/>
- <div class="uploadFileList fileList">
+ <div
+ class="uploadFileList fileList"
+ v-if="sessionDetail?.excel_name"
+ >
<a-comment
:content="sessionDetail.excel_name"
style="
@@ -219,17 +185,19 @@
/>
</template>
<template #content>
- <a-textarea
- readonly
- auto-size
- v-model="displayedText"
- :class="{ chatItemAnswer: theme === 'light' }"
- :style="{
- backgroundColor: theme === 'light' ? '#ffffff' : '#000000',
- }"
- style="border: none"
- >
- </a-textarea>
+ <a-spin :loading="loading" dot style="width: 100%">
+ <a-textarea
+ readonly
+ auto-size
+ v-model="displayedText"
+ :class="{ chatItemAnswer: theme === 'light' }"
+ :style="{
+ backgroundColor: theme === 'light' ? '#ffffff' : '#000000',
+ }"
+ style="border: none"
+ >
+ </a-textarea>
+ </a-spin>
</template>
<template #actions>
<div
@@ -251,7 +219,7 @@
>鍋滄鐢熸垚</div
>
<div class="chartStart v-else" @click="stopChat">閲嶆柊鐢熸垚</div> -->
- </a-scrollbar>
+ </div>
<div class="chat_bottom">
<div class="center-bottom">
<a-textarea
@@ -281,9 +249,11 @@
></updataFile> -->
<span v-if="getAent"></span>
<uploadFile
- v-if="agentObj.id == 'excel_talk' || dialog_id == 'excel_talk'"
+ v-if="!getAent"
ref="fileInput"
:sessionId="activeSessionId"
+ :handleRemove="handleRemove"
+ :typeXLse="false"
@selectFileCallback="selectFileCallback"
></uploadFile>
<a-button
@@ -335,14 +305,14 @@
>
<template #avatar>
<a-spin
- :loading="onFileSelectedLoading"
- v-if="onFileSelectedLoading"
+ :loading="item.onFileSelectedLoading"
+ v-if="item.onFileSelectedLoading"
>
<template #icon>
<icon-sync />
</template>
<template #tip>
- <div style="font-size: 12px">{{ textName }}</div>
+ <div style="font-size: 12px">{{ item.textName }}</div>
</template>
</a-spin>
<!-- <a-button type="text" :loading="onFileSelectedLoading" v-if="onFileSelectedLoading"></a-button>-->
@@ -350,6 +320,9 @@
<!-- <icon-file style="color: #0960bd" />-->
<!-- </a-avatar>-->
<img :src="getIconByExtension(item.name)" alt="" />
+ <div v-show="!item.onFileSelectedLoading" style="font-size: 12px">{{
+ item.textName
+ }}</div>
</template>
</a-comment>
<icon-close-circle-fill
@@ -418,8 +391,8 @@
agentConversationSetApi,
agentConverDownloadApi,
downloadFile,
- agentUploadApi,
- } from '@/api/agentSession';
+ agentUploadApi, updateAgentConversation, updateSeniorAgentConversation
+ } from "@/api/agentSession";
import EventBus from '@/utils/EventBus';
import useClipboard from 'vue-clipboard3';
import { addSessionApi, getSessionDetailsApi } from '@/api/session';
@@ -501,6 +474,45 @@
],
};
+ const isExistTip = (message: string): boolean => {
+ if (/\$([a-z]+)\$/g.test(message)) {
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ const breakLine = (detail): string[] => {
+ let indexs: any[] = [];
+ let tip_content: any;
+ let preTip = 0;
+ let preItem="";
+ let matches = detail.content.match(/\$([a-z]+)\$/g);
+ matches?.map((item) => {
+ let i = detail.content.indexOf(item);
+ if (item == "$metadata$") {
+ tip_content = detail.metadata;
+ }
+ if (item == "$sql$") {
+ tip_content = detail.sql;
+ }
+ if (item == "$code$") {
+ tip_content = detail.code;
+ }
+ indexs.push({
+ index: i,
+ item: item,
+ preIndex: preTip,
+ preItem: preItem,
+ tip_content: tip_content,
+ len: matches.length
+ });
+ preTip = i;
+ preItem = item;
+ });
+ return indexs;
+ };
+
const handleSubmit = async ({ values, errors }) => {
if (errors) return;
@@ -545,6 +557,7 @@
prompts.value = session.prompts;
activeSessionId.value = '';
+ EventBus.emit('queryAgent', uploaditemList.value);
uploaditemList.value = [];
console.log(12123);
getAentId(session.id);
@@ -559,81 +572,7 @@
isHistory.value = false;
initPage();
};
- // 璋冪敤set鏂规硶
- const agentSet = async () => {
- const res = await agentSetApi({
- id: agentObj.id,
- title: agentObj.title,
- dsl: agentObj.dsl,
- });
- // console.log(res,'agentSet');
- if (res.code == 0) {
- conversation_id.value = res.data.conversation_id;
- agentReset();
- }
- };
- // 璋冪敤reset鏂规硶
- const agentReset = async () => {
- const res = await agentResetApi({
- id: agentObj.id,
- });
- if (res.code == 0) {
- // Message.success('淇敼鎴愬姛');
- agentCompletion();
- }
- };
- // 璋冪敤completion鏂规硶
- const agentCompletion = async () => {
- const response = await fetch('/api/v1/canvas/completion', {
- method: 'POST',
- headers: {
- 'Authorization': getAuthorization(),
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- id: agentObj.id,
- }),
- });
- const reader = response?.body
- ?.pipeThrough(new TextDecoderStream())
- .pipeThrough(new EventSourceParserStream())
- .getReader();
- currIndex.value = 0;
- while (true) {
- const x = await reader?.read();
- if (x) {
- const { done, value } = x;
-
- try {
- const val = JSON.parse(value?.data || '');
- const d = val?.data;
- if (typeof d !== 'boolean') {
- console.info('data:', d);
- streamStr.value = d.content;
- startDisplayStr();
- }
- } catch (e) {
- console.warn(e);
- }
- if (done) {
- console.info('done');
- displayedText.value = '';
- // queryAgentSessionDetail(activeSessionId.value);
- break;
- }
- }
- }
- chatDis.value = false;
- loading.value = false;
- inputMsg.value = '';
- };
-
- //娓叉煋鏂囧瓧
- const chartText = (val, sql) => {
- console.log(val + sql, 77);
- return val + '\n' + sql;
- };
//鑾峰彇鍥剧墖鍦板潃
const getImg = (val) => {
@@ -674,11 +613,9 @@
const getAentId = (id) => {
if (id == 'excel_talk') {
- console.log(1);
getAent.value = false;
}
if (id == 'questions_talk') {
- console.log(2);
getAent.value = true;
}
};
@@ -688,22 +625,12 @@
conversation_id.value = session.id;
activeSessionId.value = session.id;
dialog_id.value = session.dialog_id;
- console.log(4554);
+ EventBus.emit('queryAgent', uploaditemList.value);
+ uploaditemList.value = [];
+
getAentId(session.dialog_id);
from.name = session.name;
- const { code, data } = await getSessionDetailsApi(session.id);
-
- if (code == 200) {
- sessionDetailList.value = data.message;
- refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
- // const res = await getAgentSessionDetailsApi(session.dialog_id);
- // if (res.code == 0) {
- // Object.assign(agentObj, res.data);
- // Object.assign(chatObj, res.data);
- // Object.assign(dsl, res.data.dsl);
- // refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
- // }
- }
+ queryAgentSessionDetails(activeSessionId.value);
};
const { toClipboard } = useClipboard();
@@ -713,6 +640,7 @@
const sentClick = () => {
sendMessage('click');
+
uploaditemList.value = [];
};
@@ -731,44 +659,9 @@
event.preventDefault(); // 闃绘榛樿琛屼负锛屽嵆涓嶆崲琛�
}
- // chatDis.value = true;
- // loading.value = true;
- // if (!agentObj.id) {
- // Message.warning('璇烽�夋嫨浼氳瘽');
- // chatDis.value = false;
- // loading.value = false;
- // return;
- // }
-
- // if (displayedText.value) {
- // querySessionList();
- // }
-
if (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;
- // 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('鍒涘缓浼氳瘽澶辫触锛岃閲嶈瘯');
- // }
-
- // startChat(inputMsg.value);
- // inputMsg.value = '';
createSession('');
+ uploaditemList.value = [];
} else {
Message.warning('娑堟伅涓嶈兘涓虹┖');
chatDis.value = false;
@@ -782,6 +675,11 @@
try {
loading.value = true;
chatDis.value = true;
+ let name = inputMsg.value;
+
+ if (val) {
+ name = val[0].name.split('.')[0];
+ }
if (!activeSessionId.value) {
let message = [
@@ -789,15 +687,11 @@
content: sessionDetailList.value[0].content,
role: 'assistant',
},
- {
- content: inputMsg.value,
- role: 'user',
- },
];
const res = await agentConversationSetApi({
id: '',
app_id: agentObj.id,
- name: inputMsg.value,
+ name: name,
message: message,
});
// console.log(res, "res");
@@ -808,6 +702,7 @@
if (!val) {
startChat(inputMsg.value);
inputMsg.value = '';
+ uploaditemList.value = [];
} else {
loading.value = false;
chatDis.value = false;
@@ -848,29 +743,42 @@
try {
const formData = new FormData();
uploaditemList.value = resData;
+ uploaditemList.value.map((item) => {
+ if (item.name == file[0].file.name) {
+ item.onFileSelectedLoading = true;
+ item.textName = '涓婁紶涓�';
+ }
+ return item;
+ });
if (!activeSessionId.value) {
- await createSession(1);
+ await createSession(resData);
}
- onFileSelectedLoading.value = true;
- textName.value = '涓婁紶涓�';
- // for (let i = 0; i < file.length; i++) {
- // formData.append('files', file[i].file);
- // formData.append('conversation_id', activeSessionId.value);
- // formData.append('app_id', agentObj.id);
- // }
+ // onFileSelectedLoading.value = true;
+ // textName.value = '涓婁紶涓�';
+
formData.append('files', file[0].file);
formData.append('conversation_id', activeSessionId.value);
formData.append('app_id', agentObj.id);
console.log(formData, 'formData');
const { data, code } = await agentUploadApi(formData);
if (code === 200) {
- onFileSelectedLoading.value = false;
- textName.value = '涓婁紶鎴愬姛';
+ uploaditemList.value.map((item) => {
+ item.onFileSelectedLoading = false;
+ item.textName = '涓婁紶鎴愬姛';
+ return item;
+ });
+ // onFileSelectedLoading.value = false;
+ // textName.value = '涓婁紶鎴愬姛';
}
} catch (err) {
- onFileSelectedLoading.value = false;
- textName.value = '涓婁紶澶辫触';
+ uploaditemList.value.map((item) => {
+ item.onFileSelectedLoading = false;
+ item.textName = '涓婁紶澶辫触';
+ return item;
+ });
+ // onFileSelectedLoading.value = false;
+ // textName.value = '涓婁紶澶辫触';
Message.error('涓婁紶澶辫触');
}
};
@@ -888,13 +796,15 @@
return type;
};
- let onFileSelectedLoading = ref(true);
- const textName = ref('涓婁紶鎴愬姛');
+ // let onFileSelectedLoading = ref(true);
+ // const textName = ref('涓婁紶鎴愬姛');
const deleteFile = (item) => {
console.log(uploaditemList.value);
uploaditemList.value.splice(item.index, 1);
+ EventBus.emit('queryAgent', item);
};
+
const getIconByExtension = computed(() => (extension) => {
const fileExtension = ref('');
fileExtension.value = extension.split('.').pop();
@@ -947,20 +857,36 @@
.pipeThrough(new EventSourceParserStream())
.getReader();
currIndex.value = 0;
+ let end_msg={};
while (true) {
const x = await reader?.read();
if (x) {
const { done, value } = x;
- // console.log(x, 999);
-
+ console.log(x, 999);
+ loading.value = false;
if (value && value?.event == 'message') {
try {
const val = JSON.parse(value?.data || '');
- const d = val?.data;
+ const d = val?.data;
if (typeof d !== 'boolean') {
console.info('data:', d);
- streamStr.value = d.content;
+ if (d?.content) {
+ let msg = d.content;
+ //灏哾.output涓�$metadata$鏇挎崲涓篸.metadata
+ msg = msg.replace('$metadata$', d.metadata);
+ //d.content涓瓨鍦�$sql$
+ if (d.content.includes('$sql$')) {
+ msg = msg.replace('$sql$', d.sql);
+ }
+ //d.content涓瓨鍦�$code$
+ if (d.content.includes('$code$')) {
+ msg = msg.replace('$code$', d.code);
+ }
+ end_msg=d;
+ streamStr.value = msg;
+ }
+ EventBus.emit('queryAgent', uploaditemList.value);
startDisplayStr();
}
} catch (e) {
@@ -970,20 +896,20 @@
if (done) {
console.info('done');
- // displayedText.value = '';
- if (isStopChat.value) {
- isStopChat.value = false;
- setChatDataMeg(chatDataMeg);
- } else {
- // queryAgentSessionDetail(activeSessionId.value);
- // EventBus.emit('queryAppUsageList');
+ if (!chatObj?.message) {
+ chatObj.message = [];
}
+ chatObj.message.push(end_msg) ;
+ await updateSeniorAgentConversation({
+ converson_id: activeSessionId.value,
+ message: chatObj.message
+ });
+ setChatDataMeg(chatDataMeg);
break;
}
}
}
chatDis.value = false;
- loading.value = false;
};
const stopChat = async () => {
@@ -1041,18 +967,16 @@
if (timer) {
clearTimeout(timer!);
}
+
const res = streamStr.value;
// 灏嗘暟缁勪腑鐨勫瓧绗︿覆鎷兼帴璧锋潵
if (currIndex.value < res.length) {
displayedText.value += res[currIndex.value];
-
currIndex.value++;
- setTimeout(startDisplayStr, 100);
+ setTimeout(startDisplayStr, 50);
refreshScroll();
} else {
- displayedText.value = '';
- queryAgentSessionDetails(activeSessionId.value);
clearTimeout(timer!);
timer = null;
}
@@ -1061,8 +985,13 @@
const scrollbar = ref(null);
const refreshScroll = () => {
nextTick(() => {
- const container = document.getElementById('agentHome');
- scrollbar.value.scrollTop(container.scrollHeight);
+ const container = document.getElementById('chatAgentHome');
+ //婊氬姩鍒皊crollbar搴曠
+ if (container) {
+container.scrollTop = container.scrollHeight;
+ }
+
+ scrollbar.scrollTop(container.scrollHeight);
});
};
@@ -1270,6 +1199,9 @@
}
}
}
+ :deep(.arco-spin-loading .arco-spin-mask-icon) {
+ left: 10%;
+ }
}
}
.header___section {
--
Gitblit v1.8.0