liudong
2024-08-18 753105ac88328bcf1a7ed9af92286bec0679c975
智能体和agent新建会话名称bug修改
1个文件已添加
4个文件已修改
656 ■■■■ 已修改文件
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/session.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sessionManager/components/add.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sessionManager/components/agentSession.vue 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sessionManager/index.vue 361 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -47,6 +47,7 @@
    "sass": "^1.77.8",
    "sortablejs": "^1.15.0",
    "vue": "^3.2.40",
    "vue-clipboard3": "^2.0.0",
    "vue-echarts": "^6.2.3",
    "vue-i18n": "^9.2.2",
    "vue-router": "^4.0.14"
src/api/session.ts
@@ -45,3 +45,14 @@
export function getDialogListApi() {
  return axios.get<ISessionListResult>('/api/dialog/list');
}
export function uploadWithoutKb(params) {
  const config = {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      // token: token,
    },
  };
  return axios.post('/api/v1/document/upload_without_kb', params, config);
}
src/views/sessionManager/components/add.vue
New file
@@ -0,0 +1,130 @@
<template>
  <span class="action"
        @click="handleClick"
        style="position: absolute;left: 10px;bottom: 10px;z-index: 99;font-size: 24px">
                <icon-attachment />
              </span>
  <a-modal
    v-model:visible="visible"
    title="上传文件"
    @open="handleOpened"
    @cancel="handleCancel"
    :ok-loading="loading"
    @before-ok="handleBeforeOk"
    title-align="start"
  >
    <a-tabs :default-active-key="activeKey" @change="activeKeyChange">
      <a-tab-pane key="1" title="文件"> </a-tab-pane>
      <a-tab-pane key="2" title="文件夹"> </a-tab-pane>
    </a-tabs>
    <div class="aUpload">
      <!--          <a-upload :file-list="uploadList" draggable accept=".word, .pdf, .ppt, .excel, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .pptx, .ppt, .pdf, .mp4, .avi, .mp3,.wav, .wma, .wmv, .rm," :custom-request="customRequest" />-->
      <a-upload
        action="/"
        :auto-upload="false"
        ref="uploadRef"
        :file-list="uploadList"
        draggable
        @change="onChange"
        multiple
      />
    </div>
  </a-modal>
</template>
<script lang="ts" setup>
  import { onMounted, onBeforeMount, reactive, ref, computed } from 'vue';
  import axios from 'axios';
  import { kbdocumentupload } from '@/api/kbList';
  import { Message } from '@arco-design/web-vue';
  let CancelToken = axios.CancelToken;
  let source = null;
  const visible = ref(false);
  const loading = ref(false);
  const directory = ref(false);
  const activeKey = ref('1');
  const formRef = ref(null);
  const uploadList = ref([]);
  const form = reactive({
    name: '', // 用户名
    nameJoin: '', // 昵称
    post: '', // 岗位
    txt: '', // 备注
  });
  const props = defineProps(['kbobj']);
  const emit = defineEmits(['changeFetchData']);
  const uploadRef = ref();
  const files = ref([]);
  console.log(props.kbobj);
  const acceptNameList = computed(() => {
    return '.word, .pdf, .ppt, .excel, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .pptx, .ppt, .pdf, .mp4, .avi, .mp3,.wav, .wma, .wmv, .rm,';
  });
  // 上传文件
  const submitForm = async (done) => {
    if (files.value && files.value.length > 0) {
      files.value.map((item) => {
        const formData = new FormData();
        formData.append('file', item.file);
        formData.append('kb_id', props.kbobj.id);
        kbdocumentupload(formData).then((res) => {
          if (res.code == 0) {
            emit('changeFetchData');
            Message.success('上传成功');
            handleCancel();
          }
        });
      });
      done(false);
    } else {
      done(false);
    }
  };
  const handleSubmit = ({ values, errors }) => {};
  const onChange = (fileList) => {
    files.value = fileList;
  };
  const handleClick = () => {
    visible.value = true;
  };
  const handleBeforeOk = (done) => {
    submitForm(done);
  };
  const handleCancel = () => {
    visible.value = false;
  };
  const handleOpened = (el) => {
    // console.log(props.kbobj);
    uploadList.value = [];
    files.value = [];
    loading.value = false;
  };
  const activeKeyChange = (value) => {
    activeKey.value = value;
    directory.value = value == '2' ? true : false;
  };
  onBeforeMount(() => {});
  onMounted(() => {});
</script>
<script lang="ts">
  export default {
    name: 'add',
    methods: {},
  };
</script>
<style scoped lang="less">
  .aUpload {
    width: 100%;
    max-height: 500px;
    overflow: hidden;
    overflow-y: auto;
    :deep(.arco-upload-progress) {
      display: none;
    }
  }
</style>
src/views/sessionManager/components/agentSession.vue
@@ -12,13 +12,13 @@
    id="agentHome"
    class="chat-list"
    style="
              width: 90%;
              width: 80%;
              overflow: auto;
              height: calc(100vh - 380px);
              margin: 0px auto 20px;
            "
  >
    <div class="chat-item" v-for="sessionDetail in sessionDetailList">
    <div class="chat-item" v-for="(sessionDetail,index) in sessionDetailList">
      <a-comment v-if="sessionDetail.role === 'user'">
        <template #avatar>
          <img
@@ -42,11 +42,28 @@
          />
        </template>
        <template #content>
          <a-card :class="{ chatItemAnswer: theme === 'light' }">
            <div :class="{ light: theme === 'light' }"
            >{{ sessionDetail.content }}
            </div>
          </a-card>
<!--          <a-card :class="{ chatItemAnswer: theme === 'light' }">-->
<!--            <div :class="{ light: theme === 'light' }"-->
<!--            >{{ sessionDetail.content }}-->
<!--            </div>-->
<!--          </a-card>-->
          <a-textarea
            readonly
            auto-size
            v-model="sessionDetail.content"
            :class="{ chatItemAnswer: theme === 'light' }"
            :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
            style="border: none"
          >
          </a-textarea>
        </template>
        <template #actions>
                  <span class="action" v-if="index != 0" @click="copy(sessionDetail.content)">
                     <icon-copy /> 复制
                  </span>
          <span class="action"  v-if="index != 0 && index == sessionDetailList.length - 1" @click="reGenerate()">
                     <icon-refresh /> 重新生成
                  </span>
        </template>
      </a-comment>
      <a-comment v-else-if="sessionDetail.role === 'last'">
@@ -63,8 +80,18 @@
            auto-size
            v-model="displayedText"
            :class="{ chatItemAnswer: theme === 'light' }"
            :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
            style="border: none"
          >
          </a-textarea>
        </template>
        <template #actions>
          <div class="action"
               @click="stopChat"
               style="background: var(--color-bg-2);color: var(--color-primary-light-4);" v-if="displayedText != ''">
            <icon-record-stop />
            停止生成
          </div>
        </template>
      </a-comment>
    </div>
@@ -84,6 +111,8 @@
        show-word-limit
        :disabled="chatDis"
        :class="{ textItemAnswer: theme === 'dark' }"
        :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
        style="border: none"
        :auto-size="{
                  minRows: 12,
                  maxRows: 5,
@@ -94,11 +123,12 @@
        <a-button
          :disabled="chatDis"
          @click="sentClick"
          type="primary"
          type="text"
          style="border-radius: 24px"
          :loading="loading"
          size="large"
        >发送</a-button
        >
          <icon-send size="32" style="color: #0960bd;"/>
        </a-button
        >
      </div>
    </div>
@@ -113,6 +143,7 @@
import { EventSourceParserStream } from 'eventsource-parser/stream';
import { agentResetApi, agentSetApi, getAgentSessionDetailsApi } from "@/api/agentSession";
import EventBus from '@/utils/EventBus';
import useClipboard from "vue-clipboard3";
const props = defineProps({
  modalObj: Object,
});
@@ -139,7 +170,8 @@
const agentList = ref([]);
const selectValue = ref('');
const sectionList = ref({});
let chatObj = reactive({});
const isStopChat = ref(false)
const appStore = useAppStore();
const theme = computed(() => {
  return appStore.theme;
@@ -247,12 +279,22 @@
};
const { toClipboard } = useClipboard();
const copy = async (text) => {
  await toClipboard(text);    //参数为要复制的文本
}
const sentClick = () => {
  sendMessage('click');
};
// 重新生成
const reGenerate = () => {
  let inputContent = sessionDetailList.value[sessionDetailList.value.length-2].content
  startChat(inputContent)
};
const sendMessage = async (event) => {
  if (event.keyCode == 13 || event === 'click') {
    if (!event.shiftKey) {
@@ -261,8 +303,8 @@
        event.preventDefault(); // 阻止默认行为,即不换行
      }
      chatDis.value = true;
      loading.value = true;
      // chatDis.value = true;
      // loading.value = true;
      // if (!agentObj.id) {
      //   Message.warning('请选择会话');
      //   chatDis.value = false;
@@ -275,8 +317,22 @@
      // }
      if (inputMsg.value) {
        startChat(inputMsg.value)
        inputMsg.value = '';
      } else {
        Message.warning('消息不能为空');
        chatDis.value = false;
        loading.value = false;
      }
    }
  }
};
const startChat = async(valMsg)=>{
        sessionDetailList.value.push({
          content: inputMsg.value,
    content: valMsg,
          role: 'user',
        });
        sessionDetailList.value.push({ role: 'last' });
@@ -291,7 +347,7 @@
            },
            body: JSON.stringify({
              id: agentObj.id,
              message: inputMsg.value,
        message: valMsg,
            }),
          }
        );
@@ -305,7 +361,7 @@
          const x = await reader?.read();
          if (x) {
            const { done, value } = x;
            console.log(x, 999);
      // console.log(x, 999);
            try {
              const val = JSON.parse(value?.data || '');
              const d = val?.data;
@@ -328,15 +384,44 @@
        }
        chatDis.value = false;
        loading.value = false;
        inputMsg.value = '';
      } else {
        Message.warning('消息不能为空');
        chatDis.value = false;
        loading.value = false;
      }
const stopChat=async()=>{
  // const { code, data } = await stopChatApi(activeSessionId.value);
  // if (code === 200) {
  //   Message.success("已停止");
  //   queryNewSessionDetail(activeSessionId.value);
  // }
  isStopChat.value = true;
  console.log('stopChat');
  console.log(displayedText.value, 'displayedText');
  console.log(sessionDetailList.value, 'sessionDetailList');
  let inputText = sessionDetailList.value[sessionDetailList.value.length-2].content
  // 数组合并
  let lastArr = [{
    content: inputText,
    role: "user"
  },{
    content: displayedText.value,
    role: "assistant"
  }]
  sessionDetailList.value = sessionDetailList.value.splice(0, sessionDetailList.value.length-2).concat(lastArr);
  console.log(sessionDetailList.value, 'sessionDetailList2');
  console.log(chatObj, 'chatObj对象');
  chatObj.message = chatObj.message.concat(lastArr);
  // clearTimeout(timer!);
  // timer = null;
  // const { code, data } = await addSessionApi(chatObj);
  // if (data) {
  //   //停止定时器
  //   clearTimeout(timer!);
  //   timer = null;
  //   displayedText.value = "";
  //   queryNewSessionDetail(activeSessionId.value);
  // }
    }
  }
};
const handleShiftEnter = (event) => {
  event.preventDefault();
@@ -484,6 +569,8 @@
    .chat_bottom {
      display: flex;
      align-items: center;
      width: 78%;
      margin: 0 auto;
      .center-bottom {
        // position: absolute;
        // width: 90%;
@@ -505,7 +592,7 @@
        .btn-send {
          position: absolute !important;
          right: 10px;
          bottom: 10px;
          top: 80px;
          z-index: 10;
        }
        :deep(.arco-btn-size-large) {
@@ -557,4 +644,20 @@
    }
  }
}
.action {
  cursor: pointer;
  display: inline-block;
  padding: 0 10px;
  color: var(--color-text-1);
  line-height: 24px;
  background: transparent;
  border-radius: 2px;
  cursor: pointer;
  transition: all 0.1s ease;
  font-size: 12px;
}
.action:hover {
  background: var(--color-fill-3);
}
</style>
src/views/sessionManager/index.vue
@@ -29,13 +29,13 @@
            id="home"
            class="chat-list"
            style="
              width: 90%;
              width: 80%;
              overflow: auto;
              height: calc(100vh - 300px);
              height: calc(100vh - 380px);
              margin: 0px auto 20px;
            "
          >
            <div class="chat-item" v-for="sessionDetail in sessionDetailList">
            <div class="chat-item" v-for="(sessionDetail,index) in sessionDetailList">
              <a-comment v-if="sessionDetail.role === 'user'">
                <template #avatar>
                  <img
@@ -59,13 +59,30 @@
                  />
                </template>
                <template #content>
                  <a-card :class="{ chatItemAnswer: theme === 'light' }">
                    <div
                      :class="{ light: theme === 'light' }"
                      v-html="sessionDetail.content.replace(/\n/g, '<br/>')"
                  <!--                  <a-card :class="{ chatItemAnswer: theme === 'light' }">-->
                  <!--                    <div-->
                  <!--                      :class="{ light: theme === 'light' }"-->
                  <!--                      v-html="sessionDetail.content.replace(/\n/g, '<br/>')"-->
                  <!--                    >-->
                  <!--                    </div>-->
                  <!--                  </a-card>-->
                  <a-textarea
                    readonly
                    auto-size
                    v-model="sessionDetail.content"
                    :class="{ chatItemAnswer: theme === 'light' }"
                    :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
                    style="border: none"
                    >
                    </div>
                  </a-card>
                  </a-textarea>
                </template>
                <template #actions>
                  <span class="action" v-if="index != 0" @click="copy(sessionDetail.content)">
                     <icon-copy /> 复制
                  </span>
                  <span class="action"  v-if="index != 0 && index == sessionDetailList.length - 1" @click="reGenerate()">
                     <icon-refresh /> 重新生成
                  </span>
                </template>
              </a-comment>
              <a-comment v-else-if="sessionDetail.role === 'last'">
@@ -82,8 +99,18 @@
                    auto-size
                    v-model="displayedText"
                    :class="{ chatItemAnswer: theme === 'light' }"
                    :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
                    style="border: none"
                  >
                  </a-textarea>
                </template>
                <template #actions>
                  <div class="action"
                       @click="stopChat"
                       style="background: var(--color-bg-2);color: var(--color-primary-light-4);" v-if="displayedText != ''">
                     <icon-record-stop />
                    停止生成
                  </div>
                </template>
              </a-comment>
            </div>
@@ -92,6 +119,7 @@
            >
            <div class="chartStart v-else" @click="stopChat">重新生成</div> -->
          </a-scrollbar>
          <div class="chat_bottom">
            <div class="center-bottom">
              <!-- <a-textarea
@@ -113,21 +141,34 @@
                show-word-limit
                :disabled="chatDis"
                :class="{ textItemAnswer: theme === 'dark' }"
                :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
                style="border: none"
                :auto-size="{
                  minRows: 12,
                  maxRows: 5,
                }"
              />
              <div style="margin-left: 20px">
                <a-upload
                  ref="uploadRef"
                  :file-list="uploadList"
                  multiple
                  :custom-request="customRequest"
                          style="font-size: 24px;">
                  <template #upload-button>
                    <icon-attachment style="color: #0960bd"/>
                  </template>
                </a-upload>
              </div>
              <div class="btn-send">
                <!-- <icon-send size="32" /> -->
                <a-button
                  :disabled="chatDis"
                  @click="sentClick"
                  type="primary"
                  type="text"
                  style="border-radius: 24px"
                  :loading="loading"
                  size="large"
                  >发送
                ><icon-send size="32" style="color: #0960bd"/>
                </a-button>
              </div>
            </div>
@@ -163,9 +204,9 @@
  import {
    IconClose,
    IconSearch,
    IconTiktokColor,
  } from '@arco-design/web-vue/es/icon';
  import { useAppStore, useUserStore } from '@/store';
  IconTiktokColor
} from "@arco-design/web-vue/es/icon";
import { useAppStore, useUserStore } from "@/store";
  import {
    computed,
    nextTick,
@@ -174,51 +215,96 @@
    reactive,
    ref,
    onBeforeMount,
    onBeforeUnmount,
  } from 'vue';
  onBeforeUnmount
} from "vue";
  import { Message } from '@arco-design/web-vue';
  import { EventSourceParserStream } from 'eventsource-parser/stream';
  import moment from 'moment';
  import chatMenu from '@/views/sessionManager/components/chatMenu.vue';
  import AddSession from '@/views/sessionManager/components/addSession.vue';
  import agentSession from '@/views/sessionManager/components/agentSession.vue';
  import historySession from '@/views/sessionManager/components/historySession.vue';
  import smartAi from '@/views/sessionManager/components/smartAi.vue';
  import EventBus from '@/utils/EventBus';
import { Message } from "@arco-design/web-vue";
import { EventSourceParserStream } from "eventsource-parser/stream";
import moment from "moment";
import chatMenu from "@/views/sessionManager/components/chatMenu.vue";
import AddSession from "@/views/sessionManager/components/addSession.vue";
import agentSession from "@/views/sessionManager/components/agentSession.vue";
import historySession from "@/views/sessionManager/components/historySession.vue";
import smartAi from "@/views/sessionManager/components/smartAi.vue";
import EventBus from "@/utils/EventBus";
  import {
    addSessionApi,
    chatApi,
    getDialogListApi,
    getSessionDetailsApi,
    sessionListApi,
  } from '@/api/session';
  import { getAuthorization } from '@/utils/auth';
  import { queryCanvasList } from '@/api/Agent';
  import { getAgentSessionDetailsApi } from '@/api/agentSession';
  sessionListApi, uploadWithoutKb
} from "@/api/session";
import { getAuthorization } from "@/utils/auth";
import { queryCanvasList } from "@/api/Agent";
import { getAgentSessionDetailsApi } from "@/api/agentSession";
import useClipboard from "vue-clipboard3";
  const sessionDetailList = ref([]); //根据会话id出来的会话详情
  const sessionList = ref([]); //会话列表
  const modalObj = reactive({ add: false });
  const dialogId = ref('');
const dialogId = ref("");
  const chatDis = ref(false);
  const loading = ref(false);
  const agentType = ref('1');
  const agentTitle = ref('未命名会话');
const agentType = ref("1");
const agentTitle = ref("未命名会话");
let chatObj = reactive({});
const isStopChat = ref(false)
  const currIndex = ref(0);
  const displayedText = ref(''); // 正在显示的文字
const displayedText = ref(""); // 正在显示的文字
  let timer: number | null = null;
  const streamStr = ref('');
  const inputMsg = ref('');
  const activeSessionId = ref('');
  const fieldNames = { value: 'id', label: 'name' };
const streamStr = ref("");
const inputMsg = ref("");
const activeSessionId = ref("");
const fieldNames = { value: "id", label: "name" };
  const dialogs = ref([]);
  const dialogObj = reactive({});
  const agentObj = reactive({});
  const agentList = ref([]);
  const selectValue = ref('');
const selectValue = ref("");
  const sectionList = ref({});
const uploadList = ref([]);
const uploadRef = ref();
const files = ref([]);
const { toClipboard } = useClipboard();
const copy = async (text) => {
  await toClipboard(text);    //参数为要复制的文本
}
const onChange = (fileList) => {
  // files.value = fileList;
};
const submitOne = (e) => {
  e.stopPropagation();
  console.log(files.value);
  uploadRef.value.submit(files.value.find((x) => x.status === 'init'));
};
// 上传文件
const customRequest = async(option) => {
  const {onProgress, onError, onSuccess, fileItem, name} = option
  const { code, data } = await getSessionDetailsApi(activeSessionId.value);
  if (code === 200) {
    console.log(data, "详情");
    if (fileItem.file) {
      const formData = new FormData();
      formData.append('file', fileItem.file);
      formData.append('conversation_id', data.dialog_id);
      uploadWithoutKb(formData).then((res) => {
        console.log(res);
        uploadList.value = [];
        if (res.code == 0) {
          console.log(res);
        }
      });
    }
  }
}
  const DialogList = async () => {
    const { code, data } = await getDialogListApi();
    if (code === 200) {
@@ -227,10 +313,10 @@
        dialogs.value = data.map((item) => {
          return {
            ...item,
            type: 1, //智能体
          type: 1 //智能体
          };
        });
        console.log(data, 'dialogs');
      console.log(data, "dialogs");
        queryCanvas();
      }
    }
@@ -239,12 +325,12 @@
  const queryCanvas = async (params = {}) => {
    try {
      const { data } = await queryCanvasList(params);
      console.log(data, 'agent');
    console.log(data, "agent");
      agentList.value = data.map((item) => {
        return {
          ...item,
          name: item.title,
          type: 2, //agent
        type: 2 //agent
        };
      });
      // 合并数组
@@ -263,13 +349,13 @@
    }
  };
  // 新建会话
  const createSession = async (id, name = '未命名会话') => {
const createSession = async (id, name = "未命名会话") => {
    // 如果有会话id
    console.log(name, '新建会话名称');
  console.log(name, "新建会话名称");
    const res = await addSessionApi({
      dialog_id: id,
      conversation_desc: name,
    conversation_desc: name
    });
    // console.log(res, "res");
    if (res.code == 200) {
@@ -277,13 +363,13 @@
      activeSessionId.value = res.data?.conversation_id;
      queryNewSessionDetail(res.data?.conversation_id);
    } else {
      Message.error('创建会话失败,请重试');
    Message.error("创建会话失败,请重试");
    }
  };
  const handleShiftEnter = (event) => {
    event.preventDefault();
    inputMsg.value += '\n';
  inputMsg.value += "\n";
  };
  const dialogChange = (val) => {
    // 判断当前是智能体或agent
@@ -294,60 +380,81 @@
        Object.assign(dialogObj, item);
      }
    });
    console.log(dialogObj.type, 'dialogObj');
  console.log(dialogObj.type, "dialogObj");
    if (dialogObj.type == 1) {
      agentType.value = 1;
    agentType.value = '1';
      querySessionList();
    } else {
      agentType.value = 2;
    agentType.value = '2';
      queryAgentSessionList();
    }
    // querySessionList();
  };
// 发送
  const sentClick = () => {
    sendMessage('click');
  sendMessage("click");
  };
// 重新生成
const reGenerate = () => {
  let inputContent = sessionDetailList.value[sessionDetailList.value.length-2].content
  startChat(inputContent)
};
  const sendMessage = async (event) => {
    if (event.keyCode == 13 || event === 'click') {
  if (event.keyCode == 13 || event === "click") {
      if (!event.shiftKey) {
        //只有enter没有shift,或进行你的其他逻辑
        if (event !== 'click') {
      if (event !== "click") {
          event.preventDefault(); // 阻止默认行为,即不换行
        }
        chatDis.value = true;
        loading.value = true;
        if (!activeSessionId.value) {
          Message.warning('请选择会话');
          chatDis.value = false;
          loading.value = false;
          return;
        }
      // if (!activeSessionId.value) {
      //   Message.warning("请选择会话");
      //   chatDis.value = false;
      //   loading.value = false;
      //   return;
      // }
        // if (displayedText.value) {
        //   querySessionList();
        // }
        if (inputMsg.value) {
        startChat(inputMsg.value)
        inputMsg.value = "";
      } else {
        Message.warning("消息不能为空");
      }
    }
  }
};
const startChat = async(valMsg)=>{
  chatDis.value = true;
  loading.value = true;
          sessionDetailList.value.push({
            content: inputMsg.value,
            role: 'user',
    content: valMsg,
    role: "user"
          });
          sessionDetailList.value.push({ role: 'last' });
  sessionDetailList.value.push({ role: "last" });
          refreshScroll();
          const response = await fetch(
            '/api/tech/cloudminds/query?modeltype=localragflow',
    "/api/tech/cloudminds/query?modeltype=localragflow",
            {
              method: 'POST',
      method: "POST",
              headers: {
                'Authorization': getAuthorization(),
                'Content-Type': 'application/json',
        "Authorization": getAuthorization(),
        "Content-Type": "application/json"
              },
              body: JSON.stringify({
                conversation_id: activeSessionId.value,
                messages: inputMsg.value,
              }),
        messages: valMsg
      })
            }
          );
@@ -360,12 +467,12 @@
            const x = await reader?.read();
            if (x) {
              const { done, value } = x;
              console.log(x, 999);
      // console.log(x, 999);
              try {
                const val = JSON.parse(value?.data || '');
        const val = JSON.parse(value?.data || "");
                const d = val?.data;
                if (typeof d !== 'boolean') {
                  console.info('data:', d);
        if (typeof d !== "boolean") {
          // console.info("data:", d);
                  streamStr.value = d.content;
                  startDisplayStr();
                }
@@ -373,10 +480,13 @@
                console.warn(e);
              }
              if (done) {
                console.info('done');
                displayedText.value = '';
        console.info("done");
        displayedText.value = "";
        // if(!isStopChat.value){
        //   queryNewSessionDetail(activeSessionId.value);
        // }
                queryNewSessionDetail(activeSessionId.value);
                EventBus.emit('queryAppUsageList');
        EventBus.emit("queryAppUsageList");
                break;
              }
            }
@@ -384,30 +494,61 @@
          // querySessionList();
          chatDis.value = false;
          loading.value = false;
          inputMsg.value = '';
        } else {
          Message.warning('消息不能为空');
          chatDis.value = false;
          loading.value = false;
        }
const stopChat=async()=>{
  // const { code, data } = await stopChatApi(activeSessionId.value);
  // if (code === 200) {
  //   Message.success("已停止");
  //   queryNewSessionDetail(activeSessionId.value);
  // }
  isStopChat.value = true;
  console.log('stopChat');
  console.log(displayedText.value, 'displayedText');
  console.log(sessionDetailList.value, 'sessionDetailList');
  let inputText = sessionDetailList.value[sessionDetailList.value.length-2].content
  // 数组合并
  let lastArr = [{
    content: inputText,
    role: "user"
  },{
    content: displayedText.value,
    role: "assistant"
  }]
  sessionDetailList.value = sessionDetailList.value.splice(0, sessionDetailList.value.length-2).concat(lastArr);
  console.log(sessionDetailList.value, 'sessionDetailList2');
  console.log(chatObj, 'chatObj对象');
  chatObj.message = chatObj.message.concat(lastArr);
    // clearTimeout(timer!);
    // timer = null;
  // const { code, data } = await addSessionApi(chatObj);
  // if (data) {
  //   //停止定时器
  //   clearTimeout(timer!);
  //   timer = null;
  //   displayedText.value = "";
  //   queryNewSessionDetail(activeSessionId.value);
  // }
      }
    }
  };
  const queryNewSessionDetail = async (id) => {
    activeSessionId.value = id;
    const { code, data } = await getSessionDetailsApi(id);
    if (code === 200) {
      console.log(data, '新建会话详情');
    console.log(data, "新建会话详情");
    Object.assign(chatObj, data);
      sessionDetailList.value = data.message;
      agentTitle.value = data.name;
      refreshScroll(); //刷新滚动条位置
    isStopChat.value = false;
    }
  };
  const changeAgentType = (val, session) => {
    agentType.value = val;
    console.log(val, 'val');
  console.log(val, "val");
  };
  const querySessionDetail = async (session) => {
@@ -430,7 +571,7 @@
  const scrollbar = ref(null);
  const refreshScroll = () => {
    nextTick(() => {
      const container = document.getElementById('home');
    const container = document.getElementById("home");
      scrollbar.value.scrollTop(container.scrollHeight);
    });
  };
@@ -442,7 +583,7 @@
      activeSessionId.value = data[0].id; //默认选择第一个
      querySessionDetail(data[0]);
    } else {
      Message.warning('查询失败');
    Message.warning("查询失败");
    }
  };
@@ -464,16 +605,16 @@
  onBeforeMount(() => {
    // DialogList();
    //新建会话
    createSession('');
  createSession("");
  });
  onMounted(() => {
    EventBus.on('newChat', () => {
      agentType.value = 1;
      createSession('');
  EventBus.on("newChat", () => {
    agentType.value = "1";
    createSession("");
    });
  });
  onBeforeUnmount(() => {
    EventBus.off('newChat');
  EventBus.off("newChat");
  });
  const appStore = useAppStore();
@@ -656,7 +797,8 @@
      .chat_bottom {
        display: flex;
        align-items: center;
      width: 78%;
      margin: 0 auto;
        .center-bottom {
          // position: absolute;
          // width: 90%;
@@ -678,7 +820,7 @@
          .btn-send {
            position: absolute !important;
            right: 10px;
            bottom: 10px;
          top: 110px;
            z-index: 10;
          }
@@ -761,6 +903,7 @@
      }
    }
  }
  .header___lEPyH {
    width: 100%;
    height: 46px;
@@ -770,6 +913,7 @@
    align-items: center;
    justify-content: center;
    -webkit-backdrop-filter: blur(15px);
    .chatHeaderBox {
      width: auto;
      border-radius: 8px;
@@ -781,10 +925,27 @@
      text-overflow: ellipsis; /* 使用省略号来代替被隐藏的文字 */
      white-space: nowrap; /* 不换行,使内容在一行内显示 */
      max-width: 200px;
      .title {
        color: var(--color-text-1);
        font-size: 12px;
      }
    }
  }
.action {
  cursor: pointer;
  display: inline-block;
  padding: 0 10px;
  color: var(--color-text-1);
  line-height: 24px;
  background: transparent;
  border-radius: 2px;
  cursor: pointer;
  transition: all 0.1s ease;
  font-size: 12px;
}
.action:hover {
  background: var(--color-fill-3);
}
</style>