From 0a7b21651335b59259ea0d484d552517291f984e Mon Sep 17 00:00:00 2001 From: liangxu Date: Thu, 7 May 2026 12:08:03 +0800 Subject: [PATCH] fix(knowledge): refresh inflight items and skip empty chunked groups Poll the knowledge item list every 5s while any item is still pending or processing so the UI reflects ingestion progress without manual refresh, and exclude items that have no active chunks from group counters so groups with no usable content do not appear populated. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/admin-web/src/views/KnowledgeView.vue | 8 ++++++++ .../internal/tenant/app/knowledge_service.go | 18 ++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/apps/admin-web/src/views/KnowledgeView.vue b/apps/admin-web/src/views/KnowledgeView.vue index cf423d3..e5f4434 100644 --- a/apps/admin-web/src/views/KnowledgeView.vue +++ b/apps/admin-web/src/views/KnowledgeView.vue @@ -62,6 +62,14 @@ const groupsQuery = useQuery({ const itemsQuery = useQuery({ queryKey: computed(() => ['knowledge', 'items', selectedGroupId.value]), queryFn: () => knowledgeApi.listItems(selectedGroupId.value ?? undefined), + refetchInterval: (query) => { + const items = query.state.data as KnowledgeItem[] | undefined + if (!items || items.length === 0) return false + const hasInflight = items.some( + (item) => item.status !== 'completed' && item.status !== 'failed', + ) + return hasInflight ? 5000 : false + }, }) const columns: TableColumnsType = [ diff --git a/server/internal/tenant/app/knowledge_service.go b/server/internal/tenant/app/knowledge_service.go index 3e17e1e..11931fd 100644 --- a/server/internal/tenant/app/knowledge_service.go +++ b/server/internal/tenant/app/knowledge_service.go @@ -240,10 +240,20 @@ func (s *KnowledgeService) ListGroups(ctx context.Context) ([]KnowledgeGroupResp } countRows, err := s.pool.Query(ctx, ` - SELECT group_id, COUNT(*)::bigint - FROM knowledge_items - WHERE tenant_id = $1 AND deleted_at IS NULL - GROUP BY group_id + SELECT ki.group_id, COUNT(DISTINCT ki.id)::bigint + FROM knowledge_items ki + WHERE ki.tenant_id = $1 + AND ki.deleted_at IS NULL + AND ki.status = 'completed' + AND EXISTS ( + SELECT 1 + FROM knowledge_chunks_meta kcm + WHERE kcm.tenant_id = ki.tenant_id + AND kcm.knowledge_item_id = ki.id + AND kcm.item_version = ki.item_version + AND kcm.status = 'active' + ) + GROUP BY ki.group_id `, actor.TenantID) if err != nil { return nil, response.ErrInternal(50050, "knowledge_group_counts_query_failed", "failed to list knowledge group counts")