From 333bf56ddce833c06eef9da6d3786cd34b931819 Mon Sep 17 00:00:00 2001 From: lxfight <1686540385@qq.com> Date: Sun, 19 Oct 2025 22:40:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=9F=A5=E8=AF=86=E5=BA=93=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E6=B8=B2=E6=9F=93=E7=BB=9F=E8=AE=A1=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/dashboard/routes/knowledge_base.py | 24 ++++++++++++++++--- dashboard/src/views/knowledge-base/KBList.vue | 14 +++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/astrbot/dashboard/routes/knowledge_base.py b/astrbot/dashboard/routes/knowledge_base.py index 5107262fd..729d98059 100644 --- a/astrbot/dashboard/routes/knowledge_base.py +++ b/astrbot/dashboard/routes/knowledge_base.py @@ -230,11 +230,13 @@ class KnowledgeBaseRoute(Route): Query 参数: - page: 页码 (默认 1) - page_size: 每页数量 (默认 20) + - refresh_stats: 是否刷新统计信息 (默认 false,首次加载时可设为 true) """ try: kb_manager = self._get_kb_manager() page = request.args.get("page", 1, type=int) page_size = request.args.get("page_size", 20, type=int) + refresh_stats = request.args.get("refresh_stats", "false").lower() == "true" # 转换为 offset 和 limit offset = (page - 1) * page_size @@ -242,6 +244,16 @@ class KnowledgeBaseRoute(Route): kbs = await kb_manager.list_kbs(offset=offset, limit=limit) + # 如果需要刷新统计信息 + if refresh_stats: + for kb in kbs: + try: + await kb_manager._update_kb_stats(kb.kb_id) + except Exception as e: + logger.warning(f"刷新知识库 {kb.kb_id} 统计信息失败: {e}") + # 刷新后重新查询以获取最新数据 + kbs = await kb_manager.list_kbs(offset=offset, limit=limit) + # 转换为字典列表 kb_list = [] for kb in kbs: @@ -260,7 +272,9 @@ class KnowledgeBaseRoute(Route): "top_k_dense": kb.top_k_dense or 50, "top_k_sparse": kb.top_k_sparse or 50, "top_m_final": kb.top_m_final or 5, - "enable_rerank": kb.enable_rerank if kb.enable_rerank is not None else True, + "enable_rerank": kb.enable_rerank + if kb.enable_rerank is not None + else True, "created_at": kb.created_at.isoformat(), "updated_at": kb.updated_at.isoformat(), } @@ -354,7 +368,9 @@ class KnowledgeBaseRoute(Route): "top_k_dense": kb.top_k_dense or 50, "top_k_sparse": kb.top_k_sparse or 50, "top_m_final": kb.top_m_final or 5, - "enable_rerank": kb.enable_rerank if kb.enable_rerank is not None else True, + "enable_rerank": kb.enable_rerank + if kb.enable_rerank is not None + else True, "created_at": kb.created_at.isoformat(), "updated_at": kb.updated_at.isoformat(), } @@ -506,7 +522,9 @@ class KnowledgeBaseRoute(Route): "top_k_dense": kb.top_k_dense or 50, "top_k_sparse": kb.top_k_sparse or 50, "top_m_final": kb.top_m_final or 5, - "enable_rerank": kb.enable_rerank if kb.enable_rerank is not None else True, + "enable_rerank": kb.enable_rerank + if kb.enable_rerank is not None + else True, "created_at": kb.created_at.isoformat(), "updated_at": kb.updated_at.isoformat(), } diff --git a/dashboard/src/views/knowledge-base/KBList.vue b/dashboard/src/views/knowledge-base/KBList.vue index 6a4891fd4..0177bff14 100644 --- a/dashboard/src/views/knowledge-base/KBList.vue +++ b/dashboard/src/views/knowledge-base/KBList.vue @@ -337,10 +337,15 @@ const emojiCategories = [ ] // 加载知识库列表 -const loadKnowledgeBases = async () => { +const loadKnowledgeBases = async (refreshStats = false) => { loading.value = true try { - const response = await axios.get('/api/kb/list') + const params: any = {} + if (refreshStats) { + params.refresh_stats = 'true' + } + + const response = await axios.get('/api/kb/list', { params }) if (response.data.status === 'ok') { kbList.value = response.data.data.items || [] } else { @@ -500,7 +505,7 @@ const showSnackbar = (text: string, color: string = 'success') => { } onMounted(() => { - loadKnowledgeBases() + loadKnowledgeBases(true) // 首次加载时刷新统计信息 loadProviders() }) @@ -595,7 +600,8 @@ onMounted(() => { align-items: center; gap: 6px; font-size: 0.875rem; - color: rgb(var(--v-theme-on-surface-variant)); + color: rgb(var(--v-theme-on-surface)); + font-weight: 500; } .kb-actions {