liudong
2024-08-19 5631aab9e380b83ec8ec6e21390e9386b0e0e852
src/views/sessionManager/index.vue
@@ -1,162 +1,66 @@
<template>
  <div class="container">
    <AddSession
      :modalObj="modalObj"
      @addSession="addSession"
      :dialogId="dialogId"
    ></AddSession>
    <!--    <AddSession-->
    <!--      :modalObj="modalObj"-->
    <!--      @addSession="addSession"-->
    <!--      :dialogId="dialogId"-->
    <!--    ></AddSession>-->
    <!--    <a-card class="top-title">AI会话记录</a-card>-->
    <a-row :gutter="[5, 5]" style="margin-top: 3px;">
      <!--      <a-col :span="6">-->
      <!--        <a-card class="left-select">-->
      <!--          <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-->
      <!--                type="primary"-->
      <!--                shape="round"-->
      <!--                class="card-btn-1"-->
      <!--                @click="modalObj.add = true"-->
      <!--              >-->
      <!--                +新建会话-->
      <!--              </a-button>-->
      <!--              &lt;!&ndash; <a-button type="text" shape="circle" class="card-btn-2">-->
      <!--                <icon-search />-->
      <!--              </a-button> &ndash;&gt;-->
      <!--            </div>-->
      <!--          </template>-->
      <!--        </a-card>-->
      <!--        <a-card class="left">-->
      <!--          <a-scrollbar-->
      <!--            class="left-list"-->
      <!--            style="-->
      <!--              height: calc(100vh - 350px);-->
      <!--              overflow-y: auto;-->
      <!--              overflow-x: hidden;-->
      <!--            "-->
      <!--          >-->
      <!--            <div-->
      <!--              class="item left-list-item"-->
      <!--              v-for="session in sessionList"-->
      <!--              @click="querySessionDetail(session)"-->
      <!--              :class="{ isLeftActive: activeSessionId === session.id }"-->
      <!--            >-->
      <!--              <div class="text" :class="{ time: 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-row :gutter="[5, 5]" style="margin-top: 3px">
      <a-col :span="1">
        <chatMenu></chatMenu>
        <chatMenu
          @createSession="createSession"
          @querySessionDetail="querySessionDetail"
          @changeAgentType="changeAgentType"
        ></chatMenu>
      </a-col>
      <!--      智能体会话-->
      <a-col :span="23" v-show="agentType == '1'">
        <!-- <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">
            我可以理解和学习人类的语言,具备多轮对话的能力,现在和我开始交流吧~
          </div>
          <div class="center-question">
            <div class="center-question-left">试一试这样问我</div>
            <div class="center-question-right">
              <a-button type="primary">换一换</a-button>
        <div class="center">
          <div class="header___lEPyH">
            <div class="chatHeader">
              <div class="chatHeaderBox">
<!--                <span class="title">{{ agentTitle }}</span>-->
                <a-popover
                  position="bottom"
                  trigger="click"
                >
                  <a-button border
                  >{{agentTitle}}
                    <icon-down style="margin-left: 4px" />
                  </a-button>
                  <template #content>
                    <a-button
                      type="text"
                      class="button"
                      style="color: #2a2a2b"
                      @click="handleClick()"
                    >
                      <template #icon>
                        <icon-edit />
                      </template>
                      修改名称
                    </a-button>
<!--                    <a-divider style="margin: 10px 0" />-->
                  </template>
                </a-popover>
              </div>
            </div>
          </div>
          <a-row justify="space-around" class="center-list">
            <a-col :span="7" class="item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </a-col>
            <a-col :span="7" class="item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </a-col>
            <a-col :span="7" class="item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </a-col>
            <a-col :span="7" class="item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </a-col>
            <a-col :span="7" class="item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </a-col>
            <a-col :span="7" class="item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </a-col>
          </a-row>
        </div> -->
        <div class="center">
          <a-scrollbar
            ref="scrollbar"
            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
@@ -180,11 +84,30 @@
                  />
                </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' }"-->
                  <!--                      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"
                  >
                  </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'">
@@ -201,8 +124,19 @@
                    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>
@@ -211,6 +145,7 @@
            >
            <div class="chartStart v-else" @click="stopChat">重新生成</div> -->
          </a-scrollbar>
          <div class="chat_bottom">
            <div class="center-bottom">
              <!-- <a-textarea
@@ -232,23 +167,71 @@
                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 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"
                >发送
                </a-button
                >
                  <icon-send size="32" style="color: #0960bd" />
                </a-button>
              </div>
            </div>
            <!--            <div style="margin-top: 0px">-->
            <!--              <a-upload-->
            <!--                ref="uploadRef"-->
            <!--                :file-list="uploadList"-->
            <!--                :limit="1"-->
            <!--                multiple-->
            <!--                :custom-request="customRequest"-->
            <!--                style="font-size: 24px;margin-bottom: 10px;position: relative;width: 200px">-->
            <!--                <template #upload-button>-->
            <!--                  <icon-attachment style="color: #0960bd;position: absolute;top:-50px;left: 20px;z-index: 10000"/>-->
            <!--                </template>-->
            <!--              </a-upload>-->
            <!--            </div>-->
            <span style="position: absolute;top:94px;left: 20px;z-index: 999;cursor: pointer">
              <icon-attachment size="28" @click="selectFile" style="color: #0960bd;" />
              <input
                ref="fileInput"
                type="file"
                style="display: none;"
                @change="onFileSelected"
              />
            </span>
            <div class="uploadFileList">
              <div class="files" v-for="(item,index) in uploaditemList" :key="index"
                   style="position: relative;width: 200px;margin-top: 10px;">
                <a-comment
                  :author="item.name"
                  :content="item.size +''"
                  style="background: var(--color-bg-2);padding:10px;border-radius: 10px"
                >
                  <template #avatar>
                    <a-spin :loading="onFileSelectedLoading" v-if="onFileSelectedLoading">
                      <template #icon>
                        <icon-sync />
                      </template>
                    </a-spin>
<!--                    <a-button type="text" :loading="onFileSelectedLoading" v-if="onFileSelectedLoading"></a-button>-->
                    <a-avatar v-if="!onFileSelectedLoading">
                      <icon-file style="color: #0960bd" />
                    </a-avatar>
                  </template>
                </a-comment>
                <icon-close-circle-fill size="18px"
                                        @click="deleteFile(item)"
                                        style="position: absolute;right: -4px;top: -4px;color: red;cursor: pointer"/>
              </div>
            </div>
          </div>
@@ -259,68 +242,37 @@
          <agentSession :modalObj="agentObj"></agentSession>
        </div>
      </a-col>
      <!-- <a-col :span="5">
        <a-card class="right">
          <div class="right-top">
            <div class="right-title">数智库</div>
            <div class="right-btn">
              <a-button type="outline" shape="circle" style="border: none">
                <icon-search />
              </a-button>
              <a-button
                type="outline"
                shape="circle"
                style="border: none; margin-left: -10px"
              >
                <icon-close />
              </a-button>
            </div>
          </div>
          <div class="right-tag">
            <a-button type="primary" size="mini" class="btn">全部 </a-button>
            <a-button type="outline" size="mini" class="btn"
              >文档创作
            </a-button>
            <a-button type="outline" size="mini" class="btn"
              >知识学习
            </a-button>
            <a-button type="outline" size="mini" class="btn"
              >效率提升
            </a-button>
          </div>
          <div class="right-list">
            <div class="right-item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </div>
            <div class="right-item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </div>
            <div class="right-item">
              <div class="item-title">
                <IconTiktokColor></IconTiktokColor>
                抖音带货脚本
              </div>
              <div class="item-content" :class="{ dark: theme === 'dark' }">
                编写引人注目且具有说服力的、适用于产品的...
              </div>
            </div>
          </div>
        </a-card>
      </a-col> -->
      <a-col :span="23" v-show="agentType == '3'">
        <div class="center" style="padding: 0">
          <historySession
            @querySessionDetail="querySessionDetail"
            @changeAgentType="changeAgentType"
          ></historySession>
        </div>
      </a-col>
      <a-col :span="23" v-show="agentType == '4'">
        <div class="center" style="padding: 0">
          <smartAi
            @createSession="createSession"
            @querySessionDetail="querySessionDetail"
            @changeAgentType="changeAgentType"
          ></smartAi>
        </div>
      </a-col>
    </a-row>
    <a-modal v-model:visible="visible" title="修改名称" @before-open="handleOpened" @cancel="handleCancel" :footer="false" title-align="start">
      <a-form ref="formRef" :rules="rules" :model="chatObj" @submit="handleSubmit" >
        <a-form-item field="name" label="名称">
          <a-input v-model="agentTitle" placeholder="请输入名称"/>
        </a-form-item>
        <a-form-item>
          <div style="width: 100%;text-align: right">
            <a-button @click="visible = false">取消</a-button>
            <a-button style="margin-left: 10px" type="primary" html-type="submit">确定</a-button>
          </div>
        </a-form-item>
      </a-form>
    </a-modal>
  </div>
</template>
<script setup lang="ts">
@@ -330,7 +282,16 @@
  IconTiktokColor
} from "@arco-design/web-vue/es/icon";
import { useAppStore, useUserStore } from "@/store";
import { computed, nextTick, onMounted, watch, reactive, ref } from "vue";
import {
  computed,
  nextTick,
  onMounted,
  watch,
  reactive,
  ref,
  onBeforeMount,
  onBeforeUnmount
} from "vue";
import { Message } from "@arco-design/web-vue";
import { EventSourceParserStream } from "eventsource-parser/stream";
@@ -338,15 +299,21 @@
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 setName from "@/views/sessionManager/components/setName.vue";
import EventBus from "@/utils/EventBus";
import {
  addSessionApi,
  chatApi,
  getDialogListApi,
  getSessionDetailsApi,
  sessionListApi
  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([]); //会话列表
@@ -355,7 +322,9 @@
const chatDis = ref(false);
const loading = ref(false);
const agentType = ref("1");
const agentTitle = ref("未命名会话");
let chatObj = reactive({});
const isStopChat = ref(false);
const currIndex = ref(0);
const displayedText = ref(""); // 正在显示的文字
let timer: number | null = null;
@@ -369,6 +338,132 @@
const agentList = ref([]);
const selectValue = ref("");
const sectionList = ref({});
const uploadList = ref([]);
const uploaditemList = ref([]);
const uploadRef = ref();
const files = ref([]);
const file = ref('');
const fileInput = ref(null);
const chatDataMeg = reactive({})
const visible = ref(false);
const rules = {
  name: [
    {
      required: true,
      message:'名称不允许为空',
    },
  ],
}
const handleSubmit = async({values, errors}) => {
  if(errors) return;
  // chatObj.name = agentTitle.value;
  // chatObj.conversation_id = chatObj.id;
  let chatData = {
    id:chatObj.id,
    conversation_id:chatObj.id,
    name: agentTitle.value
  }
  const { code, data } = await addSessionApi(chatData);
  if (data) {
    Message.success("修改成功");
    handleCancel()
    queryNewSessionDetail(activeSessionId.value);
  }
}
const handleClick = () => {
  visible.value = true;
};
const handleCancel = () => {
  visible.value = false;
}
const handleOpened =(el) => {
  // Object.assign(form,{
  //   name: '',// 用户名
  // });
  // formRef.value.resetFields();
}
const selectFile = () => {
  fileInput.value.click();
};
let onFileSelectedLoading = ref(false);
const onFileSelected = (event) => {
  const file = event.target.files[0];
  uploaditemList.value = [{
    name: file.name,
    size: file.size,
  }];
  if (file) {
    onFileSelectedLoading.value = true;
    const formData = new FormData();
    formData.append("file", file);
    formData.append("conversation_id", activeSessionId.value);
    uploadWithoutKb(formData).then((res) => {
      // console.log(res);
      if (res.code == 200) {
        console.log(res);
        console.log(uploaditemList.value);
        onFileSelectedLoading.value = false;
        fileInput.value.value = "";
        uploaditemList.value = [];
        Message.success("上传成功");
      } else {
        Message.error("上传失败");
      }
    });
  }
};
const deleteFile = (item) => {
  console.log(uploaditemList.value);
  uploaditemList.value = [];
};
const { toClipboard } = useClipboard();
const copy = async (text) => {
  await toClipboard(text);    //参数为要复制的文本
};
const onChange = (fileList) => {
  // files.value = fileList;
};
// 上传文件
const customRequest = async (option) => {
  const { onProgress, onError, onSuccess, fileItem, name } = option;
  fileItem.status = "ready";
  if (fileItem.file) {
    const formData = new FormData();
    formData.append("file", fileItem.file);
    formData.append("conversation_id", activeSessionId.value);
    uploadWithoutKb(formData).then((res) => {
      // console.log(res);
      if (res.code == 200) {
        console.log(res);
        console.log(uploadList.value);
        fileItem.status = "done";
        // uploadList.value = [];
      } else {
        fileItem.status = "error";
      }
    });
  }
};
const DialogList = async () => {
  const { code, data } = await getDialogListApi();
  if (code === 200) {
@@ -382,7 +477,6 @@
      });
      console.log(data, "dialogs");
      queryCanvas();
      // querySessionList();
    }
  }
};
@@ -403,12 +497,32 @@
    // 判断当前是智能体或agent
    // console.log(val, 'val');
    if (dialogs.value.length > 0) {
      dialogChange(dialogs.value[0].id);
    }
    // if (dialogs.value.length > 0) {
    //   dialogChange(dialogs.value[0].id);
    // }
    //新建会话
    createSession(dialogs.value[0].id);
  } catch (err) {
    // you can report use errorHandler or other
  } finally {
  }
};
// 新建会话
const createSession = async (id, name = "未命名会话") => {
  // 如果有会话id
  console.log(name, "新建会话名称");
  const res = await addSessionApi({
    dialog_id: id,
    conversation_desc: name
  });
  // console.log(res, "res");
  if (res.code == 200) {
    // console.log(res.data.conversation_id);
    activeSessionId.value = res.data?.conversation_id;
    queryNewSessionDetail(res.data?.conversation_id);
  } else {
    Message.error("创建会话失败,请重试");
  }
};
@@ -427,18 +541,26 @@
  });
  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");
};
// 重新生成
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) {
@@ -447,82 +569,161 @@
        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) {
        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;
            console.log(x, 999);
            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 = "";
              querySessionDetail(sectionList.value);
              break;
            }
          }
        }
        querySessionList();
        chatDis.value = false;
        loading.value = false;
        startChat(inputMsg.value);
        inputMsg.value = "";
      } else {
        Message.warning("消息不能为空");
        chatDis.value = false;
        loading.value = false;
      }
    }
  }
};
const startChat = async (valMsg) => {
  chatDis.value = true;
  loading.value = true;
  sessionDetailList.value.push({
    content: valMsg,
    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: valMsg
      })
    }
  );
  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;
      // console.log(x, 999);
      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 = "";
        if(isStopChat.value){
          setChatDataMeg(chatDataMeg);
        }else{
          queryNewSessionDetail(activeSessionId.value);
          EventBus.emit("queryAppUsageList");
        }
        break;
      }
    }
  }
  // querySessionList();
  chatDis.value = false;
  loading.value = false;
};
const stopChat = async () => {
  // const { code, data } = await stopChatApi(activeSessionId.value);
  // if (code === 200) {
  //   Message.success("已停止");
  //   queryNewSessionDetail(activeSessionId.value);
  // }
  loading.value = false;
  chatDis.value = false;
  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);
  Object.assign(chatDataMeg,{
    id:chatObj.id,
    conversation_id:chatObj.id,
    message: sessionDetailList.value
  });
};
const setChatDataMeg = async(chatData) => {
  const { code, data } = await addSessionApi(chatData);
  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, "新建会话详情");
    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");
};
const querySessionDetail = async (session) => {
  sectionList.value = session;
  activeSessionId.value = session.id;
@@ -574,8 +775,19 @@
const addSession = () => {
  querySessionList();
};
onBeforeMount(() => {
  // DialogList();
  //新建会话
  createSession("");
});
onMounted(() => {
  DialogList();
  EventBus.on("newChat", () => {
    agentType.value = "1";
    createSession("");
  });
});
onBeforeUnmount(() => {
  EventBus.off("newChat");
});
const appStore = useAppStore();
@@ -639,8 +851,8 @@
  .left {
    /* height: calc(100vh - 160px);
    overflow-y: auto;
    overflow-x: hidden;*/
  overflow-y: auto;
  overflow-x: hidden;*/
    border: 0px;
    .left-list {
@@ -694,6 +906,7 @@
  .center {
    position: relative;
    padding-left: 50px;
    .center-title {
      line-height: 60px;
@@ -755,14 +968,17 @@
    }
    .chat_bottom {
      display: flex;
      align-items: center;
      //display: flex;
      //align-items: center;
      width: 78%;
      margin: 0 auto;
      position: relative;
      .center-bottom {
        // position: absolute;
        // width: 90%;
        // bottom: 20px;
        // left: 5%;
        //position: absolute;
        //width: 100%;
        //bottom: 20px;
        //left: 5%;
        background: #fff;
        border: 1px solid #00000014;
        border-radius: 24px;
@@ -778,8 +994,8 @@
        .btn-send {
          position: absolute !important;
          right: 10px;
          bottom: 10px;
          right: 4px;
          top: 90px;
          z-index: 10;
        }
@@ -862,4 +1078,54 @@
    }
  }
}
.header___lEPyH {
  width: 100%;
  height: 46px;
  position: relative;
  backdrop-filter: blur(15px);
  display: flex;
  align-items: center;
  justify-content: center;
  -webkit-backdrop-filter: blur(15px);
  .chatHeaderBox {
    width: auto;
    border-radius: 8px;
    padding: 4px 20px;
    transition: all var(--animation-duration) var(--animation-transition);
    display: flex;
    align-items: flex-end;
    overflow: hidden; /* 隐藏超出的内容 */
    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);
}
:deep(.arco-upload-list-item-operation) {
  //display: none;
}
</style>