Просмотр исходного кода

Merge branch 'master' of http://gitlab.smartai.com/zhupei/smartai2dian0

张涛 1 год назад
Родитель
Сommit
cb6f38e139
28 измененных файлов с 342 добавлено и 66 удалено
  1. 7 0
      public/config.js
  2. 1 1
      public/i18n/lang-zh.json
  3. 33 6
      src/modules/conversation-board/BoardAgentItem.vue
  4. 1 0
      src/modules/conversation-board/BoardAgentList.vue
  5. 3 1
      src/modules/conversation-chat/DialogAsideLeft.vue
  6. 3 1
      src/modules/conversation-chat/DialogAsideRight.vue
  7. 3 1
      src/modules/conversation-chat/DialogItem.vue
  8. 4 2
      src/modules/conversation-chat/DialogWelcome.vue
  9. 1 0
      src/modules/conversation-chat/dialog-content/DialogContent.vue
  10. 1 0
      src/modules/conversation-chat/dialog-item/BtnStopChat.vue
  11. 9 1
      src/modules/conversation-chat/dialog-item/DialogActions.vue
  12. 8 1
      src/modules/conversation-chat/dialog-item/DialogAnswer.vue
  13. 7 1
      src/modules/conversation-chat/dialog-item/DialogQuestion.vue
  14. 8 1
      src/modules/conversation-dialog/format-dialog-answer-for-loading.js
  15. 8 1
      src/modules/conversation-dialog/format-dialog-answer-from-history.js
  16. 7 1
      src/modules/conversation-dialog/format-dialog-answer-from-websocket_receive_message.js
  17. 3 3
      src/modules/conversation-dialog/format-dialog-history.js
  18. 8 1
      src/modules/conversation-dialog/format-dialog-question-by-client.js
  19. 8 1
      src/modules/conversation-dialog/format-dialog-question-by-history.js
  20. 3 0
      src/modules/conversation-dialog/get-icon-4-dialog.js
  21. 12 3
      src/modules/conversation-history/HistoryItem.vue
  22. 15 4
      src/modules/conversation-history/HistoryTypeDropdown.vue
  23. 2 2
      src/views/ConversationQA.vue
  24. 100 0
      src/views/conversation/ChatAsideAgent.vue
  25. 52 6
      src/views/conversation/ChatAsideMenu.vue
  26. 1 1
      src/views/conversation/ConversationBoardContainer.vue
  27. 26 26
      src/views/conversation/ConversationChatContainer.vue
  28. 8 1
      src/views/conversation/ConversationHistoryContainer.vue

+ 7 - 0
public/config.js

@@ -24,3 +24,10 @@ window.DIFY_BASE_URL = 'http://192.168.20.119:28003';
  * 小数系统访问地址
  */
 window.XIAOSHU_URL = 'http://192.168.20.119:9301';
+
+/**
+ * 当用户第一次进入系统时,进入的第一个页面就是对话页面
+ * 此时需要一个默认的Agent用来创建对话
+ * 此处对默认的Agent ID进行配置
+ */
+window.DEFAULT_CHAT_AGENT_ID = '42e4fcdc-9bea-11ef-ac30-0242ac160006';

+ 1 - 1
public/i18n/lang-zh.json

@@ -85,7 +85,7 @@
     "search_history": "搜索历史会话",
     "history_today": "今天",
     "history_month": "本月",
-    "history_earlier": "更早以前",
+    "history_earlier": "一个月以前",
     "history_loadmore": "加载更多",
     "history_nomore": "没有更多了",
     "history_empty": "暂无数据",

+ 33 - 6
src/modules/conversation-board/BoardAgentItem.vue

@@ -1,19 +1,34 @@
 <template>
   <div class="conversation-agent-item">
-    <div class="agent-item-icon" @click="handleClick"></div>
+    <div class="agent-item-icon" @click="handleClick">
+      <img :src="img_icon" />
+    </div>
 
     <div class="agent-item-intro" @click="handleClick">
-      <div class="agent-item-intro-title">{{ title }}</div>
-      <div class="agent-item-intro-desc">{{ desc }}</div>
+      <a-tooltip :content="title" position="top">
+        <div class="agent-item-intro-title">{{ title }}</div>
+      </a-tooltip>
+
+      <a-tooltip :content="desc" position="top">
+        <div class="agent-item-intro-desc">{{ desc }}</div>
+      </a-tooltip>
     </div>
   </div>
 </template>
 
 <script setup>
+import { computed } from 'vue';
+import { getIconIntelligent } from '../common/icon-map';
+
 const props = defineProps({
   title: String,
   desc: String,
-  id: String
+  id: String,
+  icon: String
+});
+
+const img_icon = computed(() => {
+  return getIconIntelligent(props.icon);
 });
 
 const emit = defineEmits(['active']);
@@ -47,6 +62,10 @@ const handleClick = () => {
   cursor: pointer;
 }
 
+.agent-item-icon img {
+  width: 100%;
+}
+
 .agent-item-intro {
   cursor: pointer;
 }
@@ -56,11 +75,19 @@ const handleClick = () => {
   font-weight: bold;
 
   margin-bottom: 8px;
+
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1; /* 这里设置显示的行数 */
+  line-clamp: 1;
+  overflow: hidden;
 }
 
 .agent-item-intro-desc {
-  /* white-space: nowrap;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 3; /* 这里设置显示的行数 */
+  line-clamp: 3;
   overflow: hidden;
-  text-overflow: ellipsis; */
 }
 </style>

+ 1 - 0
src/modules/conversation-board/BoardAgentList.vue

@@ -6,6 +6,7 @@
       :title="item.name"
       :desc="item.description"
       :id="item.id"
+      :icon="item.icon"
       @active="handleActive"
     />
   </div>

+ 3 - 1
src/modules/conversation-chat/DialogAsideLeft.vue

@@ -1,6 +1,8 @@
 <template>
   <div class="dialog-aside-left">
-    <div>对话左侧边栏</div>
+    <div>
+      <!-- <span>对话左侧边栏</span> -->
+    </div>
   </div>
 </template>
 

+ 3 - 1
src/modules/conversation-chat/DialogAsideRight.vue

@@ -1,6 +1,8 @@
 <template>
   <div class="dialog-aside-right">
-    <div>对话右侧边栏</div>
+    <div>
+      <!-- <span>对话右侧边栏</span> -->
+    </div>
   </div>
 </template>
 

+ 3 - 1
src/modules/conversation-chat/DialogItem.vue

@@ -40,7 +40,8 @@ const item_type = computed(() => {
  */
 const questionInfo = computed(() => {
   return {
-    content: props.dialog.question
+    content: props.dialog.question,
+    client_custom_icon: props.dialog.client_custom_icon
   };
 });
 
@@ -64,6 +65,7 @@ const answerInfo = computed(() => {
    * 2 已结束
    */
   obj.client_custom_chat_status = chat_info.client_custom_chat_status;
+  obj.client_custom_icon = chat_info.client_custom_icon;
 
   return obj;
 });

+ 4 - 2
src/modules/conversation-chat/DialogWelcome.vue

@@ -1,12 +1,14 @@
 <template>
   <div class="dialog-welcome-content">
-    <div>对话欢迎内容:欢迎内容应该按照agent进行配置,最好是从后端进行返回</div>
+    <div>
+      <!-- <span>对话欢迎内容:欢迎内容应该按照agent进行配置,最好是从后端进行返回</span> -->
+    </div>
   </div>
 </template>
 
 <script setup>
 const props = defineProps({
-  suggestion: Object
+  agent_info: Object
 });
 </script>
 

+ 1 - 0
src/modules/conversation-chat/dialog-content/DialogContent.vue

@@ -36,5 +36,6 @@ const props = defineProps({
   background-color: #fff;
   border-radius: 10px;
   padding: 18px;
+  box-shadow: 0 0 5px #dedede;
 }
 </style>

+ 1 - 0
src/modules/conversation-chat/dialog-item/BtnStopChat.vue

@@ -16,6 +16,7 @@ const handleClick = () => {
   padding: 5px;
   font-size: 14px;
 
+  background-color: #fff;
   border-radius: 5px;
   border-width: 1px;
   border-style: solid;

+ 9 - 1
src/modules/conversation-chat/dialog-item/DialogActions.vue

@@ -1,7 +1,11 @@
 <template>
   <div class="dialog-actions-container">
     <div class="dialog-action-part dialog-action-left">
-      <div class="action-btn-item" @click="handleCopy">复制</div>
+      <a-tooltip content="复制" position="right">
+        <div class="action-btn-item" @click="handleCopy">
+          <icon-copy size="22" />
+        </div>
+      </a-tooltip>
       <!-- <div class="action-btn-item" @click="handleRetry">再试一次</div>
       <div class="action-btn-item" @click="handleShare">分享</div> -->
     </div>
@@ -69,6 +73,10 @@ const handleHate = () => {};
   align-items: center;
 }
 
+.action-btn-item {
+  cursor: pointer;
+}
+
 .dialog-action-left .action-btn-item {
   /* margin-left: 5px; */
   margin-right: 10px;

+ 8 - 1
src/modules/conversation-chat/dialog-item/DialogAnswer.vue

@@ -3,7 +3,9 @@
     <BtnSelectItem v-if="select_btn_visible" @change="handleSelectChange" />
 
     <div class="dialog-main answer-main">
-      <div class="dialog-icon answer-icon"></div>
+      <div class="dialog-icon answer-icon">
+        <img :src="answer.client_custom_icon" />
+      </div>
 
       <div class="dialog-content answer-content">
         <div>
@@ -39,6 +41,8 @@ import BtnStopChat from './BtnStopChat.vue';
 
 import formatAnwserString from '../../conversation-dialog/format-anwser-string';
 
+import { getIconIntelligent } from '../../common/icon-map';
+
 import copyText from '../../../3rd-libs/clipboard';
 
 const props = defineProps({
@@ -143,6 +147,9 @@ const handleAnswerRetry = () => {
 .answer-icon {
   margin-right: 5px;
 }
+.answer-icon img {
+  width: 100%;
+}
 
 .answer-actions-btns {
   margin-top: 5px;

+ 7 - 1
src/modules/conversation-chat/dialog-item/DialogQuestion.vue

@@ -9,7 +9,9 @@
         </div>
       </div>
 
-      <div class="dialog-icon question-icon"></div>
+      <div class="dialog-icon question-icon">
+        <img :src="question.client_custom_icon" />
+      </div>
     </div>
   </div>
 </template>
@@ -62,4 +64,8 @@ const handleSelectChange = () => {
 .question-icon {
   margin-left: 5px;
 }
+
+.question-icon img {
+  width: 100%;
+}
 </style>

+ 8 - 1
src/modules/conversation-dialog/format-dialog-answer-for-loading.js

@@ -1,9 +1,13 @@
+import { getIcon4Answer } from './get-icon-4-dialog';
+
 /**
  * 此方法返回一个answer,仅用于加载中状态
  * 当用户已发送消息,但是还未返回时
  * 此时界面上应该显示一个Loading状态
  */
-export default function formatDialogAnswerForLoading() {
+export default function formatDialogAnswerForLoading(agentInfo) {
+  const icon_src = getIcon4Answer(agentInfo);
+
   const currentMsg = {
     /**
      * 对话消息类别
@@ -20,6 +24,9 @@ export default function formatDialogAnswerForLoading() {
      */
     client_custom_chat_status: 0, // 此轮会话的状态值 0 加载中 1 进行中 2 已结束
 
+    // 图标
+    client_custom_icon: icon_src,
+
     question: '',
     answer: '' // 消息正文,markdown格式,需要进行解析
   };

+ 8 - 1
src/modules/conversation-dialog/format-dialog-answer-from-history.js

@@ -1,9 +1,13 @@
 import generateClientUniqueId from '../../utils/generate-client-unique-id';
 
+import { getIcon4Answer } from './get-icon-4-dialog';
+
 /**
  * 格式化用户的对话记录的回答数据
  */
-export default function formatDialogAnswerFromHistory(item) {
+export default function formatDialogAnswerFromHistory(item, agentInfo) {
+  const icon_src = getIcon4Answer(agentInfo);
+
   return {
     /**
      * 对话消息类别
@@ -26,6 +30,9 @@ export default function formatDialogAnswerFromHistory(item) {
      */
     client_custom_chat_status: 2, // 此轮会话的状态值 0 加载中 1 进行中 2 已结束
 
+    // 图标
+    client_custom_icon: icon_src,
+
     client_custom_unique_id: generateClientUniqueId(item.answer),
     answer: item.answer
   };

+ 7 - 1
src/modules/conversation-dialog/format-dialog-answer-from-websocket_receive_message.js

@@ -2,6 +2,7 @@ import { jsonParse, jsonStringify } from '../../utils/utils';
 
 import { formatCodePython, formatCodeSql } from './format-code-string';
 import generateClientUniqueId from '../../utils/generate-client-unique-id';
+import { getIcon4Answer } from './get-icon-4-dialog';
 
 /**
  * 格式化websocket发送消息的参数
@@ -10,12 +11,14 @@ import generateClientUniqueId from '../../utils/generate-client-unique-id';
  * @param {object} preMsg - 前一次的消息,如果是流式消息,则需要上一次的Content进行拼接,从而形成新的消息
  * @returns
  */
-export default function formatDialogAnswerFromWebsocketReceiveMessage(message_str, preMsg) {
+export default function formatDialogAnswerFromWebsocketReceiveMessage(message_str, preMsg, agentInfo) {
   const res_content = jsonParse(message_str);
 
   // 复制一份原消息内容
   const copyPreMsg = jsonParse(jsonStringify(preMsg));
 
+  const icon_src = getIcon4Answer(agentInfo);
+
   /**
    * 类别:
    * close
@@ -62,6 +65,9 @@ export default function formatDialogAnswerFromWebsocketReceiveMessage(message_st
      */
     client_custom_chat_status: 1, // 此轮会话的状态值 0 加载中 1 进行中 2 已结束
 
+    // 图标
+    client_custom_icon: icon_src,
+
     question: res_content.question // 用户的提问内容
 
     // answer: '', // 消息正文,markdown格式,需要进行解析

+ 3 - 3
src/modules/conversation-dialog/format-dialog-history.js

@@ -4,12 +4,12 @@ import formatDialogAnswerFromHistory from './format-dialog-answer-from-history';
 /**
  * 格式化用户的对话历史记录数据
  */
-export default function formatDialogHistoryMessages(session_list) {
+export default function formatDialogHistoryMessages(session_list, agentInfo) {
   const arr = [];
 
   session_list.forEach((item) => {
-    const question = formatDialogQuestionByHistory(item);
-    const answer = formatDialogAnswerFromHistory(item);
+    const question = formatDialogQuestionByHistory(item, agentInfo);
+    const answer = formatDialogAnswerFromHistory(item, agentInfo);
 
     arr.push(question);
     arr.push(answer);

+ 8 - 1
src/modules/conversation-dialog/format-dialog-question-by-client.js

@@ -1,11 +1,15 @@
 import generateClientUniqueId from '../../utils/generate-client-unique-id';
 
+import { getIcon4Question } from './get-icon-4-dialog';
+
 /**
  * 组装客户端用户提问的数据
  */
-export default function formatDialogQuestionByClient(text, file_list) {
+export default function formatDialogQuestionByClient(text, file_list, agentInfo) {
   const cur_stamp = Date.now();
 
+  const icon_src = getIcon4Question(agentInfo);
+
   return {
     /**
      * 此项的类别
@@ -16,6 +20,9 @@ export default function formatDialogQuestionByClient(text, file_list) {
     client_custom_create_time: cur_stamp, // 创建的时间戳
     client_custom_unique_id: generateClientUniqueId(text + cur_stamp),
 
+    // 图标
+    client_custom_icon: icon_src,
+
     question: text
   };
 }

+ 8 - 1
src/modules/conversation-dialog/format-dialog-question-by-history.js

@@ -1,9 +1,13 @@
 import generateClientUniqueId from '../../utils/generate-client-unique-id';
+import { getIcon4Question } from './get-icon-4-dialog';
 
 /**
  * 格式化用户的对话历史记录的提问数据
  */
-export default function formatDialogQuestionByHistory(item) {
+export default function formatDialogQuestionByHistory(item, agentInfo) {
+  const agent_icon = agentInfo?.agent?.icon || '';
+  const icon_src = getIcon4Question(agent_icon);
+
   return {
     /**
      * 对话消息类别
@@ -26,6 +30,9 @@ export default function formatDialogQuestionByHistory(item) {
      */
     client_custom_chat_status: 2, // 此轮会话的状态值 0 加载中 1 进行中 2 已结束
 
+    // 图标
+    client_custom_icon: icon_src,
+
     client_custom_unique_id: generateClientUniqueId(item.question),
     question: item.question
   };

Разница между файлами не показана из-за своего большого размера
+ 3 - 0
src/modules/conversation-dialog/get-icon-4-dialog.js


+ 12 - 3
src/modules/conversation-history/HistoryItem.vue

@@ -8,7 +8,9 @@
   </div>
 
   <div v-if="show_current_item" :class="item_klass">
-    <div class="history-item-icon" @click="handleClick"></div>
+    <div class="history-item-icon" @click="handleClick">
+      <img :src="history_icon" />
+    </div>
 
     <div class="history-item-intro">
       <div class="history-item-intro-title" @click="handleClick">{{ history.name }}</div>
@@ -28,6 +30,7 @@
 import { ref, computed } from 'vue';
 import { formatTimestamp2Hours, formatTimestamp2Weekend, formatTimestamp2Date } from '../../utils/datetime';
 import { useLocaleStore } from '../../base/store/use-locale';
+import { getIcon4Question } from '../conversation-dialog/get-icon-4-dialog';
 
 import BtnHistoryItemDelete from './BtnHistoryItemDelete.vue';
 
@@ -40,6 +43,8 @@ const emit = defineEmits(['active', 'delete']);
 
 const is_deleted = ref(false);
 
+const history_icon = getIcon4Question();
+
 /**
  * history示例数据
  * ------------------------------------------------
@@ -166,7 +171,7 @@ const handleDeleteSuccess = () => {
 .history-item-icon {
   width: 36px;
   height: 36px;
-  background-color: #ccc;
+  /* background-color: #ccc; */
   border-radius: 18px;
 
   margin-right: 5px;
@@ -174,6 +179,9 @@ const handleDeleteSuccess = () => {
 
   flex-shrink: 0;
 }
+.history-item-icon img {
+  width: 100%;
+}
 
 .history-item-intro {
   display: flex;
@@ -194,7 +202,8 @@ const handleDeleteSuccess = () => {
 }
 
 .conversation-history-section-data:hover {
-  box-shadow: 0 0 5px var(--color-text-1);
+  /* box-shadow: 0 0 5px var(--color-text-1); */
+  box-shadow: 0 0 5px var(--color-text-4);
 }
 .conversation-history-section-data:hover .history-item-time {
   display: none;

+ 15 - 4
src/modules/conversation-history/HistoryTypeDropdown.vue

@@ -1,8 +1,8 @@
 <template>
   <a-dropdown trigger="hover">
-    <a-button v-if="api_status === 1" type="text">{{ btn_label }}</a-button>
-    <a-button v-if="api_status === 2" type="text"><a-spin :size="16" /></a-button>
-    <a-button v-if="api_status === 3" type="text">{{ btn_label }}</a-button>
+    <a-button v-if="api_status === 1" class="history-type-btn" type="text">{{ btn_label }}</a-button>
+    <a-button v-if="api_status === 2" class="history-type-btn" type="text"><a-spin :size="16" /></a-button>
+    <a-button v-if="api_status === 3" class="history-type-btn" type="text">{{ btn_label }}</a-button>
 
     <template #content>
       <a-doption
@@ -60,4 +60,15 @@ onMounted(() => {
 });
 </script>
 
-<style lang="css" scoped></style>
+<style lang="css" scoped>
+.history-type-btn {
+  font-size: 18px;
+
+  max-width: 100px;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1; /* 这里设置显示的行数 */
+  line-clamp: 1;
+  overflow: hidden;
+}
+</style>

+ 2 - 2
src/views/ConversationQA.vue

@@ -32,7 +32,7 @@ import ConversationChatContainer from './conversation/ConversationChatContainer.
 
 import { useAllAgentStore } from '../base/store/use-all-agents';
 
-import { getHistoryLogs, getDialogChatId } from '../modules/conversation-dialog/api-dialog';
+import { getConfigField } from '../config/index';
 
 /**
  * 此页面为对话页面
@@ -112,7 +112,7 @@ onMounted(async () => {
      * 默认的agent,和赵秦刚沟通,为知识问答(2024-12-18)
      * 下列为知识问答的ID
      */
-    const default_agent_id = '42e4fcdc-9bea-11ef-ac30-0242ac160006';
+    const default_agent_id = getConfigField('DEFAULT_CHAT_AGENT_ID');
     chat_agent.value = default_agent_id;
 
     query_value_status.value = 2;

+ 100 - 0
src/views/conversation/ChatAsideAgent.vue

@@ -0,0 +1,100 @@
+<template>
+  <a-tooltip v-if="has_msg" :content="label" position="right">
+    <div class="aside-menu-btn-item" @click="handleClick">
+      <span>
+        <img class="aside-btn-icon" :src="img" />
+      </span>
+
+      <span class="agent-remove-btn" @click.stop="handleRemove"><icon-close /></span>
+    </div>
+  </a-tooltip>
+
+  <div v-if="!has_msg" class="aside-menu-btn-item" @click="handleClick">
+    <span>
+      <img class="aside-btn-icon" :src="img_src" />
+    </span>
+
+    <span class="agent-remove-btn" @click.stop="handleRemove"><icon-close /></span>
+  </div>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue';
+import { icon_chat_map } from './chat-icon-map';
+
+const props = defineProps({
+  label: String,
+  img: String
+});
+
+const emit = defineEmits(['active', 'delete']);
+
+const has_msg = computed(() => {
+  return !!props.label ? true : false;
+});
+
+// const img_src = computed(() => {
+//   const img_name = props.img_name;
+
+//   if (img_name in icon_chat_map) {
+//     return icon_chat_map[props.img_name].t1;
+//   } else {
+//     return 'testimg.png';
+//   }
+// });
+
+const handleClick = () => {
+  emit('active');
+};
+
+//删除操作
+const handleRemove = () => {
+  emit('delete');
+};
+</script>
+
+<style lang="css" scoped>
+.aside-menu-btn-item {
+  width: 40px;
+  height: 40px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  margin-top: 15px;
+  margin-bottom: 15px;
+  margin-left: auto;
+  margin-right: auto;
+
+  text-align: center;
+
+  cursor: pointer;
+
+  position: relative;
+}
+.agent-remove-btn {
+  position: absolute;
+  right: 3px;
+  top: 3px;
+  width: 14px;
+  height: 14px;
+  display: none;
+  background-color: red;
+  color: #fff;
+  border-radius: 50%;
+}
+.aside-menu-btn-item:hover {
+  background-color: var(--color-fill-4);
+  border-radius: 12px;
+}
+.aside-menu-btn-item:hover .agent-remove-btn {
+  display: inline-block;
+}
+.aside-menu-btn-item:last-child {
+  margin-bottom: 0;
+}
+
+.aside-btn-icon {
+  width: 24px;
+}
+</style>

+ 52 - 6
src/views/conversation/ChatAsideMenu.vue

@@ -28,11 +28,15 @@
 
         <div class="aside-menu-h-line"></div>
 
-        <ChatAsideBtn />
-
-        <ChatAsideBtn />
-
-        <ChatAsideBtn />
+        <ChatAsideAgent
+          v-for="item of agents_list"
+          :label="item.name"
+          :img="item.icon"
+          :id="item.id"
+          :key="item.id"
+          @active="handleAgentClick(item.id)"
+          @delete="handleAgentDelete(item.id)"
+        />
       </div>
     </div>
   </div>
@@ -44,8 +48,10 @@ import { useRouter } from 'vue-router';
 import { useThemeStore } from '../../base/store/use-theme';
 import { useRecentAgentStore } from '../../base/store/use-recent-agents';
 import { useAllAgentStore } from '../../base/store/use-all-agents';
+import { getIconIntelligent } from '../../modules/common/icon-map';
 
 import ChatAsideBtn from './ChatAsideBtn.vue';
+import ChatAsideAgent from './ChatAsideAgent.vue';
 
 const router = useRouter();
 
@@ -63,12 +69,52 @@ const current_theme_klass = computed(() => {
 
 // 最近使用的 智能体 列表
 const agents_list = computed(() => {
-  return recentAgents.agents;
+  const arr = [];
+
+  const list = recentAgents.getList();
+
+  const len = list.length;
+  for (let i = 0; i < len; i++) {
+    if (i >= 3) {
+      break;
+    }
+
+    const item = list[i];
+
+    arr.push({
+      id: item.id,
+      icon: getIconIntelligent(item.icon),
+      name: item.name
+    });
+  }
+
+  return arr;
 });
 
 const handleMenuClick = (path) => {
   router.push(path);
 };
+
+/**
+ * 点击最近使用的Agent
+ * @param agent_id
+ */
+const handleAgentClick = (agent_id) => {
+  router.push({
+    path: '/chat/qa',
+    query: {
+      agent: agent_id
+    }
+  });
+};
+
+/**
+ * 移除某个近期使用的Agent
+ * @param agent_id
+ */
+const handleAgentDelete = (agent_id) => {
+  recentAgents.removeItem(agent_id);
+};
 </script>
 
 <style lang="css" scoped>

+ 1 - 1
src/views/conversation/ConversationBoardContainer.vue

@@ -62,7 +62,7 @@ const handleItemActive = (target_id) => {
   const target_info = allAgents.getInfo(target_id);
 
   // 添加记录
-  recentAgents.addItem(target_id, 'name', 'icon');
+  recentAgents.addItem(target_id, target_info.name, target_info.icon);
 
   emit('agentActive', target_id);
 };

+ 26 - 26
src/views/conversation/ConversationChatContainer.vue

@@ -12,7 +12,7 @@
       />
 
       <div class="conversation-chat-content">
-        <DialogWelcome v-if="show_welcome" class="conversation-chat-area" />
+        <DialogWelcome v-if="show_welcome" class="conversation-chat-area" :agent_info="CHAT_AGENT_INFOMATION" />
         <DialogList
           v-if="!show_welcome"
           ref="list_scroller"
@@ -285,7 +285,7 @@ const handleInputSubmit = async (options) => {
    * 整理客户端提问的数据
    * 组装Question数据
    */
-  const client_question = formatDialogQuestionByClient(ask_text, ask_files);
+  const client_question = formatDialogQuestionByClient(ask_text, ask_files, CHAT_AGENT_INFOMATION.value);
   // 保存用户的提问信息
   // 当消息正式发出后,将提问数据放入列表中
   chat_new_question.value = client_question;
@@ -333,7 +333,7 @@ function handleWSSend(chat_id, value) {
   // 消息即将发送,记录用户的提问数据
   chat_new_list.value.push(chat_new_question.value);
   // 客户端依据此数据展示加载中的动画
-  const loadingMsg = formatDialogAnswerForLoading();
+  const loadingMsg = formatDialogAnswerForLoading(CHAT_AGENT_INFOMATION.value);
   chat_new_list.value.push(loadingMsg);
 
   /**
@@ -393,7 +393,7 @@ function handleWSMessage(e) {
   /**
    * 整理返回的数据
    */
-  const currentChat = formatDialogAnswerFromWebsocketReceiveMessage(res_data, last_msg);
+  const currentChat = formatDialogAnswerFromWebsocketReceiveMessage(res_data, last_msg, CHAT_AGENT_INFOMATION.value);
   const chat_status = currentChat.status;
   const chat_message = currentChat.message;
 
@@ -460,6 +460,27 @@ onMounted(() => {
   const agent_id = props.agent_id;
   const session_id = props.session_id;
 
+  /**
+   * 根据agent_id 查询到agent的基本信息
+   * 从而确定agent的相关功能支持,例如:是否需要上传文件,支持上传什么类型的文件、支持上传多少个文件?
+   * 例如:主题、背景、等等
+   */
+  const agentInfo = allAgents.getInfo(agent_id);
+  if (agentInfo) {
+    const client_config = getAgentClientConfig(agent_id);
+    if (client_config) {
+      CHAT_AGENT_INFOMATION.value = {
+        config: client_config,
+        agent: agentInfo
+      };
+    } else {
+      CHAT_AGENT_INFOMATION.value = {
+        config: {},
+        agent: agentInfo
+      };
+    }
+  }
+
   // 组件挂载
   if (session_id) {
     // 有历史记录:获取历史记录内容进行展示
@@ -470,7 +491,7 @@ onMounted(() => {
           const session_list = res.data;
 
           // 将列表数据进行转化
-          const list = formatDialogHistory(session_list);
+          const list = formatDialogHistory(session_list, CHAT_AGENT_INFOMATION.value);
 
           // 如果历史记录不为空
           // 则需要展示对话内容
@@ -493,27 +514,6 @@ onMounted(() => {
   } else {
     // 无历史记录:等待创建会话内容(用户开始输入、提交完成),列表区域显示欢迎界面
   }
-
-  /**
-   * 根据agent_id 查询到agent的基本信息
-   * 从而确定agent的相关功能支持,例如:是否需要上传文件,支持上传什么类型的文件、支持上传多少个文件?
-   * 例如:主题、背景、等等
-   */
-  const agentInfo = allAgents.getInfo(agent_id);
-  if (agentInfo) {
-    const client_config = getAgentClientConfig(agent_id);
-    if (client_config) {
-      CHAT_AGENT_INFOMATION.value = {
-        config: client_config,
-        agent: agentInfo
-      };
-    } else {
-      CHAT_AGENT_INFOMATION.value = {
-        config: {},
-        agent: agentInfo
-      };
-    }
-  }
 });
 
 // ---------------------------------------------------------

+ 8 - 1
src/views/conversation/ConversationHistoryContainer.vue

@@ -93,7 +93,9 @@ function dropListByType(res_list) {
     let label_item = null; // label项目(今天、本月、更早以前)
     const content_item = item; // 数据项目
 
-    const create_time = content_item.updated_time; // 会话创建时间
+    // const create_time = content_item.updated_time; // 会话创建时间
+    const create_time_str = content_item.create_date; // "2024-12-18 11:45:23"
+    const create_time = new Date(create_time_str);
 
     if (create_time >= today_zero) {
       // 今天的数据
@@ -258,6 +260,11 @@ const handleTypeSelected = (type_item) => {
     return;
   }
 
+  // 统计数据归位
+  count_today.value = 0;
+  count_month.value = 0;
+  count_earlier.value = 0;
+
   // 记录Agent ID
   agent_id.value = type_item.id;
 

Некоторые файлы не были показаны из-за большого количества измененных файлов