From 3a6672e564e37ebe29099b5c84b74041cbf2144e Mon Sep 17 00:00:00 2001
From: liudong <liudong>
Date: 星期四, 08 八月 2024 17:22:06 +0800
Subject: [PATCH] 智能体测试和配置bug页面修改

---
 src/views/session/sessionRecordsManager/index.vue |  457 +++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 297 insertions(+), 160 deletions(-)

diff --git a/src/views/session/sessionRecordsManager/index.vue b/src/views/session/sessionRecordsManager/index.vue
index 1dd9235..4b22809 100644
--- a/src/views/session/sessionRecordsManager/index.vue
+++ b/src/views/session/sessionRecordsManager/index.vue
@@ -1,122 +1,19 @@
-<script setup lang="ts">
-  import {
-    IconSearch,
-    IconTiktokColor,
-    IconSend,
-    IconClose,
-  } from '@arco-design/web-vue/es/icon';
-  import { useAppStore } from '@/store';
-  import { computed, ref, onMounted, reactive, nextTick } from 'vue';
-  import { Message } from '@arco-design/web-vue';
-  import moment from 'moment';
-  import AddSession from '@/views/session/sessionManager/components/addSession.vue';
-  import {
-    sessionListApi,
-    deleteSessionApi,
-    getSessionDetailsApi,
-    chatApi,
-  } from '@/api/session';
-  const sessionDetailList = ref([]); //鏍规嵁浼氳瘽id鍑烘潵鐨勪細璇濊鎯�
-  const sessionList = ref([]); //浼氳瘽鍒楄〃
-  const modalObj = reactive({ add: false });
-
-  const currIndex = ref(0);
-  const displayedText = ref(''); // 姝e湪鏄剧ず鐨勬枃瀛�
-  let timer: number | null = null;
-  const streamStr = ref('');
-  const inputMsg = ref('');
-  const activeSessionId = ref('');
-
-  const sendMessage = async (event) => {
-    event.preventDefault();
-    if (!activeSessionId.value) {
-      Message.warning('璇烽�夋嫨浼氳瘽');
-      return;
-    }
-    if (inputMsg.value) {
-      const { code, data } = await chatApi({
-        conversation_id: activeSessionId.value,
-        messages: inputMsg.value,
-      });
-      const res = await getSessionDetailsApi(activeSessionId.value);
-      if (res.code === 200) {
-        sessionDetailList.value = res.data.message.map((item, index) => {
-          if (index === res.data.message.length - 1) {
-            item.role = 'last';
-            displayedText.value = '';
-            currIndex.value = 0;
-            streamStr.value = item.content;
-            startDisplayStr();
-          }
-          return item;
-        });
-        refreshScroll();
-      }
-      inputMsg.value = '';
-    } else {
-      Message.warning('娑堟伅涓嶈兘涓虹┖');
-    }
-  };
-  const querySessionDetail = async (session) => {
-    activeSessionId.value = session.id;
-    const { code, data } = await getSessionDetailsApi(session.id);
-    if (code === 200) {
-      sessionDetailList.value = data.message;
-      refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
-    }
-  };
-  const scrollbar = ref(null);
-  const refreshScroll = () => {
-    nextTick(() => {
-      const container = document.getElementById('home');
-      scrollbar.value.scrollTop(container.scrollHeight);
-    });
-  };
-  // 鏌ヨ浼氳瘽鍒楄〃
-  const querySessionList = async () => {
-    const { code, data } = await sessionListApi();
-    if (code === 200) {
-      sessionList.value = data;
-    } else {
-      Message.warning('鏌ヨ澶辫触');
-    }
-  };
-  //鏂板浼氳瘽涔嬪悗鍒锋柊浼氳瘽鍒楄〃
-  const addSession = () => {
-    querySessionList();
-  };
-  onMounted(() => {
-    querySessionList();
-  });
-  const appStore = useAppStore();
-  const theme = computed(() => {
-    return appStore.theme;
-  });
-  //鏂囧瓧鍔ㄦ�佽緭鍑�
-  const startDisplayStr = () => {
-    if (timer) {
-      clearTimeout(timer!);
-    }
-    const res = streamStr.value;
-    // 灏嗘暟缁勪腑鐨勫瓧绗︿覆鎷兼帴璧锋潵
-    if (currIndex.value < res.length) {
-      displayedText.value += res[currIndex.value];
-      currIndex.value++;
-      setTimeout(startDisplayStr, 100);
-    } else {
-      clearTimeout(timer!);
-      timer = null;
-    }
-  };
-</script>
-
 <template>
   <div class="container">
     <AddSession :modalObj="modalObj" @addSession="addSession"></AddSession>
     <a-card class="top-title">AI浼氳瘽璁板綍</a-card>
     <a-row :gutter="[5, 5]" style="margin-top: 3px">
       <a-col :span="4">
-        <a-card style="height: 60px">
+        <a-card>
+          <a-select
+            v-model="selectValue"
+            :options="dialogs"
+            :field-names="fieldNames"
+            @change="dialogChange"
+          >
+          </a-select>
+        </a-card>
+        <a-card style="height: 50px">
           <template #cover>
             <div style="display: flex; justify-content: space-between">
               <a-button
@@ -127,9 +24,9 @@
               >
                 +鏂板缓浼氳瘽
               </a-button>
-              <a-button type="text" shape="circle" class="card-btn-2">
+              <!-- <a-button type="text" shape="circle" class="card-btn-2">
                 <icon-search />
-              </a-button>
+              </a-button> -->
             </div>
           </template>
         </a-card>
@@ -148,21 +45,31 @@
               @click="querySessionDetail(session)"
               :class="{ isLeftActive: activeSessionId === session.id }"
             >
-              <div class="text" :class="{ light: theme === 'dark' }">{{
-                session.name
-              }}</div>
-              <div class="time">{{
-                moment(new Date(session.create_time)).format(
-                  'YYYY-MM-DD HH:mm:ss'
-                )
-              }}</div>
+              <div class="text" :class="{ light: theme === 'dark' }"
+                >{{ session.name }}
+              </div>
+              <div class="time"
+                >{{
+                  moment(new Date(session.create_time)).format(
+                    'YYYY-MM-DD HH:mm:ss'
+                  )
+                }}
+              </div>
             </div>
           </a-scrollbar>
         </a-card>
       </a-col>
       <a-col :span="15">
         <a-card class="center">
-          <div v-if="sessionDetailList.length === 0">
+          <div
+            v-if="sessionDetailList.length === 0"
+            style="
+              width: 90%;
+              overflow: auto;
+              height: 65vh;
+              margin: 0px auto 20px;
+            "
+          >
             <div class="center-title">鏅鸿兘闂瓟</div>
             <div class="center-content">
               鎴戝彲浠ョ悊瑙e拰瀛︿範浜虹被鐨勮瑷�锛屽叿澶囧杞璇濈殑鑳藉姏锛岀幇鍦ㄥ拰鎴戝紑濮嬩氦娴佸惂~
@@ -176,7 +83,8 @@
             <a-row justify="space-around" class="center-list">
               <a-col :span="7" class="item">
                 <div class="item-title">
-                  <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                  <IconTiktokColor></IconTiktokColor>
+                  鎶栭煶甯﹁揣鑴氭湰
                 </div>
                 <div class="item-content" :class="{ dark: theme === 'dark' }">
                   缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -184,7 +92,8 @@
               </a-col>
               <a-col :span="7" class="item">
                 <div class="item-title">
-                  <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                  <IconTiktokColor></IconTiktokColor>
+                  鎶栭煶甯﹁揣鑴氭湰
                 </div>
                 <div class="item-content" :class="{ dark: theme === 'dark' }">
                   缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -192,7 +101,8 @@
               </a-col>
               <a-col :span="7" class="item">
                 <div class="item-title">
-                  <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                  <IconTiktokColor></IconTiktokColor>
+                  鎶栭煶甯﹁揣鑴氭湰
                 </div>
                 <div class="item-content" :class="{ dark: theme === 'dark' }">
                   缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -200,7 +110,8 @@
               </a-col>
               <a-col :span="7" class="item">
                 <div class="item-title">
-                  <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                  <IconTiktokColor></IconTiktokColor>
+                  鎶栭煶甯﹁揣鑴氭湰
                 </div>
                 <div class="item-content" :class="{ dark: theme === 'dark' }">
                   缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -208,7 +119,8 @@
               </a-col>
               <a-col :span="7" class="item">
                 <div class="item-title">
-                  <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                  <IconTiktokColor></IconTiktokColor>
+                  鎶栭煶甯﹁揣鑴氭湰
                 </div>
                 <div class="item-content" :class="{ dark: theme === 'dark' }">
                   缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -216,7 +128,8 @@
               </a-col>
               <a-col :span="7" class="item">
                 <div class="item-title">
-                  <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                  <IconTiktokColor></IconTiktokColor>
+                  鎶栭煶甯﹁揣鑴氭湰
                 </div>
                 <div class="item-content" :class="{ dark: theme === 'dark' }">
                   缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -229,7 +142,12 @@
             id="home"
             v-else
             class="chat-list"
-            style="width: 90%; overflow: auto; height: 60vh; margin: 0px auto"
+            style="
+              width: 90%;
+              overflow: auto;
+              height: 65vh;
+              margin: 0px auto 20px;
+            "
           >
             <div class="chat-item" v-for="sessionDetail in sessionDetailList">
               <a-comment
@@ -237,9 +155,7 @@
                 avatar="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp"
               >
                 <template #content>
-                  <div :class="{ light: theme === 'light' }">{{
-                    sessionDetail.content
-                  }}</div>
+                  <div>{{ sessionDetail.content }} </div>
                 </template>
               </a-comment>
               <a-comment
@@ -251,9 +167,9 @@
                     class="chat-item-answer"
                     style="background-color: rgba(63, 64, 79, 1)"
                   >
-                    <div :class="{ light: theme === 'light' }">{{
-                      sessionDetail.content
-                    }}</div>
+                    <div :class="{ light: theme === 'light' }"
+                      >{{ sessionDetail.content }}
+                    </div>
                   </a-card>
                 </template>
               </a-comment>
@@ -267,16 +183,16 @@
                     auto-size
                     v-model="displayedText"
                     class="chat-item-answer"
-                    style="background-color: rgba(63, 64, 79, 1)"
+                    style="background-color: rgba(192, 172, 172, 0.88)"
                   >
                   </a-textarea>
                 </template>
               </a-comment>
             </div>
           </a-scrollbar>
-
-          <div class="center-bottom">
-            <a-textarea
+          <div class="chat_bottom">
+            <div class="center-bottom">
+              <!-- <a-textarea
               v-model="inputMsg"
               @keydown.shift.enter="sendMessage"
               style="height: 180px"
@@ -285,7 +201,30 @@
               allow-clear
               show-word-limit
             >
-            </a-textarea>
+            </a-textarea> -->
+              <a-textarea
+                v-model="inputMsg"
+                @keydown.enter="sendMessage"
+                placeholder="杈撳叆鎮ㄦ兂浜嗚В鐨勫唴瀹癸紝Shift+Enter鎹㈣锛孍nter鍙戦��"
+                allow-clear
+                show-word-limit
+                :disabled="chatDis"
+                :auto-size="{
+                  minRows: 12,
+                  maxRows: 5,
+                }"
+              />
+            </div>
+            <div style="margin-left: 10px">
+              <!-- <icon-send size="32" /> -->
+              <a-button
+                :disabled="chatDis"
+                @click="sentClick"
+                type="primary"
+                size="large"
+                >鍙戦��</a-button
+              >
+            </div>
           </div>
         </a-card>
       </a-col>
@@ -309,25 +248,26 @@
           <div class="right-tag">
             <a-space>
               <a-button type="primary" shape="round" size="mini" class="btn"
-                >鍏ㄩ儴</a-button
-              >
+                >鍏ㄩ儴
+              </a-button>
               <a-button type="outline" shape="round" size="mini" class="btn"
-                >鏂囨。鍒涗綔</a-button
-              >
+                >鏂囨。鍒涗綔
+              </a-button>
               <a-button type="outline" shape="round" size="mini" class="btn"
-                >鐭ヨ瘑瀛︿範</a-button
-              >
+                >鐭ヨ瘑瀛︿範
+              </a-button>
             </a-space>
             <a-space style="margin-top: 10px">
               <a-button type="outline" shape="round" size="mini" class="btn"
-                >鏁堢巼鎻愬崌</a-button
-              >
+                >鏁堢巼鎻愬崌
+              </a-button>
             </a-space>
           </div>
           <div class="right-list">
             <div class="right-item">
               <div class="item-title">
-                <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                <IconTiktokColor></IconTiktokColor>
+                鎶栭煶甯﹁揣鑴氭湰
               </div>
               <div class="item-content" :class="{ dark: theme === 'dark' }">
                 缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -335,7 +275,8 @@
             </div>
             <div class="right-item">
               <div class="item-title">
-                <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                <IconTiktokColor></IconTiktokColor>
+                鎶栭煶甯﹁揣鑴氭湰
               </div>
               <div class="item-content" :class="{ dark: theme === 'dark' }">
                 缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -343,7 +284,8 @@
             </div>
             <div class="right-item">
               <div class="item-title">
-                <IconTiktokColor></IconTiktokColor>鎶栭煶甯﹁揣鑴氭湰
+                <IconTiktokColor></IconTiktokColor>
+                鎶栭煶甯﹁揣鑴氭湰
               </div>
               <div class="item-content" :class="{ dark: theme === 'dark' }">
                 缂栧啓寮曚汉娉ㄧ洰涓斿叿鏈夎鏈嶅姏鐨勩�侀�傜敤浜庝骇鍝佺殑...
@@ -355,44 +297,212 @@
     </a-row>
   </div>
 </template>
+<script setup lang="ts">
+  import {
+    IconClose,
+    IconSearch,
+    IconTiktokColor,
+  } from '@arco-design/web-vue/es/icon';
+  import { useAppStore } from '@/store';
+  import { computed, nextTick, onMounted, reactive, ref } from 'vue';
+  import { Message } from '@arco-design/web-vue';
+  import { EventSourceParserStream } from 'eventsource-parser/stream';
+  import moment from 'moment';
+  import AddSession from '@/views/session/sessionManager/components/addSession.vue';
+  import {
+    chatApi,
+    getDialogListApi,
+    getSessionDetailsApi,
+    sessionListApi,
+  } from '@/api/session';
+  import { getAuthorization } from "@/utils/auth";
 
+
+  const sessionDetailList = ref([]); //鏍规嵁浼氳瘽id鍑烘潵鐨勪細璇濊鎯�
+  const sessionList = ref([]); //浼氳瘽鍒楄〃
+  const modalObj = reactive({ add: false });
+  const chatDis = ref(false);
+
+  const currIndex = ref(0);
+  const displayedText = ref(''); // 姝e湪鏄剧ず鐨勬枃瀛�
+  let timer: number | null = null;
+  const streamStr = ref('');
+  const inputMsg = ref('');
+  const activeSessionId = ref('');
+  const fieldNames = { value: 'id', label: 'name' };
+  const dialogs = ref([]);
+  const selectValue = ref('');
+  const DialogList = async () => {
+    const { code, data } = await getDialogListApi();
+    if (code === 200) {
+      if (data) {
+        selectValue.value = data[0].id;
+        dialogs.value = data;
+        querySessionList();
+      }
+    }
+  };
+  const dialogChange = (value) => {
+    querySessionList();
+  };
+  const sentClick = (event) => {
+    sendMessage(event);
+  };
+  const sendMessage = async (event) => {
+    event.preventDefault();
+    chatDis.value = true;
+    if (!activeSessionId.value) {
+      Message.warning('璇烽�夋嫨浼氳瘽');
+      return;
+    }
+    if (inputMsg.value) {
+      sessionDetailList.value.push({ "content": inputMsg.value, "role": "user" });
+      sessionDetailList.value.push({  "role": "last" });
+      refreshScroll();
+      const response = await fetch("/api/tech/cloudminds/query?modeltype=localragflow", {
+        method: 'POST',
+        headers: {
+          'Authorization': getAuthorization(),
+          'Content-Type': 'application/json',
+        },
+        body: JSON.stringify({
+          conversation_id: activeSessionId.value,
+          messages: inputMsg.value,
+        }),
+      });
+
+      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');
+            break;
+          }
+        }
+      }
+      chatDis.value=false;
+      inputMsg.value = '';
+    } else {
+      Message.warning('娑堟伅涓嶈兘涓虹┖');
+    }
+  };
+  const querySessionDetail = async (session) => {
+    activeSessionId.value = session.id;
+    const { code, data } = await getSessionDetailsApi(session.id);
+    if (code === 200) {
+      sessionDetailList.value = data.message;
+      refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
+    }
+  };
+  const scrollbar = ref(null);
+  const refreshScroll = () => {
+    nextTick(() => {
+      const container = document.getElementById('home');
+      scrollbar.value.scrollTop(container.scrollHeight);
+    });
+  };
+  // 鏌ヨ浼氳瘽鍒楄〃
+  const querySessionList = async () => {
+    const { code, data } = await sessionListApi(selectValue.value);
+    if (code === 200) {
+      sessionList.value = data;
+    } else {
+      Message.warning('鏌ヨ澶辫触');
+    }
+  };
+  //鏂板浼氳瘽涔嬪悗鍒锋柊浼氳瘽鍒楄〃
+  const addSession = () => {
+    querySessionList();
+  };
+  onMounted(() => {
+    DialogList();
+  });
+  const appStore = useAppStore();
+  const theme = computed(() => {
+    return appStore.theme;
+  });
+  //鏂囧瓧鍔ㄦ�佽緭鍑�
+  const startDisplayStr = () => {
+    if (timer) {
+      clearTimeout(timer!);
+    }
+    const res = streamStr.value;
+    // 灏嗘暟缁勪腑鐨勫瓧绗︿覆鎷兼帴璧锋潵
+    if (currIndex.value < res.length) {
+      displayedText.value += res[currIndex.value];
+      currIndex.value++;
+      setTimeout(startDisplayStr, 100);
+      refreshScroll();
+    } else {
+      clearTimeout(timer!);
+      timer = null;
+    }
+  };
+</script>
 <style scoped lang="scss">
   .isLeftActive {
     background-color: lightgrey;
   }
+
   .light {
     color: white !important;
   }
+
   .dark {
     color: gray !important;
   }
+
   .container {
     .top-title {
       line-height: 60px;
       font-size: 25px;
       font-family: 榛戜綋;
     }
+
     .center,
     .right {
       box-sizing: border-box;
       height: calc(100vh - 100px);
     }
+
     .left {
       /* height: calc(100vh - 160px);
-            overflow-y: auto;
-            overflow-x: hidden;*/
+        overflow-y: auto;
+        overflow-x: hidden;*/
       border: 0px;
+
       .left-list {
         .item {
           cursor: pointer;
+
           .text,
           .time {
             line-height: 30px;
           }
+
           .text {
             color: black;
             padding-left: 10px;
           }
+
           .time {
             color: gray;
             font-size: 12px;
@@ -405,41 +515,50 @@
       margin: 10px;
       width: 75%;
     }
+
     .card-btn-2 {
       margin: 10px 10px;
     }
+
     .center {
       position: relative;
+
       .center-title {
         line-height: 60px;
         font-size: 25px;
         font-family: 榛戜綋;
         color: deepskyblue;
       }
+
       .center-content {
         font-size: 14px;
         color: gray;
       }
+
       .center-question {
         margin-top: 20px;
         display: flex;
         justify-content: space-between;
+
         .center-question-left {
           margin-top: 5px;
           margin-left: 20px;
         }
+
         .center-question-right {
           margin-right: 20px;
         }
       }
       .center-list {
         margin-top: 10px;
+
         .item {
           border-radius: 10px;
           margin-top: 10px;
           padding: 10px;
           height: 120px;
           background-color: lightcyan;
+
           .item-title {
             text-align: center;
             line-height: 40px;
@@ -449,22 +568,38 @@
           }
         }
       }
-      .center-bottom {
-        position: absolute;
-        width: 90%;
-        bottom: 20px;
-        left: 5%;
+      .chat_bottom {
+        display: flex;
+        align-items: center;
+        .center-bottom {
+          // position: absolute;
+          // width: 90%;
+          // bottom: 20px;
+          // left: 5%;
+          background: #fff;
+          border: 1px solid #00000014;
+          border-radius: 24px;
+          display: flex;
+          flex: 1 1;
+          flex-direction: column;
+          overflow: hidden;
+          :deep(.arco-textarea-wrapper) {
+            border-radius: 24px;
+          }
+        }
       }
     }
     .right {
       .right-top {
         display: flex;
         justify-content: space-between;
+
         .right-title {
           font-size: 25px;
           font-family: 榛戜綋;
           color: black;
         }
+
         .right-btn {
           position: relative;
           left: 20px;
@@ -474,6 +609,7 @@
       .right-tag {
         margin-top: 20px;
       }
+
       .right-list {
         .right-item {
           border-radius: 10px;
@@ -481,6 +617,7 @@
           padding: 10px;
           height: 120px;
           background-color: lightcyan;
+
           .item-title {
             text-align: center;
             line-height: 40px;

--
Gitblit v1.8.0